def test_integer_to_binary2(self): """Test integer to binary variables 2""" mod = QuadraticProgram() mod.integer_var(name="x", lowerbound=0, upperbound=1) mod.integer_var(name="y", lowerbound=0, upperbound=1) mod.minimize(1, {"x": 1}, {("x", "y"): 2}) mod.linear_constraint({"x": 1}, "==", 1) mod.quadratic_constraint({"x": 1}, {("x", "y"): 2}, "==", 1) mod2 = IntegerToBinary().convert(mod) self.assertListEqual([e.name + "@0" for e in mod.variables], [e.name for e in mod2.variables]) self.assertDictEqual(mod.objective.linear.to_dict(), mod2.objective.linear.to_dict()) self.assertDictEqual(mod.objective.quadratic.to_dict(), mod2.objective.quadratic.to_dict()) self.assertEqual(mod.get_num_linear_constraints(), mod2.get_num_linear_constraints()) for cst, cst2 in zip(mod.linear_constraints, mod2.linear_constraints): self.assertDictEqual(cst.linear.to_dict(), cst2.linear.to_dict()) self.assertEqual(mod.get_num_quadratic_constraints(), mod2.get_num_quadratic_constraints()) for cst, cst2 in zip(mod.quadratic_constraints, mod2.quadratic_constraints): self.assertDictEqual(cst.linear.to_dict(), cst2.linear.to_dict()) self.assertDictEqual(cst.quadratic.to_dict(), cst2.quadratic.to_dict())
def test_binary_to_integer(self): """Test binary to integer""" op = QuadraticProgram() for i in range(0, 2): op.binary_var(name="x{}".format(i)) op.integer_var(name="x2", lowerbound=0, upperbound=5) linear = {"x0": 1, "x1": 2, "x2": 1} op.maximize(0, linear, {}) linear = {} for x in op.variables: linear[x.name] = 1 op.linear_constraint(linear, Constraint.Sense.EQ, 6, "x0x1x2") conv = IntegerToBinary() _ = conv.convert(op) new_x = conv.interpret([0, 1, 1, 1, 1]) np.testing.assert_array_almost_equal(new_x, [0, 1, 5])
def test_converter_list(self): """Test converter list""" op = QuadraticProgram() op.integer_var(0, 3, "x") op.binary_var('y') op.maximize(linear={'x': 1, 'y': 2}) op.linear_constraint(linear={'x': 1, 'y': 1}, sense='LE', rhs=3, name='xy_leq') min_eigen_solver = NumPyMinimumEigensolver() # a single converter qp2qubo = QuadraticProgramToQubo() min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver, converters=qp2qubo) result = min_eigen_optimizer.solve(op) self.assertEqual(result.fval, 4) # a list of converters ineq2eq = InequalityToEquality() int2bin = IntegerToBinary() penalize = LinearEqualityToPenalty() converters = [ineq2eq, int2bin, penalize] min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver, converters=converters) result = min_eigen_optimizer.solve(op) self.assertEqual(result.fval, 4) with self.assertRaises(TypeError): invalid = [qp2qubo, "invalid converter"] MinimumEigenOptimizer(min_eigen_solver, converters=invalid)
def test_converter_list(self): """Test converters list""" # Input. model = Model() x_0 = model.binary_var(name='x0') x_1 = model.binary_var(name='x1') model.maximize(-x_0+2*x_1) op = QuadraticProgram() op.from_docplex(model) # Get the optimum key and value. n_iter = 8 # a single converter. qp2qubo = QuadraticProgramToQubo() gmf = GroverOptimizer(4, num_iterations=n_iter, quantum_instance=self.sv_simulator, converters=qp2qubo) results = gmf.solve(op) self.validate_results(op, results) # a list of converters ineq2eq = InequalityToEquality() int2bin = IntegerToBinary() penalize = LinearEqualityToPenalty() converters = [ineq2eq, int2bin, penalize] gmf = GroverOptimizer(4, num_iterations=n_iter, quantum_instance=self.sv_simulator, converters=converters) results = gmf.solve(op) self.validate_results(op, results) # invalid converters with self.assertRaises(TypeError): invalid = [qp2qubo, "invalid converter"] GroverOptimizer(4, num_iterations=n_iter, quantum_instance=self.sv_simulator, converters=invalid)
def test_integer_to_binary(self): """ Test integer to binary """ op = QuadraticProgram() for i in range(0, 2): op.binary_var(name='x{}'.format(i)) op.integer_var(name='x2', lowerbound=0, upperbound=5) linear = {} for i, x in enumerate(op.variables): linear[x.name] = i + 1 op.maximize(0, linear, {}) conv = IntegerToBinary() op2 = conv.convert(op) self.assertEqual(op2.get_num_vars(), 5) self.assertListEqual([x.vartype for x in op2.variables], [Variable.Type.BINARY] * 5) self.assertListEqual([x.name for x in op2.variables], ['x0', 'x1', 'x2@0', 'x2@1', 'x2@2']) dct = op2.objective.linear.to_dict() self.assertEqual(dct[2], 3) self.assertEqual(dct[3], 6) self.assertEqual(dct[4], 6)
def test_empty_problem(self): """ Test empty problem """ op = QuadraticProgram() conv = InequalityToEquality() op = conv.convert(op) conv = IntegerToBinary() op = conv.convert(op) conv = LinearEqualityToPenalty() op = conv.convert(op) _, shift = op.to_ising() self.assertEqual(shift, 0.0)
def test_continuous_variable_decode(self): """Test decode func of IntegerToBinaryConverter for continuous variables""" mdl = Model("test_continuous_varable_decode") c = mdl.continuous_var(lb=0, ub=10.9, name="c") x = mdl.binary_var(name="x") mdl.maximize(c + x * x) op = from_docplex_mp(mdl) converter = IntegerToBinary() op = converter.convert(op) admm_params = ADMMParameters() qubo_optimizer = MinimumEigenOptimizer(NumPyMinimumEigensolver()) continuous_optimizer = CplexOptimizer() solver = ADMMOptimizer( qubo_optimizer=qubo_optimizer, continuous_optimizer=continuous_optimizer, params=admm_params, ) result = solver.solve(op) new_x = converter.interpret(result.x) self.assertEqual(new_x[0], 10.9)
def test_continuous_variable_decode(self): """ Test decode func of IntegerToBinaryConverter for continuous variables""" try: mdl = Model('test_continuous_varable_decode') c = mdl.continuous_var(lb=0, ub=10.9, name='c') x = mdl.binary_var(name='x') mdl.maximize(c + x * x) op = QuadraticProgram() op.from_docplex(mdl) converter = IntegerToBinary() op = converter.convert(op) admm_params = ADMMParameters() qubo_optimizer = MinimumEigenOptimizer(NumPyMinimumEigensolver()) continuous_optimizer = CplexOptimizer() solver = ADMMOptimizer( qubo_optimizer=qubo_optimizer, continuous_optimizer=continuous_optimizer, params=admm_params, ) result = solver.solve(op) new_x = converter.interpret(result.x) self.assertEqual(new_x[0], 10.9) except MissingOptionalLibraryError as ex: self.skipTest(str(ex))
def test_converter_list(self): """Test converter list""" op = QuadraticProgram() op.integer_var(0, 3, "x") op.binary_var("y") op.maximize(linear={"x": 1, "y": 2}) op.linear_constraint(linear={ "y": 1, "x": 1 }, sense="LE", rhs=3, name="xy_leq") # construct minimum eigen optimizer min_eigen_solver = NumPyMinimumEigensolver() min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver) # a single converter qp2qubo = QuadraticProgramToQubo() recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer( min_eigen_optimizer, min_num_vars=2, converters=qp2qubo) result = recursive_min_eigen_optimizer.solve(op) self.assertEqual(result.fval, 4) # a list of converters ineq2eq = InequalityToEquality() int2bin = IntegerToBinary() penalize = LinearEqualityToPenalty() converters = [ineq2eq, int2bin, penalize] recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer( min_eigen_optimizer, min_num_vars=2, converters=converters) result = recursive_min_eigen_optimizer.solve(op) self.assertEqual(result.fval, 4) # invalid converters with self.assertRaises(TypeError): invalid = [qp2qubo, "invalid converter"] RecursiveMinimumEigenOptimizer(min_eigen_optimizer, min_num_vars=2, converters=invalid)
def test_integer_to_binary_quadratic(self): """Test integer to binary variables with quadratic expressions""" mod = QuadraticProgram() mod.integer_var(name="x", lowerbound=10, upperbound=13) mod.minimize(quadratic={("x", "x"): 1}) mod2 = IntegerToBinary().convert(mod) self.assertListEqual([e.name for e in mod2.variables], ["x@0", "x@1"]) self.assertEqual(mod.get_num_linear_constraints(), 0) self.assertEqual(mod.get_num_quadratic_constraints(), 0) self.assertAlmostEqual(mod2.objective.constant, 100) self.assertDictEqual(mod2.objective.linear.to_dict(use_name=True), { "x@0": 20, "x@1": 40 }) self.assertDictEqual( mod2.objective.quadratic.to_dict(use_name=True), { ("x@0", "x@0"): 1, ("x@1", "x@1"): 4, ("x@0", "x@1"): 4 }, )
def test_integer_to_binary_zero_range_variable(self): """Test integer to binary variables with zero range variables""" with self.subTest( "zero range variable in a linear expression of the objective"): mod = QuadraticProgram() mod.integer_var(name="x", lowerbound=10, upperbound=10) mod.minimize(linear={"x": 1}) mod2 = IntegerToBinary().convert(mod) self.assertListEqual([e.name for e in mod2.variables], ["x@0"]) self.assertEqual(mod.get_num_linear_constraints(), 0) self.assertEqual(mod.get_num_quadratic_constraints(), 0) self.assertAlmostEqual(mod2.objective.constant, 10) self.assertDictEqual(mod2.objective.linear.to_dict(), {}) self.assertDictEqual(mod2.objective.quadratic.to_dict(), {}) with self.subTest( "zero range variable in a quadratic expression of the objective" ): mod = QuadraticProgram() mod.integer_var(name="x", lowerbound=10, upperbound=10) mod.minimize(quadratic={("x", "x"): 1}) mod2 = IntegerToBinary().convert(mod) self.assertListEqual([e.name for e in mod2.variables], ["x@0"]) self.assertEqual(mod.get_num_linear_constraints(), 0) self.assertEqual(mod.get_num_quadratic_constraints(), 0) self.assertAlmostEqual(mod2.objective.constant, 100) self.assertDictEqual(mod2.objective.linear.to_dict(), {}) self.assertDictEqual(mod2.objective.quadratic.to_dict(), {}) with self.subTest("zero range variable in a linear constraint"): mod = QuadraticProgram() mod.integer_var(name="x", lowerbound=10, upperbound=10) mod.binary_var(name="y") mod.linear_constraint({"x": 1, "y": 1}, "<=", 100) mod2 = IntegerToBinary().convert(mod) self.assertListEqual([e.name for e in mod2.variables], ["x@0", "y"]) self.assertEqual(mod.get_num_linear_constraints(), 1) self.assertEqual(mod.get_num_quadratic_constraints(), 0) self.assertAlmostEqual(mod2.objective.constant, 0) self.assertDictEqual(mod2.objective.linear.to_dict(), {}) self.assertDictEqual(mod2.objective.quadratic.to_dict(), {}) cst = mod2.get_linear_constraint(0) self.assertDictEqual(cst.linear.to_dict(use_name=True), {"y": 1}) self.assertEqual(cst.sense, Constraint.Sense.LE) self.assertAlmostEqual(cst.rhs, 90) self.assertEqual(cst.name, "c0") with self.subTest("zero range variable in a quadratic constraint"): mod = QuadraticProgram() mod.integer_var(name="x", lowerbound=10, upperbound=10) mod.binary_var(name="y") mod.quadratic_constraint({"x": 1}, { ("x", "x"): 2, ("x", "y"): 3 }, ">=", 100) mod2 = IntegerToBinary().convert(mod) self.assertListEqual([e.name for e in mod2.variables], ["x@0", "y"]) self.assertEqual(mod.get_num_linear_constraints(), 0) self.assertEqual(mod.get_num_quadratic_constraints(), 1) self.assertAlmostEqual(mod2.objective.constant, 0) self.assertDictEqual(mod2.objective.linear.to_dict(), {}) self.assertDictEqual(mod2.objective.quadratic.to_dict(), {}) cst = mod2.get_quadratic_constraint(0) self.assertDictEqual(cst.linear.to_dict(use_name=True), {"y": 30}) self.assertEqual(cst.sense, Constraint.Sense.GE) self.assertAlmostEqual(cst.rhs, -110) self.assertEqual(cst.name, "q0")