module Numeric.Probability.Simulation where
import qualified Numeric.Probability.Distribution as Dist
import qualified Numeric.Probability.Random as Rnd
import qualified Numeric.Probability.Trace as Trace
import System.Random (Random, )
import qualified Numeric.Probability.Monad as MonadExt
class C c where
(~.) :: (Fractional prob, Ord prob, Random prob, Ord a) =>
Int -> (a -> c a) -> Rnd.Transition prob a
(~..) :: (Fractional prob, Ord prob, Random prob, Ord a) =>
(Int,Int) -> (a -> c a) -> Trace.RExpand prob a
(~*.) :: (Fractional prob, Ord prob, Random prob, Ord a) =>
(Int,Int) -> (a -> c a) -> Rnd.Transition prob a
infix 6 ~. , ~..
infix 8 ~*.
instance (Num prob, Ord prob, Random prob) => C (Dist.T prob) where
~. :: forall prob a.
(Fractional prob, Ord prob, Random prob, Ord a) =>
Int -> (a -> T prob a) -> Transition prob a
(~.) Int
x = forall (c :: * -> *) prob a.
(C c, Fractional prob, Ord prob, Random prob, Ord a) =>
Int -> (a -> c a) -> Transition prob a
(~.) Int
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall prob a.
(Num prob, Ord prob, Random prob) =>
T prob a -> Change a
Rnd.change
~.. :: forall prob a.
(Fractional prob, Ord prob, Random prob, Ord a) =>
(Int, Int) -> (a -> T prob a) -> RExpand prob a
(~..) (Int, Int)
x = forall (c :: * -> *) prob a.
(C c, Fractional prob, Ord prob, Random prob, Ord a) =>
(Int, Int) -> (a -> c a) -> RExpand prob a
(~..) (Int, Int)
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall prob a.
(Num prob, Ord prob, Random prob) =>
T prob a -> Change a
Rnd.change
~*. :: forall prob a.
(Fractional prob, Ord prob, Random prob, Ord a) =>
(Int, Int) -> (a -> T prob a) -> Transition prob a
(~*.) (Int, Int)
x = forall (c :: * -> *) prob a.
(C c, Fractional prob, Ord prob, Random prob, Ord a) =>
(Int, Int) -> (a -> c a) -> Transition prob a
(~*.) (Int, Int)
x forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall prob a.
(Num prob, Ord prob, Random prob) =>
T prob a -> Change a
Rnd.change
instance C Rnd.T where
~. :: forall prob a.
(Fractional prob, Ord prob, Random prob, Ord a) =>
Int -> (a -> T a) -> Transition prob a
(~.) Int
n a -> T a
t = forall prob a.
(Fractional prob, Ord a) =>
[T a] -> Distribution prob a
Rnd.dist forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> a -> [a]
replicate Int
n forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> T a
t
~.. :: forall prob a.
(Fractional prob, Ord prob, Random prob, Ord a) =>
(Int, Int) -> (a -> T a) -> RExpand prob a
(~..) (Int
k,Int
n) a -> T a
t = forall prob a.
(Fractional prob, Ord a) =>
[RTrace a] -> RSpace prob a
Trace.merge forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. Int -> a -> [a]
replicate Int
k forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a. Monad m => Int -> (a -> m a) -> a -> m [a]
MonadExt.walk Int
n a -> T a
t
~*. :: forall prob a.
(Fractional prob, Ord prob, Random prob, Ord a) =>
(Int, Int) -> (a -> T a) -> Transition prob a
(~*.) (Int
k,Int
n) a -> T a
t = Int
k forall (c :: * -> *) prob a.
(C c, Fractional prob, Ord prob, Random prob, Ord a) =>
Int -> (a -> c a) -> Transition prob a
~. forall (m :: * -> *) a. Monad m => Int -> (a -> m a) -> a -> m a
MonadExt.iterate Int
n a -> T a
t