示例#1
0
    def test_inversions(self):
        for s in symmetries.SYMMETRIES:
            with self.subTest(symmetry=s):
                self.assertEqualNPArray(
                    self.feat,
                    symmetries.apply_symmetry_feat(
                        s,
                        symmetries.apply_symmetry_feat(
                            symmetries.invert_symmetry(s), self.feat)))
                self.assertEqualNPArray(
                    self.feat,
                    symmetries.apply_symmetry_feat(
                        symmetries.invert_symmetry(s),
                        symmetries.apply_symmetry_feat(s, self.feat)))

                self.assertEqualNPArray(
                    self.pi,
                    symmetries.apply_symmetry_pi(
                        utils_test.BOARD_SIZE, s,
                        symmetries.apply_symmetry_pi(
                            utils_test.BOARD_SIZE,
                            symmetries.invert_symmetry(s), self.pi)))
                self.assertEqualNPArray(
                    self.pi,
                    symmetries.apply_symmetry_pi(
                        utils_test.BOARD_SIZE, symmetries.invert_symmetry(s),
                        symmetries.apply_symmetry_pi(utils_test.BOARD_SIZE, s,
                                                     self.pi)))
示例#2
0
    def find_symmetry(self, x, pi, x2, pi2):
        for sym in symmetries.SYMMETRIES:
            x_equal = (x == symmetries.apply_symmetry_feat(sym, x2)).all()
            pi_equal = (pi == symmetries.apply_symmetry_pi(sym, pi2)).all()
            if x_equal and pi_equal:
                return sym

        self.assertTrue(False, "No rotation makes {} equal {}".format(pi, pi2))
示例#3
0
        def find_symmetry(x, pi, x2, pi2):
            for sym in symmetries.SYMMETRIES:
                x_equal = (x == symmetries.apply_symmetry_feat(sym, x2)).all()
                pi_equal = (pi == symmetries.apply_symmetry_pi(sym, pi2)).all()
                if x_equal and pi_equal:
                    return sym

            assert False, "No rotation makes {} equal {}".format(
                pi1.reshape((go.N, go.N)), pi2((go.N, go.N)))
示例#4
0
 def test_compositions(self):
   test_cases = [
       ('rot90', 'rot90', 'rot180'),
       ('rot90', 'rot180', 'rot270'),
       ('identity', 'rot90', 'rot90'),
       ('fliprot90', 'rot90', 'fliprot180'),
       ('rot90', 'rot270', 'identity'),
   ]
   for s1, s2, composed in test_cases:
     with self.subTest(s1=s1, s2=s2, composed=composed):
       self.assertEqualNPArray(symmetries.apply_symmetry_feat(
           composed, self.feat), symmetries.apply_symmetry_feat(
               s2, symmetries.apply_symmetry_feat(s1, self.feat)))
       self.assertEqualNPArray(
           symmetries.apply_symmetry_pi(
               utils_test.BOARD_SIZE, composed, self.pi),
           symmetries.apply_symmetry_pi(
               utils_test.BOARD_SIZE, s2,
               symmetries.apply_symmetry_pi(
                   utils_test.BOARD_SIZE, s1, self.pi)))
示例#5
0
 def test_compositions(self):
     test_cases = [
         ('rot90', 'rot90', 'rot180'),
         ('rot90', 'rot180', 'rot270'),
         ('identity', 'rot90', 'rot90'),
         ('fliprot90', 'rot90', 'fliprot180'),
         ('rot90', 'rot270', 'identity'),
     ]
     for s1, s2, composed in test_cases:
         with self.subTest(s1=s1, s2=s2, composed=composed):
             self.assertEqualNPArray(
                 symmetries.apply_symmetry_feat(composed, self.feat),
                 symmetries.apply_symmetry_feat(
                     s2, symmetries.apply_symmetry_feat(s1, self.feat)))
             self.assertEqualNPArray(
                 symmetries.apply_symmetry_pi(utils_test.BOARD_SIZE,
                                              composed, self.pi),
                 symmetries.apply_symmetry_pi(
                     utils_test.BOARD_SIZE, s2,
                     symmetries.apply_symmetry_pi(utils_test.BOARD_SIZE, s1,
                                                  self.pi)))
示例#6
0
    def find_symmetry(self, x, pi, x2, pi2):
        for sym in symmetries.SYMMETRIES:
            #print (sym, type(x), type(symmetries.apply_symmetry_feat(sym, x2)))
            #print (x.shape, symmetries.apply_symmetry_feat(sym, x2).shape)
            #print (pi.shape, symmetries.apply_symmetry_pi(sym, pi2).shape)
            x_equal = (x == symmetries.apply_symmetry_feat(sym, x2)).all()
            pi_equal = (pi == symmetries.apply_symmetry_pi(sym, pi2)).all()
            if x_equal and pi_equal:
                return sym

        assert False, "No rotation makes {} equal {}".format(
            pi, pi2)
示例#7
0
 def test_uniqueness(self):
     all_symmetries_f = [
         symmetries.apply_symmetry_feat(s, self.feat)
         for s in symmetries.SYMMETRIES
     ]
     all_symmetries_pi = [
         symmetries.apply_symmetry_pi(utils_test.BOARD_SIZE, s, self.pi)
         for s in symmetries.SYMMETRIES
     ]
     for f1, f2 in itertools.combinations(all_symmetries_f, 2):
         self.assertNotEqualNPArray(f1, f2)
     for pi1, pi2 in itertools.combinations(all_symmetries_pi, 2):
         self.assertNotEqualNPArray(pi1, pi2)
示例#8
0
 def test_uniqueness(self):
   all_symmetries_f = [
       symmetries.apply_symmetry_feat(
           s, self.feat) for s in symmetries.SYMMETRIES
   ]
   all_symmetries_pi = [
       symmetries.apply_symmetry_pi(
           utils_test.BOARD_SIZE, s, self.pi) for s in symmetries.SYMMETRIES
   ]
   for f1, f2 in itertools.combinations(all_symmetries_f, 2):
     self.assertNotEqualNPArray(f1, f2)
   for pi1, pi2 in itertools.combinations(all_symmetries_pi, 2):
     self.assertNotEqualNPArray(pi1, pi2)
示例#9
0
  def test_inversions(self):
    for s in symmetries.SYMMETRIES:
      with self.subTest(symmetry=s):
        self.assertEqualNPArray(
            self.feat, symmetries.apply_symmetry_feat(
                s, symmetries.apply_symmetry_feat(
                    symmetries.invert_symmetry(s), self.feat)))
        self.assertEqualNPArray(
            self.feat, symmetries.apply_symmetry_feat(
                symmetries.invert_symmetry(s), symmetries.apply_symmetry_feat(
                    s, self.feat)))

        self.assertEqualNPArray(
            self.pi, symmetries.apply_symmetry_pi(
                utils_test.BOARD_SIZE, s, symmetries.apply_symmetry_pi(
                    utils_test.BOARD_SIZE, symmetries.invert_symmetry(s),
                    self.pi)))
        self.assertEqualNPArray(
            self.pi, symmetries.apply_symmetry_pi(
                utils_test.BOARD_SIZE, symmetries.invert_symmetry(s),
                symmetries.apply_symmetry_pi(
                    utils_test.BOARD_SIZE, s, self.pi)))
示例#10
0
 def test_proper_move_transform(self):
     # Check that the reinterpretation of 362 = 19*19 + 1 during symmetry
     # application is consistent with coords.from_flat
     move_array = np.arange(utils_test.BOARD_SIZE**2 + 1)
     coord_array = np.zeros([utils_test.BOARD_SIZE, utils_test.BOARD_SIZE])
     for c in range(utils_test.BOARD_SIZE**2):
         coord_array[coords.from_flat(utils_test.BOARD_SIZE, c)] = c
     for s in symmetries.SYMMETRIES:
         with self.subTest(symmetry=s):
             transformed_moves = symmetries.apply_symmetry_pi(
                 utils_test.BOARD_SIZE, s, move_array)
             transformed_board = symmetries.apply_symmetry_feat(
                 s, coord_array)
             for new_coord, old_coord in enumerate(transformed_moves[:-1]):
                 self.assertEqual(
                     old_coord, transformed_board[coords.from_flat(
                         utils_test.BOARD_SIZE, new_coord)])
示例#11
0
 def test_proper_move_transform(self):
   # Check that the reinterpretation of 362 = 19*19 + 1 during symmetry
   # application is consistent with coords.from_flat
   move_array = np.arange(utils_test.BOARD_SIZE ** 2 + 1)
   coord_array = np.zeros([utils_test.BOARD_SIZE, utils_test.BOARD_SIZE])
   for c in range(utils_test.BOARD_SIZE ** 2):
     coord_array[coords.from_flat(utils_test.BOARD_SIZE, c)] = c
   for s in symmetries.SYMMETRIES:
     with self.subTest(symmetry=s):
       transformed_moves = symmetries.apply_symmetry_pi(
           utils_test.BOARD_SIZE, s, move_array)
       transformed_board = symmetries.apply_symmetry_feat(s, coord_array)
       for new_coord, old_coord in enumerate(transformed_moves[:-1]):
         self.assertEqual(
             old_coord,
             transformed_board[
                 coords.from_flat(utils_test.BOARD_SIZE, new_coord)])
示例#12
0
 def rotate_py_func(x, pi):
     syms, x_rot = symmetries.randomize_symmetries_feat(x)
     pi_rot = [symmetries.apply_symmetry_pi(s, p) for s, p in zip(syms, pi)]
     return x_rot, pi_rot