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 +5/−1
- Simulation/Aivika/Experiment/ExperimentSpecsView.hs +6/−4
- Simulation/Aivika/Experiment/ExperimentSpecsWriter.hs +5/−5
- Simulation/Aivika/Experiment/FileRenderer.hs +33/−0
- Simulation/Aivika/Experiment/FinalStatsView.hs +6/−4
- Simulation/Aivika/Experiment/FinalTableView.hs +18/−4
- Simulation/Aivika/Experiment/LastValueView.hs +6/−4
- Simulation/Aivika/Experiment/SamplingStatsWriter.hs +6/−6
- Simulation/Aivika/Experiment/TableView.hs +18/−4
- Simulation/Aivika/Experiment/TimingStatsView.hs +6/−4
- Simulation/Aivika/Experiment/TimingStatsWriter.hs +9/−9
- Simulation/Aivika/Experiment/Types.hs +32/−92
- Simulation/Aivika/Experiment/WebPageRenderer.hs +83/−0
- aivika-experiment.cabal +6/−6
- examples/LinearArray.hs +2/−2
- examples/MachRep3.hs +2/−2
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