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)
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()
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):
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