Attackers in intervals now also work.

This commit is contained in:
Stefan Dresselhaus
2018-06-21 16:15:43 +02:00
parent 6dfc7e1ae0
commit f478f0ecb6
4 changed files with 57 additions and 33 deletions

View File

@ -16,6 +16,7 @@ import System.IO
import System.Environment
import Data.Aeson
import qualified Data.ByteString as BS
import qualified Data.ByteString.Lazy as LBS
import Options.Applicative
import Data.Semigroup ((<>))
@ -47,10 +48,9 @@ exampleEnvironment addedC es pred tox =
, toxicCompounds = tox --[(Produced FPP,0.1)] ++ tox
, possibleEnzymes = es -- [pps,fpps] ++ es
, settings = Settings { automimicry = False
, predatorsRandom = False
, predatorBehaviour = AttackInterval 10
, numPlants = 50
, logEveryNIterations = 10
, verbose = True
}
}
@ -83,8 +83,8 @@ exampleEnvironment addedC es pred tox =
-- Running the simulation
-- ----------------------
loop :: Int -> [Plant] -> Simulation -> IO ()
loop loopAmount ps env = loop' loopAmount 0 ps env
loop :: Int -> [Plant] -> Simulation -> CLIOptions -> IO ()
loop loopAmount ps env opts = loop' loopAmount 0 ps env
where
-- cache enzyme colorful-strings
@ -96,7 +96,7 @@ loop loopAmount ps env = loop' loopAmount 0 ps env
) <$> possibleEnzymes (snd env)
toxins :: [(Compound, Amount)]
toxins = toxicCompounds (snd env)
printEverything = verbose.settings.snd $ env
printEverything = verbose opts
padded i str = take i $ str ++ repeat ' '
printEvery = 10
loop' :: Int -> Int -> [Plant] -> Simulation -> IO ()
@ -107,15 +107,19 @@ loop loopAmount ps env = loop' loopAmount 0 ps env
putStrLn ""
putStrLn $ "Generation " ++ show curLoop ++ " of " ++ show loopAmount ++ ":"
newPlants <- simulate s $ do
when (curLoop == 0) $
tell $ "num_iter"
++ ",c_sum_mu,c_sum_sigma"
++ ",c_d_mu,c_d_sigma"
++ ",e_d_mu,e_d_sigma"
++ ",fitness_mean,fitness_sigma"
++ ",percent_toxic_mean,percent_toxic_sigma"
when (curLoop == 0) $ do
preds <- length <$> fromEnv predators
--- generates "pred1,pred2,pred3,.....predN"
let additionalHeader = intercalate "," $ ("pred"++).show <$> [1..preds]
tell $ "num_iter"
++ ",c_sum_mu,c_sum_sigma"
++ ",c_d_mu,c_d_sigma"
++ ",e_d_mu,e_d_sigma"
++ ",fitness_mean,fitness_sigma"
++ ",percent_toxic_mean,percent_toxic_sigma"
++ "," ++ additionalHeader
logIter <- fromEnv $ logEveryNIterations . settings
(!fs,cs) <- unzip <$> fitness plants
(!fs,cs) <- unzip <$> fitness curLoop plants
txns <- fmap (fromEnum . fst) <$> fromEnv toxicCompounds -- [Int] of id's of toxic compounds
let fps = zip plants fs -- gives us plants & their fitness in a tuple
sumFitness = sum fs
@ -164,13 +168,17 @@ loop loopAmount ps env = loop' loopAmount 0 ps env
putStrLn $ "Percentage of toxins in Cmpnds= " ++ show toxs
hFlush stdout
threadDelay $ 10*1000 -- sleep x*1000ns (=x ~ ms)
when (curLoop `mod` logIter == 0) $
when (curLoop `mod` logIter == 0) $ do
preds <- fmap fst <$> fromEnv predators
let numPlantsCanRepel = (\ir -> sum $ (\p -> if sum ((p LA.!) <$> ir) > 0 then 1 else 0) <$> cs) . fmap fromEnum . irresistance <$> preds
addedData = intercalate "," $ show <$> numPlantsCanRepel
tell $ show curLoop
++ "," ++ show c_sum_mu ++ "," ++ show c_sum_sigma
++ "," ++ show c_d_mu ++ "," ++ show c_d_sigma
++ "," ++ show e_d_mu ++ "," ++ show e_d_sigma
++ "," ++ show (fst fns) ++ "," ++ show (snd fns)
++ "," ++ show (fst toxs) ++ "," ++ show (snd toxs)
++ "," ++ addedData
-- generate x new plants.
np <- fromEnv (numPlants . settings)
sequence . flip fmap [1..np] $ \_ -> do
@ -190,6 +198,7 @@ loop loopAmount ps env = loop' loopAmount 0 ps env
data CLIOptions = CLIOptions
{ environment :: Maybe FilePath
, logfile :: FilePath
, verbose :: Bool
}
cliOptParser :: Parser CLIOptions
@ -208,6 +217,11 @@ cliOptParser = CLIOptions
<> value "simulation.log"
<> help "Name for the logfile"
)
<*> switch
(long "verbose"
<> short 'v'
<> help "show 'gui' during process"
)
cliopts = info (cliOptParser <**> helper)
(fullDesc
@ -236,15 +250,15 @@ main = do
putStrLn $ "reading environment: " ++ file
decodeStrict' <$> BS.readFile file
let emptyPlants = replicate (numPlants . settings $ env) emptyPlant
printEverything = verbose.settings $ env
printEverything = verbose opts
enzs <- randomRs (0,length (possibleEnzymes env) - 1) <$> newStdGen
let startPlants = randomGenome 1 enzs (possibleEnzymes env) emptyPlants
--writeFile "poison.twopi" $ generateDotFromPoisonTree "poison" 0.5 poisonedTree
--writeFile "environment.json" . encode $ env
LBS.writeFile "environment.json" . encode $ env
when printEverything $ putStr "\ESC[?1049h"
loghandle <- openFile (logfile opts) WriteMode
putStrLn $ "logging to: " ++ logfile opts
loop 2000 startPlants (loghandle,env)
loop 2000 startPlants (loghandle,env) opts
hClose loghandle
when printEverything $ do
putStrLn "Simulation ended. Press key to exit."