Пример #1
0
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
Пример #2
0
 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)