packages feed

aivika-experiment 2.1 → 3.0

raw patch · 16 files changed

+243/−147 lines, 16 filesdep ~aivikaPVP ok

version bump matches the API change (PVP)

Dependency ranges changed: aivika

API changes (from Hackage documentation)

- Simulation.Aivika.Experiment.ExperimentSpecsView: instance WebPageRendering r => ExperimentView ExperimentSpecsView r WebPageWriter
- Simulation.Aivika.Experiment.FinalStatsView: instance WebPageRendering r => ExperimentView FinalStatsView r WebPageWriter
- Simulation.Aivika.Experiment.FinalTableView: instance WebPageRendering r => ExperimentView FinalTableView r WebPageWriter
- Simulation.Aivika.Experiment.LastValueView: instance WebPageRendering r => ExperimentView LastValueView r WebPageWriter
- Simulation.Aivika.Experiment.TableView: instance WebPageRendering r => ExperimentView TableView r WebPageWriter
- Simulation.Aivika.Experiment.TimingStatsView: instance WebPageRendering r => ExperimentView TimingStatsView r WebPageWriter
- Simulation.Aivika.Experiment.Types: WebPageRenderer :: WebPageRenderer
- Simulation.Aivika.Experiment.Types: WebPageWriter :: (Int -> HtmlWriter ()) -> (Int -> HtmlWriter ()) -> WebPageWriter
- Simulation.Aivika.Experiment.Types: class ExperimentRendering r WebPageWriter => WebPageRendering r
- Simulation.Aivika.Experiment.Types: data WebPageRenderer
- Simulation.Aivika.Experiment.Types: data WebPageWriter
- Simulation.Aivika.Experiment.Types: instance ExperimentRendering WebPageRenderer WebPageWriter
- Simulation.Aivika.Experiment.Types: instance WebPageRendering WebPageRenderer
- Simulation.Aivika.Experiment.Types: reporterRequest :: ExperimentReporter a -> a
- Simulation.Aivika.Experiment.Types: reporterWriteHtml :: WebPageWriter -> Int -> HtmlWriter ()
- Simulation.Aivika.Experiment.Types: reporterWriteTOCHtml :: WebPageWriter -> Int -> HtmlWriter ()
- Simulation.Aivika.Experiment.Types: type WebPageGenerator r = ExperimentGenerator r WebPageWriter
+ Simulation.Aivika.Experiment.ExperimentSpecsView: instance ExperimentView ExperimentSpecsView (WebPageRenderer a)
+ Simulation.Aivika.Experiment.FileRenderer: FileRenderer :: a -> FileRenderer a
+ Simulation.Aivika.Experiment.FileRenderer: data FileRenderer a
+ Simulation.Aivika.Experiment.FileRenderer: instance ExperimentRendering (FileRenderer a)
+ Simulation.Aivika.Experiment.FileRenderer: type FileGenerator a = ExperimentGenerator (FileRenderer a)
+ Simulation.Aivika.Experiment.FinalStatsView: instance ExperimentView FinalStatsView (WebPageRenderer a)
+ Simulation.Aivika.Experiment.FinalTableView: instance ExperimentView FinalTableView (FileRenderer a)
+ Simulation.Aivika.Experiment.FinalTableView: instance ExperimentView FinalTableView (WebPageRenderer a)
+ Simulation.Aivika.Experiment.LastValueView: instance ExperimentView LastValueView (WebPageRenderer a)
+ Simulation.Aivika.Experiment.TableView: instance ExperimentView TableView (FileRenderer a)
+ Simulation.Aivika.Experiment.TableView: instance ExperimentView TableView (WebPageRenderer a)
+ Simulation.Aivika.Experiment.TimingStatsView: instance ExperimentView TimingStatsView (WebPageRenderer a)
+ Simulation.Aivika.Experiment.Types: reporterContext :: ExperimentReporter r -> ExperimentContext r
+ Simulation.Aivika.Experiment.Types: runExperimentWithExecutor :: ExperimentRendering r => ([IO ()] -> IO ()) -> Experiment -> [ExperimentGenerator r] -> r -> Simulation Results -> IO ()
+ Simulation.Aivika.Experiment.WebPageRenderer: WebPageRenderer :: a -> WebPageRenderer a
+ Simulation.Aivika.Experiment.WebPageRenderer: WebPageWriter :: (Int -> HtmlWriter ()) -> (Int -> HtmlWriter ()) -> WebPageWriter
+ Simulation.Aivika.Experiment.WebPageRenderer: data WebPageRenderer a
+ Simulation.Aivika.Experiment.WebPageRenderer: data WebPageWriter
+ Simulation.Aivika.Experiment.WebPageRenderer: instance ExperimentRendering (WebPageRenderer a)
+ Simulation.Aivika.Experiment.WebPageRenderer: reporterWriteHtml :: WebPageWriter -> Int -> HtmlWriter ()
+ Simulation.Aivika.Experiment.WebPageRenderer: reporterWriteTOCHtml :: WebPageWriter -> Int -> HtmlWriter ()
+ Simulation.Aivika.Experiment.WebPageRenderer: type WebPageGenerator a = ExperimentGenerator (WebPageRenderer a)
- Simulation.Aivika.Experiment.Types: ExperimentGenerator :: (Experiment -> r -> FilePath -> ExperimentWriter (ExperimentReporter a)) -> ExperimentGenerator r a
+ Simulation.Aivika.Experiment.Types: ExperimentGenerator :: (Experiment -> r -> FilePath -> ExperimentWriter (ExperimentReporter r)) -> ExperimentGenerator r
- Simulation.Aivika.Experiment.Types: ExperimentReporter :: ExperimentWriter () -> ExperimentWriter () -> (ExperimentData -> Event DisposableEvent) -> a -> ExperimentReporter a
+ Simulation.Aivika.Experiment.Types: ExperimentReporter :: ExperimentWriter () -> ExperimentWriter () -> (ExperimentData -> Event DisposableEvent) -> ExperimentContext r -> ExperimentReporter r
- Simulation.Aivika.Experiment.Types: class ExperimentRendering r a | r -> a
+ Simulation.Aivika.Experiment.Types: class ExperimentRendering r where data family ExperimentContext r :: *
- Simulation.Aivika.Experiment.Types: class ExperimentRendering r a => ExperimentView v r a | r -> a
+ Simulation.Aivika.Experiment.Types: class ExperimentRendering r => ExperimentView v r
- Simulation.Aivika.Experiment.Types: data ExperimentGenerator r a
+ Simulation.Aivika.Experiment.Types: data ExperimentGenerator r
- Simulation.Aivika.Experiment.Types: data ExperimentReporter a
+ Simulation.Aivika.Experiment.Types: data ExperimentReporter r
- Simulation.Aivika.Experiment.Types: generateReporter :: ExperimentGenerator r a -> Experiment -> r -> FilePath -> ExperimentWriter (ExperimentReporter a)
+ Simulation.Aivika.Experiment.Types: generateReporter :: ExperimentGenerator r -> Experiment -> r -> FilePath -> ExperimentWriter (ExperimentReporter r)
- Simulation.Aivika.Experiment.Types: outputView :: ExperimentView v r a => v -> ExperimentGenerator r a
+ Simulation.Aivika.Experiment.Types: outputView :: ExperimentView v r => v -> ExperimentGenerator r
- Simulation.Aivika.Experiment.Types: renderExperiment :: ExperimentRendering r a => Experiment -> r -> [ExperimentReporter a] -> FilePath -> ExperimentWriter ()
+ Simulation.Aivika.Experiment.Types: renderExperiment :: ExperimentRendering r => Experiment -> r -> [ExperimentReporter r] -> FilePath -> ExperimentWriter ()
- Simulation.Aivika.Experiment.Types: reporterFinalise :: ExperimentReporter a -> ExperimentWriter ()
+ Simulation.Aivika.Experiment.Types: reporterFinalise :: ExperimentReporter r -> ExperimentWriter ()
- Simulation.Aivika.Experiment.Types: reporterInitialise :: ExperimentReporter a -> ExperimentWriter ()
+ Simulation.Aivika.Experiment.Types: reporterInitialise :: ExperimentReporter r -> ExperimentWriter ()
- Simulation.Aivika.Experiment.Types: reporterSimulate :: ExperimentReporter a -> ExperimentData -> Event DisposableEvent
+ Simulation.Aivika.Experiment.Types: reporterSimulate :: ExperimentReporter r -> ExperimentData -> Event DisposableEvent
- Simulation.Aivika.Experiment.Types: runExperiment :: ExperimentRendering r a => Experiment -> [ExperimentGenerator r a] -> r -> Simulation Results -> IO ()
+ Simulation.Aivika.Experiment.Types: runExperiment :: ExperimentRendering r => Experiment -> [ExperimentGenerator r] -> r -> Simulation Results -> IO ()
- Simulation.Aivika.Experiment.Types: runExperimentParallel :: ExperimentRendering r a => Experiment -> [ExperimentGenerator r a] -> r -> Simulation Results -> IO ()
+ Simulation.Aivika.Experiment.Types: runExperimentParallel :: ExperimentRendering r => Experiment -> [ExperimentGenerator r] -> r -> Simulation Results -> IO ()

Files

Simulation/Aivika/Experiment.hs view
@@ -25,7 +25,9 @@         module Simulation.Aivika.Experiment.ExperimentSpecsWriter,         module Simulation.Aivika.Experiment.ExperimentWriter,         module Simulation.Aivika.Experiment.FinalTableView,-        module Simulation.Aivika.Experiment.Utils) where+        module Simulation.Aivika.Experiment.Utils,+        module Simulation.Aivika.Experiment.WebPageRenderer,+        module Simulation.Aivika.Experiment.FileRenderer) where  import Simulation.Aivika.Experiment.Types import Simulation.Aivika.Experiment.HtmlWriter@@ -41,3 +43,5 @@ import Simulation.Aivika.Experiment.ExperimentWriter import Simulation.Aivika.Experiment.FinalTableView import Simulation.Aivika.Experiment.Utils+import Simulation.Aivika.Experiment.WebPageRenderer+import Simulation.Aivika.Experiment.FileRenderer
Simulation/Aivika/Experiment/ExperimentSpecsView.hs view
@@ -1,5 +1,5 @@ -{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-# LANGUAGE MultiParamTypeClasses #-}  -- | -- Module     : Simulation.Aivika.Experiment.ExperimentSpecsView@@ -23,6 +23,7 @@ import Data.Monoid  import Simulation.Aivika.Experiment.Types+import Simulation.Aivika.Experiment.WebPageRenderer import Simulation.Aivika.Experiment.HtmlWriter import Simulation.Aivika.Experiment.ExperimentWriter import Simulation.Aivika.Experiment.ExperimentSpecsWriter@@ -44,18 +45,19 @@                         experimentSpecsDescription = "It shows the experiment specs.",                         experimentSpecsWriter      = defaultExperimentSpecsWriter } -instance WebPageRendering r => ExperimentView ExperimentSpecsView r WebPageWriter where  +instance ExperimentView ExperimentSpecsView (WebPageRenderer a) where        outputView v =      let reporter exp renderer dir =           do st <- newExperimentSpecs v exp-             let writer =+             let context =+                   WebPageContext $                    WebPageWriter { reporterWriteTOCHtml = experimentSpecsTOCHtml st,                                    reporterWriteHtml    = experimentSpecsHtml st }              return ExperimentReporter { reporterInitialise = return (),                                          reporterFinalise   = return (),                                          reporterSimulate   = const $ return mempty,-                                         reporterRequest    = writer }+                                         reporterContext    = context }     in ExperimentGenerator { generateReporter = reporter }    -- | The state of the view.
Simulation/Aivika/Experiment/ExperimentSpecsWriter.hs view
@@ -67,7 +67,7 @@     experimentSpecsRungeKutta4Text = "the 4-th order Runge-Kutta",     experimentSpecsFormatter = id,     experimentSpecsWrite = \writer exp ->-      do let format x = experimentSpecsFormatter writer (show x)+      do let format x = experimentSpecsFormatter writer x          writeHtml "<p>"          writeHtml "<table frame='border' cellspacing='4' width='"          writeHtml $ show $ experimentSpecsWidth writer@@ -84,7 +84,7 @@          writeHtmlText $ experimentSpecsStartTimeText writer           writeHtml "</td>"          writeHtml "<td>"-         writeHtmlText $ format $ spcStartTime $ experimentSpecs exp+         writeHtmlText $ format $ show $ spcStartTime $ experimentSpecs exp          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "<tr>"@@ -92,7 +92,7 @@          writeHtmlText $ experimentSpecsStopTimeText writer          writeHtml "</td>"          writeHtml "<td>"-         writeHtmlText $ format $ spcStopTime $ experimentSpecs exp+         writeHtmlText $ format $ show $ spcStopTime $ experimentSpecs exp          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "<tr>"@@ -100,7 +100,7 @@          writeHtmlText $ experimentSpecsDTText writer          writeHtml "</td>"          writeHtml "<td>"-         writeHtmlText $ format $ spcDT $ experimentSpecs exp+         writeHtmlText $ format $ show $ spcDT $ experimentSpecs exp          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "<tr>"@@ -108,7 +108,7 @@          writeHtmlText $ experimentSpecsRunCountText writer          writeHtml "</td>"          writeHtml "<td>"-         writeHtmlText $ format $ experimentRunCount exp+         writeHtmlText $ format $ show $ experimentRunCount exp          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "<tr>"
+ Simulation/Aivika/Experiment/FileRenderer.hs view
@@ -0,0 +1,33 @@++{-# LANGUAGE TypeFamilies #-}++-- |+-- Module     : Simulation.Aivika.Experiment.Types+-- Copyright  : Copyright (c) 2012-2014, David Sorokin <david.sorokin@gmail.com>+-- License    : BSD3+-- Maintainer : David Sorokin <david.sorokin@gmail.com>+-- Stability  : experimental+-- Tested with: GHC 7.8.3+--+-- It defines a renderer that saves the results in files when running the simulation experiment.+--++module Simulation.Aivika.Experiment.FileRenderer where++import Simulation.Aivika.Experiment.Types++-- | It defines a simulation 'Experiment' renderer that saves the results in files. +data FileRenderer a = FileRenderer a+                      -- ^ A file renderer that depends on the provided parameter.++-- | A convenient type synonym for describing a file generator.+type FileGenerator a = ExperimentGenerator (FileRenderer a)++-- | Saving the results of simulation in files when running the experiment.+instance ExperimentRendering (FileRenderer a) where++  -- | A file rendering context.+  data ExperimentContext (FileRenderer a) = FileContext+                                            -- ^ A file context constructor.+  +  renderExperiment e r reporters path = return ()
Simulation/Aivika/Experiment/FinalStatsView.hs view
@@ -1,5 +1,5 @@ -{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-# LANGUAGE MultiParamTypeClasses #-}  -- | -- Module     : Simulation.Aivika.Experiment.FinalStatsView@@ -26,6 +26,7 @@  import Simulation.Aivika import Simulation.Aivika.Experiment.Types+import Simulation.Aivika.Experiment.WebPageRenderer import Simulation.Aivika.Experiment.ExperimentWriter import Simulation.Aivika.Experiment.HtmlWriter import Simulation.Aivika.Experiment.SamplingStatsWriter@@ -59,18 +60,19 @@                    finalStatsTransform   = id,                    finalStatsSeries      = id } -instance WebPageRendering r => ExperimentView FinalStatsView r WebPageWriter where+instance ExperimentView FinalStatsView (WebPageRenderer a) where      outputView v =      let reporter exp renderer dir =           do st <- newFinalStats v exp dir-             let writer =+             let context =+                   WebPageContext $                    WebPageWriter { reporterWriteTOCHtml = finalStatsTOCHtml st,                                    reporterWriteHtml    = finalStatsHtml st }              return ExperimentReporter { reporterInitialise = return (),                                          reporterFinalise   = return (),                                          reporterSimulate   = simulateFinalStats st,-                                         reporterRequest    = writer }+                                         reporterContext    = context }     in ExperimentGenerator { generateReporter = reporter }    -- | The state of the view.
Simulation/Aivika/Experiment/FinalTableView.hs view
@@ -1,5 +1,5 @@ -{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-# LANGUAGE MultiParamTypeClasses #-}  -- | -- Module     : Simulation.Aivika.Experiment.FinalTableView@@ -31,6 +31,8 @@  import Simulation.Aivika import Simulation.Aivika.Experiment.Types+import Simulation.Aivika.Experiment.WebPageRenderer+import Simulation.Aivika.Experiment.FileRenderer import Simulation.Aivika.Experiment.ExperimentWriter import Simulation.Aivika.Experiment.HtmlWriter import Simulation.Aivika.Experiment.MRef@@ -95,18 +97,30 @@                    finalTableTransform   = expandResults,                    finalTableSeries      = id } -instance WebPageRendering r => ExperimentView FinalTableView r WebPageWriter where+instance ExperimentView FinalTableView (WebPageRenderer a) where      outputView v =      let reporter exp renderer dir =           do st <- newFinalTable v exp dir-             let writer =+             let context =+                   WebPageContext                    WebPageWriter { reporterWriteTOCHtml = finalTableTOCHtml st,                                    reporterWriteHtml    = finalTableHtml st }              return ExperimentReporter { reporterInitialise = return (),                                          reporterFinalise   = finaliseFinalTable st,                                          reporterSimulate   = simulateFinalTable st,-                                         reporterRequest    = writer }+                                         reporterContext    = context }+    in ExperimentGenerator { generateReporter = reporter }++instance ExperimentView FinalTableView (FileRenderer a) where+  +  outputView v = +    let reporter exp renderer dir =+          do st <- newFinalTable v exp dir+             return ExperimentReporter { reporterInitialise = return (),+                                         reporterFinalise   = finaliseFinalTable st,+                                         reporterSimulate   = simulateFinalTable st,+                                         reporterContext    = FileContext }     in ExperimentGenerator { generateReporter = reporter }    -- | The state of the view.
Simulation/Aivika/Experiment/LastValueView.hs view
@@ -1,5 +1,5 @@ -{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-# LANGUAGE MultiParamTypeClasses #-}  -- | -- Module     : Simulation.Aivika.Experiment.LastValueView@@ -26,6 +26,7 @@  import Simulation.Aivika import Simulation.Aivika.Experiment.Types+import Simulation.Aivika.Experiment.WebPageRenderer import Simulation.Aivika.Experiment.ExperimentWriter import Simulation.Aivika.Experiment.HtmlWriter import Simulation.Aivika.Experiment.Utils (replace)@@ -65,18 +66,19 @@                   lastValueTransform   = id,                   lastValueSeries      = id }   -instance WebPageRendering r => ExperimentView LastValueView r WebPageWriter where  +instance ExperimentView LastValueView (WebPageRenderer a) where        outputView v =      let reporter exp renderer dir =           do st <- newLastValues v exp-             let writer =+             let context =+                   WebPageContext $                    WebPageWriter { reporterWriteTOCHtml = lastValueTOCHtml st,                                    reporterWriteHtml    = lastValueHtml st }              return ExperimentReporter { reporterInitialise = return (),                                          reporterFinalise   = return (),                                          reporterSimulate   = simulateLastValues st,-                                         reporterRequest    = writer }+                                         reporterContext    = context }     in ExperimentGenerator { generateReporter = reporter }  -- | The state of the view.
Simulation/Aivika/Experiment/SamplingStatsWriter.hs view
@@ -55,7 +55,7 @@     samplingStatsCountText = "count",     samplingStatsFormatter = id,     samplingStatsWrite = \writer name stats ->-      do let format x = samplingStatsFormatter writer (show x)+      do let format x = samplingStatsFormatter writer x          writeHtml "<p>"          writeHtml "<table frame='border' cellspacing='4' width='"          writeHtml $ show $ samplingStatsWidth writer@@ -72,7 +72,7 @@          writeHtmlText $ samplingStatsMeanText writer           writeHtml "</td>"          writeHtml "<td>"-         writeHtmlText $ format $ samplingStatsMean stats+         writeHtmlText $ format $ show $ samplingStatsMean stats          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "<tr>"@@ -80,7 +80,7 @@          writeHtmlText $ samplingStatsDeviationText writer          writeHtml "</td>"          writeHtml "<td>"-         writeHtmlText $ format $ samplingStatsDeviation stats+         writeHtmlText $ format $ show $ samplingStatsDeviation stats          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "<tr>"@@ -88,7 +88,7 @@          writeHtmlText $ samplingStatsMinText writer          writeHtml "</td>"          writeHtml "<td>"-         writeHtmlText $ format $ samplingStatsMin stats+         writeHtmlText $ format $ show $ samplingStatsMin stats          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "<tr>"@@ -96,7 +96,7 @@          writeHtmlText $ samplingStatsMaxText writer          writeHtml "</td>"          writeHtml "<td>"-         writeHtmlText $ format $ samplingStatsMax stats+         writeHtmlText $ format $ show $ samplingStatsMax stats          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "<tr>"@@ -104,7 +104,7 @@          writeHtmlText $ samplingStatsCountText writer          writeHtml "</td>"          writeHtml "<td>"-         writeHtml $ format $ samplingStatsCount stats+         writeHtml $ format $ show $ samplingStatsCount stats          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "</table>" 
Simulation/Aivika/Experiment/TableView.hs view
@@ -1,5 +1,5 @@ -{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-# LANGUAGE MultiParamTypeClasses #-}  -- | -- Module     : Simulation.Aivika.Experiment.TableView@@ -30,6 +30,8 @@  import Simulation.Aivika import Simulation.Aivika.Experiment.Types+import Simulation.Aivika.Experiment.WebPageRenderer+import Simulation.Aivika.Experiment.FileRenderer import Simulation.Aivika.Experiment.ExperimentWriter import Simulation.Aivika.Experiment.HtmlWriter import Simulation.Aivika.Experiment.Utils (replace)@@ -113,18 +115,30 @@               tableTransform   = expandResults,               tableSeries      = id }   -instance WebPageRendering r => ExperimentView TableView r WebPageWriter where+instance ExperimentView TableView (WebPageRenderer a) where      outputView v =      let reporter exp renderer dir =           do st <- newTable v exp dir-             let writer =+             let context =+                   WebPageContext $                    WebPageWriter { reporterWriteTOCHtml = tableTOCHtml st,                                    reporterWriteHtml    = tableHtml st }              return ExperimentReporter { reporterInitialise = return (),                                          reporterFinalise   = return (),                                          reporterSimulate   = simulateTable st,-                                         reporterRequest    = writer }+                                         reporterContext    = context }+    in ExperimentGenerator { generateReporter = reporter }+  +instance ExperimentView TableView (FileRenderer a) where+  +  outputView v = +    let reporter exp renderer dir =+          do st <- newTable v exp dir+             return ExperimentReporter { reporterInitialise = return (),+                                         reporterFinalise   = return (),+                                         reporterSimulate   = simulateTable st,+                                         reporterContext    = FileContext }     in ExperimentGenerator { generateReporter = reporter }    -- | The state of the view.
Simulation/Aivika/Experiment/TimingStatsView.hs view
@@ -1,5 +1,5 @@ -{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses #-}+{-# LANGUAGE MultiParamTypeClasses #-}  -- | -- Module     : Simulation.Aivika.Experiment.TimingStatsView@@ -27,6 +27,7 @@  import Simulation.Aivika import Simulation.Aivika.Experiment.Types+import Simulation.Aivika.Experiment.WebPageRenderer import Simulation.Aivika.Experiment.ExperimentWriter import Simulation.Aivika.Experiment.HtmlWriter import Simulation.Aivika.Experiment.TimingStatsWriter@@ -70,18 +71,19 @@                     timingStatsTransform   = id,                     timingStatsSeries      = id } -instance WebPageRendering r => ExperimentView TimingStatsView r WebPageWriter where  +instance ExperimentView TimingStatsView (WebPageRenderer a) where        outputView v =      let reporter exp renderer dir =           do st <- newTimingStats v exp-             let writer =+             let context =+                   WebPageContext $                    WebPageWriter { reporterWriteTOCHtml = timingStatsTOCHtml st,                                    reporterWriteHtml    = timingStatsHtml st }              return ExperimentReporter { reporterInitialise = return (),                                          reporterFinalise   = return (),                                          reporterSimulate   = simulateTimingStats st,-                                         reporterRequest    = writer }+                                         reporterContext    = context }     in ExperimentGenerator { generateReporter = reporter }    -- | The state of the view.
Simulation/Aivika/Experiment/TimingStatsWriter.hs view
@@ -55,7 +55,7 @@     timingStatsMaxText = "maximum",     timingStatsFormatter = id,     timingStatsWrite = \writer name stats ->-      do let format x = timingStatsFormatter writer (show x)+      do let format x = timingStatsFormatter writer x          writeHtml "<p>"          writeHtml "<table frame='border' cellspacing='4' width='"          writeHtml $ show $ timingStatsWidth writer@@ -72,7 +72,7 @@          writeHtmlText $ timingStatsMeanText writer           writeHtml "</td>"          writeHtml "<td colspan='2'>"-         writeHtmlText $ format $ timingStatsMean stats+         writeHtmlText $ format $ show $ timingStatsMean stats          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "<tr>"@@ -80,7 +80,7 @@          writeHtmlText $ timingStatsDeviationText writer          writeHtml "</td>"          writeHtml "<td colspan='2'>"-         writeHtmlText $ format $ timingStatsDeviation stats+         writeHtmlText $ format $ show $ timingStatsDeviation stats          writeHtml "</td>"          writeHtml "</tr>"          writeHtml "<tr>"@@ -88,13 +88,13 @@          writeHtmlText $ timingStatsMinText writer          writeHtml "</td>"          writeHtml "<td>"-         writeHtmlText $ format $ timingStatsMin stats+         writeHtmlText $ format $ show $ timingStatsMin stats          writeHtml "</td>"          writeHtml "<td>"          writeHtmlText "("          writeHtmlText $ timingStatsTimeText writer          writeHtmlText " = "-         writeHtmlText $ format $ timingStatsMinTime stats+         writeHtmlText $ format $ show $ timingStatsMinTime stats          writeHtmlText ")"          writeHtml "</td>"          writeHtml "</tr>"@@ -103,13 +103,13 @@          writeHtmlText $ timingStatsMaxText writer          writeHtml "</td>"          writeHtml "<td>"-         writeHtmlText $ format $ timingStatsMax stats+         writeHtmlText $ format $ show $ timingStatsMax stats          writeHtml "</td>"          writeHtml "<td>"          writeHtmlText "("          writeHtmlText $ timingStatsTimeText writer          writeHtmlText " = "-         writeHtmlText $ format $ timingStatsMaxTime stats+         writeHtmlText $ format $ show $ timingStatsMaxTime stats          writeHtmlText ")"          writeHtml "</td>"          writeHtml "</tr>"@@ -119,9 +119,9 @@          writeHtml "</td>"          writeHtml "<td colspan='2'>"          writeHtml "["-         writeHtml $ format $ timingStatsStartTime stats+         writeHtml $ format $ show $ timingStatsStartTime stats          writeHtml "; "-         writeHtml $ format $ timingStatsLastTime stats+         writeHtml $ format $ show $ timingStatsLastTime stats          writeHtml "]"          writeHtml "</td>"          writeHtml "</tr>"
Simulation/Aivika/Experiment/Types.hs view
@@ -1,5 +1,5 @@ -{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, FlexibleContexts #-}+{-# LANGUAGE TypeFamilies, MultiParamTypeClasses #-}  -- | -- Module     : Simulation.Aivika.Experiment.Types@@ -19,42 +19,21 @@ -- views are provided. -- -module Simulation.Aivika.Experiment.Types-       (-- * General Definitions-        Experiment(..),-        ExperimentRendering(..),-        defaultExperiment,-        runExperiment,-        runExperimentParallel,-        ExperimentData(..),-        ExperimentView(..),-        ExperimentGenerator(..),-        ExperimentReporter(..),-        -- * Web Page Rendering-        WebPageRendering(..),-        WebPageRenderer(..),-        WebPageWriter(..),-        WebPageGenerator(..)) where+module Simulation.Aivika.Experiment.Types where  import Control.Monad import Control.Monad.State import Control.Concurrent.ParallelIO.Local -import qualified Data.Map as M--import Data.Ix import Data.Maybe import Data.Monoid -import qualified System.IO.UTF8 as UTF8 import System.Directory import System.FilePath  import GHC.Conc (getNumCapabilities)  import Simulation.Aivika-import Simulation.Aivika.Experiment.HtmlWriter-import Simulation.Aivika.Experiment.Utils (replace) import Simulation.Aivika.Experiment.ExperimentWriter  -- | It defines the simulation experiment with the specified rendering backend and its bound data.@@ -94,25 +73,28 @@                experimentNumCapabilities = getNumCapabilities }  -- | It allows rendering the simulation results in an arbitrary way.-class ExperimentRendering r a | r -> a where+class ExperimentRendering r where +  -- | Defines a context used when rendering the experiment.+  data ExperimentContext r :: *+   -- | Render the experiment after the simulation is finished, for example,   -- creating the @index.html@ file in the specified directory.-  renderExperiment :: Experiment -> r -> [ExperimentReporter a] -> FilePath -> ExperimentWriter ()+  renderExperiment :: Experiment -> r -> [ExperimentReporter r] -> FilePath -> ExperimentWriter ()  -- | This is a generator of the reporter with the specified rendering backend.                     -data ExperimentGenerator r a = -  ExperimentGenerator { generateReporter :: Experiment -> r -> FilePath -> ExperimentWriter (ExperimentReporter a)+data ExperimentGenerator r = +  ExperimentGenerator { generateReporter :: Experiment -> r -> FilePath -> ExperimentWriter (ExperimentReporter r)                         -- ^ Generate a reporter bound up with the specified directory.                       }  -- | Defines a view in which the simulation results should be saved. -- You should extend this type class to define your own views such -- as the PDF document.-class ExperimentRendering r a => ExperimentView v r a | r -> a where+class ExperimentRendering r => ExperimentView v r where      -- | Create a generator of the reporter.-  outputView :: v -> ExperimentGenerator r a+  outputView :: v -> ExperimentGenerator r  -- | It describes the source simulation data used in the experiment. data ExperimentData =@@ -123,7 +105,7 @@                  }  -- | Defines what creates the simulation reports by the specified renderer.-data ExperimentReporter a =+data ExperimentReporter r =   ExperimentReporter { reporterInitialise :: ExperimentWriter (),                        -- ^ Initialise the reporting before                         -- the simulation runs are started.@@ -135,17 +117,17 @@                        -- and return a finalizer that will be called                         -- in the stop time after the last signal is                         -- triggered and processed.-                       reporterRequest    :: a-                       -- ^ Return data requested by the renderer.+                       reporterContext    :: ExperimentContext r+                       -- ^ Return a context used by the renderer.                      }  -- | Run the simulation experiment sequentially. For example,  -- it can be a Monte-Carlo simulation dependentent on the external -- 'Parameter' values.-runExperiment :: ExperimentRendering r a+runExperiment :: ExperimentRendering r                  => Experiment                  -- ^ the simulation experiment to run-                 -> [ExperimentGenerator r a]+                 -> [ExperimentGenerator r]                  -- ^ generators used for rendering                  -> r                  -- ^ the rendering backend@@ -166,10 +148,10 @@ -- threads directly with help of 'experimentNumCapabilities', -- although the real number of parallel threads can depend on many -- factors.-runExperimentParallel :: ExperimentRendering r a+runExperimentParallel :: ExperimentRendering r                          => Experiment                          -- ^ the simulation experiment to run-                         -> [ExperimentGenerator r a]+                         -> [ExperimentGenerator r]                          -- ^ generators used for rendering                          -> r                          -- ^ the rendering backend@@ -183,12 +165,12 @@                parallel_ pool tasks                          -- | Run the simulation experiment with the specified executor.-runExperimentWithExecutor :: ExperimentRendering r a +runExperimentWithExecutor :: ExperimentRendering r                              => ([IO ()] -> IO ())                              -- ^ an executor that allows parallelizing the simulation if required                              -> Experiment                              -- ^ the simulation experiment to run-                             -> [ExperimentGenerator r a]+                             -> [ExperimentGenerator r]                              -- ^ generators used for rendering                              -> r                              -- ^ the rendering backend@@ -219,62 +201,20 @@                     runEventWith EarlierEvents $                     forM reporters $ \reporter ->                     reporterSimulate reporter d-              runEventInStopTime $-                disposeEvent $ mconcat fs+              let m1 =+                    runEventInStopTime $+                    return ()+                  m2 =+                    runEventInStopTime $+                    disposeEvent $ mconcat fs+                  mh (SimulationException e') =+                    when (experimentVerbose e) $+                    liftIO $+                    do putStr "A simulation exception has been raised when running: " +                       putStrLn $ show e'+              finallySimulation (catchSimulation m1 mh) m2      liftIO $        executor $ runSimulations simulate specs runCount      forM_ reporters reporterFinalise      renderExperiment e r reporters path      return ()---- | It defines the web page renderer for simulation 'Experiment'. -data WebPageRenderer = WebPageRenderer---- | It replies to the requests made by the web page renderer.-data WebPageWriter =-  WebPageWriter { reporterWriteTOCHtml :: Int -> HtmlWriter (),-                  -- ^ Return a TOC (Table of Contents) item for -                  -- the HTML index file after the finalisation -                  -- function is called, i.e. in the very end. -                  -- The agument specifies the ordered number of -                  -- the item.-                  ---                  -- You should wrap your HTML in 'writeHtmlListItem'.-                  reporterWriteHtml :: Int -> HtmlWriter ()-                  -- ^ Return an HTML code for the index file-                  -- after the finalisation function is called,-                  -- i.e. in the very end. The agument specifies-                  -- the ordered number of the item.-                }---- | A subclass of renderers that know how to save the @index.html@ file--- when rendering the simulation experiment.-class ExperimentRendering r WebPageWriter => WebPageRendering r---- | A convenient type synonym for describing the web page generators.-type WebPageGenerator r = ExperimentGenerator r WebPageWriter--instance WebPageRendering WebPageRenderer--instance ExperimentRendering WebPageRenderer WebPageWriter where--  renderExperiment e r reporters path = -    do let html :: HtmlWriter ()-           html = -             writeHtmlDocumentWithTitle (experimentTitle e) $-             do writeHtmlList $-                  forM_ (zip [1..] reporters) $ \(i, reporter) -> -                  reporterWriteTOCHtml (reporterRequest reporter) i-                writeHtmlBreak-                unless (null $ experimentDescription e) $-                  writeHtmlParagraph $-                  writeHtmlText $ experimentDescription e-                forM_ (zip [1..] reporters) $ \(i, reporter) ->-                  reporterWriteHtml (reporterRequest reporter) i-           file = combine path "index.html"-       ((), contents) <- runHtmlWriter html id-       liftIO $ do-         UTF8.writeFile file (contents [])-         when (experimentVerbose e) $-           do putStr "Generated file "-              putStrLn file
+ Simulation/Aivika/Experiment/WebPageRenderer.hs view
@@ -0,0 +1,83 @@++{-# LANGUAGE TypeFamilies #-}++-- |+-- Module     : Simulation.Aivika.Experiment.Types+-- Copyright  : Copyright (c) 2012-2014, David Sorokin <david.sorokin@gmail.com>+-- License    : BSD3+-- Maintainer : David Sorokin <david.sorokin@gmail.com>+-- Stability  : experimental+-- Tested with: GHC 7.8.3+--+-- It defines a renderer that creates a web page when running the simulation experiment.+--++module Simulation.Aivika.Experiment.WebPageRenderer where++import Control.Monad+import Control.Monad.Trans++import qualified System.IO.UTF8 as UTF8+import System.Directory+import System.FilePath++import Simulation.Aivika+import Simulation.Aivika.Experiment.Types+import Simulation.Aivika.Experiment.HtmlWriter+import Simulation.Aivika.Experiment.ExperimentWriter++-- | It defines the web page renderer for simulation 'Experiment'. +data WebPageRenderer a = WebPageRenderer a+                         -- ^ A renderer that depends on the provided parameter.++-- | It replies to the requests made by the web page renderer.+data WebPageWriter =+  WebPageWriter { reporterWriteTOCHtml :: Int -> HtmlWriter (),+                  -- ^ Return a TOC (Table of Contents) item for +                  -- the HTML index file after the finalisation +                  -- function is called, i.e. in the very end. +                  -- The agument specifies the ordered number of +                  -- the item.+                  --+                  -- You should wrap your HTML in 'writeHtmlListItem'.+                  reporterWriteHtml :: Int -> HtmlWriter ()+                  -- ^ Return an HTML code for the index file+                  -- after the finalisation function is called,+                  -- i.e. in the very end. The agument specifies+                  -- the ordered number of the item.+                }++-- | A convenient type synonym for describing a web page generator.+type WebPageGenerator a = ExperimentGenerator (WebPageRenderer a)++-- | Rending a web page with results when running the simulation experiment.+instance ExperimentRendering (WebPageRenderer a) where++  -- | A web page context.+  newtype ExperimentContext (WebPageRenderer a) =+    WebPageContext { runWebPageContext :: WebPageWriter+                     -- ^ Run the web page context.+                   }++  renderExperiment e r reporters path = +    do let html :: HtmlWriter ()+           html = +             writeHtmlDocumentWithTitle (experimentTitle e) $+             do writeHtmlList $+                  forM_ (zip [1..] reporters) $ \(i, reporter) -> +                  reporterWriteTOCHtml (runWebPageContext $+                                        reporterContext reporter) i+                writeHtmlBreak+                unless (null $ experimentDescription e) $+                  writeHtmlParagraph $+                  writeHtmlText $ experimentDescription e+                forM_ (zip [1..] reporters) $ \(i, reporter) ->+                  reporterWriteHtml (runWebPageContext $+                                     reporterContext reporter) i+           file = combine path "index.html"+       ((), contents) <- runHtmlWriter html id+       liftIO $ do+         UTF8.writeFile file (contents [])+         when (experimentVerbose e) $+           do putStr "Generated file "+              putStrLn file
aivika-experiment.cabal view
@@ -1,5 +1,5 @@ name:            aivika-experiment-version:         2.1+version:         3.0 synopsis:        Simulation experiments for the Aivika library description:     This package allows defining simulation experiments for the Aivika@@ -41,6 +41,8 @@                      Simulation.Aivika.Experiment.FinalTableView                      Simulation.Aivika.Experiment.Utils                      Simulation.Aivika.Experiment.MRef+                     Simulation.Aivika.Experiment.WebPageRenderer+                     Simulation.Aivika.Experiment.FileRenderer                           build-depends:   base >= 3 && < 6,                      mtl >= 1.1.0.2,@@ -51,12 +53,10 @@                      split >= 0.2.2,                      network-uri >= 2.6,                      parallel-io >= 0.3.2.1,-                     aivika >= 2.1+                     aivika >= 3.0 -    extensions:      FlexibleInstances,-                     FlexibleContexts,-                     MultiParamTypeClasses,-                     FunctionalDependencies+    extensions:      MultiParamTypeClasses,+                     TypeFamilies                           ghc-options:     -O2 
examples/LinearArray.hs view
@@ -59,7 +59,7 @@     experimentDescription = "Model Linear Array as described in " ++                             "the examples included in Berkeley-Madonna." } -generators :: WebPageRendering r => [WebPageGenerator r]+generators :: [WebPageGenerator a] generators =   [outputView defaultExperimentSpecsView,    outputView $ defaultTableView {@@ -86,4 +86,4 @@         resultByName "m" <>         resultByName "c" } ] -main = runExperiment experiment generators WebPageRenderer (model 51)+main = runExperiment experiment generators (WebPageRenderer ()) (model 51)
examples/MachRep3.hs view
@@ -43,7 +43,7 @@     experimentRunCount = 3,     experimentDescription = description } -generators :: WebPageRendering r => [WebPageGenerator r]+generators :: [WebPageGenerator a] generators =   [outputView defaultExperimentSpecsView,    outputView $ defaultLastValueView {@@ -115,4 +115,4 @@        [resultSource "x" "The proportion of up time" prop,         resultSource "t" "Simulation time" time] -main = runExperiment experiment generators WebPageRenderer model+main = runExperiment experiment generators (WebPageRenderer ()) model