# Boltzmann samplers

`Boltzmann.Data`

Define sized random generators for `Data.Data`

generic types.

```
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
import Test.QuickCheck
import Boltzmann.Data
data Term = Lambda Int Term | App Term Term | Var Int
deriving (Show, Data)
instance Arbitrary Term where
arbitrary = sized $ generatorPWith [positiveInts]
positiveInts :: Alias Gen
positiveInts =
alias $ \() -> fmap getPositive arbitrary :: Gen Int
main = sample (arbitrary :: Gen Term)
```

- Objects of the same size (number of constructors) occur with the same
probability (see Duchon et al., references below).
- Implements rejection sampling and pointing.
- Works with QuickCheck and MonadRandom, but also similar user-defined monads
for randomness (just implement
`MonadRandomLike`

).
- Can be tweaked somewhat with user defined generators.

`Boltzmann.Species`

An experimental interface to obtain Boltzmann samplers from an applicative
specification of a combinatorial system.

No documentation (yet).

## References