-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Easy and reasonably efficient probabilistic programming and random generation -- -- Easy and reasonably efficient probabilistic programming and random -- generation -- -- This library gives a common language to speak about probability -- distributions and random generation, by wrapping both, when necessary, -- in a RandT monad defined in Math.Probable.Random. This -- module also provides a lot of useful little combinators for easily -- describing how random values for your types should be generated. -- -- In Math.Probable.Distribution, you'll find functions for -- generating random values that follow any distribution supported by -- mwc-random. -- -- In Math.Probable.Distribution.Finite, you'll find an -- adaptation of Eric Kidd's work on probability monads (from -- here). -- -- You may want to check the examples bundled with this package, viewable -- online at -- https://github.com/alpmestan/probable/tree/master/examples. One -- of these examples is simple enough to be worth reproducing here. -- --
-- module Main where -- -- import Control.Applicative -- import Control.Monad -- import Math.Probable -- -- import qualified Data.Vector.Unboxed as VU -- -- data Person = Person Int -- ^ age -- Double -- ^ weight (kgs) -- Double -- ^ salary (e.g euros) -- deriving (Eq, Show) -- -- person :: RandT IO Person -- person = -- Person <$> uniformIn (1, 100) -- <*> uniformIn (2, 130) -- <*> uniformIn (500, 10000) -- -- randomPersons :: Int -> IO [Person] -- randomPersons n = mwc $ listOf n person -- -- randomDoubles :: Int -> IO (VU.Vector Double) -- randomDoubles n = mwc $ vectorOf n double -- -- main :: IO () -- main = do -- randomPersons 10 >>= mapM_ print -- randomDoubles 10 >>= VU.mapM_ print ---- -- Please report any feature request or problem, either by email or -- through github's issues/feature requests. @package probable @version 0.1.3 -- | Random number generation based on Gen, defined as a Monad -- transformer. -- -- Quickstart, in ghci: -- --
-- λ> import Math.Probable
-- λ> import Control.Applicative
-- λ> mwc double
-- 0.2756820707828763
-- λ> mwc word64
-- 12175918187293541909
-- λ> mwc $ (,) <$> bool <*> intIn (0, 10)
-- (True,7)
-- λ> mwc $ do { n <- intIn (1, 10) ; listOf n (listOf 2 bool) }
-- [ [False,True],[True,False],[False,True],[False,False],[False,False],
-- [False,True],[True,False],[True,False],[True,True],[False,False]
-- ]
--
--
-- This module features a bunch of combinators that can help you create
-- some random generation descriptions easily, and in a very familiar
-- style.
--
-- You can easily combine them through the Monad instance for
-- RandT which really just make sure everyone gets a Gen
-- (from mwc-random) eventually. This of course makes RandT a
-- Functor and an Applicative.
--
--
-- import Math.Probable
--
-- data Person =
-- Person { name :: String
-- , age :: Int
-- , salary :: Double
-- }
-- deriving (Eq, Show)
--
-- randomPerson :: PrimMonad m
-- => RandT m Person
-- randomPerson = do
-- -- we pick a random length
-- -- for the person's name
-- nameLen <- intIn (3, 10)
--
-- -- and just express what a random Person
-- -- should be, Applicative-style
-- Person <$> pickName nameLen -- pick a name
-- <*> intIn (0, 100) -- an Int between 0 and 100
-- <*> doubleIn (0, 10000) -- a Double between 0 and 10000
--
-- where pickName nameLen = do
-- -- the initial, between 'A' and 'Z'
-- initial <- chr `fmap` intIn (65, 90)
--
-- (initial:) `fmap`
-- -- the rest, between 'a' and 'z'
-- listOf (nameLen - 1)
-- (chr `fmap` intIn (97, 122))
--
--
-- This is all nice, but how do we actually sample such a Person? You
-- just have to call mwc:
--
--
-- λ> mwc randomPerson
-- Person {name = "Ojeesra", age = 83, salary = 3075.9945184521885}
--
--
-- So any value of type 'RandT m a' is something that you'll eventually
-- run in m (hence IO or ST s) for
-- generating a random value of type a. Note that
-- mwc forces the execution using withSystemRandom and
-- gets you back in IO, whereas mwcST gets you back in
-- ST s.
--
-- My simple name generation routine can help you pick a name for your
-- baby, if you are having one soon.
--
-- -- λ> map name `fmap` mwc (listOf 10 randomPerson) -- ["Npujbc","Faidx","Zusha","Ghbipic","Ljaestei","Fktcfonnxe","Hlvkolds","Zpws","Zgmrkrdv","Rhcd"] ---- -- If we were to make a generator that could generate more familiar and -- creativity-free names, we wouldn't sample uniformly from the alphabet. module Math.Probable.Random -- | RandT type, equivalent to a ReaderT (Gen -- (PrimState m)) -- -- This lets you build simple or complex random generation routines -- without having the generator passed all around and just run the whole -- thing in the end, most likely by using mwc. newtype RandT m a RandT :: (Gen (PrimState m) -> m a) -> RandT m a [runRandT] :: RandT m a -> Gen (PrimState m) -> m a -- | Take a RandT value and run it in IO, generating all the -- random values described by the RandT. It just uses -- withSystemRandom so you really should try hard to put your -- whole random generation logic in RandT and call mwc in -- the end, thus initialising the generator only once and generating -- everything with it. -- -- See the documentation for withSystemRandom for more about this. -- --
-- λ> mwc $ (+2) `fmap` int8 -- 34 --mwc :: RandT IO a -> IO a -- | If for some reason you have a RandT (ST s) you -- can run it from IO just like we do with mwc. -- --
-- λ> mwcST $ listOf 4 bool -- [False,False,True,True] --mwcST :: RandT (ST s) a -> IO a -- | A generic function for sampling uniformly any type that implements -- Variate. -- -- All the xxxIn functions from this module just call -- uniformR. uniformIn :: (Variate a, PrimMonad m) => (a, a) -> RandT m a -- | Generate a random Int. The whole Int range is used. -- --
-- λ> mwc int -- 8354496680947360541 --int :: PrimMonad m => RandT m Int -- | Generate a random Int8. The whole Int8 range is used. -- --
-- λ> mwc int8 -- -65 --int8 :: PrimMonad m => RandT m Int8 -- | Generate a random Int16. The whole Int16 range is used. -- --
-- λ> mwc int16 -- 15413 --int16 :: PrimMonad m => RandT m Int16 -- | Generate a random Int32. The whole Int32 range is used. -- --
-- λ> mwc int32 -- 1774441747 --int32 :: PrimMonad m => RandT m Int32 -- | Generate a random Int64. The whole Int64 range is used. -- --
-- λ> mwc int64 -- -2596387699802756017 --int64 :: PrimMonad m => RandT m Int64 -- | Generate a random Int in the given range. -- --
-- λ> mwc $ intIn (0, 10) -- 7 --intIn :: PrimMonad m => (Int, Int) -> RandT m Int -- | Generate a random Int8 in the given range -- --
-- λ> mwc $ int8In (-10, 10) -- -3 --int8In :: PrimMonad m => (Int8, Int8) -> RandT m Int8 -- | Generate a random Int16 in the given range -- --
-- λ> mwc $ int16In (-500, 30129) -- 9501 --int16In :: PrimMonad m => (Int16, Int16) -> RandT m Int16 -- | Generate a random Int32 in the given range. -- --
-- λ> mwc $ int32In (-500, 30129) -- 8012 --int32In :: PrimMonad m => (Int32, Int32) -> RandT m Int32 -- | Generate a random Int64 in the given range. -- --
-- λ> mwc $ int64In (-2^30, 30) -- -630614786 --int64In :: PrimMonad m => (Int64, Int64) -> RandT m Int64 -- | Generate a random Word. The whole Word range is used. -- --
-- λ> mwc word -- 3106215968599504888 --word :: PrimMonad m => RandT m Word -- | Generate a random Word8. The whole Word8 range is used. -- --
-- λ> mwc word8 -- 231 --word8 :: PrimMonad m => RandT m Word8 -- | Generate a random Word16. The whole Word16 range is -- used. -- --
-- λ> mwc word16 -- 31127 --word16 :: PrimMonad m => RandT m Word16 -- | Generate a random Word32. The whole Word32 range is -- used. -- --
-- λ> mwc word32 -- 3917666696 --word32 :: PrimMonad m => RandT m Word32 -- | Generate a random Word64. The whole Word64 range is -- used. -- --
-- λ> mwc word64 -- 12496697905424132339 --word64 :: PrimMonad m => RandT m Word64 -- | Generate a random Word in the given range. -- --
-- λ> mwc $ wordIn (1, 64) -- 28 --wordIn :: PrimMonad m => (Word, Word) -> RandT m Word -- | Generate a random Word8 in the given range -- --
-- λ> mwc $ word8In (2, 15) -- 3 --word8In :: PrimMonad m => (Word8, Word8) -> RandT m Word8 -- | Generate a random Word16 in the given range. -- --
-- λ> mwc $ word16In (2^13, 2^14) -- 8885 --word16In :: PrimMonad m => (Word16, Word16) -> RandT m Word16 -- | Generate a random Word32 in the given range. -- --
-- λ> mwc $ word32In (100, 330) -- 125 --word32In :: PrimMonad m => (Word32, Word32) -> RandT m Word32 -- | Generate a random Word64 in the given range. -- --
-- λ> mwc $ word64In (2^45, 2^46) -- 59226619151303 --word64In :: PrimMonad m => (Word64, Word64) -> RandT m Word64 -- | Generate a random Float between 0 (excluded) and 1 (included) -- --
-- λ> mwc float -- 0.11831179 --float :: PrimMonad m => RandT m Float -- | Generate a random Double between 0 (excluded) and 1 (included) -- --
-- λ> mwc double -- 0.7689412928620208 --double :: PrimMonad m => RandT m Double -- | Generate a random Float in the given range -- --
-- λ> mwc $ floatIn (0.20, 3.14) -- 1.3784513 --floatIn :: PrimMonad m => (Float, Float) -> RandT m Float -- | Generate a random Double in the given range -- --
-- λ> mwc $ doubleIn (-30.121121445, 0.129898878612) -- -13.612464813256999 --doubleIn :: PrimMonad m => (Double, Double) -> RandT m Double -- | Generate a random Bool -- --
-- λ> mwc bool -- False --bool :: PrimMonad m => RandT m Bool -- | Repeatedly run a random computation yielding a value of type -- a to get a list of random values of type a. -- --
-- λ> mwc (listOf 30 float) -- [ 5.438623e-2,0.78114086,0.4954672,0.5958733,0.47243807,5.883485e-2 -- , 5.500287e-2,0.79262286,0.5528683,0.7628807,0.80705905,0.15368962 -- , 0.8654971,0.4560417,0.23922172,0.5069659,0.8130155,0.6559351 -- , 1.31405e-2,0.25705606,0.7134138,0.79111993,0.7529769,0.10573909 -- , 0.37731406,0.6289338,0.85156864,0.15691182,0.9910314,8.133593e-2 -- ] ---- --
-- λ> mwc (sum `fmap` listOf 30 float) -- 15.037931 --listOf :: Monad m => Int -> RandT m a -> RandT m [a] -- | A function for generating a vector of the given length with random -- values of any type (in contrast to vectorOfVariate). -- -- It is generic in the Vector instance it hands you back. It's -- implemented in terms of replicateM and has been benchmarked to -- perform as well as uniformVector on simple types -- (uniformVector can't generate values for types that don't have -- a Variate instance). -- --
-- λ> import qualified Data.Vector.Unboxed as V -- λ> :set -XScopedTypeVariables -- λ> v :: V.Vector Int <- mwc $ vectorOf 10 int -- λ> V.mapM_ print v -- -3920053790769159788 -- 3983393642052845448 -- 1528310798822685910 -- 3522283620461337684 -- 6451017362937898910 -- 1929485210691770214 -- 8547527164583329795 -- 3298785082692387491 -- 4019024417224980311 -- -5216301990322376953 --vectorOf :: (Monad m, Vector v a) => Int -> RandT m a -> RandT m (v a) -- | A function for generating a vector of the given length for values -- whose types are instances of Variate. -- -- This function is generic in the type of vector it returns, any -- instance of Vector will do. -- -- It's just a wrapper arround uniformVector and doesn't really -- use the Monad instance of RandT. -- -- But if you want to have a vector of Persons, you have to use -- vectorOf. -- --
-- λ> import qualified Data.Vector.Unboxed as V -- λ> :set -XScopedTypeVariables -- λ> v :: V.Vector Double <- mwc $ vectorOfVariate 10 -- λ> V.mapM_ print v -- 3.8565084196117705e-2 -- 0.575103826646098 -- 0.379710162825715 -- 0.4066991135077237 -- 0.9778431248247549 -- 0.3786223745680838 -- 0.4361789615081698 -- 0.9904407826187301 -- 0.2951087330670904 -- 0.1533350329892028 --vectorOfVariate :: (PrimMonad m, Variate a, Vector v a) => Int -> RandT m (v a) instance GHC.Base.Monad m => GHC.Base.Monad (Math.Probable.Random.RandT m) instance GHC.Base.Monad m => GHC.Base.Functor (Math.Probable.Random.RandT m) instance GHC.Base.Monad m => GHC.Base.Applicative (Math.Probable.Random.RandT m) -- | Fun with finite distributions! -- -- This all pretty much comes from Eric Kidd's series of blog posts at -- http://www.randomhacks.net/probability-monads/. -- -- I have adapted it a bit by making it fit into my own random -- generation/sampling scheme. -- -- The idea and purpose of this module should be clear after going -- through an example. First, let's import the library and -- vector. -- --
-- import Math.Probable -- import qualified Data.Vector as V ---- -- We are going to talk about Books, and particularly about whether a -- given book is interesting or not. -- --
-- data Book = Interesting -- | Boring -- deriving (Eq, Show) ---- -- Let's say we have very particular tastes, and that we think that only -- 20% of all books are interesting (that's not so small actually. oh -- well). -- --
-- bookPrior :: Finite d => d Book -- bookPrior = weighted [ (Interesting, 0.2) -- , (Boring, 0.8) -- ] ---- -- weighted belongs to the Finite class, which represents -- types that can somehow represent a distribution over a finite set. -- That makes our distribution polymorphic in how we will use it. -- Awesome! -- -- So how does it look? -- --
-- λ> exact bookPrior -- in ghci -- [Event Interesting 20.0%,Event Boring 80.0%] ---- -- exact takes Fin a and gives you the inner list -- that Fin uses to represent the distribution. -- -- Now, what if we pick two books? First, how do we even do that? Well, -- any instance of Finite must be a Monad, so you have your -- good old do notation. The ones provided by this package also -- provide Functor and Applicative instances, but let's use -- do. -- --
-- twoBooks :: Finite d => d (Book, Book) -- twoBooks = do -- book1 <- bookPrior -- book2 <- bookPrior -- return (book1, book2) ---- -- Nothing impressive. We pick a book with the prior we defined above, -- then another, pair them together and hand the pair back. What this -- will actually do is behave just like in the list monad, but in -- addition to this it will combine the probabilities of the various -- events we could be dealing with in the appropriate way. -- -- So, how about we verify what I just said: -- --
-- λ> exact twoBooks -- [ Event (Interesting,Interesting) 4.0% -- , Event (Interesting,Boring) 16.0% -- , Event (Boring,Interesting) 16.0% -- , Event (Boring,Boring) 64.0% -- ] ---- -- Nice! Let's take a look at a more complicated scenario now. -- -- What if we wanted to take a look at the same distribution, with just a -- difference: we want at least one of the books to be an Interesting -- one. -- --
-- oneInteresting :: Fin (Book, Book) -- oneInteresting = bayes $ do -- notice the call to bayes -- (b1, b2) <- twoBooks -- condition (b1 == Interesting || b2 == Interesting) -- return (b1, b2) ---- -- We get two books from the previous distribution, and use -- condition to restrict the current distribution to the values of -- b1 and b2 that verify our condition. This lifts us in the -- FinBayes type, where our probabilistic computations can "fail" -- in some sense. If you want to discard values and restrict the ones on -- which you'll run further computations, use condition. -- -- However, how do we view the distribution now, without having all those -- Maybes in the middle? That's what bayes is for. It runs -- the computations for the distribution and discards all the ones where -- any condition wasn't satisfied. In particular, it means it -- hands you back a normal Fin distribution. -- -- If we run this one: -- --
-- λ> exact oneInteresting -- [ Event (Interesting,Interesting) 11.1% -- , Event (Interesting,Boring) 44.4% -- , Event (Boring,Interesting) 44.4% -- ] ---- -- Note that these finite distribution types support random sampling too: -- --
-- -- example of the former -- sampleBooks :: RandT IO (V.Vector Book) -- sampleBooks = vectorOf 10 bookPrior ---- --
-- λ> mwc sampleBooks -- fromList [Interesting,Boring,Boring,Boring,Boring -- ,Boring,Boring,Interesting,Boring,Boring] ---- --
-- λ> mwc $ listOf 4 (liftF oneInteresting) -- example of the latter -- [ (Boring,Interesting) -- , (Boring,Interesting) -- , (Boring,Interesting) -- , (Interesting,Boring) -- ] --module Math.Probable.Distribution.Finite -- | Probability type: wrapper around Double for a nicer Show instance and -- for more easily enforcing normalization of weights newtype P P :: Double -> P -- | Get the underlying probability -- --
-- λ> prob (P 0.1) -- 0.1 --prob :: P -> Double -- | An event, and its probability data Event a Event :: a -> {-# UNPACK #-} !P -> Event a -- | This event never happens (probability of 0) -- --
-- never = Event undefined 0 --never :: Event a -- | EventT monad transformer -- -- It pairs a value with a probability within the m monad newtype EventT m a EventT :: m (Event a) -> EventT m a [runEventT] :: EventT m a -> m (Event a) -- | T distribution of probabilities over a finite set. class (Functor d, Monad d) => Finite d -- | The only requirement is to somehow be able to represent the -- distribution corresponding to the list given as argument, e.g: -- --
-- weighted [(True, 0.8), (False, 0.2)] ---- -- It should also be able to handle the normalization for you. -- --
-- weighted [(True, 8), (False, 2)] --weighted :: Finite d => [(a, Double)] -> d a -- | Fin is just 'EventT []' -- -- You can think of 'Fin a' meaning '[Event a]' i.e a list of the -- possible outcomes of type a with their respective probability type Fin = EventT [] -- | See the outcomes of a finite distribution and their probabilities -- --
-- λ> exact $ uniformly [True, False] -- [Event True 50.0%,Event False 50.0%] ---- --
-- λ> data Fruit = Apple | Orange deriving (Eq, Show) -- λ> exact $ uniformly [Apple, Orange] -- [Event Apple 50.0%,Event Orange 50.0%] ---- --
-- λ> exact $ weighted [(Apple, 0.8), (Orange, 0.2)] -- [Event Apple 80.0%,Event Orange 20.0%] --exact :: Fin a -> [Event a] -- | Create a Finite distribution over the values in the list, each -- with an equal probability -- --
-- λ> exact $ uniformly [True, False] -- [Event True 50.0%,Event False 50.0%] --uniformly :: Finite d => [a] -> d a -- | Make finite distributions (Fin) citizens of RandT by -- simply sampling an element at random while still approximately -- preserving the distribution -- --
-- λ> mwc . liftF $ uniformly [True, False]
-- False
-- λ> mwc . liftF $ uniformly [True, False]
-- True
-- λ> mwc . liftF $ weighted [("Haskell", 99), ("PHP", 1)]
-- "Haskell"
--
liftF :: PrimMonad m => Fin a -> RandT m a
-- | FinBayes is Fin with a MaybeT layer
--
-- What is that for? The MaybeT lets us express the fact that what
-- we've drawn from the distribution isn't of interest anymore, using
-- condition, and observing the remaining cases, using
-- bayes, to get back to a normal finite distribution. Example:
--
-- -- data Wine = Good | Bad deriving (Eq, Show) -- -- wines :: Finite d => d Wine -- wines = weighted [(Good, 0.2), (Bad, 0.8)] -- -- twoWines :: Finite d => d (Wine, Wine) -- twoWines = (,) <*> wines <$> wines -- -- decentMeal :: FinBayes (Wine, Wine) -- decentMeal = do -- (wine1, wine2) <- twoWines -- -- we only consider the outcomes of 'twoWines' -- -- where at least one of the two wines is good -- -- because we're having a nice meal and are looking -- -- for a decent pair of wine -- condition (wine1 == Good || wine2 == Good) -- return (wine1, wine2) -- -- -- to view the distribution, applying -- -- Bayes' rule on our way: -- exact (bayes decentMeal) --type FinBayes = MaybeT Fin -- | This functions discards all the elements of the distribution for which -- the call to condition yielded Nothing. While -- condition does the mapping to Maybe values, this -- function discards all of those values for which the condition was not -- met. bayes :: FinBayes a -> Fin a -- | This is the core of FinBayes. If the Bool is false, the -- current computation is shortcuited (sent to a Nothing in -- MaybeT) and won't be included when running the distribution -- with bayes. See the documentation of FinBayes for an -- example. condition :: Bool -> FinBayes () -- | Keeps only the Justs and remove the Maybe layer in the -- distribution. onlyJust :: Fin (Maybe a) -> Fin a instance GHC.Show.Show a => GHC.Show.Show (Math.Probable.Distribution.Finite.Event a) instance GHC.Classes.Eq a => GHC.Classes.Eq (Math.Probable.Distribution.Finite.Event a) instance GHC.Real.RealFrac Math.Probable.Distribution.Finite.P instance GHC.Real.Real Math.Probable.Distribution.Finite.P instance GHC.Num.Num Math.Probable.Distribution.Finite.P instance GHC.Real.Fractional Math.Probable.Distribution.Finite.P instance GHC.Classes.Ord Math.Probable.Distribution.Finite.P instance GHC.Classes.Eq Math.Probable.Distribution.Finite.P instance Math.Probable.Distribution.Finite.Finite Math.Probable.Distribution.Finite.Fin instance Control.Monad.Primitive.PrimMonad m => Math.Probable.Distribution.Finite.Finite (Math.Probable.Random.RandT m) instance Math.Probable.Distribution.Finite.Finite Math.Probable.Distribution.Finite.FinBayes instance GHC.Base.Monad m => GHC.Base.Functor (Math.Probable.Distribution.Finite.EventT m) instance (GHC.Base.Functor m, GHC.Base.Monad m) => GHC.Base.Applicative (Math.Probable.Distribution.Finite.EventT m) instance GHC.Base.Monad m => GHC.Base.Monad (Math.Probable.Distribution.Finite.EventT m) instance Control.Monad.Trans.Class.MonadTrans Math.Probable.Distribution.Finite.EventT instance GHC.Base.Functor Math.Probable.Distribution.Finite.Event instance GHC.Base.Applicative Math.Probable.Distribution.Finite.Event instance GHC.Base.Monad Math.Probable.Distribution.Finite.Event instance GHC.Show.Show Math.Probable.Distribution.Finite.P module Math.Probable.Distribution -- | Beta distribution (from Statistics.Distribution.Beta) -- --
-- λ> mwc $ listOf 10 (beta 81 219) -- [ 0.23238372272745833,0.252972980515086,0.22708315774257903 -- , 0.25807200295967214,0.29794072226119983,0.24534701159196015 -- , 0.24766870269839578,0.2994199351220346,0.2728157476212405,0.2593318159573564 -- ] --beta :: PrimMonad m => Double -> Double -> RandT m Double -- | Cauchy distribution (from Statistics.Distribution.Cauchy) -- --
-- λ> mwc $ listOf 10 (cauchy 0 0.1) -- [ -0.3932758718373347,0.490467375093784,4.2620417667423555e-2 -- , 3.370509874905657e-2,-8.186484692937862e-2,9.371858212168262e-2 -- , -1.1095818809115384e-2,3.0353983716155386e-2,0.22759697862410477 -- , -0.1881828277028582 ] --cauchy :: PrimMonad m => Double -> Double -> RandT m Double -- | Cauchy distribution around 0, with scale 1 (from -- Statistics.Distribution.Cauchy) -- --
-- λ> mwc $ listOf 10 cauchyStd -- [ 9.409701589649838,-7.361963972107541,0.168746305673769 -- , 5.091825420838711,-0.326080163135388,-1.2989850787629456 -- , -2.685658063444485,0.22671438734899435,-1.602349559644217e-2 -- , -0.6476292643908057 ] --cauchyStd :: PrimMonad m => RandT m Double -- | Chi-squared distribution (from -- Statistics.Distribution.ChiSquared) -- --
-- λ> mwc $ listOf 10 (chiSquare 4) -- [ 8.068852054279787,1.861584389294606,6.3049415103095265 -- , 1.0512164068833838,1.6243237867165086,5.284901049954076 -- , 0.4773242487947021,1.1753876666374887,5.21554771873363 -- , 3.477574639460651 ] --chiSquared :: PrimMonad m => Int -> RandT m Double -- | Fisher's F-Distribution (from -- Statistics.Distribution.FDistribution) -- --
-- λ> mwc $ listOf 10 (fisher 4 3) -- [ 3.437898578540642,0.844120450719367,1.9907851466347173 -- , 2.0089975147012784,1.3729208790549117,0.9380430357924707 -- , 2.642389323945247,1.0918121624055352,0.45650856735477335 -- , 2.5134537326659196 ] --fisher :: PrimMonad m => Int -> Int -> RandT m Double -- | Gamma distribution (from Statistics.Distribution.Gamma) -- --
-- λ> mwc $ listOf 10 (gamma 3 0.1) -- [ 5.683745415884202e-2,0.20726188766138176,0.3150672538487696 -- , 0.4250825346490057,0.5586516230326105,0.46897413151474315 -- , 0.18374916962208182,9.93000480494153e-2,0.6057279704154832 -- , 0.11070190282993911 ] --gamma :: PrimMonad m => Double -> Double -> RandT m Double -- | Gamma distribution, without checking whether the parameter are valid -- (from Statistics.Distribution.Gamma) -- --
-- λ> mwc $ listOf 10 (improperGamma 3 0.1) -- [ 0.30431838005485,0.4044380297376584,2.8950141419406657e-2 -- , 0.468271612850147,0.18587792578128381,0.22735854572527045 -- , 0.5168050216325927,5.896911236207261e-2,0.24654560998405564 -- , 0.10557650513145429 ] --improperGamma :: PrimMonad m => Double -> Double -> RandT m Double -- | Geometric distribution. -- -- Distribution of the number of trials needed to get one success. See -- Statistics.Distribution.Geometric -- --
-- λ> mwc $ listOf 10 (geometric 0.8) -- [2,1,1,1,1,1,1,2,1,5] --geometric :: PrimMonad m => Double -> RandT m Int -- | Geometric distribution. -- -- Distribution of the number of failures before getting one success. See -- Statistics.Distribution.Geometric -- --
-- λ> mwc $ listOf 10 (geometric0 0.8) -- [0,0,0,0,0,1,1,0,0,0] --geometric0 :: PrimMonad m => Double -> RandT m Int -- | Student-T distribution (from -- Statistics.Distribution.StudentT) -- --
-- λ> mwc $ listOf 10 (student 0.2) -- [ -14.221373473810829,-29.395749168822267,19.448665112984997 -- , -30.00446058929083,-0.5033202547957609,2.321975597874013 -- , 0.7884787761643617,-0.1895113832448149,-131.12901170537924 -- , 1.371956948317759 ] --student :: PrimMonad m => Double -> RandT m Double -- | Uniform distribution between a and b (from -- Statistics.Distribution.Uniform) -- --
-- λ> mwc $ listOf 10 (uniform 0.1 0.2) -- [ 0.1711914559256124,0.1275212181343327,0.15347702635758945 -- , 0.1743662387063698,0.12047749686635312,0.10719840237585587 -- , 0.10543681342025846,0.13482973080648325,0.19779298960413577 -- , 0.1681037592576508 ] --uniform :: PrimMonad m => Double -> Double -> RandT m Double -- | Normal distribution (from Statistics.Distribution.Normal) -- --
-- λ> mwc $ listOf 10 (normal 4 1) -- [ 3.6815394812555144,3.5958531529526727,3.775960990625964 -- , 4.413109650155896,4.825826384709198,4.805629590118984 -- , 5.259267547365003,4.45410634165052,4.886537243027636 -- , 3.0409409067356954 ] --normal :: PrimMonad m => Double -> Double -> RandT m Double -- | The standard normal distribution (mean = 0, stddev = 1) (from -- Statistics.Distribution.Normal) -- --
-- λ> mwc $ listOf 10 standard -- [ 0.2252627935262769,1.1831885443897947,-0.6577353418647461 -- , 2.1574536855051853,-0.16983072710637676,0.9667954287638821 -- , -1.8758605246293683,-0.8578048838241616,1.9516838769731923 -- , 0.43752574431460434 ] --standard :: PrimMonad m => RandT m Double -- | Create a normal distribution using parameters estimated from the -- sample (from Statistics.Distribution.Normal) -- --
-- λ> mwc . listOf 10 $ -- normalFromSample $ -- V.fromList [1,1,1,3,3,3,4 -- ,4,4,4,4,4,4,4 -- ,4,4,4,4,4,5,5 -- ,5,7,7,7] -- [ 7.1837511677441395,2.388433817342809,5.252282321156134 -- , 4.988163140851522,0.40102386713467864,4.4840751065620665 -- , 2.1471370686776874,2.6591948802201046,3.843667372514598 -- , 1.7650436484843248 ] --normalFromSample :: PrimMonad m => Sample -> Maybe (RandT m Double) -- | Exponential distribution (from -- Statistics.Distribution.Exponential) -- --
-- λ> mwc $ listOf 10 (exponential 0.2) -- [ 5.713524665694821,1.7774315204594584,2.434017573227628 -- , 5.463202731505528,0.5403008025455847,14.346316301765576 -- , 7.380393612391503,24.800854500680032,0.8731076703020924 -- , 6.1661076502236645 ] --exponential :: PrimMonad m => Double -> RandT m Double -- | Exponential distribution given a sample (from -- Statistics.Distribution.Exponential) -- --
-- λ> mwc $ listOf 10 (exponentialFromSample $ V.fromList [1,1,1,0]) -- [ 0.4237050903604833,1.934301502525168,0.7435728843566659 -- , 1.8720263209574293,0.605750265970631,0.24103955067365979 -- , 0.6294952762436511,1.660404952631443,0.6448230847113577 -- , 0.8891555734786789 ] --exponentialFromSample :: PrimMonad m => Sample -> Maybe (RandT m Double) -- | Sample from a continuous distribution from the statistics -- package -- --
-- λ> import qualified Statistics.Distribution.Normal as Normal -- λ> mwc $ continuous (Normal.normalDistr 0 1) -- -0.7266583064693862 ---- -- This is equivalent to using normal from this module. continuous :: (ContGen d, PrimMonad m) => d -> RandT m Double -- | Sample from a discrete distribution from the statistics -- package -- --
-- λ> import qualified Statistics.Distribution.Normal as Normal -- λ> mwc $ discrete (Geo.geometric 0.6) -- 2 ---- -- This is equivalent to using geometric from this module. discrete :: (DiscreteGen d, PrimMonad m) => d -> RandT m Int -- | Easy, composable and efficient random number generation, with support -- for distributions over a finite set and your usual probability -- distributions. module Math.Probable