コード例 #1
0
ファイル: find.py プロジェクト: PermutaTriangle/TheShading
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 setUp(self):
     pattern = [2,4,3,1]
     shading = set([(0,0),(4,0),(2,1),(4,1),(2,2),(4,2),(3,3),(0,4)])
     self.mesh_pattern = MeshPattern(pattern, shading)
     self.perm1 = Permutation([6,3,9,7,8,10,5,4,2,1])  # Occurrence: E.g., [1,3,6,9]
     self.perm2 = Permutation([2,3,9,7,6,10,5,4,8,1])  # Occurrence: E.g., [1,6,7,9]
     self.perm3 = Permutation([10,9,8,7,3,6,4,5,1,2])  # Occurrence: None (avoids)
     self.perm4 = Permutation([1,2,3,4,5])  # Avoids as well
     self.perm5 = Permutation([2,3,5,4,1])  # Two occurrences
     self.patt1 = self.perm4
     self.patt2 = self.perm5
     self.patt3 = Permutation((3,4,1,2))
     self.shad1 = frozenset([(5,0),(5,1),(5,2),(3,2),(2,1),(3,3),(0,0),(1,0),(2,0)])
     self.shad2 = frozenset([(3,3),(2,2),(1,1),(0,2)])
     self.shad3 = frozenset([(1,3),(4,4),(2,1),(2,2),(0,4),(4,0)])
     self.mesh1 = MeshPattern(self.patt1, self.shad1)
     self.mesh2 = MeshPattern(self.patt2, self.shad2)
     self.mesh3 = MeshPattern(self.patt3, self.shad3)
コード例 #3
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)
コード例 #4
0
class TestMeshPattern(unittest.TestCase):

    def setUp(self):
        pattern = [2,4,3,1]
        shading = set([(0,0),(4,0),(2,1),(4,1),(2,2),(4,2),(3,3),(0,4)])
        self.mesh_pattern = MeshPattern(pattern, shading)
        self.perm1 = Permutation([6,3,9,7,8,10,5,4,2,1])  # Occurrence: E.g., [1,3,6,9]
        self.perm2 = Permutation([2,3,9,7,6,10,5,4,8,1])  # Occurrence: E.g., [1,6,7,9]
        self.perm3 = Permutation([10,9,8,7,3,6,4,5,1,2])  # Occurrence: None (avoids)
        self.perm4 = Permutation([1,2,3,4,5])  # Avoids as well
        self.perm5 = Permutation([2,3,5,4,1])  # Two occurrences
        self.patt1 = self.perm4
        self.patt2 = self.perm5
        self.patt3 = Permutation((3,4,1,2))
        self.shad1 = frozenset([(5,0),(5,1),(5,2),(3,2),(2,1),(3,3),(0,0),(1,0),(2,0)])
        self.shad2 = frozenset([(3,3),(2,2),(1,1),(0,2)])
        self.shad3 = frozenset([(1,3),(4,4),(2,1),(2,2),(0,4),(4,0)])
        self.mesh1 = MeshPattern(self.patt1, self.shad1)
        self.mesh2 = MeshPattern(self.patt2, self.shad2)
        self.mesh3 = MeshPattern(self.patt3, self.shad3)

    def test_list_perm(self):
        # TODO: What is this?
        self.assertTrue(Permutation([1,2,3,4,5]).contains(MeshPattern([1,2,3], set([(0,0)]))))
        self.assertEqual(set([(0,1),(0,2),(1,0),(1,1),(1,2),(2,0),(2,1)]), MeshPattern([2,1], set([])).non_pointless_boxes())

    def test_init_new(self):
        # TODO
        pass

    def test_complement(self):
        # TODO
        pass

    def test_reverse(self):
        # TODO
        pass

    def test_inverse(self):
        # TODO
        pass

    def test_sub_mesh_pattern(self):
        # Sub mesh pattern from indices 1, 2, and 3 of mesh1
        pattern = (1,2,3)
        shading = set([(1,0),(2,1),(2,2)])
        mesh_pattern = MeshPattern(pattern, shading)
        sub_mesh_pattern = self.mesh1.sub_mesh_pattern((1,2,3))
        self.assertEqual(sub_mesh_pattern, mesh_pattern)
        # Sub mesh pattern from indices 0, 1, and 4 of mesh1
        pattern = (1,2,3)
        shading = set([(0,0),(1,0),(3,0),(3,1)])
        mesh_pattern = MeshPattern(pattern, shading)
        sub_mesh_pattern = self.mesh1.sub_mesh_pattern((0,1,4))
        self.assertEqual(sub_mesh_pattern, mesh_pattern)
        # Sub mesh pattern from indices 3 and 4 of mesh1
        self.assertEqual(self.mesh1.sub_mesh_pattern((3,4)), MeshPattern((1,2)))
        # Sub mesh pattern from indices 2 and 3 of mesh1
        self.assertEqual(self.mesh1.sub_mesh_pattern((2,3)), MeshPattern((1,2), set([(1,1)])))
        # Sub mesh pattern from index 0 of mesh3
        self.assertEqual(self.mesh3.sub_mesh_pattern((0,)), MeshPattern((1,)))
        # Sub mesh pattern from indices 0, 1, and 3 of mesh3
        self.assertEqual(self.mesh3.sub_mesh_pattern((0,1,3)), MeshPattern((2,3,1), set([(0,3),(1,2),(3,3)])))
        # Some complete sub meshes
        self.assertEqual(self.mesh1.sub_mesh_pattern(range(len(self.mesh1))), self.mesh1)
        self.assertEqual(self.mesh2.sub_mesh_pattern(range(len(self.mesh2))), self.mesh2)
        self.assertEqual(self.mesh3.sub_mesh_pattern(range(len(self.mesh3))), self.mesh3)

    def test_rotate(self):
        # Rotate once
        pattern = self.patt2.rotate()
        shading = set([(2,3),(3,2),(2,5),(1,4)])
        mesh = MeshPattern(pattern, shading)
        self.assertEqual(mesh, self.mesh2.rotate())
        # Rotate twice
        pattern = self.patt2.rotate(2)
        shading = set([(2,2),(3,3),(4,4),(5,3)])
        mesh = MeshPattern(pattern, shading)
        self.assertEqual(mesh, self.mesh2.rotate(2))
        # Rotate thrice
        pattern = self.patt2.rotate(3)
        shading = set([(2,3),(3,2),(4,1),(3,0)])
        mesh = MeshPattern(pattern, shading)
        self.assertEqual(mesh, self.mesh2.rotate(3))

    def flip_horizontal(self):
        # TODO
        pass

    def flip_vertical(self):
        # TODO
        pass

    def flip_diagonal(self):
        # TODO
        pass

    def flip_antidiagonal(self):
        # TODO
        pass

    def test_shade(self):
        # TODO
        pass

    def test_add_point(self):
        # TODO
        pass

    def test_add_increase(self):
        # TODO
        pass

    def test_add_decrease(self):
        # TODO
        pass

    def test_occurrences_in(self):
        # TODO: Maybe the contained_in, etc. tests are enough?
        pass

    def test_contained_in(self):
        self.assertTrue(Permutation([1,2,3]).contains(MeshPattern([1,2], set([(1,0),(1,1),(1,2)]))))
        self.assertTrue(self.mesh_pattern.contained_in(self.perm1))
        self.assertTrue(self.mesh_pattern.contained_in(self.perm2))
        self.assertFalse(self.mesh_pattern.contained_in(self.perm3))
        self.assertTrue(self.mesh_pattern.contained_in(self.perm1, self.perm2))
        self.assertFalse(self.mesh_pattern.contained_in(self.perm1, self.perm3))

    def test_avoided_by(self):
        self.assertFalse(self.mesh_pattern.avoided_by(self.perm1))
        self.assertFalse(self.mesh_pattern.avoided_by(self.perm2))
        self.assertTrue(self.mesh_pattern.avoided_by(self.perm3))
        self.assertTrue(self.mesh_pattern.avoided_by(self.perm4))
        self.assertTrue(self.mesh_pattern.avoided_by(self.perm3, self.perm4))
        self.assertFalse(self.mesh_pattern.avoided_by(self.perm4, self.perm1, self.perm3))

    def test_count_occurrences_in(self):
        self.assertEqual(self.mesh_pattern.count_occurrences_in(self.perm1), 8)
        self.assertEqual(self.mesh_pattern.count_occurrences_in(self.perm2), 12)
        self.assertEqual(self.mesh_pattern.count_occurrences_in(self.perm3), 0)
        self.assertEqual(self.mesh_pattern.count_occurrences_in(self.perm4), 0)
        self.assertEqual(self.mesh_pattern.count_occurrences_in(self.perm5), 2)

    def test_is_shaded(self):
        # TODO
        pass

    def test_non_pointless_boxes(self):
        # TODO
        pass

    def test_rank(self):
        # TODO
        pass

    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)

    def test_len(self):
        self.assertEqual(len(self.mesh1), 5)
        self.assertEqual(len(self.mesh2), 5)
        self.assertEqual(len(self.mesh3), 4)
        self.assertEqual(len(MeshPattern()), 0)
        self.assertEqual(len(MeshPattern((1,))), 1)

    def test_eq(self):
        self.assertNotEqual(self.mesh1, self.mesh2)
        self.assertNotEqual(self.mesh1, self.mesh3)
        self.assertNotEqual(self.mesh2, self.mesh1)
        self.assertNotEqual(self.mesh2, self.mesh3)
        self.assertNotEqual(self.mesh3, self.mesh1)
        self.assertNotEqual(self.mesh3, self.mesh2)
        mesh1copy = MeshPattern(self.patt1, self.shad1)
        mesh2copy = MeshPattern(self.patt2, self.shad2)
        mesh3copy = MeshPattern(self.patt3, self.shad3)
        self.assertEqual(self.mesh1, mesh1copy)
        self.assertEqual(self.mesh2, mesh2copy)
        self.assertEqual(self.mesh3, mesh3copy)
        self.assertEqual(mesh1copy, mesh1copy)
        self.assertEqual(mesh2copy, mesh2copy)
        self.assertEqual(mesh3copy, mesh3copy)

    def test_bool(self):
        self.assertTrue(self.mesh1)
        self.assertTrue(self.mesh2)
        self.assertTrue(self.mesh3)
        self.assertTrue(MeshPattern(Permutation((1,))))
        self.assertTrue(MeshPattern((), set([(0,0)])))
        self.assertFalse(MeshPattern())

    def test_contains(self):
        # TODO
        pass