def test_setters(self): """test setters.""" quadratic_program = QuadraticProgram() for _ in range(5): quadratic_program.continuous_var() zeros = np.zeros(quadratic_program.get_num_vars()) linear = LinearExpression(quadratic_program, zeros) coefficients_list = list(range(5)) coefficients_array = np.array(coefficients_list) coefficients_dok = dok_matrix([coefficients_list]) coefficients_dict_int = {i: i for i in range(1, 5)} coefficients_dict_str = {f"x{i}": i for i in range(1, 5)} for coeffs in [ coefficients_list, coefficients_array, coefficients_dok, coefficients_dict_int, coefficients_dict_str, ]: linear.coefficients = coeffs self.assertEqual((linear.coefficients != coefficients_dok).nnz, 0) self.assertTrue((linear.to_array() == coefficients_list).all()) self.assertDictEqual(linear.to_dict(use_name=False), coefficients_dict_int) self.assertDictEqual(linear.to_dict(use_name=True), coefficients_dict_str)
def test_ising_to_quadraticprogram_quadratic(self): """Test optimization problem to operators with linear=False""" op = QUBIT_OP_MAXIMIZE_SAMPLE offset = OFFSET_MAXIMIZE_SAMPLE quadratic = QuadraticProgram() quadratic.from_ising(op, offset, linear=False) self.assertEqual(quadratic.get_num_vars(), 4) self.assertEqual(quadratic.get_num_linear_constraints(), 0) self.assertEqual(quadratic.get_num_quadratic_constraints(), 0) self.assertEqual(quadratic.objective.sense, quadratic.objective.Sense.MINIMIZE) self.assertAlmostEqual(quadratic.objective.constant, 900000) quadratic_matrix = np.zeros((4, 4)) quadratic_matrix[0, 0] = -500001 quadratic_matrix[0, 1] = 400000 quadratic_matrix[0, 2] = 600000 quadratic_matrix[0, 3] = 800000 quadratic_matrix[1, 1] = -800001 quadratic_matrix[1, 2] = 1200000 quadratic_matrix[1, 3] = 1600000 quadratic_matrix[2, 2] = -900001 quadratic_matrix[2, 3] = 2400000 quadratic_matrix[3, 3] = -800001 np.testing.assert_array_almost_equal( quadratic.objective.quadratic.coefficients.toarray(), quadratic_matrix)
def test_setters(self): """ test setters. """ quadratic_program = QuadraticProgram() for _ in range(5): quadratic_program.continuous_var() n = quadratic_program.get_num_vars() zeros = np.zeros((n, n)) quadratic = QuadraticExpression(quadratic_program, zeros) coefficients_list = [[0 for _ in range(5)] for _ in range(5)] for i, v in enumerate(coefficients_list): for j, _ in enumerate(v): coefficients_list[min(i, j)][max(i, j)] += i * j coefficients_array = np.array(coefficients_list) coefficients_dok = dok_matrix(coefficients_list) coefficients_dict_int = {(i, j): v for (i, j), v in coefficients_dok.items()} coefficients_dict_str = {('x{}'.format(i), 'x{}'.format(j)): v for (i, j), v in coefficients_dok.items()} for coeffs in [coefficients_list, coefficients_array, coefficients_dok, coefficients_dict_int, coefficients_dict_str]: quadratic.coefficients = coeffs self.assertEqual((quadratic.coefficients != coefficients_dok).nnz, 0) self.assertTrue((quadratic.to_array() == coefficients_list).all()) self.assertDictEqual(quadratic.to_dict(use_name=False), coefficients_dict_int) self.assertDictEqual(quadratic.to_dict(use_name=True), coefficients_dict_str)
def test_constructor(self): """test constructor""" quadratic_program = QuadraticProgram() self.assertEqual(quadratic_program.name, "") self.assertEqual(quadratic_program.status, QuadraticProgram.Status.VALID) self.assertEqual(quadratic_program.get_num_vars(), 0) self.assertEqual(quadratic_program.get_num_linear_constraints(), 0) self.assertEqual(quadratic_program.get_num_quadratic_constraints(), 0) self.assertEqual(quadratic_program.objective.constant, 0) self.assertDictEqual(quadratic_program.objective.linear.to_dict(), {}) self.assertDictEqual(quadratic_program.objective.quadratic.to_dict(), {})
def test_clear(self): """test clear""" q_p = QuadraticProgram("test") q_p.binary_var("x") q_p.binary_var("y") q_p.minimize(constant=1, linear={"x": 1, "y": 2}, quadratic={("x", "x"): 1}) q_p.linear_constraint({"x": 1}, "==", 1) q_p.quadratic_constraint({"x": 1}, {("y", "y"): 2}, "<=", 1) q_p.clear() self.assertEqual(q_p.name, "") self.assertEqual(q_p.status, QuadraticProgram.Status.VALID) self.assertEqual(q_p.get_num_vars(), 0) self.assertEqual(q_p.get_num_linear_constraints(), 0) self.assertEqual(q_p.get_num_quadratic_constraints(), 0) self.assertEqual(q_p.objective.constant, 0) self.assertDictEqual(q_p.objective.linear.to_dict(), {}) self.assertDictEqual(q_p.objective.quadratic.to_dict(), {})
def test_clear(self): """ test clear """ q_p = QuadraticProgram('test') q_p.binary_var('x') q_p.binary_var('y') q_p.minimize(constant=1, linear={ 'x': 1, 'y': 2 }, quadratic={('x', 'x'): 1}) q_p.linear_constraint({'x': 1}, '==', 1) q_p.quadratic_constraint({'x': 1}, {('y', 'y'): 2}, '<=', 1) q_p.clear() self.assertEqual(q_p.name, '') self.assertEqual(q_p.status, QuadraticProgram.Status.VALID) self.assertEqual(q_p.get_num_vars(), 0) self.assertEqual(q_p.get_num_linear_constraints(), 0) self.assertEqual(q_p.get_num_quadratic_constraints(), 0) self.assertEqual(q_p.objective.constant, 0) self.assertDictEqual(q_p.objective.linear.to_dict(), {}) self.assertDictEqual(q_p.objective.quadratic.to_dict(), {})
def test_read_from_lp_file(self): """test read lp file""" try: q_p = QuadraticProgram() with self.assertRaises(FileNotFoundError): q_p.read_from_lp_file('') with self.assertRaises(FileNotFoundError): q_p.read_from_lp_file('no_file.txt') lp_file = self.get_resource_path( path.join('resources', 'test_quadratic_program.lp')) q_p.read_from_lp_file(lp_file) self.assertEqual(q_p.name, 'my problem') self.assertEqual(q_p.get_num_vars(), 3) self.assertEqual(q_p.get_num_binary_vars(), 1) self.assertEqual(q_p.get_num_integer_vars(), 1) self.assertEqual(q_p.get_num_continuous_vars(), 1) self.assertEqual(q_p.get_num_linear_constraints(), 3) self.assertEqual(q_p.get_num_quadratic_constraints(), 3) self.assertEqual(q_p.variables[0].name, 'x') self.assertEqual(q_p.variables[0].vartype, Variable.Type.BINARY) self.assertEqual(q_p.variables[0].lowerbound, 0) self.assertEqual(q_p.variables[0].upperbound, 1) self.assertEqual(q_p.variables[1].name, 'y') self.assertEqual(q_p.variables[1].vartype, Variable.Type.INTEGER) self.assertEqual(q_p.variables[1].lowerbound, -1) self.assertEqual(q_p.variables[1].upperbound, 5) self.assertEqual(q_p.variables[2].name, 'z') self.assertEqual(q_p.variables[2].vartype, Variable.Type.CONTINUOUS) self.assertEqual(q_p.variables[2].lowerbound, -1) self.assertEqual(q_p.variables[2].upperbound, 5) self.assertEqual(q_p.objective.sense, QuadraticObjective.Sense.MINIMIZE) self.assertEqual(q_p.objective.constant, 1) self.assertDictEqual(q_p.objective.linear.to_dict(use_name=True), { 'x': 1, 'y': -1, 'z': 10 }) self.assertDictEqual( q_p.objective.quadratic.to_dict(use_name=True), { ('x', 'x'): 0.5, ('y', 'z'): -1 }) cst = q_p.linear_constraints self.assertEqual(cst[0].name, 'lin_eq') self.assertDictEqual(cst[0].linear.to_dict(use_name=True), { 'x': 1, 'y': 2 }) self.assertEqual(cst[0].sense, Constraint.Sense.EQ) self.assertEqual(cst[0].rhs, 1) self.assertEqual(cst[1].name, 'lin_leq') self.assertDictEqual(cst[1].linear.to_dict(use_name=True), { 'x': 1, 'y': 2 }) self.assertEqual(cst[1].sense, Constraint.Sense.LE) self.assertEqual(cst[1].rhs, 1) self.assertEqual(cst[2].name, 'lin_geq') self.assertDictEqual(cst[2].linear.to_dict(use_name=True), { 'x': 1, 'y': 2 }) self.assertEqual(cst[2].sense, Constraint.Sense.GE) self.assertEqual(cst[2].rhs, 1) cst = q_p.quadratic_constraints self.assertEqual(cst[0].name, 'quad_eq') self.assertDictEqual(cst[0].linear.to_dict(use_name=True), { 'x': 1, 'y': 1 }) self.assertDictEqual(cst[0].quadratic.to_dict(use_name=True), { ('x', 'x'): 1, ('y', 'z'): -1, ('z', 'z'): 2 }) self.assertEqual(cst[0].sense, Constraint.Sense.EQ) self.assertEqual(cst[0].rhs, 1) self.assertEqual(cst[1].name, 'quad_leq') self.assertDictEqual(cst[1].linear.to_dict(use_name=True), { 'x': 1, 'y': 1 }) self.assertDictEqual(cst[1].quadratic.to_dict(use_name=True), { ('x', 'x'): 1, ('y', 'z'): -1, ('z', 'z'): 2 }) self.assertEqual(cst[1].sense, Constraint.Sense.LE) self.assertEqual(cst[1].rhs, 1) self.assertEqual(cst[2].name, 'quad_geq') self.assertDictEqual(cst[2].linear.to_dict(use_name=True), { 'x': 1, 'y': 1 }) self.assertDictEqual(cst[2].quadratic.to_dict(use_name=True), { ('x', 'x'): 1, ('y', 'z'): -1, ('z', 'z'): 2 }) self.assertEqual(cst[2].sense, Constraint.Sense.GE) self.assertEqual(cst[2].rhs, 1) except MissingOptionalLibraryError as ex: self.skipTest(str(ex)) except RuntimeError as ex: self.fail(str(ex))
def test_variables_handling(self): """ test add variables """ quadratic_program = QuadraticProgram() self.assertEqual(quadratic_program.get_num_vars(), 0) self.assertEqual(quadratic_program.get_num_continuous_vars(), 0) self.assertEqual(quadratic_program.get_num_binary_vars(), 0) self.assertEqual(quadratic_program.get_num_integer_vars(), 0) x_0 = quadratic_program.continuous_var() self.assertEqual(x_0.name, 'x0') self.assertEqual(x_0.lowerbound, 0) self.assertEqual(x_0.upperbound, INFINITY) self.assertEqual(x_0.vartype, Variable.Type.CONTINUOUS) self.assertEqual(quadratic_program.get_num_vars(), 1) self.assertEqual(quadratic_program.get_num_continuous_vars(), 1) self.assertEqual(quadratic_program.get_num_binary_vars(), 0) self.assertEqual(quadratic_program.get_num_integer_vars(), 0) x_1 = quadratic_program.continuous_var(name='x1', lowerbound=5, upperbound=10) self.assertEqual(x_1.name, 'x1') self.assertEqual(x_1.lowerbound, 5) self.assertEqual(x_1.upperbound, 10) self.assertEqual(x_1.vartype, Variable.Type.CONTINUOUS) self.assertEqual(quadratic_program.get_num_vars(), 2) self.assertEqual(quadratic_program.get_num_continuous_vars(), 2) self.assertEqual(quadratic_program.get_num_binary_vars(), 0) self.assertEqual(quadratic_program.get_num_integer_vars(), 0) x_2 = quadratic_program.binary_var() self.assertEqual(x_2.name, 'x2') self.assertEqual(x_2.lowerbound, 0) self.assertEqual(x_2.upperbound, 1) self.assertEqual(x_2.vartype, Variable.Type.BINARY) self.assertEqual(quadratic_program.get_num_vars(), 3) self.assertEqual(quadratic_program.get_num_continuous_vars(), 2) self.assertEqual(quadratic_program.get_num_binary_vars(), 1) self.assertEqual(quadratic_program.get_num_integer_vars(), 0) x_3 = quadratic_program.binary_var(name='x3') self.assertEqual(x_3.name, 'x3') self.assertEqual(x_3.lowerbound, 0) self.assertEqual(x_3.upperbound, 1) self.assertEqual(x_3.vartype, Variable.Type.BINARY) self.assertEqual(quadratic_program.get_num_vars(), 4) self.assertEqual(quadratic_program.get_num_continuous_vars(), 2) self.assertEqual(quadratic_program.get_num_binary_vars(), 2) self.assertEqual(quadratic_program.get_num_integer_vars(), 0) x_4 = quadratic_program.integer_var() self.assertEqual(x_4.name, 'x4') self.assertEqual(x_4.lowerbound, 0) self.assertEqual(x_4.upperbound, INFINITY) self.assertEqual(x_4.vartype, Variable.Type.INTEGER) self.assertEqual(quadratic_program.get_num_vars(), 5) self.assertEqual(quadratic_program.get_num_continuous_vars(), 2) self.assertEqual(quadratic_program.get_num_binary_vars(), 2) self.assertEqual(quadratic_program.get_num_integer_vars(), 1) x_5 = quadratic_program.integer_var(name='x5', lowerbound=5, upperbound=10) self.assertEqual(x_5.name, 'x5') self.assertEqual(x_5.lowerbound, 5) self.assertEqual(x_5.upperbound, 10) self.assertEqual(x_5.vartype, Variable.Type.INTEGER) self.assertEqual(quadratic_program.get_num_vars(), 6) self.assertEqual(quadratic_program.get_num_continuous_vars(), 2) self.assertEqual(quadratic_program.get_num_binary_vars(), 2) self.assertEqual(quadratic_program.get_num_integer_vars(), 2) with self.assertRaises(QiskitOptimizationError): quadratic_program.continuous_var(name='x0') with self.assertRaises(QiskitOptimizationError): quadratic_program.binary_var(name='x0') with self.assertRaises(QiskitOptimizationError): quadratic_program.integer_var(name='x0') variables = [x_0, x_1, x_2, x_3, x_4, x_5] for i, x in enumerate(variables): y = quadratic_program.get_variable(i) z = quadratic_program.get_variable(x.name) self.assertEqual(x.name, y.name) self.assertEqual(x.name, z.name) self.assertDictEqual(quadratic_program.variables_index, {'x' + str(i): i for i in range(6)})
def test_read_from_lp_file(self): """test read lp file""" try: q_p = QuadraticProgram() with self.assertRaises(FileNotFoundError): q_p.read_from_lp_file("") with self.assertRaises(FileNotFoundError): q_p.read_from_lp_file("no_file.txt") lp_file = self.get_resource_path("test_quadratic_program.lp", "problems/resources") q_p.read_from_lp_file(lp_file) self.assertEqual(q_p.name, "my problem") self.assertEqual(q_p.get_num_vars(), 3) self.assertEqual(q_p.get_num_binary_vars(), 1) self.assertEqual(q_p.get_num_integer_vars(), 1) self.assertEqual(q_p.get_num_continuous_vars(), 1) self.assertEqual(q_p.get_num_linear_constraints(), 3) self.assertEqual(q_p.get_num_quadratic_constraints(), 3) self.assertEqual(q_p.variables[0].name, "x") self.assertEqual(q_p.variables[0].vartype, Variable.Type.BINARY) self.assertEqual(q_p.variables[0].lowerbound, 0) self.assertEqual(q_p.variables[0].upperbound, 1) self.assertEqual(q_p.variables[1].name, "y") self.assertEqual(q_p.variables[1].vartype, Variable.Type.INTEGER) self.assertEqual(q_p.variables[1].lowerbound, -1) self.assertEqual(q_p.variables[1].upperbound, 5) self.assertEqual(q_p.variables[2].name, "z") self.assertEqual(q_p.variables[2].vartype, Variable.Type.CONTINUOUS) self.assertEqual(q_p.variables[2].lowerbound, -1) self.assertEqual(q_p.variables[2].upperbound, 5) self.assertEqual(q_p.objective.sense, QuadraticObjective.Sense.MINIMIZE) self.assertEqual(q_p.objective.constant, 1) self.assertDictEqual(q_p.objective.linear.to_dict(use_name=True), { "x": 1, "y": -1, "z": 10 }) self.assertDictEqual( q_p.objective.quadratic.to_dict(use_name=True), { ("x", "x"): 0.5, ("y", "z"): -1 }, ) cst = q_p.linear_constraints self.assertEqual(cst[0].name, "lin_eq") self.assertDictEqual(cst[0].linear.to_dict(use_name=True), { "x": 1, "y": 2 }) self.assertEqual(cst[0].sense, Constraint.Sense.EQ) self.assertEqual(cst[0].rhs, 1) self.assertEqual(cst[1].name, "lin_leq") self.assertDictEqual(cst[1].linear.to_dict(use_name=True), { "x": 1, "y": 2 }) self.assertEqual(cst[1].sense, Constraint.Sense.LE) self.assertEqual(cst[1].rhs, 1) self.assertEqual(cst[2].name, "lin_geq") self.assertDictEqual(cst[2].linear.to_dict(use_name=True), { "x": 1, "y": 2 }) self.assertEqual(cst[2].sense, Constraint.Sense.GE) self.assertEqual(cst[2].rhs, 1) cst = q_p.quadratic_constraints self.assertEqual(cst[0].name, "quad_eq") self.assertDictEqual(cst[0].linear.to_dict(use_name=True), { "x": 1, "y": 1 }) self.assertDictEqual( cst[0].quadratic.to_dict(use_name=True), { ("x", "x"): 1, ("y", "z"): -1, ("z", "z"): 2 }, ) self.assertEqual(cst[0].sense, Constraint.Sense.EQ) self.assertEqual(cst[0].rhs, 1) self.assertEqual(cst[1].name, "quad_leq") self.assertDictEqual(cst[1].linear.to_dict(use_name=True), { "x": 1, "y": 1 }) self.assertDictEqual( cst[1].quadratic.to_dict(use_name=True), { ("x", "x"): 1, ("y", "z"): -1, ("z", "z"): 2 }, ) self.assertEqual(cst[1].sense, Constraint.Sense.LE) self.assertEqual(cst[1].rhs, 1) self.assertEqual(cst[2].name, "quad_geq") self.assertDictEqual(cst[2].linear.to_dict(use_name=True), { "x": 1, "y": 1 }) self.assertDictEqual( cst[2].quadratic.to_dict(use_name=True), { ("x", "x"): 1, ("y", "z"): -1, ("z", "z"): 2 }, ) self.assertEqual(cst[2].sense, Constraint.Sense.GE) self.assertEqual(cst[2].rhs, 1) except RuntimeError as ex: self.fail(str(ex))