Esempio n. 1
0
def test_jointree_creation():
    """
    Tests join tree creation.
    :return: None.
    """
    n0 = BbnNode(Variable(0, 'n0', ['t', 'f']), [])
    n1 = BbnNode(Variable(1, 'n1', ['t', 'f']), [])
    n2 = BbnNode(Variable(2, 'n2', ['t', 'f']), [])

    clique0 = Clique([n0, n1])
    clique1 = Clique([n1, n2])
    sep_set0 = clique0.get_sep_set(clique1)
    sep_set1 = clique0.get_sep_set(clique1)
    sep_set2 = clique1.get_sep_set(clique0)
    sep_set3 = clique0.get_sep_set(clique0)

    e0 = JtEdge(sep_set0)
    e1 = JtEdge(sep_set1)
    e2 = JtEdge(sep_set2)
    e3 = JtEdge(sep_set3)

    g = JoinTree().add_edge(e0).add_edge(e1).add_edge(e2).add_edge(e3)

    nodes = g.get_nodes()
    edges = g.get_edges()

    assert len(nodes) == 3
    assert len(edges) == 1
    assert len(g.get_flattened_edges()) == 2
Esempio n. 2
0
    def transform(cliques):
        """
        Transforms the cliques into a join tree.
        :param cliques: List of cliques.
        :return: Join tree.
        """
        join_tree = JoinTree()
        sep_sets = Transformer.get_sep_sets(cliques)
        n = (len(cliques) - 1) * 2
        total = 0

        for i in range(len(sep_sets)):
            join_tree.add_edge(JtEdge(sep_sets[i]))
            total += 2
            if total == n:
                break

        return join_tree
Esempio n. 3
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)
Esempio n. 4
0
    def transform(cliques):
        """
        Transforms the cliques into a join tree.

        :param cliques: List of cliques.
        :return: Join tree.
        """
        join_tree = JoinTree()
        for clique in cliques:
            join_tree.add_node(clique)

        sep_sets = Transformer.get_sep_sets(cliques)

        for i in range(len(sep_sets)):
            jtEdge = JtEdge(sep_sets[i])
            join_tree.add_edge(jtEdge)

        return join_tree
Esempio n. 5
0
import json

from pybbn.graph.jointree import JoinTree
from pybbn.pptc.inferencecontroller import InferenceController

with open('simple-join-tree.json', 'r') as f:
    j = f.read()
    d = json.loads(j)
    jt = JoinTree.from_dict(d)
    jt = InferenceController.apply_from_serde(jt)
Esempio n. 6
0
import json

from pybbn.graph.dag import Bbn
from pybbn.graph.edge import EdgeType, Edge
from pybbn.graph.jointree import JoinTree
from pybbn.graph.node import BbnNode
from pybbn.graph.variable import Variable
from pybbn.pptc.inferencecontroller import InferenceController

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))
jt = InferenceController.apply(bbn)

with open('simple-join-tree.json', 'w') as f:
    d = JoinTree.to_dict(jt)
    j = json.dumps(d, sort_keys=True, indent=2)
    f.write(j)
Esempio n. 7
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)
Esempio n. 8
0
def test_to_dict():
    """
    Tests serializing join tree to dictionary.
    :return: None.
    """
    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))
    jt = InferenceController.apply(bbn)
    d = JoinTree.to_dict(jt)
    lhs = json.dumps(d, sort_keys=True, indent=2)
    rhs = """{
  "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
      ]
    }
  }
}"""
    assert lhs == rhs