def go(t): if t.is_leaf(): return 0, 0, 1 ts = t.children quartets, triples, kappas = zip(*map(go, ts)) kappa = sum(kappas) if kappa < 3: triple = 0 elif isomorphic(t, t0): triple = 1 else: t_s0 = sum(triples) t_s1 = sum(kappas[i1] * kappas[i2] * kappas[i3] for i1 in range(len(ts)) for i2 in range(i1 + 1, len(ts)) for i3 in range(i2 + 1, len(ts))) triple = t_s0 + t_s1 if kappa < 4: return 0, triple, kappa for q, v in zip(Q, vs): if isomorphic(t, q): return v, triple, kappa s0 = sum(quartets) s1 = sum( binom2(kappas[i1]) * kappas[i2] * kappas[i3] + binom2(kappas[i2]) * kappas[i1] * kappas[i3] + binom2(kappas[i3]) * kappas[i1] * kappas[i2] for i1 in range(len(ts)) for i2 in range(i1 + 1, len(ts)) for i3 in range(i2 + 1, len(ts))) s2 = sum(kappas[i1] * triples[i2] + kappas[i2] * triples[i1] for i1 in range(len(ts)) for i2 in range(i1 + 1, len(ts))) s3 = sum( binom2(kappas[i1]) * binom2(kappas[i2]) for i1 in range(len(ts)) for i2 in range(i1 + 1, len(ts))) s4 = sum(kappas[i1] * kappas[i2] * kappas[i3] * kappas[i4] for i1 in range(len(ts)) for i2 in range(i1 + 1, len(ts)) for i3 in range(i2 + 1, len(ts)) for i4 in range(i3 + 1, len(ts))) return s0 + vs[1] * s1 + vs[2] * s2 + vs[3] * s3 + vs[ 4] * s4, triple, kappa
def go(t): if t.is_leaf(): return 0, 1 cophs, kappas = zip(*map(go, t.children)) kappa = sum(kappas) coph = binom2(kappa) + sum(cophs) return coph, kappa
def go(t): if t.is_leaf(): return 0, 1 ts = t.children quartets, kappas = zip(*map(go, ts)) kappa = sum(kappas) if kappa < 4: return 0, kappa s0 = sum(quartets) s3 = sum( binom2(kappas[i1]) * binom2(kappas[i2]) for i1 in range(len(ts)) for i2 in range(i1 + 1, len(ts))) return s0 + s3, kappa
def test_binom2(self): self.assertEqual(util.binom2(5), factorial(5) // (factorial(5 - 2) * factorial(2))) self.assertEqual(util.binom2(10), factorial(10) // (factorial(10 - 2) * factorial(2))) self.assertTrue(isinstance(util.binom2(3), int)) self.assertTrue(isinstance(util.binom2(0), int)) self.assertEqual(util.binom2(0), util.binom2(1), 0)