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())
Beispiel #2
0
 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)
Beispiel #3
0
 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)
Beispiel #4
0
 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)
Beispiel #6
0
 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)
Beispiel #7
0
 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)
Beispiel #8
0
 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)
Beispiel #9
0
 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)
Beispiel #11
0
 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,
     )
Beispiel #12
0
 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())
Beispiel #13
0
 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)
Beispiel #14
0
 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)
Beispiel #15
0
 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)
Beispiel #16
0
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)
Beispiel #18
0
 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())
Beispiel #19
0
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_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_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())
Beispiel #23
0
 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)
Beispiel #24
0
 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())
Beispiel #25
0
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)