def test_load_from_json(): dg = BayesianNetwork() with open('one_parent_net.json', 'r') as f: json_ = json.load(f) dg.load_graph_from_json(json_) assert len(dg) == 2 parents = dg.get_parents('parent') assert len(parents) == 0 parents = dg.get_parents('child') assert len(parents) == 1 factor = dg.get_value('parent', 'factor') f = Factor(scope=np.array([0]), card=np.array([2]), val=np.array([0.57, 0.43])) assert is_equal(f, factor) factor = dg.get_value('child', 'factor') f = Factor(scope=np.array([1, 0]), card=np.array([2, 2]), val=np.array([0.40, 0.60, 0.13, 0.87])) assert is_equal(f, factor)
def test_another_marg(): f1 = Factor(scope=np.array([0]), card=np.array([2], dtype=np.int32), val=np.array([0.57, 0.43])) f2 = Factor(scope=np.array([1, 0]), card=np.array([2, 2], dtype=np.int32), val=np.array([0.4, 0.6, 0.13, 0.87])) f = get_product(f1, f2) f_marg = get_marg(f, 1) assert np.array_equal(f_marg.scope, np.array([0])) assert np.array_equal(f_marg.card, np.array([2])) assert np.allclose(f_marg.val, np.array([0.57, 0.43]))
def f1(): ''' f1 [1 phi] -------- 0 0.11 1 0.89 ''' return Factor(scope=np.array([1]), card=np.array([2]), val=np.array([0.11, 0.89]))
def f4(): ''' f4 [4 5 phi] ------------ [0 0 0.39] [1 0 0.61] [0 1 0.06] [1 1 0.94] ''' return Factor(scope=np.array([4, 5]), card=np.array([2, 2]), val=np.array([0.39, 0.61, 0.06, 0.94]))
def f3(): ''' f3 [3 2 phi] ------------ [0 0 0.39] [1 0 0.61] [0 1 0.06] [1 1 0.94] ''' return Factor(scope=np.array([3, 2]), card=np.array([2, 2]), val=np.array([0.39, 0.61, 0.06, 0.94]))
def f2(): ''' f2 [2 1 phi] ------------ [0 0 0.59] [1 0 0.41] [0 1 0.22] [1 1 0.78] ''' return Factor(scope=np.array([2, 1]), card=np.array([2, 2]), val=np.array([0.59, 0.41, 0.22, 0.78]))
def load_graph_from_json(self, json_): self._dg = nx.DiGraph() for node_name, value in json_.iteritems(): # Have we seen this node name before? if node_name not in self._to_index: self._to_index[node_name] = self._index self._to_name[self._index] = node_name self._index += 1 for p in value['parents']: if p not in self._to_index: self._to_index[p] = self._index self._to_name[self._index] = p self._index += 1 p_indx = [self._to_index[p] for p in value['parents']] c_indx = self._to_index[node_name] scope = np.array([c_indx] + p_indx) card = np.ones(scope.shape[0], dtype=np.int32) * 2 N = np.prod(card) val = np.empty((N,)) for v in value['values']: A = np.array(v['states']) A = A.reshape((-1, A.shape[0])) i = assign_to_indx(A, card)[0] val[i] = v['value'] # What are the parents? f = Factor(scope=scope, card=card, val=val) f = log(f) var_scope = set([node_name] + value['parents']) self.add_node(node_name=node_name, attr_dict={'factor': f, 'scope': var_scope}) self.add_parents(node_name, value['parents'])
def test_is_equal_scope_out_of_order(f2): ''' f2 [2 1 phi] ------------ [0 0 0.59] [1 0 0.41] [0 1 0.22] [1 1 0.78] f2_ [1 2 phi] ------------ [0 0 0.59] [1 0 0.22] [0 1 0.41] [1 1 0.78] ''' f2_ = Factor(scope=np.array([1, 2]), card=np.array([2, 2]), val=np.array([0.59, 0.22, 0.41, 0.78])) assert is_equal(f2, f2_) assert is_equal(f2_, f2)