def test_sum(self) -> None: ip = IP() x = ip.add_boolean_grid(5, 5) self.assertIsInstance(sum(x[:][1]), Sum) self.assertIsInstance(sum(x[2][:]), Sum) x3 = ip.add_boolean_cube(5, 5, 6) self.assertIsInstance(sum(sum(x3[:][2][:])), Sum)
def test_sudoku(self) -> None: n = 3 ip = IP() x = ip.add_boolean_cube(n * n, n * n, n * n) for i in range(n * n): for j in range(n * n): s = Sum(0) for k in range(n * n): s += x[i][j][k] ip.add_constraint(s == 1) for i in range(n * n): for k in range(n * n): s = Sum(0) for j in range(n * n): s += x[i][j][k] ip.add_constraint(s == 1) for j in range(n * n): for k in range(n * n): s = Sum(0) for i in range(n * n): s += x[i][j][k] ip.add_constraint(s == 1) for i in range(n): for j in range(n): for k in range(n * n): s = Sum(0) for i2 in range(n): for j2 in range(n): s += x[n * i + i2][n * j + j2][k] ip.add_constraint(s == 1) solver = Solver() solutions = solver.solutions(ip) self.assertTrue(solutions.get()) d = np.zeros((n * n, n * n)) for i in range(n * n): for j in range(n * n): for k in range(n * n): d[i, j] += (k + 1) * x[i][j][k].value() for i in range(n * n): self.assertEqual(len(set(d[:, i])), n * n) self.assertEqual(len(set(d[i, :])), n * n) for i in range(n): for j in range(n): self.assertEqual( len(set(d[n * i:n * i + n, n * j:n * j + n].flatten())), n * n)
class TestCloudSolver(unittest.TestCase): def setUp(self) -> None: self.n = 3 n = self.n self.ip = IP() x = self.ip.add_boolean_cube(n * n, n * n, n * n) self.x = x for i in range(n * n): for j in range(n * n): s = Sum(0) for k in range(n * n): s += x[i][j][k] self.ip.add_constraint(s == 1) for i in range(n * n): for k in range(n * n): s = Sum(0) for j in range(n * n): s += x[i][j][k] self.ip.add_constraint(s == 1) for j in range(n * n): for k in range(n * n): s = Sum(0) for i in range(n * n): s += x[i][j][k] self.ip.add_constraint(s == 1) for i in range(n): for j in range(n): for k in range(n * n): s = Sum(0) for i2 in range(n): for j2 in range(n): s += x[n * i + i2][n * j + j2][k] self.ip.add_constraint(s == 1) def verify_solution(self): n = self.n x = self.x d = np.zeros((n * n, n * n)) for i in range(n * n): for j in range(n * n): for k in range(n * n): d[i, j] += (k + 1) * x[i][j][k].value() for i in range(n * n): self.assertEqual(len(set(d[:, i])), n * n) self.assertEqual(len(set(d[i, :])), n * n) for i in range(n): for j in range(n): self.assertEqual( len(set(d[n * i:n * i + n, n * j:n * j + n].flatten())), n * n) @unittest.skip("Not a good unit test. Sends email.") def test_cloud(self) -> None: solver = CloudSolver() solutions = solver.solutions(self.ip) self.assertTrue(solutions.get()) self.verify_solution() @unittest.skip("Slow.") def test_fake_cloud(self) -> None: solver = Solver() solutions = solver.solutions(self.ip) self.assertTrue(solutions.get()) self.verify_solution() fake_server = FakeNeosServer(self.ip.solution) self.ip.solution = None cloud_solver = CloudSolver("http://localhost:8000") solutions = cloud_solver.solutions(self.ip) self.assertTrue(solutions.get()) self.verify_solution() fake_server.stop()