def test_bind_to_parent_array(self): """bind_to_parent_array should bind tree to array correctly""" a = reshape(arange(33), (11, 3)) index_tree(self.t3) bindings = bind_to_parent_array(self.t3, a) self.assertEqual(len(bindings), 10) self.assertEqual(bindings[0][0], a[8]) self.assertEqual(bindings[0][1], a[10]) self.assertEqual(bindings[1][0], a[4]) self.assertEqual(bindings[1][1], a[8]) self.assertEqual(bindings[2][0], a[0]) self.assertEqual(bindings[2][1], a[4]) self.assertEqual(bindings[3][0], a[1]) self.assertEqual(bindings[3][1], a[4]) self.assertEqual(bindings[4][0], a[2]) self.assertEqual(bindings[4][1], a[4]) self.assertEqual(bindings[5][0], a[5]) self.assertEqual(bindings[5][1], a[8]) self.assertEqual(bindings[6][0], a[3]) self.assertEqual(bindings[6][1], a[5]) self.assertEqual(bindings[7][0], a[9]) self.assertEqual(bindings[7][1], a[10]) self.assertEqual(bindings[8][0], a[6]) self.assertEqual(bindings[8][1], a[9]) self.assertEqual(bindings[9][0], a[7]) self.assertEqual(bindings[9][1], a[9])
def test_bind_to_parent_array(self): """bind_to_parent_array should bind tree to array correctly""" a = reshape(arange(33), (11,3)) index_tree(self.t3) bindings = bind_to_parent_array(self.t3, a) self.assertEqual(len(bindings), 10) self.assertEqual(bindings[0][0], a[8]) self.assertEqual(bindings[0][1], a[10]) self.assertEqual(bindings[1][0], a[4]) self.assertEqual(bindings[1][1], a[8]) self.assertEqual(bindings[2][0], a[0]) self.assertEqual(bindings[2][1], a[4]) self.assertEqual(bindings[3][0], a[1]) self.assertEqual(bindings[3][1], a[4]) self.assertEqual(bindings[4][0], a[2]) self.assertEqual(bindings[4][1], a[4]) self.assertEqual(bindings[5][0], a[5]) self.assertEqual(bindings[5][1], a[8]) self.assertEqual(bindings[6][0], a[3]) self.assertEqual(bindings[6][1], a[5]) self.assertEqual(bindings[7][0], a[9]) self.assertEqual(bindings[7][1], a[10]) self.assertEqual(bindings[8][0], a[6]) self.assertEqual(bindings[8][1], a[9]) self.assertEqual(bindings[9][0], a[7]) self.assertEqual(bindings[9][1], a[9])
def test_index_tree(self): """index_tree should produce correct index and node map""" #test for first tree: contains singleton outgroup t1 = self.t1 id_1, child_1 = index_tree(t1) nodes_1 = [n._leaf_index for n in t1.traverse(self_before=False, \ self_after=True)] self.assertEqual(nodes_1, [0, 1, 2, 3, 6, 4, 5, 7, 8]) self.assertEqual(child_1, [(2, 0, 1), (6, 2, 3), (7, 4, 5), (8, 6, 7)]) #test for second tree: strictly bifurcating t2 = self.t2 id_2, child_2 = index_tree(t2) nodes_2 = [n._leaf_index for n in t2.traverse(self_before=False, \ self_after=True)] self.assertEqual(nodes_2, [0, 1, 4, 2, 3, 5, 8, 6, 7, 9, 10]) self.assertEqual(child_2, [(4, 0, 1), (5, 2, 3), (8, 4, 5), (9, 6, 7), (10, 8, 9)]) #test for third tree: contains trifurcation and single-child parent t3 = self.t3 id_3, child_3 = index_tree(t3) nodes_3 = [n._leaf_index for n in t3.traverse(self_before=False, \ self_after=True)] self.assertEqual(nodes_3, [0, 1, 2, 4, 3, 5, 8, 6, 7, 9, 10]) self.assertEqual(child_3, [(4, 0, 2), (5, 3, 3), (8, 4, 5), (9, 6, 7), (10, 8, 9)])
def test_sum_descendants(self): """sum_descendants should sum total descendants w/ each state""" id_, child = index_tree(self.t3) a = zeros((11, 3)) + 99 # fill with junk bindings = bind_to_array(child, a) # load in leaf envs a[0] = a[1] = a[2] = a[7] = [0, 1, 0] a[3] = [1, 0, 0] a[6] = [0, 0, 1] sum_descendants(bindings) self.assertEqual( a, array( [ [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [0, 3, 0], [1, 0, 0], [0, 0, 1], [0, 1, 0], [1, 3, 0], [0, 1, 1], [1, 4, 1], ] ), )
def test_bool_descendants(self): """bool_descendants should be true if any descendant true""" # self.t3 = DndParser('(((a,b,c),(d)),(e,f))', UniFracTreeNode) id_, child = index_tree(self.t3) a = zeros((11, 3)) + 99 # fill with junk bindings = bind_to_array(child, a) # load in leaf envs a[0] = a[1] = a[2] = a[7] = [0, 1, 0] a[3] = [1, 0, 0] a[6] = [0, 0, 1] bool_descendants(bindings) self.assertEqual( a, array( [ [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [0, 1, 0], [1, 0, 0], [0, 0, 1], [0, 1, 0], [1, 1, 0], [0, 1, 1], [1, 1, 1], ] ), )
def test_fitch_descendants_missing_data(self): """fitch_descendants should work with missing data""" #tree and envs for testing missing values t_str = '(((a:1,b:2):4,(c:3,d:1):2):1,(e:2,f:1):3);' env_str = """a A b B c D d C e C f D""" t = DndParser(t_str, UniFracTreeNode) node_index, nodes = index_tree(t) env_counts = count_envs(env_str.split('\n')) count_array, unique_envs, env_to_index, node_to_index = \ index_envs(env_counts, node_index) branch_lengths = get_branch_lengths(node_index) #test just the AB pair ab_counts = count_array[:, 0:2] bindings = bind_to_array(nodes, ab_counts) changes = fitch_descendants(bindings, counter=FitchCounter) self.assertEqual(changes, 1) orig_result = ab_counts.copy() #check that the original Fitch counter gives the expected #incorrect parsimony result changes = fitch_descendants(bindings, counter=FitchCounterDense) self.assertEqual(changes, 5) new_result = ab_counts.copy() #check that the two versions fill the array with the same values self.assertEqual(orig_result, new_result)
def test_fitch_descendants(self): """fitch_descendants should assign states by fitch parsimony, ret. #""" id_, child = index_tree(self.t3) a = zeros((11, 3)) + 99 # fill with junk bindings = bind_to_array(child, a) # load in leaf envs a[0] = a[1] = a[2] = a[7] = [0, 1, 0] a[3] = [1, 0, 0] a[6] = [0, 0, 1] changes = fitch_descendants(bindings) self.assertEqual(changes, 2) self.assertEqual( a, array( [ [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [0, 1, 0], [1, 0, 0], [0, 0, 1], [0, 1, 0], [1, 1, 0], [0, 1, 1], [0, 1, 0], ] ), )
def setUp(self): """Define a couple of standard trees""" self.t1 = DndParser("(((a,b),c),(d,e))", UniFracTreeNode) self.t2 = DndParser("(((a,b),(c,d)),(e,f))", UniFracTreeNode) self.t3 = DndParser("(((a,b,c),(d)),(e,f))", UniFracTreeNode) self.t4 = DndParser("((c)b,((f,g,h)e,i)d)", UniFracTreeNode) self.t4.Name = "a" self.t_str = "((a:1,b:2):4,(c:3,(d:1,e:1):2):3)" self.t = DndParser(self.t_str, UniFracTreeNode) self.env_str = """ a A 1 a C 2 b A 1 b B 1 c B 1 d B 3 e C 1""" self.env_counts = count_envs(self.env_str.splitlines()) self.node_index, self.nodes = index_tree(self.t) self.count_array, self.unique_envs, self.env_to_index, self.node_to_index = index_envs( self.env_counts, self.node_index ) self.branch_lengths = get_branch_lengths(self.node_index) self.old_t_str = "((org1:0.11,org2:0.22,(org3:0.12,org4:0.23)g:0.33)b:0.2,(org5:0.44,org6:0.55)c:0.3,org7:0.4)" self.old_t = DndParser(self.old_t_str, UniFracTreeNode) self.old_env_str = """ org1 env1 1 org1 env2 1 org2 env2 1 org3 env2 1 org4 env3 1 org5 env1 1 org6 env1 1 org7 env3 1 """ self.old_env_counts = count_envs(self.old_env_str.splitlines()) self.old_node_index, self.old_nodes = index_tree(self.old_t) self.old_count_array, self.old_unique_envs, self.old_env_to_index, self.old_node_to_index = index_envs( self.old_env_counts, self.old_node_index ) self.old_branch_lengths = get_branch_lengths(self.old_node_index)
def test_delete_empty_parents(self): """delete_empty_parents should remove empty parents from bound indices""" id_to_node, node_first_last = index_tree(self.t) bound_indices = bind_to_array(node_first_last, self.count_array[:,0:1]) bool_descendants(bound_indices) self.assertEqual(len(bound_indices), 4) deleted = delete_empty_parents(bound_indices) self.assertEqual(len(deleted), 2) for d in deleted: self.assertEqual(d[0][0], 1)
def setUp(self): """Define a couple of standard trees""" self.t1 = DndParser('(((a,b),c),(d,e))', UniFracTreeNode) self.t2 = DndParser('(((a,b),(c,d)),(e,f))', UniFracTreeNode) self.t3 = DndParser('(((a,b,c),(d)),(e,f))', UniFracTreeNode) self.t4 = DndParser('((c)b,((f,g,h)e,i)d)', UniFracTreeNode) self.t4.Name = 'a' self.t_str = '((a:1,b:2):4,(c:3,(d:1,e:1):2):3)' self.t = DndParser(self.t_str, UniFracTreeNode) self.env_str = """ a A 1 a C 2 b A 1 b B 1 c B 1 d B 3 e C 1""" self.env_counts = count_envs(self.env_str.splitlines()) self.node_index, self.nodes = index_tree(self.t) self.count_array, self.unique_envs, self.env_to_index, \ self.node_to_index = index_envs(self.env_counts, self.node_index) self.branch_lengths = get_branch_lengths(self.node_index) self.old_t_str = '((org1:0.11,org2:0.22,(org3:0.12,org4:0.23)g:0.33)b:0.2,(org5:0.44,org6:0.55)c:0.3,org7:0.4)' self.old_t = DndParser(self.old_t_str, UniFracTreeNode) self.old_env_str = """ org1 env1 1 org1 env2 1 org2 env2 1 org3 env2 1 org4 env3 1 org5 env1 1 org6 env1 1 org7 env3 1 """ self.old_env_counts = count_envs(self.old_env_str.splitlines()) self.old_node_index, self.old_nodes = index_tree(self.old_t) self.old_count_array, self.old_unique_envs, self.old_env_to_index, \ self.old_node_to_index = index_envs(self.old_env_counts, self.old_node_index) self.old_branch_lengths = get_branch_lengths(self.old_node_index)
def test_index_tree(self): """index_tree should produce correct index and node map""" # test for first tree: contains singleton outgroup t1 = self.t1 id_1, child_1 = index_tree(t1) nodes_1 = [n._leaf_index for n in t1.traverse(self_before=False, self_after=True)] self.assertEqual(nodes_1, [0, 1, 2, 3, 6, 4, 5, 7, 8]) self.assertEqual(child_1, [(2, 0, 1), (6, 2, 3), (7, 4, 5), (8, 6, 7)]) # test for second tree: strictly bifurcating t2 = self.t2 id_2, child_2 = index_tree(t2) nodes_2 = [n._leaf_index for n in t2.traverse(self_before=False, self_after=True)] self.assertEqual(nodes_2, [0, 1, 4, 2, 3, 5, 8, 6, 7, 9, 10]) self.assertEqual(child_2, [(4, 0, 1), (5, 2, 3), (8, 4, 5), (9, 6, 7), (10, 8, 9)]) # test for third tree: contains trifurcation and single-child parent t3 = self.t3 id_3, child_3 = index_tree(t3) nodes_3 = [n._leaf_index for n in t3.traverse(self_before=False, self_after=True)] self.assertEqual(nodes_3, [0, 1, 2, 4, 3, 5, 8, 6, 7, 9, 10]) self.assertEqual(child_3, [(4, 0, 2), (5, 3, 3), (8, 4, 5), (9, 6, 7), (10, 8, 9)])
def test_delete_empty_parents(self): """delete_empty_parents should remove empty parents from bound indices""" id_to_node, node_first_last = index_tree(self.t) bound_indices = bind_to_array(node_first_last, self.count_array[:, 0:1]) bool_descendants(bound_indices) self.assertEqual(len(bound_indices), 4) deleted = delete_empty_parents(bound_indices) self.assertEqual(len(deleted), 2) for d in deleted: self.assertEqual(d[0][0], 1)
def test_sum_descendants(self): """sum_descendants should sum total descendants w/ each state""" id_, child = index_tree(self.t3) a = zeros((11, 3)) + 99 #fill with junk bindings = bind_to_array(child, a) #load in leaf envs a[0] = a[1] = a[2] = a[7] = [0, 1, 0] a[3] = [1, 0, 0] a[6] = [0, 0, 1] sum_descendants(bindings) self.assertEqual(a, \ array([[0,1,0],[0,1,0],[0,1,0],[1,0,0],[0,3,0],[1,0,0],\ [0,0,1],[0,1,0],[1,3,0],[0,1,1],[1,4,1]]) )
def test_traverse_reduce(self): """traverse_reduce should reduce array in traversal order.""" id_, child = index_tree(self.t3) a = zeros((11, 3)) + 99 # fill with junk bindings = bind_to_array(child, a) # load in leaf envs a[0] = a[1] = a[2] = a[7] = [0, 1, 0] a[3] = [1, 0, 0] a[6] = [0, 0, 1] f = logical_or.reduce traverse_reduce(bindings, f) self.assertEqual( a, array( [ [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [0, 1, 0], [1, 0, 0], [0, 0, 1], [0, 1, 0], [1, 1, 0], [0, 1, 1], [1, 1, 1], ] ), ) f = sum traverse_reduce(bindings, f) self.assertEqual( a, array( [ [0, 1, 0], [0, 1, 0], [0, 1, 0], [1, 0, 0], [0, 3, 0], [1, 0, 0], [0, 0, 1], [0, 1, 0], [1, 3, 0], [0, 1, 1], [1, 4, 1], ] ), )
def test_bool_descendants(self): """bool_descendants should be true if any descendant true""" #self.t3 = DndParser('(((a,b,c),(d)),(e,f))', UniFracTreeNode) id_, child = index_tree(self.t3) a = zeros((11, 3)) + 99 #fill with junk bindings = bind_to_array(child, a) #load in leaf envs a[0] = a[1] = a[2] = a[7] = [0, 1, 0] a[3] = [1, 0, 0] a[6] = [0, 0, 1] bool_descendants(bindings) self.assertEqual(a, \ array([[0,1,0],[0,1,0],[0,1,0],[1,0,0],[0,1,0],[1,0,0],\ [0,0,1],[0,1,0],[1,1,0],[0,1,1],[1,1,1]]) )
def test_fitch_descendants(self): """fitch_descendants should assign states by fitch parsimony, ret. #""" id_, child = index_tree(self.t3) a = zeros((11, 3)) + 99 #fill with junk bindings = bind_to_array(child, a) #load in leaf envs a[0] = a[1] = a[2] = a[7] = [0, 1, 0] a[3] = [1, 0, 0] a[6] = [0, 0, 1] changes = fitch_descendants(bindings) self.assertEqual(changes, 2) self.assertEqual(a, \ array([[0,1,0],[0,1,0],[0,1,0],[1,0,0],[0,1,0],[1,0,0],\ [0,0,1],[0,1,0],[1,1,0],[0,1,1],[0,1,0]]) )
def test_traverse_reduce(self): """traverse_reduce should reduce array in traversal order.""" id_, child = index_tree(self.t3) a = zeros((11, 3)) + 99 #fill with junk bindings = bind_to_array(child, a) #load in leaf envs a[0] = a[1] = a[2] = a[7] = [0, 1, 0] a[3] = [1, 0, 0] a[6] = [0, 0, 1] f = logical_or.reduce traverse_reduce(bindings, f) self.assertEqual(a,\ array([[0,1,0],[0,1,0],[0,1,0],[1,0,0],[0,1,0],[1,0,0],\ [0,0,1],[0,1,0],[1,1,0],[0,1,1],[1,1,1]]) ) f = sum traverse_reduce(bindings, f) self.assertEqual( a, \ array([[0,1,0],[0,1,0],[0,1,0],[1,0,0],[0,3,0],[1,0,0],\ [0,0,1],[0,1,0],[1,3,0],[0,1,1],[1,4,1]]) )
def test_bind_to_array(self): """bind_to_array should return correct array ranges""" a = reshape(arange(33), (11,3)) id_, child = index_tree(self.t3) bindings = bind_to_array(child, a) self.assertEqual(len(bindings), 5) self.assertEqual(bindings[0][0], a[4]) self.assertEqual(bindings[0][1], a[0:3]) self.assertEqual(bindings[0][1].shape, (3,3)) self.assertEqual(bindings[1][0], a[5]) self.assertEqual(bindings[1][1], a[3:4]) self.assertEqual(bindings[1][1].shape, (1,3)) self.assertEqual(bindings[2][0], a[8]) self.assertEqual(bindings[2][1], a[4:6]) self.assertEqual(bindings[2][1].shape, (2,3)) self.assertEqual(bindings[3][0], a[9]) self.assertEqual(bindings[3][1], a[6:8]) self.assertEqual(bindings[3][1].shape, (2,3)) self.assertEqual(bindings[4][0], a[10]) self.assertEqual(bindings[4][1], a[8:10]) self.assertEqual(bindings[4][1].shape, (2,3))
def test_bind_to_array(self): """bind_to_array should return correct array ranges""" a = reshape(arange(33), (11, 3)) id_, child = index_tree(self.t3) bindings = bind_to_array(child, a) self.assertEqual(len(bindings), 5) self.assertEqual(bindings[0][0], a[4]) self.assertEqual(bindings[0][1], a[0:3]) self.assertEqual(bindings[0][1].shape, (3, 3)) self.assertEqual(bindings[1][0], a[5]) self.assertEqual(bindings[1][1], a[3:4]) self.assertEqual(bindings[1][1].shape, (1, 3)) self.assertEqual(bindings[2][0], a[8]) self.assertEqual(bindings[2][1], a[4:6]) self.assertEqual(bindings[2][1].shape, (2, 3)) self.assertEqual(bindings[3][0], a[9]) self.assertEqual(bindings[3][1], a[6:8]) self.assertEqual(bindings[3][1].shape, (2, 3)) self.assertEqual(bindings[4][0], a[10]) self.assertEqual(bindings[4][1], a[8:10]) self.assertEqual(bindings[4][1].shape, (2, 3))
def setUp(self): """Define some standard trees.""" self.t_str = '((a:1,b:2):4,(c:3,(d:1,e:1):2):3)' self.t = DndParser(self.t_str, UniFracTreeNode) self.env_str = """ a A 1 a C 2 b A 1 b B 1 c B 1 d B 3 e C 1""" self.env_counts = count_envs(self.env_str.splitlines()) self.missing_env_str = """ a A 1 a C 2 e C 1""" self.missing_env_counts = count_envs(self.missing_env_str.splitlines()) self.extra_tip_str = """ q A 1 w C 2 e A 1 r B 1 t B 1 y B 3 u C 1""" self.extra_tip_counts = count_envs(self.extra_tip_str.splitlines()) self.wrong_tip_str = """ q A 1 w C 2 r B 1 t B 1 y B 3 u C 1""" self.wrong_tip_counts = count_envs(self.wrong_tip_str.splitlines()) self.t2_str = '(((a:1,b:1):1,c:5):2,d:4)' self.t2 = DndParser(self.t2_str, UniFracTreeNode) self.env2_str = """ a B 1 b A 1 c A 2 c C 2 d B 1 d C 1""" self.env2_counts = count_envs(self.env2_str.splitlines()) self.trees = [self.t, self.t2] self.envs = [self.env_counts, self.env2_counts] self.mc_1 = array([.5, .4, .3, .2, .1, .6, .7, .8, .9, 1.0]) # from old EnvsNode tests self.old_t_str = '((org1:0.11,org2:0.22,(org3:0.12,org4:0.23)g:0.33)b:0.2,(org5:0.44,org6:0.55)c:0.3,org7:0.4)' self.old_t = DndParser(self.old_t_str, UniFracTreeNode) self.old_env_str = """ org1 env1 1 org1 env2 1 org2 env2 1 org3 env2 1 org4 env3 1 org5 env1 1 org6 env1 1 org7 env3 1 """ self.old_env_counts = count_envs(self.old_env_str.splitlines()) self.old_node_index, self.old_nodes = index_tree(self.old_t) self.old_count_array, self.old_unique_envs, self.old_env_to_index, \ self.old_node_to_index = index_envs(self.old_env_counts, self.old_node_index) self.old_branch_lengths = get_branch_lengths(self.old_node_index)