def infer(self, algorithm='auto', **kwargs): """Calculates partition function. Available algorithms * ``auto`` - Automatic. * ``edge_elimination`` - Edge elimination. :param algorithm: Which algorithm to use. String. :return: Partition function. """ if algorithm == 'auto': return infer_edge_elimination(self) elif algorithm == 'edge_elimination': return infer_edge_elimination(self) else: raise ValueError('Unknown algorithm %s' % algorithm)
def test_infer_compare_with_pairwise_tree(): pw_model = tree_potts_model(gr_size=50, al_size=5, seed=0) true_pf = np.exp(pw_model.infer(algorithm='tree_dp').log_pf) nfg_model = inferlo.NormalFactorGraphModel.from_model(pw_model) pf = infer_edge_elimination(nfg_model) assert np.allclose(true_pf, pf)
def test_infer_compare_with_pairwise_grid_5x5(): pw_model = grid_potts_model(5, 5, al_size=2, seed=0) true_pf = np.exp(pw_model.infer(algorithm='path_dp').log_pf) nfg_model = inferlo.NormalFactorGraphModel.from_model(pw_model) pf = infer_edge_elimination(nfg_model) assert np.allclose(true_pf, pf)
def test_infer_disconnected(): pw_model = PairWiseFiniteModel(5, al_size=2) pw_model.set_field(np.random.random(size=(5, 2))) pw_model.add_interaction(2, 3, np.random.random(size=(2, 2))) true_pf = np.exp(pw_model.infer(algorithm='bruteforce').log_pf) nfg_model = inferlo.NormalFactorGraphModel.from_model(pw_model) pf = infer_edge_elimination(nfg_model) assert np.allclose(true_pf, pf)
def test_ifer_clique_3vars(): al_size = 5 np.random.seed(10) domain = inferlo.DiscreteDomain.range(al_size) model = inferlo.NormalFactorGraphModel(3, domain) f01 = np.random.random(size=(al_size, al_size)) f12 = np.random.random(size=(al_size, al_size)) f20 = np.random.random(size=(al_size, al_size)) model *= inferlo.DiscreteFactor(model, [0, 1], f01) model *= inferlo.DiscreteFactor(model, [1, 2], f12) model *= inferlo.DiscreteFactor(model, [2, 0], f20) model.build() z = infer_edge_elimination(model) assert np.allclose(z, model.part_func_bruteforce())
def test_infer_small_line(): np.random.seed(10) domain = inferlo.DiscreteDomain.range(5) model = inferlo.NormalFactorGraphModel(3, domain) f0 = np.random.random(size=(5,)) f01 = np.random.random(size=(5, 5)) f12 = np.random.random(size=(5, 5)) f2 = np.random.random(size=(5,)) model *= inferlo.DiscreteFactor(model, [0], f0) model *= inferlo.DiscreteFactor(model, [0, 1], f01) model *= inferlo.DiscreteFactor(model, [1, 2], f12) model *= inferlo.DiscreteFactor(model, [2], f2) model.build() z = infer_edge_elimination(model) assert np.allclose(z, f0 @ f01 @ f12 @ f2)