aivika-transformers-5.3.1: Transformers for the Aivika simulation library

CopyrightCopyright (c) 2009-2017 David Sorokin <david.sorokin@gmail.com>
LicenseBSD3
MaintainerDavid Sorokin <david.sorokin@gmail.com>
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

Simulation.Aivika.Trans.Var.Unboxed

Description

Tested with: GHC 8.0.1

This module defines an unboxed variable that is bound up with the event queue and that keeps the history of changes storing the values in unboxed arrays, which allows using the variable in differential and difference equations of System Dynamics within hybrid discrete-continuous simulation.

Because of using the arrays, it would usually be a logical mistake to use this variable for collecting statistics. In most cases, the statistics can actually be collected with a very small footprint by updating immutable SamplingStats and TimingStats values in a mutable Ref reference.

Synopsis

Documentation

class MonadDES m => MonadVar m a where Source #

A type class of monads within which we can create mutable unboxed variables.

Associated Types

data Var m a Source #

Like the Ref reference but keeps the history of changes in different time points. The Var variable is safe to be used in the hybrid discrete-continuous simulation. Only this variable can be much slower than the reference.

For example, the memoised values of the variable can be used in the differential and difference equations of System Dynamics, while the variable iself can be updated within the discrete event simulation.

Because of using arrays, it would usually be a logical mistake to use the variable for collecting statistics. In most cases, the statistics can actually be collected with a very small footprint by updating immutable SamplingStats and TimingStats values in a mutable Ref reference.

Methods

newVar :: a -> Simulation m (Var m a) Source #

Create a new variable.

varMemo :: Var m a -> Dynamics m a Source #

Read the first actual, i.e. memoised, value of a variable for the requested time actuating the current events from the queue if needed.

This computation can be used in the ordinary differential and difference equations of System Dynamics.

readVar :: Var m a -> Event m a Source #

Read the recent actual value of a variable for the requested time.

This computation is destined to be used within discrete event simulation.

writeVar :: Var m a -> a -> Event m () Source #

Write a new value into the variable.

modifyVar :: Var m a -> (a -> a) -> Event m () Source #

Mutate the contents of the variable.

freezeVar :: Var m a -> Event m (Array Int Double, Array Int a, Array Int a) Source #

Freeze the variable and return in arrays the time points and the corresponding first and last values when the variable had changed or had been memoised in different time points: (1) the time points are sorted in ascending order; (2) the first and last actual values per each time point are provided.

If you need to get all changes including those ones that correspond to the same simulation time points then you can use the newSignalHistory function passing in the varChanged signal to it and then call function readSignalHistory.

varChanged :: Var m a -> Signal m a Source #

Return a signal that notifies about every change of the variable state.

varChanged_ :: MonadDES m => Var m a -> Signal m () Source #

Return a signal that notifies about every change of the variable state.