Skip to content

Analysis

A core aspect when building simulations is to understand, define and modulate the inherent system dynamics. To build a correct simulation, the designer/developer must carefully analyze how states progress over time.

To facilitate this process, kalasim offers various means to analyze data created by a simulation

  • The Event Log tracks events in a simulation
  • Monitors track state and statistics of the basic elements within a simulation, and may be used for domain-specific entities as well
  • Lifecycle Records summarize a component's states history
  • visualization to inspect complex spatio-temporal patterns

Monitors

See chapter about monitors.

Event Log

See chapter about event logging.

Visualization

See chapter about visualization.

Component Status

The state transition of a component provide value insight into its behavior. This is facilitated by lifecycle statistics ComponentLifecycleRecord that summarize a component's states history.

These data can also be transformed easily into a table as well

val customers : List<Component> // = ...
val records: List<ComponentLifecycleRecord> = customers.map { it.toLifeCycleRecord() }

records.asDataFrame()

This transforms the customers straight into a krangl dataframe with the following structure

A DataFrame: 1034 x 11
      component   createdAt   inCurrent    inData   inDataSince   inInterrupted   inPassive
 1    Vehicle.1       0.366           0   989.724        10.276               0           0
 2    Vehicle.2       1.294           0   984.423        15.577               0           0
 3    Vehicle.3       1.626           0   989.724        10.276               0           0
 4    Vehicle.4       2.794           0   989.724        10.276               0           0
and 1024 more rows, and and 4 more variables: inScheduled, inStandby, inWaiting

Clearly if needed, the user may also work with the records directly. For instance to configure a visualization.

Replication

Running a simulation just once, often does not provide sufficient insights into the dynamics of the system under consideration. Often, the user may want to execute a model many times with altered initial conditions, and then perform a statistical analysis over the output. This is also considered as what-if analyis. See here for simple example.

By design kalasim does not make use of parallelism. So when scaling up execution to run in paralell, we need to be careful, that the internal dependency injection (which relates by default to a global context variable) does not cause trouble. See here for an example that defines a parameter grid to be assessed with multi-threading with a simulation run per hyper-parameter.

Component Tracking

To prevent memory leaks, the environment just keeps track of scheduled components, that is components that are queued for execution. In some situations the user may want to track all components irrespective of their queuing status. This can be achieved by setting up a component collector before creating the components

createSimulation{
    val cc = componentCollector()

    // create components
    Component("foo")
    Component("bar")

    // analyze all components created until this point
    cc.size // will be 2
}