module Experiment (experiment, generators) where
import Data.Monoid
import Control.Arrow
import Simulation.Aivika
import Simulation.Aivika.Experiment
import Simulation.Aivika.Experiment.Chart
import qualified Simulation.Aivika.Results.Transform as T
-- | The simulation specs.
specs = Specs { spcStartTime = 0.0,
spcStopTime = 500.0,
spcDT = 0.1,
spcMethod = RungeKutta4,
spcGeneratorType = SimpleGenerator }
-- | The experiment.
experiment :: Experiment
experiment =
defaultExperiment {
experimentSpecs = specs,
experimentRunCount = 1000,
-- experimentRunCount = 10,
experimentTitle = "Machine Tool with Breakdowns" }
jobsCompleted = T.ArrivalTimer $ resultByName "jobsCompleted"
jobsInterrupted = resultByName "jobsInterrupted"
inputQueue = T.Queue $ resultByName "inputQueue"
machineProcessing = T.Server $ resultByName "machineProcessing"
jobsCompletedCount =
T.tr $ T.samplingStatsCount $
T.arrivalProcessingTime jobsCompleted
processingTime :: ResultTransform
processingTime =
T.tr $ T.arrivalProcessingTime jobsCompleted
waitTime :: ResultTransform
waitTime =
T.tr $ T.queueWaitTime inputQueue
queueCount :: ResultTransform
queueCount =
T.tr $ T.queueCount inputQueue
queueCountStats :: ResultTransform
queueCountStats =
T.tr $ T.queueCountStats inputQueue
processingFactor :: ResultTransform
processingFactor =
T.tr $ T.serverProcessingFactor machineProcessing
generators :: ChartRendering r => [WebPageGenerator r]
generators =
[outputView defaultExperimentSpecsView,
outputView defaultInfoView,
outputView $ defaultFinalStatsView {
finalStatsTitle = "Machine Tool With Breakdowns",
finalStatsSeries = jobsCompletedCount <> jobsInterrupted },
outputView $ defaultDeviationChartView {
deviationChartTitle = "The Wait Time (chart)",
deviationChartWidth = 1000,
deviationChartRightYSeries = waitTime },
outputView $ defaultFinalStatsView {
finalStatsTitle = "The Wait Time (statistics)",
finalStatsSeries = waitTime },
outputView $ defaultDeviationChartView {
deviationChartTitle = "The Queue Size (chart)",
deviationChartWidth = 1000,
deviationChartRightYSeries = queueCount <> queueCountStats },
outputView $ defaultFinalStatsView {
finalStatsTitle = "The Queue Size (statistics)",
finalStatsSeries = queueCountStats },
outputView $ defaultDeviationChartView {
deviationChartTitle = "The Processing Time (chart)",
deviationChartWidth = 1000,
deviationChartRightYSeries = processingTime },
outputView $ defaultFinalStatsView {
finalStatsTitle = "The Processing Time (statistics)",
finalStatsSeries = processingTime },
outputView $ defaultDeviationChartView {
deviationChartTitle = "The Machine Load (chart)",
deviationChartWidth = 1000,
deviationChartRightYSeries = processingFactor },
outputView $ defaultFinalHistogramView {
finalHistogramTitle = "The Machine Load (histogram)",
finalHistogramWidth = 1000,
finalHistogramSeries = processingFactor },
outputView $ defaultFinalStatsView {
finalStatsTitle = "The Machine Load (statistics)",
finalStatsSeries = processingFactor } ]