module Zwirn.Core.Random where
import Control.Monad (join)
import System.Random
import Zwirn.Core.Core
import Zwirn.Core.Modulate
import Zwirn.Core.Query
import Zwirn.Core.Types
randR :: (Random a, Applicative k) => ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
randR :: forall a (k :: * -> *) st i.
(Random a, Applicative k) =>
ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
randR ZwirnT k st i a
l ZwirnT k st i a
r = (Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
forall st (k :: * -> *) i a.
(Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
zwirn Time -> st -> k (Value i a, st)
q
where
q :: Time -> st -> k (Value i a, st)
q Time
t = ZwirnT k st i a -> Time -> st -> k (Value i a, st)
forall (k :: * -> *) st i a.
ZwirnT k st i a -> Time -> st -> k (Value i a, st)
unzwirn (((a, StdGen) -> a) -> ZwirnT k st i (a, StdGen) -> ZwirnT k st i a
forall a b. (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, StdGen) -> a
forall a b. (a, b) -> a
fst (ZwirnT k st i (a, StdGen) -> ZwirnT k st i a)
-> ZwirnT k st i (a, StdGen) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ ((a, a) -> StdGen -> (a, StdGen))
-> ZwirnT k st i (a, a)
-> ZwirnT k st i StdGen
-> ZwirnT k st i (a, StdGen)
forall a b c.
(a -> b -> c)
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (a, a) -> StdGen -> (a, StdGen)
forall g. RandomGen g => (a, a) -> g -> (a, g)
forall a g. (Random a, RandomGen g) => (a, a) -> g -> (a, g)
randomR ZwirnT k st i (a, a)
zipp (ZwirnT k st i StdGen -> ZwirnT k st i (a, StdGen))
-> ZwirnT k st i StdGen -> ZwirnT k st i (a, StdGen)
forall a b. (a -> b) -> a -> b
$ StdGen -> ZwirnT k st i StdGen
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (StdGen -> ZwirnT k st i StdGen) -> StdGen -> ZwirnT k st i StdGen
forall a b. (a -> b) -> a -> b
$ Int -> StdGen
mkStdGen (Int -> StdGen) -> Int -> StdGen
forall a b. (a -> b) -> a -> b
$ Time -> Int
forall b. Integral b => Time -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor (Time
t Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/ Time
precision)) Time
t
where
zipp :: ZwirnT k st i (a, a)
zipp = (a -> a -> (a, a))
-> ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i (a, a)
forall a b c.
(a -> b -> c)
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (,) ZwirnT k st i a
l ZwirnT k st i a
r
rand :: (Random a, Applicative k) => ZwirnT k st i a
rand :: forall a (k :: * -> *) st i.
(Random a, Applicative k) =>
ZwirnT k st i a
rand = (Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
forall st (k :: * -> *) i a.
(Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
zwirn ((Time -> st -> k (Value i a, st)) -> ZwirnT k st i a)
-> (Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ \Time
t st
st -> (Value i a, st) -> k (Value i a, st)
forall a. a -> k a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Time -> [i] -> Value i a
forall i a. a -> Time -> [i] -> Value i a
Value ((a, StdGen) -> a
forall a b. (a, b) -> a
fst ((a, StdGen) -> a) -> (a, StdGen) -> a
forall a b. (a -> b) -> a -> b
$ StdGen -> (a, StdGen)
forall g. RandomGen g => g -> (a, g)
forall a g. (Random a, RandomGen g) => g -> (a, g)
random (Int -> StdGen
mkStdGen (Int -> StdGen) -> Int -> StdGen
forall a b. (a -> b) -> a -> b
$ Time -> Int
forall b. Integral b => Time -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor (Time
t Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/ Time
precision))) Time
t [], st
st)
noise :: (Applicative k) => ZwirnT k st i Double
noise :: forall (k :: * -> *) st i. Applicative k => ZwirnT k st i Double
noise = ZwirnT k st i Double
forall a (k :: * -> *) st i.
(Random a, Applicative k) =>
ZwirnT k st i a
rand
irand :: (Applicative k) => ZwirnT k st i Int -> ZwirnT k st i Int
irand :: forall (k :: * -> *) st i.
Applicative k =>
ZwirnT k st i Int -> ZwirnT k st i Int
irand = ZwirnT k st i Int -> ZwirnT k st i Int -> ZwirnT k st i Int
forall a (k :: * -> *) st i.
(Random a, Applicative k) =>
ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
randR (Int -> ZwirnT k st i Int
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
0)
brandBy :: (Applicative k) => ZwirnT k st i Double -> ZwirnT k st i Bool
brandBy :: forall (k :: * -> *) st i.
Applicative k =>
ZwirnT k st i Double -> ZwirnT k st i Bool
brandBy ZwirnT k st i Double
prob = (Double -> Double -> Bool)
-> ZwirnT k st i Double
-> ZwirnT k st i Double
-> ZwirnT k st i Bool
forall a b c.
(a -> b -> c)
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
(>) ZwirnT k st i Double
prob ZwirnT k st i Double
forall a (k :: * -> *) st i.
(Random a, Applicative k) =>
ZwirnT k st i a
rand
sometimesBy :: (MultiMonad k) => ZwirnT k st i Double -> (ZwirnT k st i a -> ZwirnT k st i a) -> ZwirnT k st i a -> ZwirnT k st i a
sometimesBy :: forall (k :: * -> *) st i a.
MultiMonad k =>
ZwirnT k st i Double
-> (ZwirnT k st i a -> ZwirnT k st i a)
-> ZwirnT k st i a
-> ZwirnT k st i a
sometimesBy ZwirnT k st i Double
prob ZwirnT k st i a -> ZwirnT k st i a
f ZwirnT k st i a
x = ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall a. ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall (m :: * -> *) a. MultiMonad m => m (m a) -> m a
innerJoin (ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a)
-> ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ (Bool -> ZwirnT k st i a)
-> ZwirnT k st i Bool -> ZwirnT k st i (ZwirnT k st i a)
forall a b. (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Bool -> ZwirnT k st i a
cho (ZwirnT k st i Double -> ZwirnT k st i Bool
forall (k :: * -> *) st i.
Applicative k =>
ZwirnT k st i Double -> ZwirnT k st i Bool
brandBy ZwirnT k st i Double
prob)
where
cho :: Bool -> ZwirnT k st i a
cho Bool
True = ZwirnT k st i a -> ZwirnT k st i a
f ZwirnT k st i a
x
cho Bool
False = ZwirnT k st i a
x
randR' :: (Random a, Applicative k) => ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
randR' :: forall a (k :: * -> *) st i.
(Random a, Applicative k) =>
ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
randR' ZwirnT k st i a
r ZwirnT k st i a
l = (Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
forall st (k :: * -> *) i a.
(Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
zwirn Time -> st -> k (Value i a, st)
q
where
q :: Time -> st -> k (Value i a, st)
q Time
t = ZwirnT k st i a -> Time -> st -> k (Value i a, st)
forall (k :: * -> *) st i a.
ZwirnT k st i a -> Time -> st -> k (Value i a, st)
unzwirn (((a, StdGen) -> a) -> ZwirnT k st i (a, StdGen) -> ZwirnT k st i a
forall a b. (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, StdGen) -> a
forall a b. (a, b) -> a
fst (ZwirnT k st i (a, StdGen) -> ZwirnT k st i a)
-> ZwirnT k st i (a, StdGen) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ ((a, a) -> StdGen -> (a, StdGen))
-> ZwirnT k st i (a, a)
-> ZwirnT k st i StdGen
-> ZwirnT k st i (a, StdGen)
forall a b c.
(a -> b -> c)
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (a, a) -> StdGen -> (a, StdGen)
forall g. RandomGen g => (a, a) -> g -> (a, g)
forall a g. (Random a, RandomGen g) => (a, a) -> g -> (a, g)
randomR ZwirnT k st i (a, a)
zipp (ZwirnT k st i StdGen -> ZwirnT k st i (a, StdGen))
-> ZwirnT k st i StdGen -> ZwirnT k st i (a, StdGen)
forall a b. (a -> b) -> a -> b
$ StdGen -> ZwirnT k st i StdGen
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (StdGen -> ZwirnT k st i StdGen) -> StdGen -> ZwirnT k st i StdGen
forall a b. (a -> b) -> a -> b
$ Int -> StdGen
mkStdGen (Int -> StdGen) -> Int -> StdGen
forall a b. (a -> b) -> a -> b
$ Time -> Int
forall b. Integral b => Time -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor Time
t) Time
t
where
zipp :: ZwirnT k st i (a, a)
zipp = (a -> a -> (a, a))
-> ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i (a, a)
forall a b c.
(a -> b -> c)
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (,) ZwirnT k st i a
l ZwirnT k st i a
r
rand' :: (Random a, Applicative k) => ZwirnT k st i a
rand' :: forall a (k :: * -> *) st i.
(Random a, Applicative k) =>
ZwirnT k st i a
rand' = (Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
forall st (k :: * -> *) i a.
(Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
zwirn ((Time -> st -> k (Value i a, st)) -> ZwirnT k st i a)
-> (Time -> st -> k (Value i a, st)) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ \Time
t st
st -> (Value i a, st) -> k (Value i a, st)
forall a. a -> k a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (a -> Time -> [i] -> Value i a
forall i a. a -> Time -> [i] -> Value i a
Value ((a, StdGen) -> a
forall a b. (a, b) -> a
fst ((a, StdGen) -> a) -> (a, StdGen) -> a
forall a b. (a -> b) -> a -> b
$ StdGen -> (a, StdGen)
forall g. RandomGen g => g -> (a, g)
forall a g. (Random a, RandomGen g) => g -> (a, g)
random (Int -> StdGen
mkStdGen (Int -> StdGen) -> Int -> StdGen
forall a b. (a -> b) -> a -> b
$ Time -> Int
forall b. Integral b => Time -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor Time
t)) Time
t [], st
st)
irand' :: (Applicative k) => ZwirnT k st i Int -> ZwirnT k st i Int
irand' :: forall (k :: * -> *) st i.
Applicative k =>
ZwirnT k st i Int -> ZwirnT k st i Int
irand' = ZwirnT k st i Int -> ZwirnT k st i Int -> ZwirnT k st i Int
forall a (k :: * -> *) st i.
(Random a, Applicative k) =>
ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
randR' (Int -> ZwirnT k st i Int
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Int
0)
brandBy' :: (Applicative k) => ZwirnT k st i Double -> ZwirnT k st i Bool
brandBy' :: forall (k :: * -> *) st i.
Applicative k =>
ZwirnT k st i Double -> ZwirnT k st i Bool
brandBy' ZwirnT k st i Double
prob = (Double -> Double -> Bool)
-> ZwirnT k st i Double
-> ZwirnT k st i Double
-> ZwirnT k st i Bool
forall a b c.
(a -> b -> c)
-> ZwirnT k st i a -> ZwirnT k st i b -> ZwirnT k st i c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 Double -> Double -> Bool
forall a. Ord a => a -> a -> Bool
(>) ZwirnT k st i Double
prob ZwirnT k st i Double
forall a (k :: * -> *) st i.
(Random a, Applicative k) =>
ZwirnT k st i a
rand'
chooseWithSeed :: (Monad k) => Int -> [ZwirnT k st i a] -> ZwirnT k st i a
chooseWithSeed :: forall (k :: * -> *) st i a.
Monad k =>
Int -> [ZwirnT k st i a] -> ZwirnT k st i a
chooseWithSeed Int
i [ZwirnT k st i a]
ps = ([ZwirnT k st i a]
ps [ZwirnT k st i a] -> Int -> ZwirnT k st i a
forall a. HasCallStack => [a] -> Int -> a
!!) (Int -> ZwirnT k st i a) -> ZwirnT k st i Int -> ZwirnT k st i a
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ZwirnT k st i Time -> ZwirnT k st i Int -> ZwirnT k st i Int
forall (k :: * -> *) st i a.
Monad k =>
ZwirnT k st i Time -> ZwirnT k st i a -> ZwirnT k st i a
shift (Time -> ZwirnT k st i Time
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Time -> ZwirnT k st i Time) -> Time -> ZwirnT k st i Time
forall a b. (a -> b) -> a -> b
$ Int -> Time
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
i Time -> Time -> Time
forall a. Fractional a => a -> a -> a
/ Time
precision) (ZwirnT k st i Int -> ZwirnT k st i Int
forall (k :: * -> *) st i.
Applicative k =>
ZwirnT k st i Int -> ZwirnT k st i Int
irand' (ZwirnT k st i Int -> ZwirnT k st i Int)
-> ZwirnT k st i Int -> ZwirnT k st i Int
forall a b. (a -> b) -> a -> b
$ Int -> ZwirnT k st i Int
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Int -> ZwirnT k st i Int) -> Int -> ZwirnT k st i Int
forall a b. (a -> b) -> a -> b
$ [ZwirnT k st i a] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [ZwirnT k st i a]
ps Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1)
chooseList :: (Monad k) => [ZwirnT k st i a] -> ZwirnT k st i a
chooseList :: forall (k :: * -> *) st i a.
Monad k =>
[ZwirnT k st i a] -> ZwirnT k st i a
chooseList = Int -> [ZwirnT k st i a] -> ZwirnT k st i a
forall (k :: * -> *) st i a.
Monad k =>
Int -> [ZwirnT k st i a] -> ZwirnT k st i a
chooseWithSeed Int
0
enumFromToChoice :: (Ord a, Num a, Monad k) => Int -> ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
enumFromToChoice :: forall a (k :: * -> *) st i.
(Ord a, Num a, Monad k) =>
Int -> ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
enumFromToChoice Int
i ZwirnT k st i a
xz ZwirnT k st i a
yz = ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a)
-> ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ a -> a -> ZwirnT k st i a
forall {k :: * -> *} {a} {st} {i}.
(Monad k, Ord a, Num a) =>
a -> a -> ZwirnT k st i a
en (a -> a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (a -> ZwirnT k st i a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ZwirnT k st i a
xz ZwirnT k st i (a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i a
yz
where
en :: a -> a -> ZwirnT k st i a
en a
x a
y = Int -> [ZwirnT k st i a] -> ZwirnT k st i a
forall (k :: * -> *) st i a.
Monad k =>
Int -> [ZwirnT k st i a] -> ZwirnT k st i a
chooseWithSeed Int
i ([ZwirnT k st i a] -> ZwirnT k st i a)
-> [ZwirnT k st i a] -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ (a -> ZwirnT k st i a) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> [a] -> [b]
map a -> ZwirnT k st i a
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([a] -> [ZwirnT k st i a]) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> a -> b
$ a -> a -> [a]
forall a. (Ord a, Num a) => a -> a -> [a]
enumerateFromTo a
x a
y
enumFromThenToChoice :: (Ord a, Num a, Monad k) => Int -> ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a -> ZwirnT k st i a
enumFromThenToChoice :: forall a (k :: * -> *) st i.
(Ord a, Num a, Monad k) =>
Int
-> ZwirnT k st i a
-> ZwirnT k st i a
-> ZwirnT k st i a
-> ZwirnT k st i a
enumFromThenToChoice Int
i ZwirnT k st i a
xz ZwirnT k st i a
yz ZwirnT k st i a
zz = ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a)
-> ZwirnT k st i (ZwirnT k st i a) -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ a -> a -> a -> ZwirnT k st i a
forall {k :: * -> *} {a} {st} {i}.
(Monad k, Ord a, Num a) =>
a -> a -> a -> ZwirnT k st i a
en (a -> a -> a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (a -> a -> ZwirnT k st i a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ZwirnT k st i a
xz ZwirnT k st i (a -> a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (a -> ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i a
yz ZwirnT k st i (a -> ZwirnT k st i a)
-> ZwirnT k st i a -> ZwirnT k st i (ZwirnT k st i a)
forall a b.
ZwirnT k st i (a -> b) -> ZwirnT k st i a -> ZwirnT k st i b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> ZwirnT k st i a
zz
where
en :: a -> a -> a -> ZwirnT k st i a
en a
x a
y a
z = Int -> [ZwirnT k st i a] -> ZwirnT k st i a
forall (k :: * -> *) st i a.
Monad k =>
Int -> [ZwirnT k st i a] -> ZwirnT k st i a
chooseWithSeed Int
i ([ZwirnT k st i a] -> ZwirnT k st i a)
-> [ZwirnT k st i a] -> ZwirnT k st i a
forall a b. (a -> b) -> a -> b
$ (a -> ZwirnT k st i a) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> [a] -> [b]
map a -> ZwirnT k st i a
forall a. a -> ZwirnT k st i a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([a] -> [ZwirnT k st i a]) -> [a] -> [ZwirnT k st i a]
forall a b. (a -> b) -> a -> b
$ a -> a -> a -> [a]
forall a. (Ord a, Num a) => a -> a -> a -> [a]
enumerateFromThenTo a
x a
y a
z