{- |
Lotka-Volterra predator-prey model

parameters

 * @g@ : victims' growth factor

 * @d@ : predators' death factor

 * @s@ : search rate

 * @e@ : energetic efficiency
-}

module Numeric.Probability.Example.Predator where

import Numeric.Probability.Visualize (
      Vis, Color(Green, Red),
      figP, figure, title,
      showParams, xLabel, yLabel, plotL, color, label,
   )


-- try: n>=500
-- g = 1.05
-- d = 0.95
-- s = 0.01
-- e = 0.01


g, d, s, e :: Float
g :: Float
g = Float
1.02
d :: Float
d = Float
0.98
s :: Float
s = Float
0.01
e :: Float
e = Float
0.01


-- 'direct' function-over-time approach -- very inefficient due to recursion
--
-- v :: Int -> Float
-- v 0 = 20
-- v t = ((1 + r - a*p(t-1)) * v (t-1)) `max` 0
--
-- p :: Int -> Float
-- p 0 = 15
-- p t = ((1 - d + a*b*v(t-1)) * p (t-1)) `max` 0
--
--
-- fig1 = figP figure{title="Predator/Prey Simulation "++
--                          showParams [r,d,a,b] ["r","d","a","b"],
--                    xLabel="Time (generation)",
--                    yLabel="Population"}
--             [(plotF (0,15,1) v){color=Green,label="Victim"},
--              (plotF (0,15,1) p){color=Red,label="Prey"}]

v0 :: Float
v0 :: Float
v0 = Float
1

p0 :: Float
p0 :: Float
p0 = Float
1

dv :: (Float,Float) -> Float
dv :: (Float, Float) -> Float
dv (Float
v,Float
p) = (Float
gforall a. Num a => a -> a -> a
*Float
v forall a. Num a => a -> a -> a
- Float
sforall a. Num a => a -> a -> a
*Float
vforall a. Num a => a -> a -> a
*Float
p) forall a. Ord a => a -> a -> a
`max` Float
0

dp :: (Float,Float) -> Float
dp :: (Float, Float) -> Float
dp (Float
v,Float
p) = (Float
dforall a. Num a => a -> a -> a
*Float
p forall a. Num a => a -> a -> a
+ Float
eforall a. Num a => a -> a -> a
*Float
vforall a. Num a => a -> a -> a
*Float
p) forall a. Ord a => a -> a -> a
`max` Float
0

dvp :: (Float, Float) -> (Float, Float)
dvp :: (Float, Float) -> (Float, Float)
dvp (Float, Float)
vp' = ((Float, Float) -> Float
dv (Float, Float)
vp', (Float, Float) -> Float
dp (Float, Float)
vp')

vp :: [(Float, Float)]
vp :: [(Float, Float)]
vp = (Float
v0,Float
p0)forall a. a -> [a] -> [a]
:forall a b. (a -> b) -> [a] -> [b]
map (Float, Float) -> (Float, Float)
dvp [(Float, Float)]
vp

vs :: [Float]
vs :: [Float]
vs = forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> a
fst [(Float, Float)]
vp

ps :: [Float]
ps :: [Float]
ps = forall a b. (a -> b) -> [a] -> [b]
map forall a b. (a, b) -> b
snd [(Float, Float)]
vp


fig1 :: Int -> Vis
fig1 :: Int -> Vis
fig1 Int
n = FigureEnv -> [Plot] -> Vis
figP FigureEnv
figure{title :: String
title=String
"Predator/Prey Simulation "forall a. [a] -> [a] -> [a]
++
                         forall a. Show a => [a] -> [String] -> String
showParams [Float
g,Float
d,Float
s,Float
e] [String
"g",String
"d",String
"s",String
"e"],
                   xLabel :: String
xLabel=String
"Time (generation)",
                   yLabel :: String
yLabel=String
"Population"}
            [(forall a. ToFloat a => [a] -> Plot
plotL (forall a. Int -> [a] -> [a]
take Int
n [Float]
vs)){color :: Color
color=Color
Green,label :: String
label=String
"Victim"},
             (forall a. ToFloat a => [a] -> Plot
plotL (forall a. Int -> [a] -> [a]
take Int
n [Float]
ps)){color :: Color
color=Color
Red,label :: String
label=String
"Prey"}]