예제 #1
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()
        op2ope = QuadraticProgramToIsing()
        op2 = penalize.encode(op)
        qubitop, offset = op2ope.encode(op2)

        # the encoder uses a dictionary, in which the order of items in Python 3.5 is not
        # maintained, therefore don't do a list compare but dictionary compare
        qubit_op_as_dict = dict(qubitop.paulis)
        for coeff, paulis in QUBIT_OP_MAXIMIZE_SAMPLE.paulis:
            self.assertEqual(paulis, qubit_op_as_dict[coeff])

        self.assertEqual(offset, OFFSET_MAXIMIZE_SAMPLE)
예제 #2
0
    def test_optimizationproblem_to_ising_deprecated(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)
        try:
            warnings.filterwarnings(action="ignore",
                                    category=DeprecationWarning)
            op2 = penalize.encode(op)
            conv = QuadraticProgramToIsing()
            qubitop, offset = conv.encode(op2)
        finally:
            warnings.filterwarnings(action="always",
                                    category=DeprecationWarning)

        self.assertEqual(qubitop, QUBIT_OP_MAXIMIZE_SAMPLE)
        self.assertEqual(offset, OFFSET_MAXIMIZE_SAMPLE)
예제 #3
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.encode(op)
     qubo_auto = lineq2penalty_auto.encode(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)
     self.assertListEqual(result.x, result_auto.x)
예제 #4
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 = {}
     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.LE, 2, 'x1x2')
     linear_constraint = {}
     linear_constraint['x0'] = 1
     linear_constraint['x2'] = 3
     op.linear_constraint(linear_constraint, Constraint.Sense.GE, 2, 'x0x2')
     self.assertEqual(len(op.linear_constraints), 3)
     conv = LinearEqualityToPenalty()
     with self.assertRaises(QiskitOptimizationError):
         conv.encode(op)
예제 #5
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.encode(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)
예제 #6
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()
     op2ope = QuadraticProgramToIsing()
     op2 = penalize.encode(op)
     qubitop, offset = op2ope.encode(op2)
     self.assertListEqual(qubitop.paulis, QUBIT_OP_MAXIMIZE_SAMPLE.paulis)
     self.assertEqual(offset, OFFSET_MAXIMIZE_SAMPLE)
예제 #7
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.encode(op)
     self.assertEqual(len(op2.linear_constraints), 0)
예제 #8
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.encode(qprog)
     exact_mes = NumPyMinimumEigensolver()
     exact = MinimumEigenOptimizer(exact_mes)
     result = exact.solve(qubo)
     decoded_result = lineq2penalty.decode(result)
     self.assertEqual(decoded_result.fval, 4)
     self.assertListEqual(decoded_result.x, [1, 1, 0])
     self.assertEqual(decoded_result.status, OptimizationResultStatus.SUCCESS)
     infeasible_result = OptimizationResult(x=[1, 1, 1])
     decoded_infeasible_result = lineq2penalty.decode(infeasible_result)
     self.assertEqual(decoded_infeasible_result.fval, 5)
     self.assertListEqual(decoded_infeasible_result.x, [1, 1, 1])
     self.assertEqual(decoded_infeasible_result.status, OptimizationResultStatus.INFEASIBLE)