module Simulation.Aivika.Experiment
(Experiment(..),
defaultExperiment,
runExperiment,
runExperimentParallel,
ExperimentData(..),
experimentDataInStartTime,
experimentSeriesProviders,
experimentMixedSignal,
Series(..),
SeriesEntity(..),
SeriesProvider(..),
SeriesListWithSubscript,
SeriesArrayWithSubscript,
seriesListWithSubscript,
seriesArrayWithSubscript,
View(..),
Generator(..),
Reporter(..),
DirectoryName(..),
resolveDirectoryName,
FileName(..),
resolveFileName) where
import Control.Monad
import Control.Monad.State
import Control.Concurrent.ParallelIO.Local
import qualified Data.Map as M
import Data.Array
import Data.Maybe
import Data.Monoid
import qualified System.IO.UTF8 as UTF8
import System.Directory
import System.FilePath (combine)
import GHC.Conc (getNumCapabilities)
import Simulation.Aivika.Dynamics
import Simulation.Aivika.Dynamics.Simulation
import Simulation.Aivika.Dynamics.Signal
import Simulation.Aivika.Dynamics.Ref
import Simulation.Aivika.Dynamics.Var
import Simulation.Aivika.Dynamics.UVar
import Simulation.Aivika.Dynamics.EventQueue
import Simulation.Aivika.Dynamics.Parameter
import Simulation.Aivika.Statistics
import Simulation.Aivika.Experiment.HtmlWriter
import Simulation.Aivika.Experiment.Utils (replace)
data Experiment =
Experiment { experimentSpecs :: Specs,
experimentRunCount :: Int,
experimentDirectoryName :: DirectoryName,
experimentTitle :: String,
experimentDescription :: String,
experimentVerbose :: Bool,
experimentGenerators :: [Generator],
experimentIndexHtml :: Experiment -> [Reporter] -> FilePath -> IO (),
experimentNumCapabilities :: IO Int
}
defaultExperiment :: Experiment
defaultExperiment =
Experiment { experimentSpecs = Specs 0 10 0.01 RungeKutta4,
experimentRunCount = 1,
experimentDirectoryName = UniqueDirectoryName "experiment",
experimentTitle = "Simulation Experiment",
experimentDescription = "",
experimentVerbose = True,
experimentGenerators = [],
experimentIndexHtml = createIndexHtml,
experimentNumCapabilities = getNumCapabilities }
data Generator =
Generator { generateReporter :: Experiment -> FilePath -> IO Reporter
}
class View v where
outputView :: v -> Generator
class Series s where
seriesEntity :: String -> s -> SeriesEntity
data SeriesEntity =
SeriesEntity { seriesProviders :: [SeriesProvider]
}
data SeriesProvider =
SeriesProvider { providerName :: String,
providerToDouble :: Maybe (Dynamics Double),
providerToDoubleStats :: Maybe (Dynamics (SamplingStats Double)),
providerToDoubleList :: Maybe (Dynamics [Double]),
providerToInt :: Maybe (Dynamics Int),
providerToIntStats :: Maybe (Dynamics (SamplingStats Int)),
providerToIntList :: Maybe (Dynamics [Int]),
providerToString :: Maybe (Dynamics String),
providerSignal :: Maybe (Signal ())
}
data ExperimentData =
ExperimentData { experimentQueue :: EventQueue,
experimentSignalInIntegTimes :: Signal Double,
experimentSignalInStartTime :: Signal Double,
experimentSignalInStopTime :: Signal Double,
experimentSeries :: M.Map String SeriesEntity
}
experimentDataInStartTime :: EventQueue -> [(String, SeriesEntity)] -> Simulation ExperimentData
experimentDataInStartTime q m = runDynamicsInStartTime d where
d = do signalInIntegTimes <- newSignalInIntegTimes q
signalInStartTime <- newSignalInStartTime q
signalInStopTime <- newSignalInStopTime q
let series = M.fromList m
return ExperimentData { experimentQueue = q,
experimentSignalInIntegTimes = signalInIntegTimes,
experimentSignalInStartTime = signalInStartTime,
experimentSignalInStopTime = signalInStopTime,
experimentSeries = series }
experimentMixedSignal :: ExperimentData -> [SeriesProvider] -> Signal ()
experimentMixedSignal expdata providers =
let xs0 = map providerSignal providers
xs1 = filter isJust xs0
xs2 = filter isNothing xs0
signal1 = mconcat $ map fromJust xs1
signal2 = if null xs2
then signal3 <> signal4
else signal5
signal3 = void $ experimentSignalInStartTime expdata
signal4 = void $ experimentSignalInStopTime expdata
signal5 = void $ experimentSignalInIntegTimes expdata
in signal1 <> signal2
experimentSeriesProviders :: ExperimentData -> [String] -> [SeriesProvider]
experimentSeriesProviders expdata labels =
join $ flip map labels $ \label ->
case M.lookup label (experimentSeries expdata) of
Nothing ->
error $
"There is no series with label " ++ label ++
": experimentSeriesProviders"
Just entity ->
seriesProviders entity
data Reporter =
Reporter { reporterInitialise :: IO (),
reporterFinalise :: IO (),
reporterSimulate :: ExperimentData ->
Dynamics (Dynamics ()),
reporterTOCHtml :: Int -> HtmlWriter (),
reporterHtml :: Int -> HtmlWriter ()
}
runExperiment :: Experiment -> Simulation ExperimentData -> IO ()
runExperiment = runExperimentWithExecutor sequence_
runExperimentParallel :: Experiment -> Simulation ExperimentData -> IO ()
runExperimentParallel e = runExperimentWithExecutor executor e
where executor tasks =
do n <- experimentNumCapabilities e
withPool n $ \pool ->
parallel_ pool tasks
runExperimentWithExecutor :: ([IO ()] -> IO ()) ->
Experiment ->
Simulation ExperimentData -> IO ()
runExperimentWithExecutor executor e simulation =
do let specs = experimentSpecs e
runCount = experimentRunCount e
dirName = experimentDirectoryName e
generators = experimentGenerators e
path <- resolveDirectoryName Nothing dirName M.empty
when (experimentVerbose e) $
do putStr "Using directory "
putStrLn path
createDirectoryIfMissing True path
reporters <- mapM (\x -> generateReporter x e path)
generators
forM_ reporters reporterInitialise
let simulate :: Simulation ()
simulate =
do d <- simulation
fs <- runDynamicsInStartTime $
forM reporters $ \reporter ->
reporterSimulate reporter d
runDynamicsInStopTime $
do updateSignal $
experimentMixedSignal d $
join $ map seriesProviders $
M.elems $ experimentSeries d
sequence_ fs
executor $ runSimulations simulate specs runCount
forM_ reporters reporterFinalise
experimentIndexHtml e e reporters path
return ()
createIndexHtml :: Experiment -> [Reporter] -> FilePath -> IO ()
createIndexHtml e reporters path =
do let html :: HtmlWriter ()
html =
writeHtmlDocumentWithTitle (experimentTitle e) $
do writeHtmlList $
forM_ (zip [1..] reporters) $ \(i, reporter) ->
reporterTOCHtml reporter i
writeHtmlBreak
unless (null $ experimentDescription e) $
writeHtmlParagraph $
writeHtmlText $ experimentDescription e
forM_ (zip [1..] reporters) $ \(i, reporter) ->
reporterHtml reporter i
file = combine path "index.html"
((), contents) <- runHtmlWriter html id
UTF8.writeFile file (contents [])
when (experimentVerbose e) $
do putStr "Generated file "
putStrLn file
data DirectoryName = WritableDirectoryName String
| UniqueDirectoryName String
data FileName = WritableFileName String String
| UniqueFileName String String
resolveDirectoryName :: Maybe FilePath -> DirectoryName -> M.Map String String -> IO String
resolveDirectoryName dir (WritableDirectoryName name) map =
return $ replaceName (combineName dir name) map
resolveDirectoryName dir (UniqueDirectoryName name) map =
let x = replaceName name map
loop y i =
do let n = combineName dir y
f1 <- doesFileExist n
f2 <- doesDirectoryExist n
if f1 || f2
then loop (x ++ "(" ++ show i ++ ")") (i + 1)
else return n
in loop x 2
resolveFileName :: Maybe FilePath -> FileName -> M.Map String String -> IO String
resolveFileName dir (WritableFileName name ext) map =
return $ replaceName (combineName dir name ++ ext) map
resolveFileName dir (UniqueFileName name ext) map =
let x = replaceName name map
loop y i =
do let n = combineName dir y ++ ext
f1 <- doesFileExist n
f2 <- doesDirectoryExist n
if f1 || f2
then loop (x ++ "(" ++ show i ++ ")") (i + 1)
else return n
in loop x 2
replaceName :: String -> M.Map String String -> String
replaceName name map = name' where
((), name') = flip runState name $
forM_ (M.assocs map) $ \(k, v) ->
do a <- get
put $ replace k v a
combineName :: Maybe String -> String -> String
combineName dir name =
case dir of
Nothing -> name
Just dir -> combine dir name
instance Series (Simulation Double) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Just $ liftSimulation s,
providerToDoubleStats =
Just $ liftSimulation $ fmap returnSamplingStats s,
providerToDoubleList =
Just $ liftSimulation $ fmap return s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Just $ liftSimulation $ fmap show s,
providerSignal = Nothing }] }
instance Series (Simulation Int) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Just $ liftSimulation $ fmap fromIntegral s,
providerToDoubleStats =
Just $ liftSimulation $
fmap returnSamplingStats $
fmap fromIntegral s,
providerToDoubleList =
Just $ liftSimulation $
fmap return $
fmap fromIntegral s,
providerToInt = Just $ liftSimulation s,
providerToIntStats =
Just $ liftSimulation $ fmap returnSamplingStats s,
providerToIntList =
Just $ liftSimulation $ fmap return s,
providerToString = Just $ liftSimulation $ fmap show s,
providerSignal = Nothing }] }
instance Series (Simulation String) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats = Nothing,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Just $ liftSimulation s,
providerSignal = Nothing }] }
instance Series (Dynamics Double) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Just s,
providerToDoubleStats = Just $ fmap returnSamplingStats s,
providerToDoubleList = Just $ fmap return s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Just $ fmap show s,
providerSignal = Nothing }] }
instance Series (Dynamics Int) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Just $ fmap fromIntegral s,
providerToDoubleStats =
Just $ fmap returnSamplingStats $ fmap fromIntegral s,
providerToDoubleList =
Just $ fmap return $ fmap fromIntegral s,
providerToInt = Just s,
providerToIntStats = Just $ fmap returnSamplingStats s,
providerToIntList = Just $ fmap return s,
providerToString = Just $ fmap show s,
providerSignal = Nothing }] }
instance Series (Dynamics String) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats = Nothing,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Just s,
providerSignal = Nothing }] }
instance Series (Ref Double) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Just $ readRef s,
providerToDoubleStats =
Just $ fmap returnSamplingStats $ readRef s,
providerToDoubleList =
Just $ fmap return $ readRef s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Just $ fmap show (readRef s),
providerSignal = Just $ refChanged_ s }] }
instance Series (Ref Int) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Just $ fmap fromIntegral (readRef s),
providerToDoubleStats =
Just $
fmap returnSamplingStats $
fmap fromIntegral (readRef s),
providerToDoubleList =
Just $
fmap return $
fmap fromIntegral (readRef s),
providerToInt = Just $ readRef s,
providerToIntStats =
Just $ fmap returnSamplingStats (readRef s),
providerToIntList =
Just $ fmap return (readRef s),
providerToString = Just $ fmap show (readRef s),
providerSignal = Just $ refChanged_ s }] }
instance Series (Ref String) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats = Nothing,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Just $ readRef s,
providerSignal = Just $ refChanged_ s }] }
instance Series (Var Double) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Just $ readVar s,
providerToDoubleStats =
Just $ fmap returnSamplingStats $ readVar s,
providerToDoubleList =
Just $ fmap return $ readVar s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Just $ fmap show (readVar s),
providerSignal = Just $ varChanged_ s }] }
instance Series (Var Int) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Just $ fmap fromIntegral (readVar s),
providerToDoubleStats =
Just $
fmap returnSamplingStats $
fmap fromIntegral (readVar s),
providerToDoubleList =
Just $
fmap return $
fmap fromIntegral (readVar s),
providerToInt = Just $ readVar s,
providerToIntStats =
Just $ fmap returnSamplingStats (readVar s),
providerToIntList =
Just $ fmap return (readVar s),
providerToString = Just $ fmap show (readVar s),
providerSignal = Just $ varChanged_ s }] }
instance Series (Var String) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats = Nothing,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Just $ readVar s,
providerSignal = Just $ varChanged_ s }] }
instance Series (UVar Double) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Just $ readUVar s,
providerToDoubleStats =
Just $ fmap returnSamplingStats (readUVar s),
providerToDoubleList =
Just $ fmap return (readUVar s),
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Just $ fmap show (readUVar s),
providerSignal = Just $ uvarChanged_ s }] }
instance Series (UVar Int) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Just $ fmap fromIntegral (readUVar s),
providerToDoubleStats =
Just $
fmap returnSamplingStats $
fmap fromIntegral (readUVar s),
providerToDoubleList =
Just $
fmap return $
fmap fromIntegral (readUVar s),
providerToInt = Just $ readUVar s,
providerToIntStats =
Just $ fmap returnSamplingStats (readUVar s),
providerToIntList =
Just $ fmap return (readUVar s),
providerToString = Just $ fmap show (readUVar s),
providerSignal = Just $ uvarChanged_ s }] }
instance Series s => Series [s] where
seriesEntity name s =
SeriesEntity { seriesProviders =
join $ forM (zip [1..] s) $ \(i, s) ->
let name' = name ++ "[" ++ show i ++ "]"
in seriesProviders $ seriesEntity name' s }
instance (Show i, Ix i, Series s) => Series (Array i s) where
seriesEntity name s =
SeriesEntity { seriesProviders =
join $ forM (assocs s) $ \(i, s) ->
let name' = name ++ "[" ++ show i ++ "]"
in seriesProviders $ seriesEntity name' s }
data SeriesListWithSubscript s =
SeriesListWithSubscript { seriesList :: [s],
seriesListSubscript :: [String] }
data SeriesArrayWithSubscript i s =
SeriesArrayWithSubscript { seriesArray :: Array i s,
seriesArraySubscript :: Array i String }
seriesListWithSubscript :: Series s => [s] -> [String] -> SeriesListWithSubscript s
seriesListWithSubscript = SeriesListWithSubscript
seriesArrayWithSubscript :: (Ix i, Series s) => Array i s -> Array i String
-> SeriesArrayWithSubscript i s
seriesArrayWithSubscript = SeriesArrayWithSubscript
instance Series s => Series (SeriesListWithSubscript s) where
seriesEntity name s =
SeriesEntity { seriesProviders = do
let xs = seriesList s
ns = seriesListSubscript s
join $ forM (zip3 [1..] xs ns) $ \(i, s, n) ->
let name' = name ++ n
in seriesProviders $ seriesEntity name' s }
instance (Ix i, Series s) => Series (SeriesArrayWithSubscript i s) where
seriesEntity name s =
SeriesEntity { seriesProviders = do
let xs = seriesArray s
ns = seriesArraySubscript s
join $ forM (zip (assocs xs) (elems ns)) $ \((i, s), n) ->
let name' = name ++ n
in seriesProviders $ seriesEntity name' s }
instance Series (Simulation (SamplingStats Double)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats = Just $ liftSimulation s,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Simulation (SamplingStats Int)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $ liftSimulation $ fmap fromIntSamplingStats s,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Just $ liftSimulation s,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Dynamics (SamplingStats Double)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats = Just s,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Dynamics (SamplingStats Int)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats = Just $ fmap fromIntSamplingStats s,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Just $ s,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Ref (SamplingStats Double)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats = Just $ readRef s,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Ref (SamplingStats Int)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $ fmap fromIntSamplingStats $ readRef s,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Just $ readRef s,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Var (SamplingStats Double)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats = Just $ readVar s,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Var (SamplingStats Int)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $ fmap fromIntSamplingStats $ readVar s,
providerToDoubleList = Nothing,
providerToInt = Nothing,
providerToIntStats = Just $ readVar s,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Simulation [Double]) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $ liftSimulation $ fmap listSamplingStats s,
providerToDoubleList =
Just $ liftSimulation s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Simulation [Int]) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $ liftSimulation $
fmap fromIntSamplingStats $
fmap listSamplingStats s,
providerToDoubleList =
Just $ liftSimulation $
fmap (map fromIntegral) s,
providerToInt = Nothing,
providerToIntStats =
Just $ liftSimulation $ fmap listSamplingStats s,
providerToIntList =
Just $ liftSimulation s,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Dynamics [Double]) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $ fmap listSamplingStats s,
providerToDoubleList =
Just s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Dynamics [Int]) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $
fmap fromIntSamplingStats $
fmap listSamplingStats s,
providerToDoubleList =
Just $ fmap (map fromIntegral) s,
providerToInt = Nothing,
providerToIntStats =
Just $ fmap listSamplingStats s,
providerToIntList =
Just s,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Ref [Double]) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $ fmap listSamplingStats $ readRef s,
providerToDoubleList =
Just $ readRef s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Ref [Int]) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $
fmap fromIntSamplingStats $
fmap listSamplingStats $ readRef s,
providerToDoubleList =
Just $ fmap (map fromIntegral) $ readRef s,
providerToInt = Nothing,
providerToIntStats =
Just $ fmap listSamplingStats $ readRef s,
providerToIntList =
Just $ readRef s,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Var [Double]) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $ fmap listSamplingStats $ readVar s,
providerToDoubleList =
Just $ readVar s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Series (Var [Int]) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $
fmap fromIntSamplingStats $
fmap listSamplingStats $ readVar s,
providerToDoubleList =
Just $ fmap (map fromIntegral) $ readVar s,
providerToInt = Nothing,
providerToIntStats =
Just $ fmap listSamplingStats $ readVar s,
providerToIntList =
Just $ readVar s,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Ix i => Series (Simulation (Array i Double)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $ liftSimulation $
fmap listSamplingStats $
fmap elems s,
providerToDoubleList =
Just $ liftSimulation $
fmap elems s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Ix i => Series (Simulation (Array i Int)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $ liftSimulation $
fmap fromIntSamplingStats $
fmap listSamplingStats $
fmap elems s,
providerToDoubleList =
Just $ liftSimulation $
fmap (map fromIntegral) $
fmap elems s,
providerToInt = Nothing,
providerToIntStats =
Just $ liftSimulation $
fmap listSamplingStats $
fmap elems s,
providerToIntList =
Just $ liftSimulation $
fmap elems s,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Ix i => Series (Dynamics (Array i Double)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $
fmap listSamplingStats $
fmap elems s,
providerToDoubleList =
Just $ fmap elems s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Ix i => Series (Dynamics (Array i Int)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $
fmap fromIntSamplingStats $
fmap listSamplingStats $
fmap elems s,
providerToDoubleList =
Just $
fmap (map fromIntegral) $
fmap elems s,
providerToInt = Nothing,
providerToIntStats =
Just $
fmap listSamplingStats $
fmap elems s,
providerToIntList =
Just $ fmap elems s,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Ix i => Series (Ref (Array i Double)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $
fmap listSamplingStats $
fmap elems $ readRef s,
providerToDoubleList =
Just $ fmap elems $ readRef s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Ix i => Series (Ref (Array i Int)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $
fmap fromIntSamplingStats $
fmap listSamplingStats $
fmap elems $ readRef s,
providerToDoubleList =
Just $
fmap (map fromIntegral) $
fmap elems $ readRef s,
providerToInt = Nothing,
providerToIntStats =
Just $
fmap listSamplingStats $
fmap elems $ readRef s,
providerToIntList =
Just $
fmap elems $ readRef s,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Ix i => Series (Var (Array i Double)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $
fmap listSamplingStats $
fmap elems $ readVar s,
providerToDoubleList =
Just $
fmap elems $ readVar s,
providerToInt = Nothing,
providerToIntStats = Nothing,
providerToIntList = Nothing,
providerToString = Nothing,
providerSignal = Nothing }] }
instance Ix i => Series (Var (Array i Int)) where
seriesEntity name s =
SeriesEntity { seriesProviders =
[SeriesProvider { providerName = name,
providerToDouble = Nothing,
providerToDoubleStats =
Just $
fmap fromIntSamplingStats $
fmap listSamplingStats $
fmap elems $ readVar s,
providerToDoubleList =
Just $
fmap (map fromIntegral) $
fmap elems $ readVar s,
providerToInt = Nothing,
providerToIntStats =
Just $
fmap listSamplingStats $
fmap elems $ readVar s,
providerToIntList =
Just $
fmap elems $ readVar s,
providerToString = Nothing,
providerSignal = Nothing }] }