{-# LANGUAGE MultiParamTypeClasses #-}{-# LANGUAGE FunctionalDependencies #-}{-# LANGUAGE FlexibleInstances #-}{-# LANGUAGE UndecidableInstances #-}{- | Portability: Multi-parameter type class with functional dependency Abstract interface to probabilistic objects like random generators and probability distributions. It allows to use the same code both for computing complete distributions and for generating random values according to the distribution. The latter one is of course more efficient and may be used for approximation of the distribution by simulation. Maybe a better name is @Experiment@. -}moduleNumeric.Probability.ObjectwhereimportqualifiedNumeric.Probability.Distribution asDistimportqualifiedNumeric.Probability.Random asRndimportqualifiedNumeric.Probability.Shape asShapeimportqualifiedData.ListasListimportqualifiedControl.Monad.Trans.ExceptasMEimportControl.Monad(liftM,)classMonadobj =>C prob obj |obj ->prob wherefromFrequencies ::[(a ,prob )]->obj a instanceC DoubleRnd.T wherefromFrequencies :: forall a. [(a, Double)] -> T a fromFrequencies =forall prob a. (Num prob, Ord prob, Random prob) => T prob a -> T a Rnd.pick forall b c a. (b -> c) -> (a -> b) -> a -> c .forall prob a. Fractional prob => [(a, prob)] -> T prob a Dist.fromFreqs instanceFractionalprob =>C prob (Dist.T prob )wherefromFrequencies :: forall a. [(a, prob)] -> T prob a fromFrequencies =forall prob a. Fractional prob => [(a, prob)] -> T prob a Dist.fromFreqs instanceC prob obj =>C prob (ME.ExceptTb obj )wherefromFrequencies :: forall a. [(a, prob)] -> ExceptT b obj a fromFrequencies =forall e (m :: * -> *) a. m (Either e a) -> ExceptT e m a ME.ExceptTforall b c a. (b -> c) -> (a -> b) -> a -> c .forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r liftMforall a b. b -> Either a b Rightforall b c a. (b -> c) -> (a -> b) -> a -> c .forall prob (obj :: * -> *) a. C prob obj => [(a, prob)] -> obj a fromFrequencies typeSpread obj a =[a ]->obj a shape ::(C prob obj ,Fractionalprob )=>(prob ->prob )->Spread obj a shape :: forall prob (obj :: * -> *) a. (C prob obj, Fractional prob) => (prob -> prob) -> Spread obj a shape prob -> prob _[]=forall a. HasCallStack => [Char] -> a error[Char] "Probability.shape: empty list"shape prob -> prob f [a] xs =letincr :: prob incr =prob 1forall a. Fractional a => a -> a -> a /forall a b. (Integral a, Num b) => a -> b fromIntegral(forall (t :: * -> *) a. Foldable t => t a -> Int length[a] xs forall a. Num a => a -> a -> a -Int 1)ps :: [prob] ps =forall a b. (a -> b) -> [a] -> [b] List.mapprob -> prob f (forall a. (a -> a) -> a -> [a] iterate(forall a. Num a => a -> a -> a +prob incr )prob 0)inforall prob (obj :: * -> *) a. C prob obj => [(a, prob)] -> obj a fromFrequencies (forall a b. [a] -> [b] -> [(a, b)] zip[a] xs [prob] ps )linear ::(C prob obj ,Fractionalprob )=>Spread obj a linear :: forall prob (obj :: * -> *) a. (C prob obj, Fractional prob) => Spread obj a linear =forall prob (obj :: * -> *) a. (C prob obj, Fractional prob) => (prob -> prob) -> Spread obj a shape forall prob. Fractional prob => T prob Shape.linear uniform ::(C prob obj ,Fractionalprob )=>Spread obj a uniform :: forall prob (obj :: * -> *) a. (C prob obj, Fractional prob) => Spread obj a uniform =forall prob (obj :: * -> *) a. (C prob obj, Fractional prob) => (prob -> prob) -> Spread obj a shape forall prob. Fractional prob => T prob Shape.uniform negExp ::(C prob obj ,Floatingprob )=>Spread obj a negExp :: forall prob (obj :: * -> *) a. (C prob obj, Floating prob) => Spread obj a negExp =forall prob (obj :: * -> *) a. (C prob obj, Fractional prob) => (prob -> prob) -> Spread obj a shape forall prob. Floating prob => T prob Shape.negExp normal ::(C prob obj ,Floatingprob )=>Spread obj a normal :: forall prob (obj :: * -> *) a. (C prob obj, Floating prob) => Spread obj a normal =forall prob (obj :: * -> *) a. (C prob obj, Fractional prob) => (prob -> prob) -> Spread obj a shape forall prob. Floating prob => T prob Shape.normal enum ::(C prob obj ,Floatingprob )=>[Int]->Spread obj a enum :: forall prob (obj :: * -> *) a. (C prob obj, Floating prob) => [Int] -> Spread obj a enum =forall prob (obj :: * -> *) a. (C prob obj, Floating prob) => [prob] -> Spread obj a relative forall b c a. (b -> c) -> (a -> b) -> a -> c .forall a b. (a -> b) -> [a] -> [b] List.mapforall a b. (Integral a, Num b) => a -> b fromIntegral{- | Give a list of frequencies, they do not need to sum up to 1. -}relative ::(C prob obj ,Floatingprob )=>[prob ]->Spread obj a relative :: forall prob (obj :: * -> *) a. (C prob obj, Floating prob) => [prob] -> Spread obj a relative [prob] ns =forall prob (obj :: * -> *) a. C prob obj => [(a, prob)] -> obj a fromFrequencies forall b c a. (b -> c) -> (a -> b) -> a -> c .forall a b c. (a -> b -> c) -> b -> a -> c flipforall a b. [a] -> [b] -> [(a, b)] zip[prob] ns