def mixed_cpd_model(edges_five_nodes):
    """
    X-shaped 5 node model plus one more node, 'w', with edge from 'w' to 'z'.
    'z' is an AND node while all other nodes are OR nodes.
    """
    u_node = BernoulliOrNode(label_id='u', children=['x'], parents=[])
    v_node = BernoulliOrNode(label_id='v', children=['x'], parents=[])
    x_node = BernoulliOrNode(label_id='x',
                             children=['y', 'z'],
                             parents=['u', 'v'])
    y_node = BernoulliOrNode(label_id='y', children=[], parents=['x'])
    z_node = BernoulliAndNode(label_id='z', children=[], parents=['x', 'w'])
    w_node = BernoulliOrNode(label_id='w', children=['z'], parents=[])
    return BeliefUpdateNodeModel(
        nodes_dict={
            'u': u_node,
            'v': v_node,
            'x': x_node,
            'y': y_node,
            'z': z_node,
            'w': w_node
        })
def custom_cpd_model():
    """
    Y-shaped model, with parents ,'u' and 'v' as Or-nodes, 'x' a node with
    cardinality 3 and custom CPD, 'y' a node with cardinality 2 and custom CPD.
    """
    custom_cpd_x = TabularCPD(variable='x',
                              variable_card=3,
                              parents=['u', 'v'],
                              parents_card=[2, 2],
                              values=[[0.2, 0, 0.3, 0.1], [0.4, 1, 0.7, 0.2],
                                      [0.4, 0, 0, 0.7]],
                              state_names={
                                  'x': ['lo', 'med', 'hi'],
                                  'u': ['False', 'True'],
                                  'v': ['False', 'True']
                              })
    custom_cpd_y = TabularCPD(variable='y',
                              variable_card=2,
                              parents=['x'],
                              parents_card=[3],
                              values=[[0.3, 0.1, 0], [0.7, 0.9, 1]],
                              state_names={
                                  'x': ['lo', 'med', 'hi'],
                                  'y': ['False', 'True']
                              })

    u_node = BernoulliOrNode(label_id='u', children=['x'], parents=[])
    v_node = BernoulliOrNode(label_id='v', children=['x'], parents=[])
    x_node = Node(children=['y'], cpd=custom_cpd_x)
    y_node = Node(children=[], cpd=custom_cpd_y)
    return BeliefUpdateNodeModel(nodes_dict={
        'u': u_node,
        'v': v_node,
        'x': x_node,
        'y': y_node
    })
def five_node_and_model(edges_five_nodes):
    return BeliefUpdateNodeModel.init_from_edges(edges_five_nodes,
                                                 BernoulliAndNode)
def one_node_model():
    a_node = BernoulliOrNode(label_id='x', children=[], parents=[])
    return BeliefUpdateNodeModel(nodes_dict={'x': a_node})
def many_parents_and_model(many_parents_edges):
    return BeliefUpdateNodeModel.init_from_edges(many_parents_edges,
                                                 BernoulliAndNode)
def simple_model(simple_edges):
    return BeliefUpdateNodeModel.init_from_edges(simple_edges, BernoulliOrNode)