Copyright | Copyright (c) 2009-2017 David Sorokin <david.sorokin@gmail.com> |
---|---|

License | BSD3 |

Maintainer | David Sorokin <david.sorokin@gmail.com> |

Stability | experimental |

Safe Haskell | None |

Language | Haskell2010 |

Tested with: GHC 8.0.1

This module defines a variable that is bound up with the event queue and that keeps the history of changes storing the values in 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

- data Var a
- varChanged :: Var a -> Signal a
- varChanged_ :: Var a -> Signal ()
- newVar :: a -> Simulation (Var a)
- readVar :: Var a -> Event a
- varMemo :: Var a -> Dynamics a
- writeVar :: Var a -> a -> Event ()
- modifyVar :: Var a -> (a -> a) -> Event ()
- freezeVar :: Var a -> Event (Array Int Double, Array Int a, Array Int a)

# Documentation

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 is
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 under the hood, 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.

#### Instances

varChanged :: Var a -> Signal a Source #

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

varChanged_ :: Var a -> Signal () Source #

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

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

Create a new variable.

readVar :: Var a -> Event 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.

varMemo :: Var a -> Dynamics 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.

freezeVar :: Var a -> Event (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`

.