示例#1
0
def test_str():
    entry1 = PotentialEntry().add(0, 'on').add(1, 'on')
    entry2 = PotentialEntry().add(0, 'on').add(1, 'off')
    entry3 = PotentialEntry().add(0, 'off').add(1, 'on')
    entry4 = PotentialEntry().add(0, 'off').add(1, 'off')

    potential = Potential() \
        .add_entry(entry1) \
        .add_entry(entry2) \
        .add_entry(entry3) \
        .add_entry(entry4)

    assert potential.__str__(
    ) == '0=on,1=on|1.0\n0=on,1=off|1.0\n0=off,1=on|1.0\n0=off,1=off|1.0'
示例#2
0
def test_str():
    """
    Tests str function.
    :return: None.
    """
    entry1 = PotentialEntry().add(0, 'on').add(1, 'on')
    entry2 = PotentialEntry().add(0, 'on').add(1, 'off')
    entry3 = PotentialEntry().add(0, 'off').add(1, 'on')
    entry4 = PotentialEntry().add(0, 'off').add(1, 'off')

    potential = Potential() \
        .add_entry(entry1) \
        .add_entry(entry2) \
        .add_entry(entry3) \
        .add_entry(entry4)

    assert potential.__str__(
    ) == '0=on,1=on|1.0\n0=on,1=off|1.0\n0=off,1=on|1.0\n0=off,1=off|1.0'
示例#3
0
def test_potential_get_matching_entry():
    entry1 = PotentialEntry().add(0, 'on').add(1, 'on')
    entry2 = PotentialEntry().add(0, 'on').add(1, 'off')
    entry3 = PotentialEntry().add(0, 'off').add(1, 'on')
    entry4 = PotentialEntry().add(0, 'off').add(1, 'off')
    entry5 = PotentialEntry().add(3, 'off').add(1, 'off')

    potential = Potential()\
        .add_entry(entry1)\
        .add_entry(entry2)\
        .add_entry(entry3)\
        .add_entry(entry4)

    assert len(potential.get_matching_entries(entry1)) == 1
    assert len(potential.get_matching_entries(entry2)) == 1
    assert len(potential.get_matching_entries(entry3)) == 1
    assert len(potential.get_matching_entries(entry4)) == 1
    assert len(potential.get_matching_entries(entry5)) == 0
示例#4
0
def test_reapply():
    """
    Tests reinitializing join tree after updating CPTs.
    :return: None.
    """
    a = BbnNode(Variable(0, 'a', ['t', 'f']), [0.2, 0.8])
    b = BbnNode(Variable(1, 'b', ['t', 'f']), [0.1, 0.9, 0.9, 0.1])
    bbn = Bbn().add_node(a).add_node(b) \
        .add_edge(Edge(a, b, EdgeType.DIRECTED))

    lhs = InferenceController.apply(bbn)
    rhs = InferenceController.reapply(lhs, {
        0: [0.3, 0.7],
        1: [0.2, 0.8, 0.8, 0.2]
    })

    lhs_pot = [lhs.get_bbn_potential(n) for n in lhs.get_bbn_nodes()]
    rhs_pot = [rhs.get_bbn_potential(n) for n in rhs.get_bbn_nodes()]

    lhs_d = Potential.to_dict(lhs_pot)
    rhs_d = Potential.to_dict(rhs_pot)

    # lhs should not match rhs after CPT update
    for k, prob in lhs_d.items():
        assert k in rhs_d
        assert prob != rhs_d[k]

    # now create lhs with same params as param used to update old
    # should match with rhs since params are now the same
    a = BbnNode(Variable(0, 'a', ['t', 'f']), [0.3, 0.7])
    b = BbnNode(Variable(1, 'b', ['t', 'f']), [0.2, 0.8, 0.8, 0.2])
    bbn = Bbn().add_node(a).add_node(b) \
        .add_edge(Edge(a, b, EdgeType.DIRECTED))

    lhs = InferenceController.apply(bbn)
    lhs_pot = [lhs.get_bbn_potential(n) for n in lhs.get_bbn_nodes()]
    lhs_d = Potential.to_dict(lhs_pot)

    for k, prob in lhs_d.items():
        assert k in rhs_d
        assert_almost_equals(prob, rhs_d[k], 0.001)
示例#5
0
文件: jointree.py 项目: ekko2/py-bbn
    def get_evidence(self, node, value):
        """
        Gets the evidence associated with the specified BBN node and value.
        :param node: BBN node.
        :param value: Value.
        :return: Potential (the evidence).
        """
        if node.id not in self.evidences:
            self.evidences[node.id] = dict()

        if value not in self.evidences[node.id]:
            entry = PotentialEntry()
            entry.add(node.id, value)
            entry.value = 1.0

            potential = Potential()
            potential.add_entry(entry)

            self.evidences[node.id][value] = potential

        return self.evidences[node.id][value]
示例#6
0
def test_potential_get_matching_entry():
    """
    Tests get matching entry from potential.
    :return: None.
    """
    entry1 = PotentialEntry().add(0, 'on').add(1, 'on')
    entry2 = PotentialEntry().add(0, 'on').add(1, 'off')
    entry3 = PotentialEntry().add(0, 'off').add(1, 'on')
    entry4 = PotentialEntry().add(0, 'off').add(1, 'off')
    entry5 = PotentialEntry().add(3, 'off').add(1, 'off')

    potential = Potential() \
        .add_entry(entry1) \
        .add_entry(entry2) \
        .add_entry(entry3) \
        .add_entry(entry4)

    assert len(potential.get_matching_entries(entry1)) == 1
    assert len(potential.get_matching_entries(entry2)) == 1
    assert len(potential.get_matching_entries(entry3)) == 1
    assert len(potential.get_matching_entries(entry4)) == 1
    assert len(potential.get_matching_entries(entry5)) == 0
示例#7
0
def test_simple_serde():
    """
    Tests join tree serde with only 1 clique.
    :return: None.
    """
    a = BbnNode(Variable(0, 'a', ['t', 'f']), [0.2, 0.8])
    b = BbnNode(Variable(1, 'b', ['t', 'f']), [0.1, 0.9, 0.9, 0.1])
    bbn = Bbn().add_node(a).add_node(b) \
        .add_edge(Edge(a, b, EdgeType.DIRECTED))
    lhs = InferenceController.apply(bbn)

    d = JoinTree.to_dict(lhs)

    rhs = JoinTree.from_dict(d)
    rhs = InferenceController.apply_from_serde(rhs)

    lhs_pot = [lhs.get_bbn_potential(n) for n in lhs.get_bbn_nodes()]
    rhs_pot = [rhs.get_bbn_potential(n) for n in rhs.get_bbn_nodes()]

    lhs_pot = Potential.to_dict(lhs_pot)
    rhs_pot = Potential.to_dict(rhs_pot)

    assert len(lhs_pot) == len(rhs_pot)
示例#8
0
def test_forest_inference():
    """
    Tests inference on a disconnected DAG; sub-DAGs are a -> b, c -> d and e -> f.
    :return: None.
    """
    a = BbnNode(Variable(0, 'a', ['t', 'f']), [0.2, 0.8])
    b = BbnNode(Variable(1, 'b', ['t', 'f']), [0.1, 0.9, 0.9, 0.1])
    c = BbnNode(Variable(2, 'c', ['t', 'f']), [0.2, 0.8])
    d = BbnNode(Variable(3, 'd', ['t', 'f']), [0.1, 0.9, 0.9, 0.1])
    e = BbnNode(Variable(4, 'e', ['t', 'f']), [0.2, 0.8])
    f = BbnNode(Variable(5, 'f', ['t', 'f']), [0.1, 0.9, 0.9, 0.1])
    bbn = Bbn().add_node(a).add_node(b).add_node(c).add_node(d).add_node(e).add_node(f) \
        .add_edge(Edge(a, b, EdgeType.DIRECTED)) \
        .add_edge(Edge(c, d, EdgeType.DIRECTED)) \
        .add_edge(Edge(e, f, EdgeType.DIRECTED))

    jt = InferenceController.apply(bbn)
    pot = [jt.get_bbn_potential(n) for n in jt.get_bbn_nodes()]
    o = Potential.to_dict(pot)
    e = {
        '0=t': 0.2,
        '0=f': 0.8,
        '1=t': 0.7400000000000001,
        '1=f': 0.26,
        '2=t': 0.2,
        '2=f': 0.8,
        '3=t': 0.7400000000000001,
        '3=f': 0.26,
        '4=t': 0.2,
        '4=f': 0.8,
        '5=t': 0.7400000000000001,
        '5=f': 0.26
    }

    for k, p in e.items():
        assert_almost_equals(p, o[k], 0.001)
示例#9
0
def test_from_dict():
    """
    Tests deserializing from dictionary.
    :return:
    """
    s = """{
  "bbn_nodes": {
    "0": {
      "probs": [
        0.2,
        0.8
      ],
      "variable": {
        "id": 0,
        "name": "n0",
        "values": [
          "t",
          "f"
        ]
      }
    },
    "1": {
      "probs": [
        0.9,
        0.1,
        0.9,
        0.1
      ],
      "variable": {
        "id": 1,
        "name": "n1",
        "values": [
          "t",
          "f"
        ]
      }
    },
    "2": {
      "probs": [
        0.6,
        0.4,
        0.4,
        0.6
      ],
      "variable": {
        "id": 2,
        "name": "n2",
        "values": [
          "t",
          "f"
        ]
      }
    }
  },
  "jt": {
    "edges": [
      "0-1-1-1-2"
    ],
    "nodes": {
      "0-1": {
        "node_ids": [
          0,
          1
        ],
        "type": "clique"
      },
      "0-1-1-1-2": {
        "left": "0-1",
        "right": "1-2",
        "type": "sepset"
      },
      "1-2": {
        "node_ids": [
          1,
          2
        ],
        "type": "clique"
      }
    },
    "parent_info": {
      "0": [],
      "1": [
        0
      ],
      "2": [
        1
      ]
    }
  }
}"""
    d = json.loads(s)
    lhs = JoinTree.from_dict(d)
    lhs = InferenceController.apply_from_serde(lhs)

    n0 = BbnNode(Variable(0, 'n0', ['t', 'f']), [0.2, 0.8])
    n1 = BbnNode(Variable(1, 'n1', ['t', 'f']), [0.9, 0.1, 0.9, 0.1])
    n2 = BbnNode(Variable(2, 'n2', ['t', 'f']), [0.6, 0.4, 0.4, 0.6])
    bbn = Bbn().add_node(n0).add_node(n1).add_node(n2) \
        .add_edge(Edge(n0, n1, EdgeType.DIRECTED)) \
        .add_edge(Edge(n1, n2, EdgeType.DIRECTED))
    rhs = InferenceController.apply(bbn)

    lhs_pot = [lhs.get_bbn_potential(n) for n in lhs.get_bbn_nodes()]
    rhs_pot = [rhs.get_bbn_potential(n) for n in rhs.get_bbn_nodes()]

    lhs_pot = Potential.to_dict(lhs_pot)
    rhs_pot = Potential.to_dict(rhs_pot)

    assert len(lhs_pot) == len(rhs_pot)

    for k, p in lhs_pot.items():
        assert_almost_equals(p, rhs_pot[k], 0.001)