#lang scribble/doc
@(require
  scribble/manual
  scribblings/icons
  (for-label racket/base
             racket/contract
             plot
             (planet williams/simulation/simulation-with-graphics)))

@title[#:tag "simulation-classes"]{Simulation Classes}

@local-table-of-contents[]

@section{Process Classes}
TBD

@section{Resource Classes}
TBD

@section{Example---Simulation Classes}

This example is the same as Example 3 in Chapter 8 Data Collection. Since this example uses classes, the @scheme[racket] language is required instead of the @scheme[racket/base] language.

@schememod[
scheme
(code:comment " Example 4 - Classes")

(require (planet williams/simulation/simulation-with-graphics))

(define n-attendants 2)
(define attendant #f)

(define-process-class generator%
  (init-field (n 1000))
  (do ((i 0 (+ i 1)))
      ((= i n) (void))
    (wait (random-exponential 4.0))
    (make-object customer% i)))

(define-process-class customer%
    (init-field i)
    (begin
      (send attendant request)
      (work (random-flat 2.0 10.0))
      (send attendant relinquish)))

(define (run-simulation n)
  (with-new-simulation-environment
   (set! attendant (make-object resource% n-attendants))
   (make-object generator% n)
   (accumulate (variable-statistics (send attendant queue-variable-n)))
   (accumulate (variable-history (send attendant queue-variable-n)))
   (start-simulation)
   (printf "--- Example 4 - Classes ---~n")
   (printf "Maximum queue length = ~a~n"
           (variable-maximum (send attendant queue-variable-n)))
   (printf "Average queue length = ~a~n"
           (variable-mean (send attendant queue-variable-n)))
   (printf "Variance             = ~a~n"
           (variable-variance (send attendant queue-variable-n)))
   (printf "Utilization          = ~a~n"
           (variable-mean (send attendant satisfied-variable-n)))
   (printf "Variance             = ~a~n"
           (variable-variance (send attendant satisfied-variable-n)))
   (printf "~a~n" (history-plot (variable-history 
                                 (send attendant queue-variable-n))))))

(run-simulation 1000)
]

The output is identical to the example in Section 8.3 Example---Data Collection (except for the heading).

@verbatim{
--- Example 4 - Classes ---
Maximum queue length = 8
Average queue length = 0.9120534884951139
Variance             = 2.2420855874934826
Utilization          = 1.4320511974417858
Variance             = 0.5885107114317054}

@image["scribblings/images/example-4.gif"]

