# Models

As already introduced in the Getting Started section, models are implemented by writing a class derived from Model and overriding the member function simulate(). Optionally, it is also possible to override the member functions size() and simulate(t:Integer) so that the model unfolds incrementally over a number of epochs.

Mathematical Description Programmatic
$p(\mathrm{d}x_{0:T})$ The model. m:Model
$T$ Number of epochs. m.size()
$X_0$ Random variables in the initial epoch. Usually member variables of m, or local variables of m.simulate()
$X_t$ Random variables in the $t$th epoch. Usually member variables of m or local variables of m.simulate(t)
$x_0 \sim p(\mathrm{d}x_0)$ Simulate the initial model. m.simulate()
$x_t \sim p(\mathrm{d}x_t\mid x_{0:t-1})$ Simulate the $t$th epoch model. m.simulate(t)

Some classes derive from Model to provide more specific structures, such as MarkovModel and HiddenMarkovModel. It is possible to write a class derived from one of these rather than Model directly.

When implementing the simulate() and simulate(t) member functions, we make use of all the building blocks previously described to enumerate the random variables of the model and their relationships. This includes Distribution, Random and Expression objects, as well as the simulate (<~), observe (~>) and assume (~) operators.