BIFMMessagePassingRules

Backward-information-filter forward-marginal (BIFM) smoothing of a linear state-space model, as two factor nodes: BIFM, a whole time slice, and BIFMHelper, which starts the chain. Use it to smooth a long linear Gaussian chain with known matrices in two passes, without inverting a covariance at every step.

No free energy

The Bethe free energy of a model with BIFM is not supported. Asking for it throws a BIFMFreeEnergyError; run the inference without it.

BIFMMessagePassingRules — Module
BIFMMessagePassingRules

Backward-information-filter forward-marginal (BIFM) smoothing of a linear state-space model:

  • BIFM, a whole time slice, znext = A zprev + B in and out = C znext, as one deterministic node, under BIFMSmoother, which carries A, B and C and which the model must give;
  • BIFMHelper, at the start of the chain, which turns the backward pass into the forward one.

The backward pass sends information-form messages, the forward pass the marginals themselves; on a chain the result is the Rauch–Tung–Striebel smoother's. The rules take multivariate normal messages only, and the free energy of a model with BIFM is not supported: asking for it throws a BIFMFreeEnergyError.

Examples

julia> result = @call_message_update_rule(
           node = BIFM, target = :zprev, algorithm = BIFMSmoother([1.0;;], [1.0;;], [1.0;;]),
           m = (
               out = MvNormalMeanPrecision([1.0], [1.0;;]),
               in = MvNormalMeanPrecision([0.0], [1.0;;]),
               znext = MvNormalWeightedMeanPrecision([0.0], [0.0;;]),
           ),
       );

julia> mean(getresult(result)) ≈ [1.0]
true
source
Where these rules run

ReactiveMP runs these rules on a factor graph, which RxInfer builds from a GraphPPL model. The examples here call the rules directly, as a test does.

Pages

  • BIFM: the time slice, its algorithm BIFMSmoother, and the equations of both passes.
  • BIFMHelper: the node at the start of the chain.