コード例 #1
0
 def test_auto_penalty(self):
     """ Test auto penalty function"""
     op = QuadraticProgram()
     op.binary_var('x')
     op.binary_var('y')
     op.binary_var('z')
     op.minimize(constant=3, linear={'x': 1}, quadratic={('x', 'y'): 2})
     op.linear_constraint(linear={
         'x': 1,
         'y': 1,
         'z': 1
     },
                          sense='EQ',
                          rhs=2,
                          name='xyz_eq')
     lineq2penalty = LinearEqualityToPenalty(penalty=1e5)
     lineq2penalty_auto = LinearEqualityToPenalty()
     qubo = lineq2penalty.convert(op)
     qubo_auto = lineq2penalty_auto.convert(op)
     exact_mes = NumPyMinimumEigensolver()
     exact = MinimumEigenOptimizer(exact_mes)
     result = exact.solve(qubo)
     result_auto = exact.solve(qubo_auto)
     self.assertEqual(result.fval, result_auto.fval)
     np.testing.assert_array_almost_equal(result.x, result_auto.x)
コード例 #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)

        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])
コード例 #3
0
 def test_penalize_sense(self):
     """ Test PenalizeLinearEqualityConstraints with senses """
     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.LE, 2, 'x1x2')
     linear_constraint = {'x0': 1, 'x2': 3}
     op.linear_constraint(linear_constraint, Constraint.Sense.GE, 2, 'x0x2')
     self.assertEqual(op.get_num_linear_constraints(), 3)
     conv = LinearEqualityToPenalty()
     with self.assertRaises(QiskitOptimizationError):
         conv.convert(op)
コード例 #4
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
        })
コード例 #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)

        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
        })
コード例 #6
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})
コード例 #7
0
 def test_optimizationproblem_to_ising(self):
     """ Test optimization problem to operators"""
     op = QuadraticProgram()
     for i in range(4):
         op.binary_var(name='x{}'.format(i))
     linear = {}
     for x in op.variables:
         linear[x.name] = 1
     op.maximize(0, linear, {})
     linear = {}
     for i, x in enumerate(op.variables):
         linear[x.name] = i + 1
     op.linear_constraint(linear, Constraint.Sense.EQ, 3, 'sum1')
     penalize = LinearEqualityToPenalty(penalty=1e5)
     op2 = penalize.convert(op)
     qubitop, offset = op2.to_ising()
     self.assertEqual(qubitop, QUBIT_OP_MAXIMIZE_SAMPLE)
     self.assertEqual(offset, OFFSET_MAXIMIZE_SAMPLE)
コード例 #8
0
 def test_auto_penalty_warning(self):
     """ Test warnings of auto penalty function"""
     op = QuadraticProgram()
     op.binary_var('x')
     op.binary_var('y')
     op.binary_var('z')
     op.minimize(linear={'x': 1, 'y': 2})
     op.linear_constraint(linear={'x': 0.5, 'y': 0.5, 'z': 0.5}, sense='EQ', rhs=1, name='xyz')
     with self.assertLogs('qiskit.optimization', level='WARNING') as log:
         lineq2penalty = LinearEqualityToPenalty()
         _ = lineq2penalty.convert(op)
     warning = (
         'WARNING:qiskit.optimization.converters.linear_equality_to_penalty:'
         + 'Warning: Using 100000.000000 for the penalty coefficient because a float '
         + 'coefficient exists in constraints. \nThe value could be too small. If so, '
         + 'set the penalty coefficient manually.'
     )
     self.assertIn(warning, log.output)
コード例 #9
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))
コード例 #10
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])
コード例 #11
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 = {}
     linear_constraint['x0'] = 1
     linear_constraint['x1'] = 1
     op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 1, 'x0x1')
     linear_constraint = {}
     linear_constraint['x1'] = 1
     linear_constraint['x2'] = -1
     op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 2, 'x1x2')
     linear_constraint = {}
     linear_constraint['x0'] = 1
     linear_constraint['x2'] = 3
     op.linear_constraint(linear_constraint, Constraint.Sense.EQ, 2, 'x0x2')
     self.assertEqual(len(op.linear_constraints), 3)
     conv = LinearEqualityToPenalty()
     op2 = conv.convert(op)
     self.assertEqual(len(op2.linear_constraints), 0)