예제 #1
0
파일: balance.py 프로젝트: bielr/biotrees
    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
예제 #2
0
파일: balance.py 프로젝트: bielr/biotrees
    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
예제 #3
0
파일: balance.py 프로젝트: bielr/biotrees
    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
예제 #4
0
    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)