예제 #1
0
 def test_random_q_matrix_diag_vector(self):
     """Rates random should init with vector as diagonal"""
     diag = [1, -1, 2, -2]
     for i in range(NUM_TESTS):
         q = Rates.random(RnaPairs, diag)._data
         for i, d, row in zip(range(4), diag, q):
             self.assertFloatEqual(sum(row, axis=0), 0.0)
             self.assertEqual(row[i], diag[i])
예제 #2
0
 def test_random_q_matrix_diag_vector(self):
     """Rates random should init with vector as diagonal"""
     diag = [1, -1, 2, -2]
     for i in range(NUM_TESTS):
         q = Rates.random(RnaPairs, diag)._data
         for i, d, row in zip(range(4), diag, q):
             self.assertFloatEqual(sum(row, axis=0), 0.0)
             self.assertEqual(row[i], diag[i])
예제 #3
0
 def test_evolve(self):
     """RangeNode evolve should work on a starting vector"""
     t = self.t1
     t.Q = Rates.random(DnaPairs)
     t.assignQ()
     t.assignLength(0.1)
     t.assignP()
     start = array([1,0,2,1,0,0,2,1,2,0,1,2,1,0,2,0,0,3,0,2,1,0,3,1,0,2,0,0,0,0,0,1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3])
     t.evolve(start)
     for i in t.traverse():
         self.assertEqual(len(i.Sequence), len(start))
         self.assertNotEqual(i.Sequence, start)
예제 #4
0
 def test_assignP(self):
     """RangeNode assignP should work when Qs set."""
     t = self.t1
     for i in t.traverse(self_before=True):
         i.Length = random() * 0.5  #range 0 to 0.5
     t.Q = Rates.random(DnaPairs)
     t.assignQ()
     t.assignP()
     t.assignIds()
     for node in t.traverse(self_after=True):
         if node.Parent is not None:
             self.assertFloatEqual(average(1-diag(node.P._data), axis=0), \
                 node.Length)
예제 #5
0
 def test_assignP(self):
     """RangeNode assignP should work when Qs set."""
     t = self.t1
     for i in t.traverse(self_before=True):
         i.Length = random() * 0.5 #range 0 to 0.5
     t.Q = Rates.random(DnaPairs)
     t.assignQ()
     t.assignP()
     t.assignIds()
     for node in t.traverse(self_after=True):
         if node.Parent is not None:
             self.assertFloatEqual(average(1-diag(node.P._data), axis=0), \
                 node.Length)
예제 #6
0
 def test_random_q_matrix(self):
     """Rates random should return matrix of correct size"""
     for i in range(NUM_TESTS):
         q = Rates.random(RnaPairs)._data
         self.assertEqual(len(q), 4)
         self.assertEqual(len(q[0]), 4)
         for row in q:
             self.assertFloatEqual(sum(row), 0.0)
             assert min(row) < 0
             assert max(row) > 0
             l = list(row)
             l.sort()
             assert min(l[1:]) >= 0
             assert max(l[1:]) <= 1
예제 #7
0
 def test_random_q_matrix(self):
     """Rates random should return matrix of correct size"""
     for i in range(NUM_TESTS):
         q = Rates.random(RnaPairs)._data
         self.assertEqual(len(q), 4)
         self.assertEqual(len(q[0]), 4)
         for row in q:
             self.assertFloatEqual(sum(row), 0.0)
             assert min(row) < 0
             assert max(row) > 0
             l = list(row)
             l.sort()
             assert min(l[1:]) >= 0
             assert max(l[1:]) <= 1
예제 #8
0
 def test_random_q_matrix_diag(self):
     """Rates random should set diagonal correctly from scalar"""
     for i in range(NUM_TESTS):
         q = Rates.random(RnaPairs, -1)._data
         self.assertEqual(len(q), 4)
         for i, row in enumerate(q):
             self.assertFloatEqual(sum(row), 0)
             self.assertEqual(row[i], -1)
             assert max(row) <= 1
             l = list(row)
             l.sort()
             assert min(l[1:]) >= 0
             assert max(l[1:]) <= 1
     for i in range(NUM_TESTS):
         q = Rates.random(RnaPairs, -5)._data
         self.assertEqual(len(q), 4)
         for i, row in enumerate(q):
             self.assertFloatEqual(sum(row), 0)
             self.assertEqual(row[i], -5)
             assert max(row) <= 5
             l = list(row)
             l.sort()
             assert min(l[1:]) >= 0
             assert max(l[1:]) <= 5
예제 #9
0
 def test_random_q_matrix_diag(self):
     """Rates random should set diagonal correctly from scalar"""
     for i in range(NUM_TESTS):
         q = Rates.random(RnaPairs, -1)._data
         self.assertEqual(len(q), 4)
         for i, row in enumerate(q):
             self.assertFloatEqual(sum(row), 0)
             self.assertEqual(row[i], -1)
             assert max(row) <= 1
             l = list(row)
             l.sort()
             assert min(l[1:]) >= 0
             assert max(l[1:]) <= 1
     for i in range(NUM_TESTS):
         q = Rates.random(RnaPairs, -5)._data
         self.assertEqual(len(q), 4)
         for i, row in enumerate(q):
             self.assertFloatEqual(sum(row), 0)
             self.assertEqual(row[i], -5)
             assert max(row) <= 5
             l = list(row)
             l.sort()
             assert min(l[1:]) >= 0
             assert max(l[1:]) <= 5
예제 #10
0
 def test_tree_twoway_rates(self):
     """tree_twoway_rates should give plausible results on rand trees"""
     t = self.t1
     t.assignLength(0.05)
     t.Q = Rates.random(DnaPairs).normalize()
     t.assignQ()
     t.assignP()
     t.evolve(randint(0,4,100))
     t.makeIdIndex()
     result = tree_twoway_rates(t)
     self.assertEqual(result.shape, (5,5,16))
     #check that row sums are 0
     for x in [(i,j) for i in range(5) for j in range(5)]:
         self.assertFloatEqual(sum(result[x]), 0)
     #need to make sure we didn't just get an empty array
     self.assertGreaterThan((abs(result)).sum(), 0)
     #check that it works without_diag
     result = tree_twoway_rates(t, without_diag=True)
     self.assertEqual(result.shape, (5,5,12))
     #check that it works with/without normalize
     #default: no normalization, so row sums shouldn't be 1 after omitting
     #diagonal
     result = tree_twoway_rates(t, without_diag=True)
     self.assertEqual(result.shape, (5,5,12))
     #check that the row sums are not 1 before normalization (note that they
     #can be zero, though)
     sums_before = []
     for x in [(i,j) for i in range(5) for j in range(5)]:
         curr_sum = sum(result[x])
         sums_before.append(curr_sum)
     #...but if we tell it to normalize, row sums should be nearly 1
     #after omitting diagonal
     result = tree_twoway_rates(t, without_diag=True, \
         normalize=True)
     self.assertEqual(result.shape, (5,5,12))
     sums_after = []
     for x in [(i,j) for i in range(5) for j in range(5)]:
         curr_sum = sum(result[x])
         sums_after.append(curr_sum)
         if curr_sum != 0:
             self.assertFloatEqual(curr_sum, 1)
     try:
         self.assertFloatEqual(sums_before, sums_after)
     except AssertionError:
         pass
     else:
         raise AssertionError, "Expected different arrays before/after norm"
예제 #11
0
 def test_tree_threeway_rates(self):
     """tree_threeway_rates should give plausible results on rand trees"""
     #note: the following fails occasionally, but repeating it 5 times
     #and checking that one passes is fairly safe
     for i in range(5):
         try:
             t = self.t1
             t.assignLength(0.05)
             t.Q = Rates.random(DnaPairs).normalize()
             t.assignQ()
             t.assignP()
             t.evolve(randint(0,4,100))
             t.makeIdIndex()
             depths = t.leafLcaDepths()
             result = tree_threeway_rates(t, depths)
             self.assertEqual(result.shape, (5,5,5,16))
             #check that row sums are 0
             for x in [(i,j,k) for i in range(5) for j in range(5) \
                 for k in range(5)]:
                 self.assertFloatEqual(sum(result[x]), 0)
             assert any(result)
             #check that it works without_diag
             result = tree_threeway_rates(t, depths, without_diag=True)
             self.assertEqual(result.shape, (5,5,5,12))
             #check that it works with/without normalize
             #default: no normalization, so row sums shouldn't be 1 after 
             #omitting diagonal
             result = tree_threeway_rates(t, depths, without_diag=True)
             self.assertEqual(result.shape, (5,5,5,12))
             for x in [(i,j,k) for i in range(5) for j in range(5) \
                 for k in range(5)]:
                 assert sum(result[x]) == 0 or abs(sum(result[x]) - 1) > 0.01
             #...but if we tell it to normalize, row sums should be nearly 1
             #after omitting diagonal
             result = tree_threeway_rates(t, depths, without_diag=True, \
                 normalize=True)
             self.assertEqual(result.shape, (5,5,5,12))
             for x in [(i,j,k) for i in range(5) for j in range(5) \
                 for k in range(5)]:
                     s = sum(result[x])
                     if s != 0:
                         self.assertFloatEqual(s, 1)
             break
         except AssertionError:
             pass
예제 #12
0
 def test_tree_threeway_rates(self):
     """tree_threeway_rates should give plausible results on rand trees"""
     #note: the following fails occasionally, but repeating it 5 times
     #and checking that one passes is fairly safe
     for i in range(5):
         try:
             t = self.t1
             t.assignLength(0.05)
             t.Q = Rates.random(DnaPairs).normalize()
             t.assignQ()
             t.assignP()
             t.evolve(randint(0,4,100))
             t.makeIdIndex()
             depths = t.leafLcaDepths()
             result = tree_threeway_rates(t, depths)
             self.assertEqual(result.shape, (5,5,5,16))
             #check that row sums are 0
             for x in [(i,j,k) for i in range(5) for j in range(5) \
                 for k in range(5)]:
                 self.assertFloatEqual(sum(result[x]), 0)
             assert any(result)
             #check that it works without_diag
             result = tree_threeway_rates(t, depths, without_diag=True)
             self.assertEqual(result.shape, (5,5,5,12))
             #check that it works with/without normalize
             #default: no normalization, so row sums shouldn't be 1 after 
             #omitting diagonal
             result = tree_threeway_rates(t, depths, without_diag=True)
             self.assertEqual(result.shape, (5,5,5,12))
             for x in [(i,j,k) for i in range(5) for j in range(5) \
                 for k in range(5)]:
                 assert sum(result[x]) == 0 or abs(sum(result[x]) - 1) > 0.01
             #...but if we tell it to normalize, row sums should be nearly 1
             #after omitting diagonal
             result = tree_threeway_rates(t, depths, without_diag=True, \
                 normalize=True)
             self.assertEqual(result.shape, (5,5,5,12))
             for x in [(i,j,k) for i in range(5) for j in range(5) \
                 for k in range(5)]:
                     s = sum(result[x])
                     if s != 0:
                         self.assertFloatEqual(s, 1)
             break
         except AssertionError:
             pass
예제 #13
0
 def test_assignPs(self):
     """RangeNode assignPs should assign multiple scaled P matrices"""
     t = self.t1
     for i in t.traverse(self_before=True):
         i.Length = random() * 0.5  #range 0 to 0.5
     t.Q = Rates.random(DnaPairs)
     t.assignQ()
     t.assignPs([1, 0.5, 0.25])
     t.assignIds()
     for node in t.traverse(self_after=True):
         if node.Parent is not None:
             self.assertEqual(len(node.Ps), 3)
             self.assertFloatEqual(average(1-diag(node.Ps[0]._data), axis=0), \
                 node.Length)
             self.assertFloatEqual(average(1-diag(node.Ps[1]._data), axis=0), \
                 0.5*node.Length)
             self.assertFloatEqual(average(1-diag(node.Ps[2]._data), axis=0), \
                 0.25*node.Length)
예제 #14
0
 def test_assignPs(self):
     """RangeNode assignPs should assign multiple scaled P matrices"""
     t = self.t1
     for i in t.traverse(self_before=True):
         i.Length = random() * 0.5 #range 0 to 0.5
     t.Q = Rates.random(DnaPairs)
     t.assignQ()
     t.assignPs([1, 0.5, 0.25])
     t.assignIds()
     for node in t.traverse(self_after=True):
         if node.Parent is not None:
             self.assertEqual(len(node.Ps), 3)
             self.assertFloatEqual(average(1-diag(node.Ps[0]._data), axis=0), \
                 node.Length)
             self.assertFloatEqual(average(1-diag(node.Ps[1]._data), axis=0), \
                 0.5*node.Length)
             self.assertFloatEqual(average(1-diag(node.Ps[2]._data), axis=0), \
                 0.25*node.Length)
예제 #15
0
 def test_evolveSeqs(self):
     """PhlyoNode evolveSeqs should evolve multiple sequences"""
     t = self.t1
     for i in t.traverse(self_before=True):
         i.Length = 0.5
     t.Q = Rates.random(DnaPairs)
     t.assignQ()
     t.assignPs([1, 1, 0.1])
     t.assignIds()
     orig_seqs = [array(i) for i in [randint(0,4,200), randint(0,4,200), \
         randint(0,4,200)]]
     t.evolveSeqs(orig_seqs)
     for node in t.traverse():  #only look at leaves
         if node.Parent is not None:
             self.assertEqual(len(node.Sequences), 3)
             for orig, new in zip(orig_seqs, node.Sequences):
                 self.assertEqual(len(orig), len(new))
                 self.assertNotEqual(orig, new)
             assert sum(orig_seqs[1]!=node.Sequences[1]) > \
                     sum(orig_seqs[2]!=node.Sequences[2])
예제 #16
0
 def test_evolveSeqs(self):
     """PhlyoNode evolveSeqs should evolve multiple sequences"""
     t = self.t1
     for i in t.traverse(self_before=True):
         i.Length = 0.5
     t.Q = Rates.random(DnaPairs)
     t.assignQ()
     t.assignPs([1, 1, 0.1])
     t.assignIds()
     orig_seqs = [array(i) for i in [randint(0,4,200), randint(0,4,200), \
         randint(0,4,200)]]
     t.evolveSeqs(orig_seqs)
     for node in t.traverse():   #only look at leaves
         if node.Parent is not None:
             self.assertEqual(len(node.Sequences), 3)
             for orig, new in zip(orig_seqs, node.Sequences):
                 self.assertEqual(len(orig), len(new))
                 self.assertNotEqual(orig, new)
             assert sum(orig_seqs[1]!=node.Sequences[1]) > \
                     sum(orig_seqs[2]!=node.Sequences[2])