def test_random_p_matrix_diag_vector(self): """Probs random should work with a vector diagonal""" for i in range(NUM_TESTS): diag = [0, 0.2, 0.6, 1.0] p = Probs.random(RnaPairs, diag)._data for i, d, row in zip(range(4), diag, p): self.assertFloatEqual(sum(row), 1.0) self.assertEqual(row[i], diag[i])
def test_random_p_matrix(self): """Probs random should return random Probsrows that sum to 1""" for i in range(NUM_TESTS): p = Probs.random(RnaPairs)._data for i in p: self.assertFloatEqual(sum(i), 1.0) #length should be 4 by default self.assertEqual(len(p), 4) self.assertEqual(len(p[0]), 4)
def test_random_p_matrix_diag(self): """Probs random should work with a scalar diagonal""" #if diagonal is 1, off-diagonal elements should be 0 for i in range(NUM_TESTS): p = Probs.random(RnaPairs, 1)._data self.assertEqual(p, identity(4, 'd')) #if diagonal is between 0 and 1, rows should sum to 1 for i in range(NUM_TESTS): p = Probs.random(RnaPairs, 0.5)._data for i in range(4): self.assertFloatEqual(sum(p[i]), 1.0) self.assertEqual(p[i][i], 0.5) assert min(p[i]) >= 0 assert max(p[i]) <= 1 #if diagonal > 1, rows should still sum to 1 for i in range(NUM_TESTS): p = Probs.random(RnaPairs, 2)._data for i in range(4): self.assertEqual(p[i][i], 2.0) self.assertFloatEqual(sum(p[i]), 1.0) assert min(p[i]) < 0
def test_probs_to_rates(self): """probs_to_rates converts probs to rates, omitting problem cases""" probs = dict([(i, Probs.random(DnaPairs)) for i in range(100)]) rates = probs_to_rates(probs) #check we got at most the same number of items as in probs assert len(rates) <= len(probs) #check that we didn't get anything bad vals = rates.values() for v in vals: assert not v.isSignificantlyComplex() #check that we didn't miss anything good for key, val in probs.items(): if key not in rates: try: r = val.toRates() print r.isValid() assert r.isSignificantlyComplex() or (not r.isValid()) except (ZeroDivisionError, OverflowError, ValueError): pass