aivika-experiment 0.3.1 → 0.4
raw patch · 12 files changed
+126/−155 lines, 12 filesdep ~aivikaPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aivika
API changes (from Hackage documentation)
- Simulation.Aivika.Experiment: experimentQueue :: ExperimentData -> EventQueue
- Simulation.Aivika.Experiment: instance Series (UVar Double)
- Simulation.Aivika.Experiment: instance Series (UVar Int)
+ Simulation.Aivika.Experiment: instance SeriesContainer Event
- Simulation.Aivika.Experiment: ExperimentData :: EventQueue -> Signal Double -> Signal Double -> Signal Double -> Map String SeriesEntity -> ExperimentData
+ Simulation.Aivika.Experiment: ExperimentData :: Signal Double -> Signal Double -> Signal Double -> Map String SeriesEntity -> ExperimentData
- Simulation.Aivika.Experiment: Reporter :: IO () -> IO () -> (ExperimentData -> Dynamics (Dynamics ())) -> (Int -> HtmlWriter ()) -> (Int -> HtmlWriter ()) -> Reporter
+ Simulation.Aivika.Experiment: Reporter :: IO () -> IO () -> (ExperimentData -> Event (Event ())) -> (Int -> HtmlWriter ()) -> (Int -> HtmlWriter ()) -> Reporter
- Simulation.Aivika.Experiment: SeriesProvider :: String -> Maybe (Dynamics Double) -> Maybe (Dynamics (SamplingStats Double)) -> Maybe (Dynamics [Double]) -> Maybe (Dynamics Int) -> Maybe (Dynamics (SamplingStats Int)) -> Maybe (Dynamics [Int]) -> Maybe (Dynamics String) -> Maybe (Signal ()) -> SeriesProvider
+ Simulation.Aivika.Experiment: SeriesProvider :: String -> Maybe (Event Double) -> Maybe (Event (SamplingStats Double)) -> Maybe (Event [Double]) -> Maybe (Event Int) -> Maybe (Event (SamplingStats Int)) -> Maybe (Event [Int]) -> Maybe (Event String) -> Maybe (Signal ()) -> SeriesProvider
- Simulation.Aivika.Experiment: containerData :: SeriesContainer c => c a -> Dynamics a
+ Simulation.Aivika.Experiment: containerData :: SeriesContainer c => c a -> Event a
- Simulation.Aivika.Experiment: experimentDataInStartTime :: EventQueue -> [(String, SeriesEntity)] -> Simulation ExperimentData
+ Simulation.Aivika.Experiment: experimentDataInStartTime :: [(String, SeriesEntity)] -> Simulation ExperimentData
- Simulation.Aivika.Experiment: providerToDouble :: SeriesProvider -> Maybe (Dynamics Double)
+ Simulation.Aivika.Experiment: providerToDouble :: SeriesProvider -> Maybe (Event Double)
- Simulation.Aivika.Experiment: providerToDoubleList :: SeriesProvider -> Maybe (Dynamics [Double])
+ Simulation.Aivika.Experiment: providerToDoubleList :: SeriesProvider -> Maybe (Event [Double])
- Simulation.Aivika.Experiment: providerToDoubleStats :: SeriesProvider -> Maybe (Dynamics (SamplingStats Double))
+ Simulation.Aivika.Experiment: providerToDoubleStats :: SeriesProvider -> Maybe (Event (SamplingStats Double))
- Simulation.Aivika.Experiment: providerToInt :: SeriesProvider -> Maybe (Dynamics Int)
+ Simulation.Aivika.Experiment: providerToInt :: SeriesProvider -> Maybe (Event Int)
- Simulation.Aivika.Experiment: providerToIntList :: SeriesProvider -> Maybe (Dynamics [Int])
+ Simulation.Aivika.Experiment: providerToIntList :: SeriesProvider -> Maybe (Event [Int])
- Simulation.Aivika.Experiment: providerToIntStats :: SeriesProvider -> Maybe (Dynamics (SamplingStats Int))
+ Simulation.Aivika.Experiment: providerToIntStats :: SeriesProvider -> Maybe (Event (SamplingStats Int))
- Simulation.Aivika.Experiment: providerToString :: SeriesProvider -> Maybe (Dynamics String)
+ Simulation.Aivika.Experiment: providerToString :: SeriesProvider -> Maybe (Event String)
- Simulation.Aivika.Experiment: reporterSimulate :: Reporter -> ExperimentData -> Dynamics (Dynamics ())
+ Simulation.Aivika.Experiment: reporterSimulate :: Reporter -> ExperimentData -> Event (Event ())
- Simulation.Aivika.Experiment.FinalStatsView: FinalStatsView :: String -> String -> SamplingStatsWriter Double -> Dynamics Bool -> [String] -> FinalStatsView
+ Simulation.Aivika.Experiment.FinalStatsView: FinalStatsView :: String -> String -> SamplingStatsWriter Double -> Event Bool -> [String] -> FinalStatsView
- Simulation.Aivika.Experiment.FinalStatsView: finalStatsPredicate :: FinalStatsView -> Dynamics Bool
+ Simulation.Aivika.Experiment.FinalStatsView: finalStatsPredicate :: FinalStatsView -> Event Bool
- Simulation.Aivika.Experiment.FinalTableView: FinalTableView :: String -> String -> String -> String -> FileName -> String -> ShowS -> Dynamics Bool -> [String] -> FinalTableView
+ Simulation.Aivika.Experiment.FinalTableView: FinalTableView :: String -> String -> String -> String -> FileName -> String -> ShowS -> Event Bool -> [String] -> FinalTableView
- Simulation.Aivika.Experiment.FinalTableView: finalTablePredicate :: FinalTableView -> Dynamics Bool
+ Simulation.Aivika.Experiment.FinalTableView: finalTablePredicate :: FinalTableView -> Event Bool
- Simulation.Aivika.Experiment.ListSource: listSourceData :: ListSource a -> Dynamics (ListData a)
+ Simulation.Aivika.Experiment.ListSource: listSourceData :: ListSource a -> Event (ListData a)
- Simulation.Aivika.Experiment.SamplingStatsSource: samplingStatsSourceData :: SamplingStatsSource a -> Dynamics (SamplingStatsData a)
+ Simulation.Aivika.Experiment.SamplingStatsSource: samplingStatsSourceData :: SamplingStatsSource a -> Event (SamplingStatsData a)
- Simulation.Aivika.Experiment.TableView: TableView :: String -> String -> String -> String -> FileName -> String -> ShowS -> Dynamics Bool -> [String] -> TableView
+ Simulation.Aivika.Experiment.TableView: TableView :: String -> String -> String -> String -> FileName -> String -> ShowS -> Event Bool -> [String] -> TableView
- Simulation.Aivika.Experiment.TableView: tablePredicate :: TableView -> Dynamics Bool
+ Simulation.Aivika.Experiment.TableView: tablePredicate :: TableView -> Event Bool
- Simulation.Aivika.Experiment.TimingStatsView: TimingStatsView :: String -> String -> String -> TimingStatsWriter Double -> Dynamics Bool -> [String] -> TimingStatsView
+ Simulation.Aivika.Experiment.TimingStatsView: TimingStatsView :: String -> String -> String -> TimingStatsWriter Double -> Event Bool -> [String] -> TimingStatsView
- Simulation.Aivika.Experiment.TimingStatsView: timingStatsPredicate :: TimingStatsView -> Dynamics Bool
+ Simulation.Aivika.Experiment.TimingStatsView: timingStatsPredicate :: TimingStatsView -> Event Bool
Files
- Simulation/Aivika/Experiment.hs +52/−73
- Simulation/Aivika/Experiment/ExperimentSpecsWriter.hs +1/−1
- Simulation/Aivika/Experiment/FinalStatsView.hs +6/−7
- Simulation/Aivika/Experiment/FinalTableView.hs +6/−7
- Simulation/Aivika/Experiment/LastValueView.hs +5/−6
- Simulation/Aivika/Experiment/ListSource.hs +4/−4
- Simulation/Aivika/Experiment/SamplingStatsSource.hs +4/−4
- Simulation/Aivika/Experiment/TableView.hs +6/−7
- Simulation/Aivika/Experiment/TimingStatsView.hs +7/−8
- aivika-experiment.cabal +2/−2
- examples/LinearArray.hs +5/−8
- examples/MachRep3.hs +28/−28
Simulation/Aivika/Experiment.hs view
@@ -70,14 +70,14 @@ import GHC.Conc (getNumCapabilities) +import Simulation.Aivika.Specs+import Simulation.Aivika.Simulation 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.Event+import Simulation.Aivika.Signal+import Simulation.Aivika.Ref+import Simulation.Aivika.Var+import Simulation.Aivika.Parameter import Simulation.Aivika.Statistics import Simulation.Aivika.Experiment.HtmlWriter@@ -146,7 +146,7 @@ -- is numeric but it may be any string. -- -- At the same time, if the array or list of numeric values--- is wrapped in monad 'Simulation' or 'Dynamics' then the+-- is wrapped in monads 'Simulation', 'Dynamics' or 'Event' then the -- underlying numeric array and list are already treated as -- a sampling statistics or list of numbers in time point. --@@ -170,19 +170,19 @@ data SeriesProvider = SeriesProvider { providerName :: String, -- ^ Return the name.- providerToDouble :: Maybe (Dynamics Double),+ providerToDouble :: Maybe (Event Double), -- ^ Try to return the data as double values.- providerToDoubleStats :: Maybe (Dynamics (SamplingStats Double)),+ providerToDoubleStats :: Maybe (Event (SamplingStats Double)), -- ^ Try to return the statistics data in time points.- providerToDoubleList :: Maybe (Dynamics [Double]),+ providerToDoubleList :: Maybe (Event [Double]), -- ^ Try to return the list of double values.- providerToInt :: Maybe (Dynamics Int),+ providerToInt :: Maybe (Event Int), -- ^ Try to return the data as integers.- providerToIntStats :: Maybe (Dynamics (SamplingStats Int)),+ providerToIntStats :: Maybe (Event (SamplingStats Int)), -- ^ Try to return the statistics data in time points.- providerToIntList :: Maybe (Dynamics [Int]),+ providerToIntList :: Maybe (Event [Int]), -- ^ Try to return the list of integer values.- providerToString :: Maybe (Dynamics String),+ providerToString :: Maybe (Event String), -- ^ Try to return the data as strings. providerSignal :: Maybe (Signal ()) -- ^ Try to get a signal for the data, which@@ -195,9 +195,7 @@ -- | It describes the source simulation data used in the experiment. data ExperimentData =- ExperimentData { experimentQueue :: EventQueue,- -- ^ Return the event queue.- experimentSignalInIntegTimes :: Signal Double,+ ExperimentData { experimentSignalInIntegTimes :: Signal Double, -- ^ The signal triggered in the integration time points. experimentSignalInStartTime :: Signal Double, -- ^ The signal triggered in the start time.@@ -209,14 +207,13 @@ -- | Prepare data for the simulation experiment in start time from the series -- with the specified labels.-experimentDataInStartTime :: EventQueue -> [(String, SeriesEntity)] -> Simulation ExperimentData-experimentDataInStartTime q m = runDynamicsInStartTime d where- d = do signalInIntegTimes <- newSignalInIntegTimes q- signalInStartTime <- newSignalInStartTime q- signalInStopTime <- newSignalInStopTime q+experimentDataInStartTime :: [(String, SeriesEntity)] -> Simulation ExperimentData+experimentDataInStartTime m = runEventInStartTime IncludingEarlierEvents d where+ d = do signalInIntegTimes <- newSignalInIntegTimes+ signalInStartTime <- newSignalInStartTime+ signalInStopTime <- newSignalInStopTime let series = M.fromList m- return ExperimentData { experimentQueue = q,- experimentSignalInIntegTimes = signalInIntegTimes,+ return ExperimentData { experimentSignalInIntegTimes = signalInIntegTimes, experimentSignalInStartTime = signalInStartTime, experimentSignalInStopTime = signalInStopTime, experimentSeries = series }@@ -260,8 +257,7 @@ reporterFinalise :: IO (), -- ^ Finalise the reporting after -- all simulation runs are finished.- reporterSimulate :: ExperimentData -> - Dynamics (Dynamics ()),+ reporterSimulate :: ExperimentData -> Event (Event ()), -- ^ Start the simulation run in the start time -- and return a finalizer that will be called -- in the stop time after the last signal is @@ -326,12 +322,11 @@ let simulate :: Simulation () simulate = do d <- simulation- fs <- runDynamicsInStartTime $+ fs <- runEventInStartTime IncludingEarlierEvents $ forM reporters $ \reporter -> reporterSimulate reporter d- runDynamicsInStopTime $- do runQueueSync $ experimentQueue d- sequence_ fs+ runEventInStopTime IncludingCurrentEvents $+ sequence_ fs executor $ runSimulations simulate specs runCount forM_ reporters reporterFinalise experimentIndexHtml e e reporters path@@ -432,7 +427,7 @@ class SeriesContainer c where -- | Extract data from the container.- containerData :: c a -> Dynamics a+ containerData :: c a -> Event a -- | Get the signal for the container. containerSignal :: c a => Maybe (Signal ())@@ -445,6 +440,12 @@ instance SeriesContainer Dynamics where + containerData = liftDynamics++ containerSignal = const Nothing++instance SeriesContainer Event where+ containerData = id containerSignal = const Nothing@@ -541,44 +542,6 @@ providerSignal = containerSignal 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 = @@ -619,17 +582,33 @@ seriesVectorSubscript :: V.Vector String } -- | Add the specified subscript to the list.-seriesListWithSubscript :: Series s => [s] -> [String] -> SeriesListWithSubscript s+seriesListWithSubscript :: Series s+ => [s]+ -- ^ the list to subscript+ -> [String]+ -- ^ the list of subscripts+ -> SeriesListWithSubscript s+ -- ^ the subscripted list seriesListWithSubscript = SeriesListWithSubscript -- | Add the specified subscript to the array.-seriesArrayWithSubscript :: (Ix i, Series s) => Array i s -> Array i String+seriesArrayWithSubscript :: (Ix i, Series s)+ => Array i s+ -- ^ the array to subscript+ -> Array i String+ -- ^ the array of subscripts -> SeriesArrayWithSubscript i s+ -- ^ the subscripted array seriesArrayWithSubscript = SeriesArrayWithSubscript -- | Add the specified subscript to the vector.-seriesVectorWithSubscript :: Series s => V.Vector s -> V.Vector String+seriesVectorWithSubscript :: Series s+ => V.Vector s+ -- ^ the vector to subscript+ -> V.Vector String+ -- ^ the vector of subscripts -> SeriesVectorWithSubscript s+ -- ^ the subscripted vector seriesVectorWithSubscript = SeriesVectorWithSubscript instance Series s => Series (SeriesListWithSubscript s) where
Simulation/Aivika/Experiment/ExperimentSpecsWriter.hs view
@@ -19,7 +19,7 @@ import Simulation.Aivika.Experiment import Simulation.Aivika.Experiment.HtmlWriter -import Simulation.Aivika.Dynamics.Simulation+import Simulation.Aivika.Specs -- | Defines a writer that knows how to represent the -- experiment specs as the HTML table.
Simulation/Aivika/Experiment/FinalStatsView.hs view
@@ -27,11 +27,10 @@ import Simulation.Aivika.Experiment.SamplingStatsWriter import Simulation.Aivika.Experiment.SamplingStatsSource -import Simulation.Aivika.Dynamics-import Simulation.Aivika.Dynamics.Simulation-import Simulation.Aivika.Dynamics.Signal-import Simulation.Aivika.Dynamics.EventQueue-import Simulation.Aivika.Dynamics.Base+import Simulation.Aivika.Specs+import Simulation.Aivika.Simulation+import Simulation.Aivika.Event+import Simulation.Aivika.Signal import Simulation.Aivika.Statistics -- | Defines the 'View' that gathers the statistics@@ -43,7 +42,7 @@ -- ^ This is a description used in HTML. finalStatsWriter :: SamplingStatsWriter Double, -- ^ It shows the sampling statistics.- finalStatsPredicate :: Dynamics Bool,+ finalStatsPredicate :: Event Bool, -- ^ It specifies the predicate that defines -- when we count data when gathering the statistics. finalStatsSeries :: [String]@@ -102,7 +101,7 @@ finalStatsValues = values } -- | Simulation the specified series.-simulateFinalStats :: FinalStatsViewState -> ExperimentData -> Dynamics (Dynamics ())+simulateFinalStats :: FinalStatsViewState -> ExperimentData -> Event (Event ()) simulateFinalStats st expdata = do let protolabels = finalStatsSeries $ finalStatsView st protoproviders = flip map protolabels $ \protolabel ->
Simulation/Aivika/Experiment/FinalTableView.hs view
@@ -30,11 +30,10 @@ import Simulation.Aivika.Experiment import Simulation.Aivika.Experiment.HtmlWriter -import Simulation.Aivika.Dynamics-import Simulation.Aivika.Dynamics.Simulation-import Simulation.Aivika.Dynamics.Signal-import Simulation.Aivika.Dynamics.EventQueue-import Simulation.Aivika.Dynamics.Base+import Simulation.Aivika.Specs+import Simulation.Aivika.Simulation+import Simulation.Aivika.Event+import Simulation.Aivika.Signal -- | Defines the 'View' that saves the simulation -- results in the final time points for all @@ -73,7 +72,7 @@ -- ^ It defines the formatter which is applied -- to all values before they will be written -- in the CSV file.- finalTablePredicate :: Dynamics Bool,+ finalTablePredicate :: Event Bool, -- ^ It specifies the predicate that defines -- when we can save data in the table. finalTableSeries :: [String] @@ -141,7 +140,7 @@ finalTableValues = values } -- | Simulation of the specified series.-simulateFinalTable :: FinalTableViewState -> ExperimentData -> Dynamics (Dynamics ())+simulateFinalTable :: FinalTableViewState -> ExperimentData -> Event (Event ()) simulateFinalTable st expdata = do let labels = finalTableSeries $ finalTableView st providers = experimentSeriesProviders expdata labels
Simulation/Aivika/Experiment/LastValueView.hs view
@@ -26,11 +26,10 @@ import Simulation.Aivika.Experiment.HtmlWriter import Simulation.Aivika.Experiment.Utils (replace) -import Simulation.Aivika.Dynamics-import Simulation.Aivika.Dynamics.Simulation-import Simulation.Aivika.Dynamics.Signal-import Simulation.Aivika.Dynamics.EventQueue-import Simulation.Aivika.Dynamics.Base+import Simulation.Aivika.Specs+import Simulation.Aivika.Simulation+import Simulation.Aivika.Event+import Simulation.Aivika.Signal -- | Defines the 'View' that shows the last values of the simulation -- variables.@@ -93,7 +92,7 @@ lastValueMap = m } -- | Get the last values during the simulation.-simulateLastValues :: LastValueViewState -> ExperimentData -> Dynamics (Dynamics ())+simulateLastValues :: LastValueViewState -> ExperimentData -> Event (Event ()) simulateLastValues st expdata = do let labels = lastValueSeries $ lastValueView st input =
Simulation/Aivika/Experiment/ListSource.hs view
@@ -25,13 +25,13 @@ import Data.IORef import Control.Monad -import Simulation.Aivika.Dynamics+import Simulation.Aivika.Event import Simulation.Aivika.Statistics import Simulation.Aivika.Experiment -- | Represents the optimized source of data for constructing the list.-data ListSource a = SingleValueSource (Dynamics a)- | MultipleValueSource (Dynamics [a])+data ListSource a = SingleValueSource (Event a)+ | MultipleValueSource (Event [a]) -- | Represents the optimized data by which the list will be created. data ListData a = SingleValueData !a@@ -58,7 +58,7 @@ Nothing -> Nothing -- | Get data from the source in the current time point.-listSourceData :: ListSource a -> Dynamics (ListData a)+listSourceData :: ListSource a -> Event (ListData a) listSourceData (SingleValueSource x) = x >>= return . SingleValueData listSourceData (MultipleValueSource xs) = do ys <- xs
Simulation/Aivika/Experiment/SamplingStatsSource.hs view
@@ -18,13 +18,13 @@ samplingStatsSourceData, addDataToSamplingStats) where -import Simulation.Aivika.Dynamics+import Simulation.Aivika.Event import Simulation.Aivika.Statistics import Simulation.Aivika.Experiment -- | Represents the optimized source of data for the statistics.-data SamplingStatsSource a = SingleValueSource (Dynamics a)- | MultipleValueSource (Dynamics (SamplingStats a))+data SamplingStatsSource a = SingleValueSource (Event a)+ | MultipleValueSource (Event (SamplingStats a)) -- | Represents the optimized data to be included in the statistics. data SamplingStatsData a = SingleValueData !a@@ -51,7 +51,7 @@ Nothing -> Nothing -- | Get data from the source in the current time point.-samplingStatsSourceData :: SamplingStatsSource a -> Dynamics (SamplingStatsData a)+samplingStatsSourceData :: SamplingStatsSource a -> Event (SamplingStatsData a) samplingStatsSourceData source = case source of SingleValueSource x -> x >>= return . SingleValueData
Simulation/Aivika/Experiment/TableView.hs view
@@ -29,11 +29,10 @@ import Simulation.Aivika.Experiment.HtmlWriter import Simulation.Aivika.Experiment.Utils (replace) -import Simulation.Aivika.Dynamics-import Simulation.Aivika.Dynamics.Simulation-import Simulation.Aivika.Dynamics.Signal-import Simulation.Aivika.Dynamics.EventQueue-import Simulation.Aivika.Dynamics.Base+import Simulation.Aivika.Specs+import Simulation.Aivika.Simulation+import Simulation.Aivika.Event+import Simulation.Aivika.Signal -- | Defines the 'View' that saves the simulation results -- in the CSV file(s).@@ -91,7 +90,7 @@ -- ^ It defines the formatter which is applied -- to all values before they will be written -- in the CSV file(s).- tablePredicate :: Dynamics Bool,+ tablePredicate :: Event Bool, -- ^ It specifies the predicate that defines -- when we can save data in the table. tableSeries :: [String] @@ -148,7 +147,7 @@ tableMap = m } -- | Write the tables during the simulation.-simulateTable :: TableViewState -> ExperimentData -> Dynamics (Dynamics ())+simulateTable :: TableViewState -> ExperimentData -> Event (Event ()) simulateTable st expdata = do let labels = tableSeries $ tableView st providers = experimentSeriesProviders expdata labels
Simulation/Aivika/Experiment/TimingStatsView.hs view
@@ -27,11 +27,11 @@ import Simulation.Aivika.Experiment.TimingStatsWriter import Simulation.Aivika.Experiment.Utils (replace) +import Simulation.Aivika.Specs+import Simulation.Aivika.Simulation import Simulation.Aivika.Dynamics-import Simulation.Aivika.Dynamics.Simulation-import Simulation.Aivika.Dynamics.Signal-import Simulation.Aivika.Dynamics.EventQueue-import Simulation.Aivika.Dynamics.Base+import Simulation.Aivika.Event+import Simulation.Aivika.Signal import Simulation.Aivika.Statistics -- | Defines the 'View' that shows the timing statistics@@ -53,7 +53,7 @@ -- ^ The description for the view. timingStatsWriter :: TimingStatsWriter Double, -- ^ It shows the timing statistics.- timingStatsPredicate :: Dynamics Bool,+ timingStatsPredicate :: Event Bool, -- ^ Specifies when gathering the statistics. timingStatsSeries :: [String] -- ^ It contains the labels of the observed series.@@ -98,7 +98,7 @@ timingStatsMap = m } -- | Get the timing statistics during the simulation.-simulateTimingStats :: TimingStatsViewState -> ExperimentData -> Dynamics (Dynamics ())+simulateTimingStats :: TimingStatsViewState -> ExperimentData -> Event (Event ()) simulateTimingStats st expdata = do let labels = timingStatsSeries $ timingStatsView st input providers =@@ -112,7 +112,6 @@ predicate = timingStatsPredicate $ timingStatsView st i <- liftSimulation simulationIndex let r = fromJust $ M.lookup (i - 1) $ timingStatsMap st- t <- time forM_ labels $ \label -> do let providers = experimentSeriesProviders expdata [label] pairs = input providers@@ -123,7 +122,7 @@ let h = filterSignalM (const predicate) $ experimentMixedSignal expdata [provider] handleSignal_ h $ \_ ->- do t <- time+ do t <- liftDynamics time x <- input liftIO $ do y <- readIORef stats
aivika-experiment.cabal view
@@ -1,5 +1,5 @@ name: aivika-experiment-version: 0.3.1+version: 0.4 synopsis: Simulation experiments for the Aivika library description: This package allows defining simulation experiments for the Aivika@@ -53,7 +53,7 @@ split >= 0.2.2, network >= 2.3.0.13, parallel-io >= 0.3.2.1,- aivika >= 0.6.1+ aivika >= 0.7 extensions: FlexibleInstances
examples/LinearArray.hs view
@@ -14,12 +14,10 @@ import qualified Data.Vector as V +import Simulation.Aivika.Specs+import Simulation.Aivika.Simulation import Simulation.Aivika.Dynamics-import Simulation.Aivika.Dynamics.Simulation-import Simulation.Aivika.Dynamics.SystemDynamics-import Simulation.Aivika.Dynamics.EventQueue-import Simulation.Aivika.Dynamics.Base-import Simulation.Aivika.Dynamics.Signal+import Simulation.Aivika.SystemDynamics import Simulation.Aivika.Experiment import Simulation.Aivika.Experiment.LastValueView@@ -44,8 +42,7 @@ model :: Int -> Simulation ExperimentData model n =- mdo queue <- newQueue- m <- generateArray (1, n) $ \i ->+ mdo m <- generateArray (1, n) $ \i -> integ (q + k * (c!(i - 1) - c!i) + k * (c!(i + 1) - c!i)) 0 let c = array (0, n + 1) [(i, if (i == 0) || (i == n + 1)@@ -54,7 +51,7 @@ q = 1 k = 2 v = 0.75- experimentDataInStartTime queue+ experimentDataInStartTime [("t", seriesEntity "time" time), ("m", seriesEntity "M" m), ("c", seriesEntity "C" c)]
examples/MachRep3.hs view
@@ -19,13 +19,14 @@ import Control.Monad import Control.Monad.Trans +import Simulation.Aivika.Specs+import Simulation.Aivika.Simulation import Simulation.Aivika.Dynamics-import Simulation.Aivika.Dynamics.Simulation-import Simulation.Aivika.Dynamics.Base-import Simulation.Aivika.Dynamics.EventQueue-import Simulation.Aivika.Dynamics.Ref-import Simulation.Aivika.Dynamics.Resource-import Simulation.Aivika.Dynamics.Process+import Simulation.Aivika.Event+import Simulation.Aivika.Ref+import Simulation.Aivika.QueueStrategy+import Simulation.Aivika.Resource+import Simulation.Aivika.Process import Simulation.Aivika.Experiment import Simulation.Aivika.Experiment.LastValueView@@ -77,56 +78,55 @@ model :: Simulation ExperimentData model =- do queue <- newQueue- - -- number of machines currently up- nUp <- newRef queue 2+ do -- number of machines currently up+ nUp <- newRef 2 -- total up time for all machines- totalUpTime <- newRef queue 0.0+ totalUpTime <- newRef 0.0 - repairPerson <- newResource queue 1+ repairPerson <- newResource FCFS 1 - pid1 <- newProcessID queue- pid2 <- newProcessID queue+ pid1 <- newProcessId+ pid2 <- newProcessId - let machine :: ProcessID -> Process ()+ let machine :: ProcessId -> Process () machine pid = do startUpTime <- liftDynamics time upTime <- liftIO $ exprnd upRate holdProcess upTime finishUpTime <- liftDynamics time- liftDynamics $ modifyRef totalUpTime + liftEvent $ modifyRef totalUpTime (+ (finishUpTime - startUpTime)) - liftDynamics $ modifyRef nUp $ \a -> a - 1- nUp' <- liftDynamics $ readRef nUp+ liftEvent $ modifyRef nUp $ \a -> a - 1+ nUp' <- liftEvent $ readRef nUp if nUp' == 1 then passivateProcess- else do n <- liftDynamics $ - resourceCount repairPerson+ else liftEvent $+ do n <- resourceCount repairPerson when (n == 1) $ - liftDynamics $ reactivateProcess pid+ reactivateProcess pid requestResource repairPerson repairTime <- liftIO $ exprnd repairRate holdProcess repairTime- liftDynamics $ modifyRef nUp $ \a -> a + 1+ liftEvent $ modifyRef nUp $ \a -> a + 1 releaseResource repairPerson machine pid - runDynamicsInStartTime $- do t0 <- starttime- runProcess (machine pid2) pid1 t0- runProcess (machine pid1) pid2 t0+ runProcessInStartTime IncludingCurrentEvents+ pid1 (machine pid2)++ runProcessInStartTime IncludingCurrentEvents+ pid2 (machine pid1) let result = do x <- readRef totalUpTime- y <- time+ y <- liftDynamics time return $ x / (2 * y) - experimentDataInStartTime queue+ experimentDataInStartTime [("x", seriesEntity "The proportion of up time" result), ("t", seriesEntity "Simulation time" time)]