Esempio n. 1
0
    def test_linear_equality_to_penalty_decode(self):
        """ Test decode func of LinearEqualityToPenalty"""
        qprog = QuadraticProgram()
        qprog.binary_var('x')
        qprog.binary_var('y')
        qprog.binary_var('z')
        qprog.maximize(linear={'x': 3, 'y': 1, 'z': 1})
        qprog.linear_constraint(linear={
            'x': 1,
            'y': 1,
            'z': 1
        },
                                sense='EQ',
                                rhs=2,
                                name='xyz_eq')
        lineq2penalty = LinearEqualityToPenalty()
        qubo = lineq2penalty.convert(qprog)
        exact_mes = NumPyMinimumEigensolver()
        exact = MinimumEigenOptimizer(exact_mes)
        result = exact.solve(qubo)

        new_x = lineq2penalty.interpret(result.x)
        np.testing.assert_array_almost_equal(new_x, [1, 1, 0])
        infeasible_x = lineq2penalty.interpret([1, 1, 1])
        np.testing.assert_array_almost_equal(infeasible_x, [1, 1, 1])
Esempio n. 2
0
    def test_linear_equality_to_penalty_decode(self):
        """ Test decode func of LinearEqualityToPenalty"""
        qprog = QuadraticProgram()
        qprog.binary_var('x')
        qprog.binary_var('y')
        qprog.binary_var('z')
        qprog.maximize(linear={'x': 3, 'y': 1, 'z': 1})
        qprog.linear_constraint(linear={'x': 1, 'y': 1, 'z': 1}, sense='EQ', rhs=2, name='xyz_eq')
        lineq2penalty = LinearEqualityToPenalty()
        qubo = lineq2penalty.convert(qprog)
        exact_mes = NumPyMinimumEigensolver()
        exact = MinimumEigenOptimizer(exact_mes)
        result = exact.solve(qubo)

        decoded_result = lineq2penalty.interpret(result)
        self.assertEqual(decoded_result.fval, 4)
        np.testing.assert_array_almost_equal(decoded_result.x, [1, 1, 0])
        self.assertEqual(decoded_result.status, OptimizationResultStatus.SUCCESS)
        self.assertListEqual(decoded_result.variable_names, ['x', 'y', 'z'])
        self.assertDictEqual(decoded_result.variables_dict, {'x': 1.0, 'y': 1.0, 'z': 0.0})

        infeasible_result = OptimizationResult(x=[1, 1, 1], fval=0, variables=qprog.variables,
                                               status=OptimizationResultStatus.SUCCESS)
        decoded_infeasible_result = lineq2penalty.interpret(infeasible_result)
        self.assertEqual(decoded_infeasible_result.fval, 5)
        np.testing.assert_array_almost_equal(decoded_infeasible_result.x, [1, 1, 1])
        self.assertEqual(decoded_infeasible_result.status, OptimizationResultStatus.INFEASIBLE)
        self.assertListEqual(infeasible_result.variable_names, ['x', 'y', 'z'])
        self.assertDictEqual(infeasible_result.variables_dict, {'x': 1.0, 'y': 1.0, 'z': 1.0})
    def test_penalize_integer(self):
        """ Test PenalizeLinearEqualityConstraints with integer variables """
        op = QuadraticProgram()
        for i in range(3):
            op.integer_var(name='x{}'.format(i), lowerbound=-3, upperbound=3)
        # Linear constraints
        linear_constraint = {'x0': 1, 'x1': 1}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 1, 'x0x1')
        linear_constraint = {'x1': 1, 'x2': -1}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 2, 'x1x2')
        linear_constraint = {'x0': 1, 'x2': -1}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 1, 'x0x2')
        op.minimize(constant=3, linear={'x0': 1}, quadratic={('x1', 'x2'): 2})
        self.assertEqual(op.get_num_linear_constraints(), 3)
        conv = LinearEqualityToPenalty()
        op2 = conv.convert(op)
        self.assertEqual(op2.get_num_linear_constraints(), 0)

        result = OptimizationResult(x=[0, 1, -1],
                                    fval=1,
                                    variables=op2.variables)
        new_result = conv.interpret(result)
        self.assertAlmostEqual(new_result.fval, 1)
        self.assertEqual(new_result.status, OptimizationResultStatus.SUCCESS)
        np.testing.assert_array_almost_equal(new_result.x, [0, 1, -1])
        self.assertListEqual(result.variable_names, ['x0', 'x1', 'x2'])
        self.assertDictEqual(result.variables_dict, {
            'x0': 0,
            'x1': 1,
            'x2': -1
        })
    def test_penalize_binary(self):
        """ Test PenalizeLinearEqualityConstraints with binary variables """
        op = QuadraticProgram()
        for i in range(3):
            op.binary_var(name='x{}'.format(i))
        # Linear constraints
        linear_constraint = {'x0': 1, 'x1': 1}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 1, 'x0x1')
        linear_constraint = {'x1': 1, 'x2': -1}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 2, 'x1x2')
        linear_constraint = {'x0': 1, 'x2': 3}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 2, 'x0x2')
        self.assertEqual(op.get_num_linear_constraints(), 3)
        conv = LinearEqualityToPenalty()
        op2 = conv.convert(op)
        self.assertEqual(op2.get_num_linear_constraints(), 0)

        result = OptimizationResult(x=np.arange(3),
                                    fval=0,
                                    variables=op2.variables)
        new_result = conv.interpret(result)
        self.assertEqual(new_result.status,
                         OptimizationResultStatus.INFEASIBLE)
        np.testing.assert_array_almost_equal(new_result.x, np.arange(3))
        self.assertListEqual(result.variable_names, ['x0', 'x1', 'x2'])
        self.assertDictEqual(result.variables_dict, {
            'x0': 0,
            'x1': 1,
            'x2': 2
        })
Esempio n. 5
0
    def test_penalize_binary(self):
        """ Test PenalizeLinearEqualityConstraints with binary variables """
        op = QuadraticProgram()
        for i in range(3):
            op.binary_var(name='x{}'.format(i))
        # Linear constraints
        linear_constraint = {'x0': 1, 'x1': 1}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 1, 'x0x1')
        linear_constraint = {'x1': 1, 'x2': -1}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 2, 'x1x2')
        linear_constraint = {'x0': 1, 'x2': 3}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 2, 'x0x2')
        self.assertEqual(op.get_num_linear_constraints(), 3)
        conv = LinearEqualityToPenalty()
        op2 = conv.convert(op)
        self.assertEqual(op2.get_num_linear_constraints(), 0)

        new_x = conv.interpret(np.arange(3))
        np.testing.assert_array_almost_equal(new_x, np.arange(3))
Esempio n. 6
0
    def test_penalize_integer(self):
        """ Test PenalizeLinearEqualityConstraints with integer variables """
        op = QuadraticProgram()
        for i in range(3):
            op.integer_var(name='x{}'.format(i), lowerbound=-3, upperbound=3)
        # Linear constraints
        linear_constraint = {'x0': 1, 'x1': 1}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 1, 'x0x1')
        linear_constraint = {'x1': 1, 'x2': -1}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 2, 'x1x2')
        linear_constraint = {'x0': 1, 'x2': -1}
        op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 1, 'x0x2')
        op.minimize(constant=3, linear={'x0': 1}, quadratic={('x1', 'x2'): 2})
        self.assertEqual(op.get_num_linear_constraints(), 3)
        conv = LinearEqualityToPenalty()
        op2 = conv.convert(op)
        self.assertEqual(op2.get_num_linear_constraints(), 0)

        new_x = conv.interpret([0, 1, -1])
        np.testing.assert_array_almost_equal(new_x, [0, 1, -1])