def classify(classes, perm, mp_cnt, uf, depth, multbox, q_check, force_len): log('Running TSA with depth=%d, multbox=%s, q_check=%s, force_len=%s' % (depth, str(multbox), str(q_check), force_len)) outfile.write('params %s\n' % repr((depth, multbox, q_check, force_len))) nclasses = [] subclasses = 0 if depth == -1: # Shading lemma for x in xrange(mp_cnt): if x != uf.find(x): outfile.write('unite %d %d\n' % (x, uf.find(x))) for cl in classes: if len(cl) >= 2: cur = sorted(cl) nclasses.append(cur) subclasses += len(cur) outfile.write('surprising %s\n' % ' '.join(map(str, cur))) else: for cl in classes: grp = { uf.find(x): [] for x in cl } for x in xrange(mp_cnt): p = uf.find(x) if p in grp: grp[p].append(x) edges = [] for i in range(len(cl)): for j in range(i+1, len(cl)): for a in grp[uf.find(cl[i])]: for b in grp[uf.find(cl[j])]: edges.append((hamming(a,b), a, b)) edges = sorted(edges) for (_,a,b) in edges: if uf.find(a) == uf.find(b): continue mp1 = MeshPattern.unrank(perm, a) mp2 = MeshPattern.unrank(perm, b) if tsa5_coincident(mp1, mp2, depth, multbox=multbox, q_check=q_check, force_len=force_len): uf.unite(a,b) outfile.write('unite %d %d\n' % (a,b)) cur = set() for x in cl: cur.add(uf.find(x)) if len(cur) <= 1: continue cur = sorted(cur) nclasses.append(cur) outfile.write('surprising %s\n' % ' '.join(map(str, cur))) subclasses += len(cur) log('Done. Classes left: %d. Total no. of subclasses: %d' % (len(nclasses), subclasses)) return nclasses
def test_unrank(self): pattern = Permutation([1,2]) shading = set([(0,1), (0,2), (1,2), (2,0), (2,1)]) number = 230 mesh = MeshPattern(pattern, shading) self.assertEqual(MeshPattern.unrank(pattern, number), mesh) pattern = Permutation([3,1,2]) shading = set([(0,0), (0,1), (0,2), (1,0), (1,2), (2,0), (2,1), (2,2), (2,3), (3,0)]) number = 8023 mesh = MeshPattern(pattern, shading) self.assertEqual(MeshPattern.unrank(pattern, number), mesh) with self.assertRaises(AssertionError): self.assertEqual(MeshPattern.unrank([1,2,3], -1)) with self.assertRaises(AssertionError): self.assertEqual(MeshPattern.unrank(Permutation([1]), "1")) with self.assertRaises(AssertionError): self.assertEqual(MeshPattern.unrank(Permutation([1]), 16)) with self.assertRaises(AssertionError): self.assertEqual(MeshPattern.unrank(Permutation([1]), -1)) pattern = self.patt1 number = 0b111000000001100000011000001000001 mesh = self.mesh1 self.assertEqual(MeshPattern.unrank(pattern, number), mesh)