Infer.NET user guide : The Infer.NET Modelling API
Attaching constraints to variables
Infer.NET provides a variety of constraints that can be applied to variables. For example:
constrains the random variable x to be positive. Built-in constraints include Positive, True, False, Equal and EqualRandom (see the full list of built-in constraints). Constraints can be combined with factors to produce more complex constraints. Here are some examples:
Variable.ConstrainTrue(a + b < x); Variable.ConstrainEqual(y - z, 5.0);
One of the most useful constraints is ConstrainEqualRandom. This constraint is an optimized version of ConstrainEqual that avoids the creation of an intermediate random variable. The lines
Variable.ConstrainEqualRandom(x, new Gaussian(0,1)); Variable.ConstrainEqualRandom(x, distribution);
are mathematically equivalent to
Variable.ConstrainEqual(x, Variable.GaussianFromMeanAndVariance(0,1)); Variable.ConstrainEqual(x, Variable.Random(distribution));
but the ConstrainEqualRandom line leads to more efficient code since no intermediate random variable is created. Furthermore, ConstrainEqualRandom can be used in cases where there is no corresponding method on Variable to create a random variable with the desired distribution. Therefore you should try to use ConstrainEqualRandom whenever you find yourself writing ConstrainEqual lines like the above.
Similarly, if you find yourself writing
Variable.ConstrainTrue(x == y);
then try to replace this with
The second form avoids creating an intermediate random variable, making the code run faster and Infer.NET happier.
Under the hood
Under the hood, a call to Variable.ConstrainEqual is converted into a call to Variable.Constrain, as follows:
Variable.Constrain(Constrain.Equal, x, y);
Similar to factor functions, the most general way of adding a constraint is:
Variable.Constrain(MethodName, arg1, arg2, ...);
which adds the constraint specified by MethodName to the arguments arg1, arg2 (which may be random variables, constants or parameters). Using this mechanism, you can define your own constraints.