aivika-5.5: A multi-method 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.Circuit

Contents

Description

Tested with: GHC 8.0.1

It represents a circuit synchronized with the event queue. Also it allows creating the recursive links with help of the proc-notation.

The implementation is based on the Arrow Tutorial.

Synopsis

The Circuit Arrow

newtype Circuit a b Source #

Represents a circuit synchronized with the event queue. Besides, it allows creating the recursive links with help of the proc-notation.

Constructors

Circuit 

Fields

Instances

Arrow Circuit Source # 

Methods

arr :: (b -> c) -> Circuit b c #

first :: Circuit b c -> Circuit (b, d) (c, d) #

second :: Circuit b c -> Circuit (d, b) (d, c) #

(***) :: Circuit b c -> Circuit b' c' -> Circuit (b, b') (c, c') #

(&&&) :: Circuit b c -> Circuit b c' -> Circuit b (c, c') #

ArrowChoice Circuit Source # 

Methods

left :: Circuit b c -> Circuit (Either b d) (Either c d) #

right :: Circuit b c -> Circuit (Either d b) (Either d c) #

(+++) :: Circuit b c -> Circuit b' c' -> Circuit (Either b b') (Either c c') #

(|||) :: Circuit b d -> Circuit c d -> Circuit (Either b c) d #

ArrowLoop Circuit Source # 

Methods

loop :: Circuit (b, d) (c, d) -> Circuit b c #

Category * Circuit Source # 

Methods

id :: cat a a #

(.) :: cat b c -> cat a b -> cat a c #

iterateCircuitInIntegTimes :: Circuit a a -> a -> Event (Task a) Source #

Iterate the circuit in the integration time points returning a task which completes after the final output of the circuit is received.

iterateCircuitInIntegTimes_ :: Circuit a a -> a -> Event () Source #

Iterate the circuit in the integration time points.

iterateCircuitInIntegTimesMaybe :: Circuit a (Maybe a) -> a -> Event () Source #

Iterate the circuit in the integration time points, interrupting the iteration immediately if Nothing is returned within the Circuit computation.

iterateCircuitInIntegTimesEither :: Circuit a (Either b a) -> a -> Event (Task (Either b a)) Source #

Iterate the circuit in the integration time points returning a task that computes the final output of the circuit either after all points are exhausted, or after the Left result of type b is received, which interrupts the computation immediately.

iterateCircuitInTimes :: [Double] -> Circuit a a -> a -> Event (Task a) Source #

Iterate the circuit in the specified time points returning a task which completes after the final output of the circuit is received.

iterateCircuitInTimes_ :: [Double] -> Circuit a a -> a -> Event () Source #

Iterate the circuit in the specified time points.

iterateCircuitInTimesMaybe :: [Double] -> Circuit a (Maybe a) -> a -> Event () Source #

Iterate the circuit in the specified time points, interrupting the iteration immediately if Nothing is returned within the Circuit computation.

iterateCircuitInTimesEither :: [Double] -> Circuit a (Either b a) -> a -> Event (Task (Either b a)) Source #

Iterate the circuit in the specified time points returning a task that computes the final output of the circuit either after all points are exhausted, or after the Left result of type b is received, which interrupts the computation immediately.

Circuit Primitives

arrCircuit :: (a -> Event b) -> Circuit a b Source #

Create a simple circuit by the specified handling function that runs the computation for each input value to get an output.

accumCircuit :: (acc -> a -> Event (acc, b)) -> acc -> Circuit a b Source #

Accumulator that outputs a value determined by the supplied function.

The Arrival Circuit

arrivalCircuit :: Circuit a (Arrival a) Source #

A circuit that adds the information about the time points at which the values were received.

Delaying the Circuit

delayCircuit :: a -> Circuit a a Source #

Delay the input by one step using the specified initial value.

The Time Circuit

timeCircuit :: Circuit a Double Source #

A circuit that returns the current modeling time.

Conditional Computation

(<?<) Source #

Arguments

:: Circuit b c

process the event if it presents

-> Circuit a (Maybe b)

whether there is an event

-> Circuit a (Maybe c)

the resulting circuit that processes only the represented events

Like <<< but processes only the represented events.

(>?>) Source #

Arguments

:: Circuit a (Maybe b)

whether there is an event

-> Circuit b c

process the event if it presents

-> Circuit a (Maybe c)

the resulting circuit that processes only the represented events

Like >>> but processes only the represented events.

filterCircuit :: (a -> Bool) -> Circuit a b -> Circuit a (Maybe b) Source #

Filter the circuit, calculating only those parts of the circuit that satisfy the specified predicate.

filterCircuitM :: (a -> Event Bool) -> Circuit a b -> Circuit a (Maybe b) Source #

Filter the circuit within the Event computation, calculating only those parts of the circuit that satisfy the specified predicate.

neverCircuit :: Circuit a (Maybe b) Source #

The source of events that never occur.

Converting to Signals and Processors

circuitSignaling :: Circuit a b -> Signal a -> Signal b Source #

Get a signal transform by the specified circuit.

circuitProcessor :: Circuit a b -> Processor a b Source #

Transform the circuit to a processor.

Integrals and Difference Equations

integCircuit Source #

Arguments

:: Double

the initial value

-> Circuit Double Double

map the derivative to an integral

An approximation of the integral using Euler's method.

This function can be rather inaccurate as it depends on the time points at wich the Circuit computation is actuated. Also Euler's method per se is not most accurate, although simple enough for implementation.

Consider using the integ function whenever possible. That function can integrate with help of the Runge-Kutta method by the specified integration time points that are passed in the simulation specs to every Simulation, when running the model.

At the same time, the integCircuit function has no mutable state unlike the former. The latter consumes less memory but at the cost of inaccuracy and relatively more slow simulation, had we requested the integral in the same time points.

Regarding the recursive equations, the both functions allow defining them but whithin different computations (either with help of the recursive do-notation or the proc-notation).

integCircuitEither Source #

Arguments

:: Double

the initial value

-> Circuit (Either Double Double) Double

map either a new Left value or the Right derivative to an integral

Like integCircuit but allows either setting a new Left integral value, or using the Right derivative when integrating by Euler's method.

sumCircuit Source #

Arguments

:: Num a 
=> a

the initial value

-> Circuit a a

map the difference to a sum

A sum of differences starting from the specified initial value.

Consider using the more accurate diffsum function whener possible as it is calculated in every integration time point specified by specs passed in to every Simulation, when running the model.

At the same time, the sumCircuit function has no mutable state and it consumes less memory than the former.

Regarding the recursive equations, the both functions allow defining them but whithin different computations (either with help of the recursive do-notation or the proc-notation).

sumCircuitEither Source #

Arguments

:: Num a 
=> a

the initial value

-> Circuit (Either a a) a

map either a new Left value or the Right difference to a sum

Like sumCircuit but allows either setting a new Left value for the sum, or updating it by specifying the Right difference.

The Circuit Transform

circuitTransform :: Circuit a b -> Transform a b Source #

Approximate the circuit as a transform of time varying function, calculating the values in the integration time points and then interpolating in all other time points. The resulting transform computation is synchronized with the event queue.

This procedure consumes memory as the underlying memoization allocates an array to store the calculated values.

Debugging

traceCircuit Source #

Arguments

:: Maybe String

the request message

-> Maybe String

the response message

-> Circuit a b

a circuit

-> Circuit a b 

Show the debug messages with the current simulation time.