Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
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()