packages feed

aivika-experiment-chart-5.0: examples/InspectionAdjustmentStations/Experiment.hs

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 = 480.0,
                spcDT = 0.1,
                spcMethod = RungeKutta4,
                spcGeneratorType = SimpleGenerator }

-- | The experiment.
experiment :: Experiment
experiment =
  defaultExperiment {
    experimentSpecs = specs,
    experimentRunCount = 1000,
    -- experimentRunCount = 10,
    experimentTitle = "Inspection and Adjustment Stations on a Production Line (the Monte-Carlo simulation)" }

inputArrivalTimer  = T.ArrivalTimer $ resultByName "inputArrivalTimer"
outputArrivalTimer = T.ArrivalTimer $ resultByName "outputArrivalTimer"

inspectionStations = T.Server $ resultByName "inspectionStations"
adjustmentStations = T.Server $ resultByName "adjustmentStations"

inspectionQueue = T.Queue $ resultByName "inspectionQueue"
adjustmentQueue = T.Queue $ resultByName "adjustmentQueue"

resultProcessingTime :: ResultTransform
resultProcessingTime =
  (T.tr $ T.arrivalProcessingTime inputArrivalTimer) <>
  (T.tr $ T.arrivalProcessingTime outputArrivalTimer)

resultProcessingFactor :: ResultTransform
resultProcessingFactor =
  (T.serverProcessingFactor inspectionStations) <>
  (T.serverProcessingFactor adjustmentStations)

inspectionQueueCount      = T.queueCount inspectionQueue
inspectionQueueCountStats = T.tr $ T.queueCountStats inspectionQueue
inspectionWaitTime        = T.tr $ T.queueWaitTime inspectionQueue

adjustmentQueueCount      = T.queueCount adjustmentQueue
adjustmentQueueCountStats = T.tr $ T.queueCountStats adjustmentQueue
adjustmentWaitTime        = T.tr $ T.queueWaitTime adjustmentQueue

generators :: ChartRendering r => [WebPageGenerator r]
generators =
  [outputView defaultExperimentSpecsView,
   outputView defaultInfoView,
   outputView $ defaultFinalStatsView {
     finalStatsTitle  = "Arrivals",
     finalStatsSeries = resultProcessingTime },
   outputView $ defaultDeviationChartView {
     deviationChartTitle = "The processing factor (chart)",
     deviationChartWidth = 1000,
     deviationChartRightYSeries = resultProcessingFactor },
   outputView $ defaultFinalHistogramView {
     finalHistogramTitle = "The processing factor (histogram)",
     finalHistogramWidth = 1000,
     finalHistogramSeries = resultProcessingFactor },
   outputView $ defaultFinalStatsView {
     finalStatsTitle = "The processing factor (statistics)",
     finalStatsSeries = resultProcessingFactor },
   outputView $ defaultDeviationChartView {
     deviationChartTitle = "The inspection queue size (chart)",
     deviationChartWidth = 1000,
     deviationChartRightYSeries = 
       inspectionQueueCount <> inspectionQueueCountStats },
   outputView $ defaultFinalStatsView {
     finalStatsTitle = "The inspection queue size (statistics)",
     finalStatsSeries = inspectionQueueCountStats },
   outputView $ defaultDeviationChartView {
     deviationChartTitle = "The inspection queue wait time (chart)",
     deviationChartWidth = 1000,
     deviationChartRightYSeries = inspectionWaitTime },
   outputView $ defaultFinalStatsView {
     finalStatsTitle = "The inspection queue wait time (statistics)",
     finalStatsSeries = inspectionWaitTime },
   outputView $ defaultDeviationChartView {
     deviationChartTitle = "The adjustment queue size (chart)",
     deviationChartWidth = 1000,
     deviationChartRightYSeries = 
       adjustmentQueueCount <> adjustmentQueueCountStats },
   outputView $ defaultFinalStatsView {
     finalStatsTitle = "The adjustment queue size (statistics)",
     finalStatsSeries = adjustmentQueueCountStats },
   outputView $ defaultDeviationChartView {
     deviationChartTitle = "The adjustment queue wait time (chart)",
     deviationChartWidth = 1000,
     deviationChartRightYSeries = adjustmentWaitTime },
   outputView $ defaultFinalStatsView {
     finalStatsTitle = "The adjustment queue wait time (statistics)",
     finalStatsSeries = adjustmentWaitTime } ]