Probability
Probabilistic statements use one of three operators, or the keyword factor
:
x <~ p;
x ~> p;
x ~ p;
factor w;
Let x
be a value of basic type (e.g. Real
) or optional type (e.g. Real?
), or object of Random type (e.g. Random<Real>
), and p
be an object of Distribution type. Then:
x <~ p
simulates a variatex
from the distributionp
,x ~> p
observes a variatex
from the distributionp
,x ~ p
assumes thatx
is distributed according top
,factor w
applies an arbitrary log-weightw
to the current execution.
These statements emit events to an event handler, which is simply an object of type Handler. Event handlers are typically used as an interface between inference methods and models, creating the opportunity for inference methods to intervene in model execution. By default, there is no event handler registered, so the events are ignored. To register an event handler h:Handler
, use a with
block:
with h {
// do something probabilistic
}
~
and <~
operators may be used to assign initial values to variables:
x:Real <~ Gaussian(0.0, 1.0);
y:Random<Real> ~ Gaussian(0.0, 1.0);
They may even be used with let
:
let x <~ Gaussian(0.0, 1.0);
let y ~ Gaussian(0.0, 1.0);
Here, the type of x
is inferred to be Real
, and that of y
to be Random<Real>
.