packages feed

aivika-gpss-0.3: examples/Example2BTrans.hs

{-
  GENERATE 35,10
  QUEUE JOEQ
  SEIZE JOE
  DEPART JOEQ
  ADVANCE 18,6
  RELEASE JOE
  TERMINATE

  GENERATE 60,20
  QUEUE JOEQ
  SEIZE JOE
  DEPART JOEQ
  ADVANCE 10,2
  ADVANCE 18,6
  RELEASE JOE
  TERMINATE

  GENERATE 480
  TERMINATE 1

  START 1
 -}

import Control.Category
import Control.Monad.Trans

import Simulation.Aivika.Trans
import Simulation.Aivika.Trans.GPSS
import qualified Simulation.Aivika.Trans.GPSS.Queue as Q

import Simulation.Aivika.IO

type DES = IO

specs = Specs { spcStartTime = 0.0,
                spcStopTime = 480.0,
                spcDT = 1.0,
                spcMethod = RungeKutta4,
                spcGeneratorType = SimpleGenerator }
        
model :: Simulation DES (Results DES)
model =
  do joeq <- runEventInStartTime Q.newQueue
     joe  <- runEventInStartTime newFacility

     let clientStream1 = randomUniformStream (35 - 10) (35 + 10)
         clientStream2 = randomUniformStream (60 - 20) (60 + 20)

     let clients1 = streamGeneratorBlock0 clientStream1
         chain1   =
           queueBlock joeq 1 >>>
           seizeBlock joe >>>
           departBlock joeq 1 >>>
           advanceBlock (randomUniformProcess_ (18 - 6) (18 + 6)) >>>
           releaseBlock joe >>>
           terminateBlock

     let clients2 = streamGeneratorBlock0 clientStream2
         chain2   =
           queueBlock joeq 1 >>>
           seizeBlock joe >>>
           departBlock joeq 1 >>>
           advanceBlock (randomUniformProcess_ (10 - 2) (10 + 2)) >>>
           advanceBlock (randomUniformProcess_ (18 - 6) (18 + 6)) >>>
           releaseBlock joe >>>
           terminateBlock

     runProcessInStartTime $
       runGeneratorBlock clients1 chain1 

     runProcessInStartTime $
       runGeneratorBlock clients2 chain2 
  
     return $
       results
       [resultSource "joeq" "The Joe queue" joeq,
        resultSource "joe" "Joe" joe]
  
main =
  printSimulationResultsInStopTime
  printResultSourceInEnglish
  model specs