Stability | experimental |
---|---|

Maintainer | Patrick Perry <patperry@gmail.com> |

The abstract MonadMC interface and utility functions for Monte Carlo computations.

- class HasRNG m where
- type RNG m

- class (Monad m, HasRNG m) => MonadMC m where
- getRNG :: m (RNG m)
- setRNG :: RNG m -> m ()
- uniform :: Double -> Double -> m Double
- uniformInt :: Int -> m Int
- normal :: Double -> Double -> m Double
- exponential :: Double -> m Double
- levy :: Double -> Double -> m Double
- levySkew :: Double -> Double -> Double -> m Double
- poisson :: Double -> m Int
- cauchy :: Double -> m Double
- beta :: Double -> Double -> m Double
- logistic :: Double -> m Double
- pareto :: Double -> Double -> m Double
- weibull :: Double -> Double -> m Double
- gamma :: Double -> Double -> m Double
- multinomial :: Int -> Vector Double -> m (Vector Int)
- dirichlet :: Vector Double -> m (Vector Double)
- unsafeInterleaveMC :: m a -> m a

- bernoulli :: MonadMC m => Double -> m Bool
- sample :: MonadMC m => [a] -> m a
- sampleWithWeights :: MonadMC m => [(Double, a)] -> m a
- sampleSubset :: MonadMC m => [a] -> Int -> m [a]
- sampleSubset' :: MonadMC m => [a] -> Int -> m [a]
- sampleSubsetWithWeights :: MonadMC m => [(Double, a)] -> Int -> m [a]
- sampleSubsetWithWeights' :: MonadMC m => [(Double, a)] -> Int -> m [a]
- sampleInt :: MonadMC m => Int -> m Int
- sampleIntWithWeights :: MonadMC m => [Double] -> Int -> m Int
- sampleIntSubset :: MonadMC m => Int -> Int -> m [Int]
- sampleIntSubset' :: MonadMC m => Int -> Int -> m [Int]
- sampleIntSubsetWithWeights :: MonadMC m => [Double] -> Int -> Int -> m [Int]
- sampleIntSubsetWithWeights' :: MonadMC m => [Double] -> Int -> Int -> m [Int]
- shuffle :: MonadMC m => [a] -> m [a]
- shuffleInt :: MonadMC m => Int -> m [(Int, Int)]
- shuffleInt' :: MonadMC m => Int -> m [(Int, Int)]
- repeatMC :: MonadMC m => m a -> m [a]
- replicateMC :: MonadMC m => Int -> m a -> m [a]

# The Monte Carlo monad type class

class (Monad m, HasRNG m) => MonadMC m whereSource

Get the current random number generator.

Set the current random number generator.

uniform :: Double -> Double -> m DoubleSource

`uniform a b`

generates a value uniformly distributed in `[a,b)`

.

uniformInt :: Int -> m IntSource

`uniformInt n`

generates an integer uniformly in the range `[0,n-1]`

.
It is an error to call this function with a non-positive value.

normal :: Double -> Double -> m DoubleSource

`normal mu sigma`

generates a Normal random variable with mean
`mu`

and standard deviation `sigma`

.

exponential :: Double -> m DoubleSource

`exponential mu`

generates an Exponential variate with mean `mu`

.

levy :: Double -> Double -> m DoubleSource

`levy c alpha`

gets a Levy alpha-stable variate with scale `c`

and
exponent `alpha`

. The algorithm only works for `0 < alpha <= 2`

.

levySkew :: Double -> Double -> Double -> m DoubleSource

`levySkew c alpha beta `

gets a skew Levy alpha-stable variate
with scale `c`

, exponent `alpha`

, and skewness `beta`

. The skew
parameter must lie in the range `[-1,1]`

. The algorithm only works
for `0 < alpha <= 2`

.

poisson :: Double -> m IntSource

`poisson mu`

generates a Poisson random variable with mean `mu`

.

cauchy :: Double -> m DoubleSource

`cauchy a`

generates a Cauchy random variable with scale
parameter `a`

.

beta :: Double -> Double -> m DoubleSource

`beta a b`

generates a beta random variable with
parameters `a`

and `b`

.

logistic :: Double -> m DoubleSource

`logistic a`

generates a logistic random variable with
parameter `a`

.

pareto :: Double -> Double -> m DoubleSource

`pareto a b`

generates a Pareto random variable with
exponent `a`

and scale `b`

.

weibull :: Double -> Double -> m DoubleSource

`weibull a b`

generates a Weibull random variable with
scale `a`

and exponent `b`

.

gamma :: Double -> Double -> m DoubleSource

`gamma a b`

generates a gamma random variable with
parameters `a`

and `b`

.

multinomial :: Int -> Vector Double -> m (Vector Int)Source

`multinomial n ps`

generates a multinomial random
variable with parameters `ps`

formed by `n`

trials.

dirichlet :: Vector Double -> m (Vector Double)Source

`dirichlet alphas`

generates a Dirichlet random variable
with parameters `alphas`

.

unsafeInterleaveMC :: m a -> m aSource

Get the baton from the Monte Carlo monad without performing any computations. Useful but dangerous.

# Random distributions

# Sampling from lists

sample :: MonadMC m => [a] -> m aSource

`sample xs`

samples a value uniformly from the elements of `xs`

. The
results are undefined if `length xs`

is zero.

sampleWithWeights :: MonadMC m => [(Double, a)] -> m aSource

`sampleWithWeights wxs`

samples a value from the list with the given
weight.

sampleSubset :: MonadMC m => [a] -> Int -> m [a]Source

`sampleSubset xs k`

samples a subset of size `k`

from `xs`

by
sampling without replacement. The return value is a list of length `k`

with the elements in the subset in the order that they were sampled. Note
also that the elements are lazily generated.

sampleSubset' :: MonadMC m => [a] -> Int -> m [a]Source

Strict version of `sampleSubset`

.

sampleSubsetWithWeights :: MonadMC m => [(Double, a)] -> Int -> m [a]Source

Sample a subset of the elements with the given weights. Return the elements of the subset lazily in the order they were sampled.

sampleSubsetWithWeights' :: MonadMC m => [(Double, a)] -> Int -> m [a]Source

Strict version of `sampleSubsetWithWeights`

.

# Sampling `Int`

s

sampleInt :: MonadMC m => Int -> m IntSource

`sampleInt n`

samples integers uniformly from `[ 0..n-1 ]`

. It is an
error to call this function with a non-positive `n`

.

sampleIntWithWeights :: MonadMC m => [Double] -> Int -> m IntSource

`sampleIntWithWeights ws n`

samples integers from `[ 0..n-1 ]`

with the
probability of choosing `i`

proportional to `ws !! i`

. The list `ws`

must
have length equal to `n`

. Also, the elements of `ws`

must be non-negative
with at least one nonzero entry.

sampleIntSubset :: MonadMC m => Int -> Int -> m [Int]Source

`sampleIntSubset n k`

samples a subset of size `k`

by sampling without
replacement from the integers `{ 0, ..., n-1 }`

. The return value is a
list of length `k`

with the elements in the subset in the order that they
were sampled. Note also that the elements are lazily generated.

sampleIntSubset' :: MonadMC m => Int -> Int -> m [Int]Source

Strict version of `sampleIntSubset`

.

sampleIntSubsetWithWeights :: MonadMC m => [Double] -> Int -> Int -> m [Int]Source

`sampleIntSubsetWithWeights ws n k`

samplea size `k`

subset of
`{ 0, ..., n-1 }`

with the given weights by sampling elements without
replacement. It returns the elements of the subset lazily in the order
they were sampled.

sampleIntSubsetWithWeights' :: MonadMC m => [Double] -> Int -> Int -> m [Int]Source

Strict version of `sampleIntSubsetWithWeights`

.

# Shuffling

shuffle :: MonadMC m => [a] -> m [a]Source

`shuffle xs`

randomly permutes the list `xs`

and returns
the result. All permutations of the elements of `xs`

are equally
likely.

shuffleInt :: MonadMC m => Int -> m [(Int, Int)]Source

`shuffleInt n`

generates a sequence of swaps equivalent to a
uniformly-chosen random permutatation of the integers `{0, ..., n-1}`

.
For an input of `n`

, there are `n-1`

swaps, which are lazily generated.

shuffleInt' :: MonadMC m => Int -> m [(Int, Int)]Source

Strict version of `shuffleInt`

.

# Repeating computations

repeatMC :: MonadMC m => m a -> m [a]Source

Produce a lazy infinite list of values from the given Monte Carlo generator.

replicateMC :: MonadMC m => Int -> m a -> m [a]Source

Produce a lazy list of the given length using the specified generator.