def test_ilp_simple():

    n1 = Node('a', [1, 0, 0, 0, 0])
    n2 = Node('b', [1, 0, 0, 1, 0])
    n3 = Node('c', [1, 0, 0, 2, 0])
    n4 = Node('d', [1, 2, 0, 1, 0])
    n5 = Node('e', [1, 1, 0, 1, 0])
    n6 = Node('f', [1, 0, 3, 2, 0])
    n7 = Node('g', [0, 0, 0, 0, 1])
    n8 = Node('h', [0, 1, 0, 0, 1])
    n9 = Node('i', [0, 1, 2, 0, 1])
    n10 = Node('j', [0, 1, 1, 0, 1])

    nodes = [n1, n2, n3, n4, n5, n6, n7, n8, n9, n10]
    with open(stdout_backup, "w") as f:
        sys.stdout = f
        tree = ls.solve_lineage_instance(nodes, method="ilp")
    os.remove(stdout_backup)

    net = tree.get_network()

    roots = [n for n in net if net.in_degree(n) == 0]

    assert len(roots) == 1

    root = roots[0]

    targets = [n for n in net if n.is_target]

    assert len(targets) == len(nodes)

    for t in targets:
        assert nx.has_path(net, root, t)
def test_on_sim_greedy():

    stree = pic.load(open("test/data/sim_net.pkl", "rb"))
    leaves = stree.get_leaves()

    target_nodes = []
    for l in leaves:
        new_node = Node(l.name, l.get_character_vec())
        target_nodes.append(new_node)

    rtree = ls.solve_lineage_instance(target_nodes, method="greedy")

    rnet = rtree.get_network()
    roots = [n for n in rnet if rnet.in_degree(n) == 0]

    assert len(roots) == 1

    root = roots[0]

    targets = [n for n in rnet if n.is_target]

    assert len(targets) == len(target_nodes)

    for t in targets:
        assert nx.has_path(rnet, root, t)

    multi_parents = [n for n in rnet if rnet.in_degree(n) > 1]

    assert len(multi_parents) == 0
def test_ilp_parallel_evo():

    n = Node('a', [1, 1, 2, 0])
    n2 = Node('b', [1, 1, 3, 0])
    n3 = Node('c', [2, 1, 1, 0])
    n4 = Node('d', [2, 1, 3, 0])
    n5 = Node('e', [1, 3, 1, '-'])
    n6 = Node('f', [1, '-', '-', '1'])
    n7 = Node('g', [1, 1, 0, 2])

    nodes = [n, n2, n3, n4, n5, n6, n7]

    with open(stdout_backup, "w") as f:
        sys.stdout = f
        tree = ls.solve_lineage_instance(nodes, method='ilp')
    os.remove(stdout_backup)

    net = tree.get_network()

    roots = [n for n in net if net.in_degree(n) == 0]

    assert len(roots) == 1

    root = roots[0]

    targets = [n for n in net if n.is_target]

    assert len(targets) == len(nodes)

    for t in targets:
        assert nx.has_path(net, root, t)

    multi_parents = [n for n in net if net.in_degree(n) > 1]

    assert len(multi_parents) == 0
def test_on_sim_hybrid():

    stree = pic.load(open("test/data/sim_net.pkl", "rb"))
    leaves = stree.get_leaves()

    target_nodes = []
    for l in leaves:
        new_node = Node(l.name, l.get_character_vec())
        target_nodes.append(new_node)

    with open(stdout_backup, "w") as f:
        sys.stdout = f
        rtree = ls.solve_lineage_instance(target_nodes,
                                          method="hybrid",
                                          hybrid_subset_cutoff=200,
                                          time_limit=100,
                                          max_neighborhood_size=500,
                                          threads=4)

    os.remove(stdout_backup)

    rnet = rtree.get_network()
    roots = [n for n in rnet if rnet.in_degree(n) == 0]

    assert len(roots) == 1

    root = roots[0]

    targets = [n for n in rnet if n.is_target]

    assert len(targets) == len(target_nodes)

    for t in targets:
        assert nx.has_path(rnet, root, t)

    multi_parents = [n for n in rnet if rnet.in_degree(n) > 1]

    assert len(multi_parents) == 0