import opengm
import numpy as np
def infer_bp(potv, potf, indv):
N = potv.shape[0]
F = potf.shape[0]
gm = opengm.gm([2] * N, 'multiplier')
fids = gm.addFunctions(potv)
gm.addFactors(fids, np.arange(N))
fids = gm.addFunctions(potf)
gm.addFactors(fids, indv)
bp = opengm.inference.BeliefPropagation(gm, 'integrator')
res = bp.infer()
print res
margv = bp.marginals(np.arange(N))
margf = bp.factorMarginals(np.arange(N, N+F))
return margv, margf
N = 100
F = N - 1
potv = np.zeros((N, 2), dtype=np.float64)
potf = np.zeros((F, 2, 2), dtype=np.float64)
indv = np.zeros((F, 2), dtype=np.int32)
potv[:, :] = np.array([1e2, 1e0])
potf[:, :] = np.array([[1e0, 1e2], [1e0, 1e-2]])
indv[:, 0] = 0
indv[:, 1] = np.arange(1, F+1)
margv, margf = infer_bp(potv, potf, indv)
print margv[:10]