Exemplo n.º 1
0
def deep_dive(nu=(6, 5, 3, 2, 1), mu=(4, 3, 2, 1)):
    split_nu, split_mu, diagonal = split(nu, mu)
    print()
    print('TYPE:')
    print()
    print(split_nu, split_mu, diagonal)
    print()
    print(Partition.printable(split_nu, split_mu, shifted=False))
    print()

    print('nu =', nu, 'mu =', mu)
    print()
    print(Partition.printable(nu, mu, shifted=True))
    print()

    m = sum(nu) - sum(mu) + 2
    target = lvector(nu, mu, m)

    nu1, mu1 = Partition.decrement_one(nu), mu
    nu2, mu2 = Partition.decrement_one(Partition.decrement_one(nu)), mu
    nu3, mu3 = Partition.decrement_one(
        Partition.decrement_one(
            Partition.decrement_one(nu))), Partition.decrement_one(mu)
    nu4, mu4 = Partition.trim(nu[1:]), Partition.trim(mu[1:])
    nu5, mu5 = Partition.trim(nu[2:]), Partition.trim(mu[2:])
    nu6, mu6 = tuple(i - 1 for i in nu), tuple(i - 1 for i in mu)

    print(Partition.printable(nu1, mu1, shifted=True), '\n')
    print(Partition.printable(nu2, mu2, shifted=True), '\n')
    print(Partition.printable(nu3, mu3, shifted=True), '\n')
    print(Partition.printable(nu4, mu4, shifted=True), '\n')
    print(Partition.printable(nu5, mu5, shifted=True), '\n')

    m = sum(nu) - sum(mu) + 2

    print('nu =', nu, '; mu =', mu)
    print()
    print(Partition.printable(nu, mu, shifted=True))
    print()

    v = [
        lvector(nu1, mu1, m),
        lvector(nu1, mu1, m) >> 1,
        lvector(nu2, mu2, m),
        lvector(nu2, mu2, m) >> 1,
        lvector(nu3, mu3, m),
        lvector(nu3, mu3, m) >> 1,
        lvector(nu4, mu4, m),
        lvector(nu4, mu4, m) >> 1,
        lvector(nu5, mu5, m),
        lvector(nu5, mu5, m) >> 1,
        lvector(nu5, mu5, m) >> 2,
    ]
    print('target =')
    print(target)
    print()
    RowVector.print_matrix(v)
    print()
    print('partial solutions =', RowVector.solve(v, target, integral=False))
    print()
Exemplo n.º 2
0
def test_gp_pieri(n=4, m=10, l=5):
    for mu in Partition.all(m, strict=True):
        if sum(mu) <= 1:
            continue
        f = gp(n, mu)
        for p in range(1, l + 1):
            g = gp(n, (p,))

            actual = f * g

            expected = 0
            pieri = gp_pieri(mu, p)
            for (lam, c) in pieri.items():
                expected += gp(n, lam) * c

            # print('gp_%s(x_%s)' % (mu, n), '*', 'gp_%s(x_%s)' % (p, n))
            # print('  ', actual - expected)
            # print()
            assert actual == expected

            pieri = {k: 2 * v for k, v in pieri.items()}
            if p >= 2:
                for (lam, c) in gp_pieri(mu, p - 1).items():
                    pieri[lam] = pieri.get(lam, 0) + c * beta

            q = mu[0] if mu else 0
            nu = (q + p,) + mu
            print()
            print(Partition.printable(nu, mu, shifted=True))
            print()
            print('mu =', mu, 'p =', p, 'q =', q)
            print()

            rho1 = (q + p,) + mu[1:]
            rho2 = (q + p - 1,) + mu[1:]

            print(pieri)
            print()

            for lam in pieri:
                co = pieri[lam].substitute(0, 1)
                co = co - 1 if lam in [rho1, rho2] else co
                klg = Tableau.KLG_counts(nu, lam, q)
                print(lam, co, klg)
                assert co == klg
            print()
Exemplo n.º 3
0
def test_dual_inclusion_excluson(k=5):
    partitions = list(Partition.all(k, strict=True))
    for lam in partitions:
        for nu in partitions:
            if not Partition.contains(lam, nu):
                continue
            ans, queue = Vector(), {nu: 1}
            while queue:
                kappa = next(iter(queue))
                coeff = queue[kappa]
                ans += Vector({kappa: coeff})
                del queue[kappa]
                additions = {
                    tuple(kappa[i] + a[i] for i in range(len(a)))
                    for a in zero_one_tuples(len(kappa))
                    if not all(a[i] == 0 for i in range(len(a))) and all(
                        kappa[i - 1] + a[i - 1] > kappa[i] + a[i]
                        for i in range(1, len(a))) and all(
                            lam[i] >= kappa[i] + a[i] for i in range(len(a)))
                }
                for gam in additions:
                    queue[gam] = queue.get(gam, 0) - cols(gam, kappa) * coeff
            print('lambda =', lam, 'nu =', nu)
            print()
            for gam in ans:
                print(Partition.printable(gam, nu, True))
                print()
                print('coefficient =', ans[gam])
                print()
            print()
            print(ans)
            print()
            print()
            assert all(ans[g] == 2**overlap(g, nu) for g in ans)
            assert set(ans) == {
                g
                for g in Partition.subpartitions(lam, strict=True)
                if len(g) == len(nu) and Partition.contains(g, nu)
            }
Exemplo n.º 4
0
def test_gq_pieri(n=4, m=10, l=5):
    for mu in Partition.all(m, strict=True):
        if not mu:
            continue
        f = gq(n, mu)
        for p in range(1, l + 1):
            g = gq(n, (p,))

            actual = f * g

            expected = 0
            pieri = gq_pieri(mu, p)
            for (lam, c) in pieri.items():
                expected += gq(n, lam) * c

            # print('gq_%s(x_%s)' % (mu, n), '*', 'gq_%s(x_%s)' % (p, n))
            # print('  ', actual - expected)
            # print()
            assert actual == expected

            q = mu[0] if mu else 0
            nu = (q + p,) + mu
            print()
            print(Partition.printable(nu, mu, shifted=True))
            print()
            print('mu =', mu, 'p =', p, 'q =', q)
            print()

            rho1 = (q + p,) + mu[1:]
            rho2 = (q + p - 1,) + mu[1:]

            for lam in pieri:
                co = pieri[lam].substitute(0, 1)
                co = co - 1 if lam in [rho1, rho2] else co
                kog = Tableau.KOG_counts(nu, lam, q)
                print(lam, co, kog)
                assert co == kog
            print()
Exemplo n.º 5
0
def test_inclusion_excluson(k=5):
    partitions = list(Partition.all(k, strict=True))
    for kappa in partitions:
        ans, queue = Vector(), {kappa: 1}
        while queue:
            pop = next(iter(queue))
            coeff = queue[pop]
            ans += Vector({pop: coeff})
            del queue[pop]
            additions = {
                tuple(pop[i] - a[i] for i in range(len(a)))
                for a in zero_one_tuples(len(kappa))
                if not all(a[i] == 0 for i in range(len(a))) and all(
                    pop[i - 1] - a[i - 1] > pop[i] - a[i]
                    for i in range(1, len(a))) and all(0 < pop[i] - a[i]
                                                       for i in range(len(a)))
            }
            for nu in additions:
                queue[nu] = queue.get(nu, 0) - cols(pop, nu) * coeff
        print('kappa =', kappa)
        print()
        for nu in ans:
            print(Partition.printable(kappa, nu, True))
            print()
            print('coefficient =', ans[nu])
            print()
        print()
        print(ans)
        print()
        print()
        assert all(ans[nu] == 2**overlap(kappa, nu) for nu in ans)
        assert set(ans) == {
            nu
            for nu in Partition.subpartitions(kappa, strict=True)
            if len(nu) == len(kappa)
        }
Exemplo n.º 6
0
def test_all(n=6):
    def inspect(w, target, good, unique=None):
        ans = []
        sort = sorted(good, key=lambda x: -unique[x]) if unique else good
        for g in sort:
            a = w[0] * g[0]
            for i in range(1, len(g)):
                a += w[i] * g[i]
            if target == a:
                ans.append(g)
        return ans

    types = get_types(n)
    success = [0, 0]
    unique = {}
    refined_unique = defaultdict(list)
    good = set()

    for (split_nu, split_mu, diagonal) in types:
        # if (split_nu, split_mu) != ((3, 1, 1, 1), ()):
        #    continue
        target = RowVector()
        w = [RowVector() for i in range(9)]

        # print(10 * '\n')
        domain = types[(split_nu, split_mu, diagonal)]

        # if len(domain) <= 2:
        #     continue

        for (nu, mu) in domain:
            nu1, mu1 = Partition.decrement_one(nu), mu
            # nu2, mu2 = Partition.decrement_one(Partition.decrement_one(nu)), mu
            # nu3, mu3 = Partition.decrement_one(Partition.decrement_one(nu)), Partition.decrement_one(mu)
            nu4, mu4 = Partition.trim(nu[1:]), Partition.trim(mu[1:])
            nu5, mu5 = Partition.trim(nu[2:]), Partition.trim(mu[2:])
            nu6, mu6 = Partition.trim(nu[3:]), Partition.trim(mu[3:])

            m = sum(nu) - sum(mu) + 2

            v = lvector(nu, mu, m)
            target |= v

            w[0] |= lvector(nu4, mu4, m)
            w[1] |= lvector(nu4, mu4, m) >> 1
            w[2] |= lvector(nu4, mu4, m) >> 2

            w[3] |= lvector(nu5, mu5, m)
            w[4] |= lvector(nu5, mu5, m) >> 1
            w[5] |= lvector(nu5, mu5, m) >> 2

            w[6] |= lvector(nu1, mu1, m)
            w[7] |= lvector(nu1, mu1, m) >> 1
            w[8] |= lvector(nu1, mu1, m) >> 2

            # v = RowVector.elementary(1, len(v))
            # w[9] |= v

            # w[9] |= lvector(nu6, mu6, m)
            # w[10] |= lvector(nu6, mu6, m) >> 1
            # w[11] |= lvector(nu6, mu6, m) >> 2

            # w[8] |= lvector(nu2, mu2, m)
            # w[9] |= lvector(nu2, mu2, m) >> 1

            # w[10] |= lvector(nu3, mu3, m)
            # w[11] |= lvector(nu3, mu3, m) >> 1

            # w[12] |= lvector(nu6, mu6, m)
            # w[13] |= lvector(nu6, mu6, m) >> 1

            try:
                assert lvector(nu, mu, m) == rvector(nu, mu, m)
            except:
                print(Partition.printable(nu, mu, shifted=True), '\n')
                print(lvector(nu, mu, m), '==', rvector(nu, mu, m))
                input('')

        k = 1
        solved = inspect(w, k * target, good, unique)
        if not solved:
            solved = [k * x for x in RowVector.solve(w, target)]
            if solved:
                integral = [RowVector([int(a) for a in solved[0]])]
                if inspect(w, k * target, integral):
                    solved = integral

        if solved:  # and all(type(t) == int for t in solved[0]):
            solved = solved[0]
            success[0] += 1
            unique[solved] = unique.get(solved, 0) + 1
            for (nu, mu) in domain:
                x = sum(nu) - sum(mu)
            refined_unique[solved].append(
                (split_nu, split_mu, diagonal, domain, w, target))
            # if len(domain) > 1:
            #    print(len(domain), ':', solved, diagonal)
            if all(type(i) == int for i in solved):
                good.add(solved)
            if solved[-1] == 0:
                continue
        else:
            success[1] += 1
            for (nu, mu) in domain:
                # if mu == ():
                #    continue

                nu1, mu1 = Partition.decrement_one(nu), mu
                # nu2, mu2 = Partition.decrement_one(Partition.decrement_one(nu)), mu
                # nu3, mu3 = Partition.decrement_one(Partition.decrement_one(nu)), Partition.decrement_one(mu)
                nu4, mu4 = Partition.trim(nu[1:]), Partition.trim(mu[1:])
                nu5, mu5 = Partition.trim(nu[2:]), Partition.trim(mu[2:])
                # nu6, mu6 = Partition.decrement_one(Partition.decrement_one(nu)), mu

                m = sum(nu) - sum(mu) + 2

                print('nu =', nu, '; mu =', mu)
                print()
                print(Partition.printable(nu, mu, shifted=True))
                print()

                # print(Partition.printable(nu1, mu1, shifted=True), '\n')
                # print(Partition.printable(nu2, mu2, shifted=True), '\n')
                # print(Partition.printable(nu3, mu3, shifted=True), '\n')
                # print(Partition.printable(nu4, mu4, shifted=True), '\n')
                # print(Partition.printable(nu5, mu5, shifted=True), '\n')
                # print(Partition.printable(nu6, mu6, shifted=True), '\n')

                v = [
                    lvector(nu4, mu4, m),
                    lvector(nu4, mu4, m) >> 1,
                    lvector(nu4, mu4, m) >> 2,
                    lvector(nu5, mu5, m),
                    lvector(nu5, mu5, m) >> 1,
                    lvector(nu5, mu5, m) >> 2,
                    lvector(nu1, mu1, m),
                    lvector(nu1, mu1, m) >> 1,
                    lvector(nu1, mu1, m) >> 2,
                    # lvector(nu2, mu2, m),
                    # lvector(nu2, mu2, m) >> 1,
                    # lvector(nu3, mu3, m),
                    # lvector(nu3, mu3, m) >> 1,
                    # lvector(nu6, mu6, m),
                    # lvector(nu6, mu6, m) >> 1,
                ]
                print('target =')
                print(lvector(nu, mu, m))
                print()
                RowVector.print_matrix(v)
                print()
                print('partial solutions =',
                      RowVector.solve(v, lvector(nu, mu, m), integral=False))
                print()
                # print('solutions so far:')
                # for u in unique:
                #     print('*', u)

        RowVector.print_matrix(w)
        RowVector.print_matrix([target])

        print(Partition.printable(nu, mu, shifted=True), '\n')
        print(Partition.printable(nu1, mu1, shifted=True), '\n')

        print()
        print('TYPE:')
        print()
        print(split_nu, split_mu, diagonal)
        print()
        print(Partition.printable(split_nu, split_mu, shifted=False))
        print()
        print()
        print(solved)
        print()
        # input('')
        print(10 * '\n')
    print()

    for u in sorted(unique, key=lambda x: -unique[x]):
        print(u, ':', unique[u])
        for (split_nu, split_mu, diagonal, domain, w,
             target) in refined_unique[u][:10]:
            RowVector.print_matrix(w)
            RowVector.print_matrix([target])
            print()
            print('type:', split_nu, split_mu, diagonal)
            print()
            print(Partition.printable(split_nu, split_mu, shifted=False))
            print()
            # i = 1
            # for nu, mu in domain:
            #     print(i, 'of', len(domain), '\n')
            #     print(Partition.printable(nu, mu, shifted=True))
            #     print()
            #     i += 1

    print()
    print('{')
    for u in sorted(unique, key=lambda x: unique[x]):
        print(u, ':', unique[u], ',')  # , unique[u], set(refined_unique[u]))
    print('}')
    print()
    print('unique:', len(unique))
    print()
    print(success)