module RandomCycle.List ( -- * Partitions uniformPartition, uniformPartitionThin, partitionLengths, partitionFromBits, -- * Cycles uniformCyclePartition, uniformCyclePartitionThin, ) where import Control.Monad.Primitive (PrimMonad) import qualified Data.Vector as V import RandomCycle.List.Partition import qualified RandomCycle.Vector as RV import System.Random.Stateful (StatefulGen) -- | Sample a cycle graph partition of @[0.. n-1]@, -- uniformly over the /n!/ possibilities. The list implementation -- is a convenience wrapper around 'RandomCycle.Vector.uniformCyclePartition'. uniformCyclePartition :: (PrimMonad m, StatefulGen g m) => Int -> g -> m [(Int, Int)] uniformCyclePartition n g = do v <- RV.uniformCyclePartition n g pure $ V.toList v -- | Sample a cycle graph partition of @[0.. n-1]@, -- uniformly over the set satisfying the conditions. -- The list implementation is a convenience wrapper around -- 'RandomCycle.Vector.uniformCyclePartitionThin'. uniformCyclePartitionThin :: (PrimMonad m, StatefulGen g m) => -- | maximum number of draws to attempt Int -> -- | edge-wise predicate, which all edges in the result must satisfy ((Int, Int) -> Bool) -> -- | number of vertices, which will be labeled @[0..n-1]@ Int -> g -> m (Maybe [(Int, Int)]) uniformCyclePartitionThin maxit r n g = do v <- RV.uniformCyclePartitionThin maxit r n g pure $ V.toList <$> v