Ejemplo n.º 1
0
 def test_factorial(self):
     self.assertEqual(factorial(0), 1)
     self.assertEqual(factorial(1), 1)
     self.assertEqual(factorial(2), 2)
     self.assertEqual(factorial(3), 6)
     self.assertEqual(factorial(9), 362880)
     self.assertEqual(factorial(10), 3628800)
Ejemplo n.º 2
0
    def __init__(self, n, patt=None):
        self.n = n
        self.patt = patt

        self.mps = []
        self.idx = {}

        sys.stderr.write('Generating mesh patterns\n')
        ProgressBar.create(2**((n+1)*(n+1)) * (factorial(n) if patt is None else 1))
        for i,mp in enumerate(MeshPatterns(n, patt)):
            ProgressBar.progress()
            self.mps.append(mp)
            self.idx[mp] = i
        ProgressBar.finish()
Ejemplo n.º 3
0


idx = {}
mps = []
groups = {}
groupid = {}
for mp in MeshPatterns(len(patt), patt):
    idx[mp] = len(mps)
    mps.append(mp)

active = None
for l in range(n+1, mxlen+1):
    print('length %d' % l)

    ProgressBar.create(factorial(l))
    mesh_perms = {}
    for perm in Permutations(l):
        ProgressBar.progress()
        # perm = Permutation([5,2,1,6,4,3,7])
        # perm = Permutation([5,2,11,1,8,6,4,9,3,10,7])
        idx = {}
        for i,x in enumerate(perm):
            idx[x] = i
        poss = []
        for res in containment(patt, perm):
            # print([ i-1 for i in res ])
            con = set(res)
            colcnt = 0
            col = [-1]*len(perm)
            for i,v in enumerate(perm):
Ejemplo n.º 4
0
    def brute_coincify_len(self, l, active):
        n = self.mps.n
        patt = self.mps.patt
        assert patt is not None
        cnt = len(self.mps)
        mesh_perms = {}

        sys.stderr.write('Permutations of length %d\n' % l)
        ProgressBar.create(factorial(l))
        for perm in Permutations(l):
            ProgressBar.progress()
            poss = []
            for res in containment(patt, perm):
                con = set(res)
                colcnt = 0
                col = [-1]*len(perm)
                for i,v in enumerate(perm):
                    if v in con:
                        colcnt += 1
                    else:
                        col[v-1] = colcnt
                rowcnt = 0
                row = [-1]*len(perm)
                for v in range(len(perm)):
                    if v+1 in con:
                        rowcnt += 1
                    else:
                        row[v] = rowcnt
                bad = set( (u,v) for u,v in zip(col,row) if u != -1 )
                cur = set( (u,v) for u in range(len(patt)+1) for v in range(len(patt)+1) if (u,v) not in bad )
                poss.append(cur)

            last = None
            maxima = []
            for cur in sorted(poss):
                if cur == last:
                    continue
                add = True
                for other in poss:
                    if cur < other:
                        add = False
                if add:
                    maxima.append(cur)
                last = cur
            perm_id = get_perm_id(perm)
            for m in maxima:
                m = tuple(sorted(m))
                mesh_perms.setdefault(m, [])
                mesh_perms[m].append(perm_id)
        ProgressBar.finish()

        max_shaded = {}
        for i in range(cnt):
            here = self.mps[i]
            if self.uf.find(i) not in max_shaded or len(here.mesh) > len(max_shaded[self.uf.find(i)]):
                max_shaded[self.uf.find(i)] = here

        cont = {}
        notcnt = 0
        sys.stderr.write('Brute supersets, active = %d\n' % len(active))
        ProgressBar.create(len(active))
        for i in active:
            perms = set()
            here = max_shaded[i]
            ProgressBar.progress()
            notcnt += 1
            # print(i, here)
            for nxt in supersets_of_mesh(n+1, here.mesh):
                nxt = tuple(sorted(nxt))
                if nxt in mesh_perms:
                    perms |= set(mesh_perms[nxt])
            # print(i, perms)
            # perms = tuple([ tuple(p) for p in sorted(perms) ])
            perms_id = get_perm_class_id(sorted(perms))
            cont.setdefault(perms_id, [])
            cont[perms_id].append(i)
        ProgressBar.finish()

        for _, v in cont.items():
            if len(v) == 1:
                active.remove(v[0])
        return cont