packages feed

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 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)]