def test_factorset_add_remove_factors(self): self.factor_set1 = FactorSet() self.factor_set1.add_factors(self.phi1, self.phi2) self.assertEqual({self.phi1, self.phi2}, self.factor_set1.get_factors()) self.factor_set1.remove_factors(self.phi2) self.assertEqual({self.phi1}, self.factor_set1.get_factors())
def test_factorset_marginalize_not_inplace(self): phi1 = Factor(['x1', 'x2', 'x3'], [2, 3, 2], range(12)) phi2 = Factor(['x3', 'x4', 'x1'], [2, 2, 2], range(8)) phi3 = Factor(['x5', 'x6', 'x7'], [2, 2, 2], range(8)) phi4 = Factor(['x5', 'x7', 'x8'], [2, 2, 2], range(8)) factor_set = FactorSet(phi1, phi2, phi3, phi4) new_factor_set = factor_set.marginalize(['x1', 'x5'], inplace=False) phi1_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == set(['x2', 'x3']), new_factor_set.factors))[0] self.assertEqual(phi1.marginalize('x1', inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == set(['x4', 'x3']), new_factor_set.factors))[0] self.assertEqual(phi2.marginalize('x1', inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == set(['x6', 'x7']), new_factor_set.factors))[0] self.assertEqual(phi3.marginalize('x5', inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == set(['x8', 'x7']), new_factor_set.factors))[0] self.assertEqual(phi4.marginalize('x5', inplace=False), phi4_equivalent_in_factor_set)
def test_factorset_product(self): phi1 = Factor(['x1', 'x2', 'x3'], [2, 3, 2], range(12)) phi2 = Factor(['x3', 'x4', 'x1'], [2, 2, 2], range(8)) factor_set1 = FactorSet(phi1, phi2) phi3 = Factor(['x5', 'x6', 'x7'], [2, 2, 2], range(8)) phi4 = Factor(['x5', 'x7', 'x8'], [2, 2, 2], range(8)) factor_set2 = FactorSet(phi3, phi4) factor_set3 = factor_set2.product(factor_set1) self.assertEqual(set([phi1, phi2, phi3, phi4]), factor_set3.factors)
def test_factorset_divide(self): phi1 = DiscreteFactor(['x1', 'x2', 'x3'], [2, 3, 2], range(1, 13)) phi2 = DiscreteFactor(['x3', 'x4', 'x1'], [2, 2, 2], range(1, 9)) factor_set1 = FactorSet(phi1, phi2) phi3 = DiscreteFactor(['x5', 'x6', 'x7'], [2, 2, 2], range(1, 9)) phi4 = DiscreteFactor(['x5', 'x7', 'x8'], [2, 2, 2], range(1, 9)) factor_set2 = FactorSet(phi3, phi4) factor_set3 = factor_set2.divide(factor_set1, inplace=False) self.assertEqual({phi3, phi4, phi1.identity_factor() / phi1, phi2.identity_factor() / phi2}, factor_set3.factors)
def test_factorset_divide(self): phi1 = Factor(['x1', 'x2', 'x3'], [2, 3, 2], range(1, 13)) phi2 = Factor(['x3', 'x4', 'x1'], [2, 2, 2], range(1, 9)) factor_set1 = FactorSet(phi1, phi2) phi3 = Factor(['x5', 'x6', 'x7'], [2, 2, 2], range(1, 9)) phi4 = Factor(['x5', 'x7', 'x8'], [2, 2, 2], range(1, 9)) factor_set2 = FactorSet(phi3, phi4) factor_set3 = factor_set2.divide(factor_set1) self.assertEqual(set([phi3, phi4, phi1.identity_factor() / phi1, phi2.identity_factor() / phi2]), factor_set3.factors)
def test_factorset_divide(self): phi1 = Factor(['x1', 'x2', 'x3'], [2, 3, 2], range(1, 13)) phi2 = Factor(['x3', 'x4', 'x1'], [2, 2, 2], range(1, 9)) factor_set1 = FactorSet(phi1, phi2) phi3 = Factor(['x5', 'x6', 'x7'], [2, 2, 2], range(1, 9)) phi4 = Factor(['x5', 'x7', 'x8'], [2, 2, 2], range(1, 9)) factor_set2 = FactorSet(phi3, phi4) factor_set3 = factor_set2.divide(factor_set1) self.assertEqual( set([ phi3, phi4, phi1.identity_factor() / phi1, phi2.identity_factor() / phi2 ]), factor_set3.factors)
def test_factorset_divide(self): phi1 = DiscreteFactor(['x1', 'x2', 'x3'], [2, 3, 2], range(1, 13)) phi2 = DiscreteFactor(['x3', 'x4', 'x1'], [2, 2, 2], range(1, 9)) factor_set1 = FactorSet(phi1, phi2) phi3 = DiscreteFactor(['x5', 'x6', 'x7'], [2, 2, 2], range(1, 9)) phi4 = DiscreteFactor(['x5', 'x7', 'x8'], [2, 2, 2], range(1, 9)) factor_set2 = FactorSet(phi3, phi4) factor_set3 = factor_set2.divide(factor_set1, inplace=False) self.assertEqual( { phi3, phi4, phi1.identity_factor() / phi1, phi2.identity_factor() / phi2 }, factor_set3.factors)
def test_factorset_add_remove_factors(self): phi1 = Factor(['x1', 'x2', 'x3'], [2, 3, 2], range(12)) phi2 = Factor(['x3', 'x4', 'x1'], [2, 2, 2], range(8)) factor_set1 = FactorSet() factor_set1.add_factors(phi1, phi2) self.assertEqual(set([phi1, phi2]), factor_set1.get_factors()) factor_set1.remove_factors(phi2) self.assertEqual(set([phi1]), factor_set1.get_factors())
def test_factorset_marginalize_not_inplace(self): factor_set = FactorSet(self.phi1, self.phi2, self.phi3, self.phi4) new_factor_set = factor_set.marginalize(['x1', 'x5'], inplace=False) phi1_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x2', 'x3'}, new_factor_set.factors))[0] self.assertEqual(self.phi1.marginalize(['x1'], inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x4', 'x3'}, new_factor_set.factors))[0] self.assertEqual(self.phi2.marginalize(['x1'], inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x6', 'x7'}, new_factor_set.factors))[0] self.assertEqual(self.phi3.marginalize(['x5'], inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x8', 'x7'}, new_factor_set.factors))[0] self.assertEqual(self.phi4.marginalize(['x5'], inplace=False), phi4_equivalent_in_factor_set)
def test_factorset_divide(self): phi1 = DiscreteFactor(["x1", "x2", "x3"], [2, 3, 2], range(1, 13)) phi2 = DiscreteFactor(["x3", "x4", "x1"], [2, 2, 2], range(1, 9)) factor_set1 = FactorSet(phi1, phi2) phi3 = DiscreteFactor(["x5", "x6", "x7"], [2, 2, 2], range(1, 9)) phi4 = DiscreteFactor(["x5", "x7", "x8"], [2, 2, 2], range(1, 9)) factor_set2 = FactorSet(phi3, phi4) factor_set3 = factor_set2.divide(factor_set1, inplace=False) self.assertEqual( { phi3, phi4, phi1.identity_factor() / phi1, phi2.identity_factor() / phi2 }, factor_set3.factors, )
def test_factorset_marginalize_not_inplace(self): phi1 = Factor(['x1', 'x2', 'x3'], [2, 3, 2], range(12)) phi2 = Factor(['x3', 'x4', 'x1'], [2, 2, 2], range(8)) phi3 = Factor(['x5', 'x6', 'x7'], [2, 2, 2], range(8)) phi4 = Factor(['x5', 'x7', 'x8'], [2, 2, 2], range(8)) factor_set = FactorSet(phi1, phi2, phi3, phi4) new_factor_set = factor_set.marginalize(['x1', 'x5'], inplace=False) phi1_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == set(['x2', 'x3']), new_factor_set.factors))[0] self.assertEqual(phi1.marginalize('x1', inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == set(['x4', 'x3']), new_factor_set.factors))[0] self.assertEqual(phi2.marginalize('x1', inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == set(['x6', 'x7']), new_factor_set.factors))[0] self.assertEqual(phi3.marginalize('x5', inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == set(['x8', 'x7']), new_factor_set.factors))[0] self.assertEqual(phi4.marginalize('x5', inplace=False), phi4_equivalent_in_factor_set)
def test_factorset_marginalize_not_inplace(self): factor_set = FactorSet(self.phi1, self.phi2, self.phi3, self.phi4) new_factor_set = factor_set.marginalize(["x1", "x5"], inplace=False) phi1_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x2", "x3"}, new_factor_set.factors))[0] self.assertEqual(self.phi1.marginalize(["x1"], inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x4", "x3"}, new_factor_set.factors))[0] self.assertEqual(self.phi2.marginalize(["x1"], inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x6", "x7"}, new_factor_set.factors))[0] self.assertEqual(self.phi3.marginalize(["x5"], inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x8", "x7"}, new_factor_set.factors))[0] self.assertEqual(self.phi4.marginalize(["x5"], inplace=False), phi4_equivalent_in_factor_set)
def test_factorset_marginalize_not_inplace(self): factor_set = FactorSet(self.phi1, self.phi2, self.phi3, self.phi4) new_factor_set = factor_set.marginalize(['x1', 'x5'], inplace=False) phi1_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x2', 'x3'}, new_factor_set.factors))[0] self.assertEqual(self.phi1.marginalize(['x1'], inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x4', 'x3'}, new_factor_set.factors))[0] self.assertEqual(self.phi2.marginalize(['x1'], inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x6', 'x7'}, new_factor_set.factors))[0] self.assertEqual(self.phi3.marginalize(['x5'], inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x8', 'x7'}, new_factor_set.factors))[0] self.assertEqual(self.phi4.marginalize(['x5'], inplace=False), phi4_equivalent_in_factor_set)
def compute_message(cluster_1, cluster_2, inference_data_structure=VariableElimination): """ Computes the message from cluster_1 to cluster_2. The messages are computed by projecting a factor set to produce a set of marginals over a given set of scopes. The factor set is nothing but the factors present in the models. The algorithm for computing messages between any two clusters is: * Build an inference data structure with all the factors represented in the cluster. * Perform inference on the cluster using the inference data structure to compute the marginals of the variables present in the sepset between these two clusters. * The output message is the factor set of all the computed marginals. Parameters ---------- cluster_1: MarkovModel, BayesianModel, or any pgmpy supported graphical model The cluster producing the message cluster_2: MarkovModel, BayesianModel, or any pgmpy supported graphical model The cluster receiving the message inference_data_structure: Inference class such as VariableElimination or BeliefPropagation The inference data structure used to produce factor set of marginals """ # Sepset variables between the two clusters sepset_var = set(cluster_1.nodes()).intersection(cluster_2.nodes()) # Initialize the inference data structure inference = inference_data_structure(cluster_1) # Perform inference query = inference.query(list(sepset_var)) # The factor set of all the computed messages is the output # message query would be a dictionary with key as the variable # and value as the corresponding marginal thus the values # would represent the factor set return FactorSet(*query.values())
class TestFactorSet(unittest.TestCase): def setUp(self): self.phi1 = DiscreteFactor(['x1', 'x2', 'x3'], [2, 3, 2], range(12)) self.phi2 = DiscreteFactor(['x3', 'x4', 'x1'], [2, 2, 2], range(8)) self.phi3 = DiscreteFactor(['x5', 'x6', 'x7'], [2, 2, 2], range(8)) self.phi4 = DiscreteFactor(['x5', 'x7', 'x8'], [2, 2, 2], range(8)) def test_class_init(self): phi1 = DiscreteFactor(['x1', 'x2', 'x3'], [2, 3, 2], range(12)) phi2 = DiscreteFactor(['x3', 'x4', 'x1'], [2, 2, 2], range(8)) factor_set1 = FactorSet(phi1, phi2) self.assertEqual({phi1, phi2}, factor_set1.get_factors()) def test_factorset_add_remove_factors(self): self.factor_set1 = FactorSet() self.factor_set1.add_factors(self.phi1, self.phi2) self.assertEqual({self.phi1, self.phi2}, self.factor_set1.get_factors()) self.factor_set1.remove_factors(self.phi2) self.assertEqual({self.phi1}, self.factor_set1.get_factors()) def test_factorset_product(self): factor_set1 = FactorSet(self.phi1, self.phi2) factor_set2 = FactorSet(self.phi3, self.phi4) factor_set3 = factor_set2.product(factor_set1, inplace=False) self.assertEqual({self.phi1, self.phi2, self.phi3, self.phi4}, factor_set3.factors) def test_factorset_divide(self): phi1 = DiscreteFactor(['x1', 'x2', 'x3'], [2, 3, 2], range(1, 13)) phi2 = DiscreteFactor(['x3', 'x4', 'x1'], [2, 2, 2], range(1, 9)) factor_set1 = FactorSet(phi1, phi2) phi3 = DiscreteFactor(['x5', 'x6', 'x7'], [2, 2, 2], range(1, 9)) phi4 = DiscreteFactor(['x5', 'x7', 'x8'], [2, 2, 2], range(1, 9)) factor_set2 = FactorSet(phi3, phi4) factor_set3 = factor_set2.divide(factor_set1, inplace=False) self.assertEqual({phi3, phi4, phi1.identity_factor() / phi1, phi2.identity_factor() / phi2}, factor_set3.factors) def test_factorset_marginalize_inplace(self): factor_set = FactorSet(self.phi1, self.phi2, self.phi3, self.phi4) factor_set.marginalize(['x1', 'x5'], inplace=True) phi1_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x2', 'x3'}, factor_set.factors))[0] self.assertEqual(self.phi1.marginalize(['x1'], inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x4', 'x3'}, factor_set.factors))[0] self.assertEqual(self.phi2.marginalize(['x1'], inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x6', 'x7'}, factor_set.factors))[0] self.assertEqual(self.phi3.marginalize(['x5'], inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x8', 'x7'}, factor_set.factors))[0] self.assertEqual(self.phi4.marginalize(['x5'], inplace=False), phi4_equivalent_in_factor_set) def test_factorset_marginalize_not_inplace(self): factor_set = FactorSet(self.phi1, self.phi2, self.phi3, self.phi4) new_factor_set = factor_set.marginalize(['x1', 'x5'], inplace=False) phi1_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x2', 'x3'}, new_factor_set.factors))[0] self.assertEqual(self.phi1.marginalize(['x1'], inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x4', 'x3'}, new_factor_set.factors))[0] self.assertEqual(self.phi2.marginalize(['x1'], inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x6', 'x7'}, new_factor_set.factors))[0] self.assertEqual(self.phi3.marginalize(['x5'], inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list(filter(lambda x: set(x.scope()) == {'x8', 'x7'}, new_factor_set.factors))[0] self.assertEqual(self.phi4.marginalize(['x5'], inplace=False), phi4_equivalent_in_factor_set)
def test_class_init(self): phi1 = DiscreteFactor(["x1", "x2", "x3"], [2, 3, 2], range(12)) phi2 = DiscreteFactor(["x3", "x4", "x1"], [2, 2, 2], range(8)) factor_set1 = FactorSet(phi1, phi2) self.assertEqual({phi1, phi2}, factor_set1.get_factors())
class TestFactorSet(unittest.TestCase): def setUp(self): self.phi1 = DiscreteFactor(["x1", "x2", "x3"], [2, 3, 2], range(12)) self.phi2 = DiscreteFactor(["x3", "x4", "x1"], [2, 2, 2], range(8)) self.phi3 = DiscreteFactor(["x5", "x6", "x7"], [2, 2, 2], range(8)) self.phi4 = DiscreteFactor(["x5", "x7", "x8"], [2, 2, 2], range(8)) def test_class_init(self): phi1 = DiscreteFactor(["x1", "x2", "x3"], [2, 3, 2], range(12)) phi2 = DiscreteFactor(["x3", "x4", "x1"], [2, 2, 2], range(8)) factor_set1 = FactorSet(phi1, phi2) self.assertEqual({phi1, phi2}, factor_set1.get_factors()) def test_factorset_add_remove_factors(self): self.factor_set1 = FactorSet() self.factor_set1.add_factors(self.phi1, self.phi2) self.assertEqual({self.phi1, self.phi2}, self.factor_set1.get_factors()) self.factor_set1.remove_factors(self.phi2) self.assertEqual({self.phi1}, self.factor_set1.get_factors()) def test_factorset_product(self): factor_set1 = FactorSet(self.phi1, self.phi2) factor_set2 = FactorSet(self.phi3, self.phi4) factor_set3 = factor_set2.product(factor_set1, inplace=False) self.assertEqual({self.phi1, self.phi2, self.phi3, self.phi4}, factor_set3.factors) def test_factorset_divide(self): phi1 = DiscreteFactor(["x1", "x2", "x3"], [2, 3, 2], range(1, 13)) phi2 = DiscreteFactor(["x3", "x4", "x1"], [2, 2, 2], range(1, 9)) factor_set1 = FactorSet(phi1, phi2) phi3 = DiscreteFactor(["x5", "x6", "x7"], [2, 2, 2], range(1, 9)) phi4 = DiscreteFactor(["x5", "x7", "x8"], [2, 2, 2], range(1, 9)) factor_set2 = FactorSet(phi3, phi4) factor_set3 = factor_set2.divide(factor_set1, inplace=False) self.assertEqual( { phi3, phi4, phi1.identity_factor() / phi1, phi2.identity_factor() / phi2 }, factor_set3.factors, ) def test_factorset_marginalize_inplace(self): factor_set = FactorSet(self.phi1, self.phi2, self.phi3, self.phi4) factor_set.marginalize(["x1", "x5"], inplace=True) phi1_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x2", "x3"}, factor_set.factors))[0] self.assertEqual(self.phi1.marginalize(["x1"], inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x4", "x3"}, factor_set.factors))[0] self.assertEqual(self.phi2.marginalize(["x1"], inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x6", "x7"}, factor_set.factors))[0] self.assertEqual(self.phi3.marginalize(["x5"], inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x8", "x7"}, factor_set.factors))[0] self.assertEqual(self.phi4.marginalize(["x5"], inplace=False), phi4_equivalent_in_factor_set) def test_factorset_marginalize_not_inplace(self): factor_set = FactorSet(self.phi1, self.phi2, self.phi3, self.phi4) new_factor_set = factor_set.marginalize(["x1", "x5"], inplace=False) phi1_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x2", "x3"}, new_factor_set.factors))[0] self.assertEqual(self.phi1.marginalize(["x1"], inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x4", "x3"}, new_factor_set.factors))[0] self.assertEqual(self.phi2.marginalize(["x1"], inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x6", "x7"}, new_factor_set.factors))[0] self.assertEqual(self.phi3.marginalize(["x5"], inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {"x8", "x7"}, new_factor_set.factors))[0] self.assertEqual(self.phi4.marginalize(["x5"], inplace=False), phi4_equivalent_in_factor_set)
def test_factorset_product(self): factor_set1 = FactorSet(self.phi1, self.phi2) factor_set2 = FactorSet(self.phi3, self.phi4) factor_set3 = factor_set2.product(factor_set1, inplace=False) self.assertEqual({self.phi1, self.phi2, self.phi3, self.phi4}, factor_set3.factors)
def test_class_init(self): phi1 = DiscreteFactor(['x1', 'x2', 'x3'], [2, 3, 2], range(12)) phi2 = DiscreteFactor(['x3', 'x4', 'x1'], [2, 2, 2], range(8)) factor_set1 = FactorSet(phi1, phi2) self.assertEqual({phi1, phi2}, factor_set1.get_factors())
def test_class_init(self): phi1 = Factor(['x1', 'x2', 'x3'], [2, 3, 2], range(12)) phi2 = Factor(['x3', 'x4', 'x1'], [2, 2, 2], range(8)) factor_set1 = FactorSet(phi1, phi2) self.assertEqual(set([phi1, phi2]), factor_set1.get_factors())
class TestFactorSet(unittest.TestCase): def setUp(self): self.phi1 = Factor(['x1', 'x2', 'x3'], [2, 3, 2], range(12)) self.phi2 = Factor(['x3', 'x4', 'x1'], [2, 2, 2], range(8)) self.phi3 = Factor(['x5', 'x6', 'x7'], [2, 2, 2], range(8)) self.phi4 = Factor(['x5', 'x7', 'x8'], [2, 2, 2], range(8)) def test_class_init(self): phi1 = Factor(['x1', 'x2', 'x3'], [2, 3, 2], range(12)) phi2 = Factor(['x3', 'x4', 'x1'], [2, 2, 2], range(8)) factor_set1 = FactorSet(phi1, phi2) self.assertEqual({phi1, phi2}, factor_set1.get_factors()) def test_factorset_add_remove_factors(self): self.factor_set1 = FactorSet() self.factor_set1.add_factors(self.phi1, self.phi2) self.assertEqual({self.phi1, self.phi2}, self.factor_set1.get_factors()) self.factor_set1.remove_factors(self.phi2) self.assertEqual({self.phi1}, self.factor_set1.get_factors()) def test_factorset_product(self): factor_set1 = FactorSet(self.phi1, self.phi2) factor_set2 = FactorSet(self.phi3, self.phi4) factor_set3 = factor_set2.product(factor_set1, inplace=False) self.assertEqual({self.phi1, self.phi2, self.phi3, self.phi4}, factor_set3.factors) def test_factorset_divide(self): phi1 = Factor(['x1', 'x2', 'x3'], [2, 3, 2], range(1, 13)) phi2 = Factor(['x3', 'x4', 'x1'], [2, 2, 2], range(1, 9)) factor_set1 = FactorSet(phi1, phi2) phi3 = Factor(['x5', 'x6', 'x7'], [2, 2, 2], range(1, 9)) phi4 = Factor(['x5', 'x7', 'x8'], [2, 2, 2], range(1, 9)) factor_set2 = FactorSet(phi3, phi4) factor_set3 = factor_set2.divide(factor_set1, inplace=False) self.assertEqual( { phi3, phi4, phi1.identity_factor() / phi1, phi2.identity_factor() / phi2 }, factor_set3.factors) def test_factorset_marginalize_inplace(self): factor_set = FactorSet(self.phi1, self.phi2, self.phi3, self.phi4) factor_set.marginalize(['x1', 'x5'], inplace=True) phi1_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x2', 'x3'}, factor_set.factors))[0] self.assertEqual(self.phi1.marginalize(['x1'], inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x4', 'x3'}, factor_set.factors))[0] self.assertEqual(self.phi2.marginalize(['x1'], inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x6', 'x7'}, factor_set.factors))[0] self.assertEqual(self.phi3.marginalize(['x5'], inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x8', 'x7'}, factor_set.factors))[0] self.assertEqual(self.phi4.marginalize(['x5'], inplace=False), phi4_equivalent_in_factor_set) def test_factorset_marginalize_not_inplace(self): factor_set = FactorSet(self.phi1, self.phi2, self.phi3, self.phi4) new_factor_set = factor_set.marginalize(['x1', 'x5'], inplace=False) phi1_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x2', 'x3'}, new_factor_set.factors))[0] self.assertEqual(self.phi1.marginalize(['x1'], inplace=False), phi1_equivalent_in_factor_set) phi2_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x4', 'x3'}, new_factor_set.factors))[0] self.assertEqual(self.phi2.marginalize(['x1'], inplace=False), phi2_equivalent_in_factor_set) phi3_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x6', 'x7'}, new_factor_set.factors))[0] self.assertEqual(self.phi3.marginalize(['x5'], inplace=False), phi3_equivalent_in_factor_set) phi4_equivalent_in_factor_set = list( filter(lambda x: set(x.scope()) == {'x8', 'x7'}, new_factor_set.factors))[0] self.assertEqual(self.phi4.marginalize(['x5'], inplace=False), phi4_equivalent_in_factor_set)