Skip to content

Commit 2736b59

Browse files
committed
update other tests
1 parent 7795bbc commit 2736b59

File tree

7 files changed

+375
-40
lines changed

7 files changed

+375
-40
lines changed

qiskit_optimization/deprecation.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# This code is part of Qiskit.
22
#
3-
# (C) Copyright IBM 2021.
3+
# (C) Copyright IBM 2021, 2022.
44
#
55
# This code is licensed under the Apache License, Version 2.0. You may
66
# obtain a copy of this license in the LICENSE.txt file in the root directory
@@ -421,3 +421,12 @@ def deprecate_function(
421421
return _deprecate_object(
422422
version, DeprecatedType.FUNCTION, new_type, new_name, additional_msg, stack_level
423423
)
424+
425+
426+
def clear_deprecated_objects() -> None:
427+
"""Clear deprecated object cache
428+
429+
Returns:
430+
None
431+
"""
432+
_DEPRECATED_OBJECTS.clear()

test/algorithms/legacy/test_min_eigen_optimizer.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
)
4444
from qiskit_optimization.problems import QuadraticProgram
4545
from qiskit_optimization.runtime import VQEProgram, QAOAProgram
46+
from qiskit_optimization.deprecation import clear_deprecated_objects
4647

4748

4849
@ddt
@@ -382,6 +383,15 @@ def test_runtime(self, subroutine):
382383
result = opt.solve(self.op_ordering)
383384
self.assertIsInstance(result, MinimumEigenOptimizationResult)
384385

386+
def test_deprecation(self):
387+
"""Test deprecation warning"""
388+
clear_deprecated_objects()
389+
optimizer = SPSA(maxiter=100)
390+
ry_ansatz = TwoLocal(5, "ry", "cz", reps=3, entanglement="full")
391+
vqe_mes = VQE(ry_ansatz, optimizer=optimizer, quantum_instance=QasmSimulatorPy())
392+
with self.assertWarns(DeprecationWarning):
393+
_ = MinimumEigenOptimizer(vqe_mes)
394+
385395

386396
if __name__ == "__main__":
387397
unittest.main()
Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
# This code is part of Qiskit.
2+
#
3+
# (C) Copyright IBM 2018, 2022.
4+
#
5+
# This code is licensed under the Apache License, Version 2.0. You may
6+
# obtain a copy of this license in the LICENSE.txt file in the root directory
7+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8+
#
9+
# Any modifications or derivative works of this code must retain this
10+
# copyright notice, and modified files need to carry a notice indicating
11+
# that they have been altered from the originals.
12+
13+
"""Test Recursive Min Eigen Optimizer with legacy MinimumEigensolver."""
14+
15+
import unittest
16+
from test import QiskitOptimizationTestCase
17+
18+
import numpy as np
19+
20+
from qiskit import BasicAer
21+
from qiskit.utils import algorithm_globals, QuantumInstance
22+
23+
from qiskit.algorithms import NumPyMinimumEigensolver, QAOA
24+
25+
import qiskit_optimization.optionals as _optionals
26+
from qiskit_optimization.algorithms import (
27+
MinimumEigenOptimizer,
28+
CplexOptimizer,
29+
RecursiveMinimumEigenOptimizer,
30+
WarmStartQAOAOptimizer,
31+
SlsqpOptimizer,
32+
)
33+
from qiskit_optimization.algorithms.recursive_minimum_eigen_optimizer import (
34+
IntermediateResult,
35+
)
36+
from qiskit_optimization.problems import QuadraticProgram
37+
from qiskit_optimization.converters import (
38+
IntegerToBinary,
39+
InequalityToEquality,
40+
LinearEqualityToPenalty,
41+
QuadraticProgramToQubo,
42+
)
43+
44+
45+
class TestRecursiveMinEigenOptimizer(QiskitOptimizationTestCase):
46+
"""Recursive Min Eigen Optimizer Tests."""
47+
48+
@unittest.skipIf(not _optionals.HAS_CPLEX, "CPLEX not available.")
49+
def test_recursive_min_eigen_optimizer(self):
50+
"""Test the recursive minimum eigen optimizer."""
51+
filename = "op_ip1.lp"
52+
# get minimum eigen solver
53+
min_eigen_solver = NumPyMinimumEigensolver()
54+
55+
# construct minimum eigen optimizer
56+
min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver)
57+
recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer(
58+
min_eigen_optimizer, min_num_vars=4
59+
)
60+
61+
# load optimization problem
62+
problem = QuadraticProgram()
63+
lp_file = self.get_resource_path(filename, "algorithms/resources")
64+
problem.read_from_lp_file(lp_file)
65+
66+
# solve problem with cplex
67+
cplex = CplexOptimizer()
68+
cplex_result = cplex.solve(problem)
69+
70+
# solve problem
71+
result = recursive_min_eigen_optimizer.solve(problem)
72+
73+
# analyze results
74+
np.testing.assert_array_almost_equal(cplex_result.x, result.x, 4)
75+
self.assertAlmostEqual(cplex_result.fval, result.fval)
76+
77+
@unittest.skipIf(not _optionals.HAS_CPLEX, "CPLEX not available.")
78+
def test_recursive_history(self):
79+
"""Tests different options for history."""
80+
filename = "op_ip1.lp"
81+
# load optimization problem
82+
problem = QuadraticProgram()
83+
lp_file = self.get_resource_path(filename, "algorithms/resources")
84+
problem.read_from_lp_file(lp_file)
85+
86+
# get minimum eigen solver
87+
min_eigen_solver = NumPyMinimumEigensolver()
88+
89+
# construct minimum eigen optimizer
90+
min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver)
91+
92+
# no history
93+
recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer(
94+
min_eigen_optimizer,
95+
min_num_vars=4,
96+
history=IntermediateResult.NO_ITERATIONS,
97+
)
98+
result = recursive_min_eigen_optimizer.solve(problem)
99+
self.assertIsNotNone(result.replacements)
100+
self.assertIsNotNone(result.history)
101+
self.assertIsNotNone(result.history[0])
102+
self.assertEqual(len(result.history[0]), 0)
103+
self.assertIsNone(result.history[1])
104+
105+
# only last iteration in the history
106+
recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer(
107+
min_eigen_optimizer,
108+
min_num_vars=4,
109+
history=IntermediateResult.LAST_ITERATION,
110+
)
111+
result = recursive_min_eigen_optimizer.solve(problem)
112+
self.assertIsNotNone(result.replacements)
113+
self.assertIsNotNone(result.history)
114+
self.assertIsNotNone(result.history[0])
115+
self.assertEqual(len(result.history[0]), 0)
116+
self.assertIsNotNone(result.history[1])
117+
118+
# full history
119+
recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer(
120+
min_eigen_optimizer,
121+
min_num_vars=4,
122+
history=IntermediateResult.ALL_ITERATIONS,
123+
)
124+
result = recursive_min_eigen_optimizer.solve(problem)
125+
self.assertIsNotNone(result.replacements)
126+
self.assertIsNotNone(result.history)
127+
self.assertIsNotNone(result.history[0])
128+
self.assertGreater(len(result.history[0]), 1)
129+
self.assertIsNotNone(result.history[1])
130+
131+
@unittest.skipIf(not _optionals.HAS_CPLEX, "CPLEX not available.")
132+
def test_recursive_warm_qaoa(self):
133+
"""Test the recursive optimizer with warm start qaoa."""
134+
seed = 1234
135+
algorithm_globals.random_seed = seed
136+
backend = BasicAer.get_backend("statevector_simulator")
137+
qaoa = QAOA(
138+
quantum_instance=QuantumInstance(
139+
backend=backend, seed_simulator=seed, seed_transpiler=seed
140+
),
141+
reps=1,
142+
)
143+
warm_qaoa = WarmStartQAOAOptimizer(
144+
pre_solver=SlsqpOptimizer(), relax_for_pre_solver=True, qaoa=qaoa
145+
)
146+
147+
recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer(warm_qaoa, min_num_vars=4)
148+
149+
# load optimization problem
150+
problem = QuadraticProgram()
151+
lp_file = self.get_resource_path("op_ip1.lp", "algorithms/resources")
152+
problem.read_from_lp_file(lp_file)
153+
154+
# solve problem with cplex
155+
cplex = CplexOptimizer(cplex_parameters={"threads": 1, "randomseed": 1})
156+
cplex_result = cplex.solve(problem)
157+
158+
# solve problem
159+
result = recursive_min_eigen_optimizer.solve(problem)
160+
161+
# analyze results
162+
np.testing.assert_array_almost_equal(cplex_result.x, result.x, 4)
163+
self.assertAlmostEqual(cplex_result.fval, result.fval)
164+
165+
def test_converter_list(self):
166+
"""Test converter list"""
167+
op = QuadraticProgram()
168+
op.integer_var(0, 3, "x")
169+
op.binary_var("y")
170+
171+
op.maximize(linear={"x": 1, "y": 2})
172+
op.linear_constraint(linear={"y": 1, "x": 1}, sense="LE", rhs=3, name="xy_leq")
173+
174+
# construct minimum eigen optimizer
175+
min_eigen_solver = NumPyMinimumEigensolver()
176+
min_eigen_optimizer = MinimumEigenOptimizer(min_eigen_solver)
177+
# a single converter
178+
qp2qubo = QuadraticProgramToQubo()
179+
recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer(
180+
min_eigen_optimizer, min_num_vars=2, converters=qp2qubo
181+
)
182+
result = recursive_min_eigen_optimizer.solve(op)
183+
self.assertEqual(result.fval, 4)
184+
# a list of converters
185+
ineq2eq = InequalityToEquality()
186+
int2bin = IntegerToBinary()
187+
penalize = LinearEqualityToPenalty()
188+
converters = [ineq2eq, int2bin, penalize]
189+
recursive_min_eigen_optimizer = RecursiveMinimumEigenOptimizer(
190+
min_eigen_optimizer, min_num_vars=2, converters=converters
191+
)
192+
result = recursive_min_eigen_optimizer.solve(op)
193+
self.assertEqual(result.fval, 4)
194+
# invalid converters
195+
with self.assertRaises(TypeError):
196+
invalid = [qp2qubo, "invalid converter"]
197+
RecursiveMinimumEigenOptimizer(min_eigen_optimizer, min_num_vars=2, converters=invalid)
198+
199+
200+
if __name__ == "__main__":
201+
unittest.main()
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
# This code is part of Qiskit.
2+
#
3+
# (C) Copyright IBM 2021, 2022.
4+
#
5+
# This code is licensed under the Apache License, Version 2.0. You may
6+
# obtain a copy of this license in the LICENSE.txt file in the root directory
7+
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8+
#
9+
# Any modifications or derivative works of this code must retain this
10+
# copyright notice, and modified files need to carry a notice indicating
11+
# that they have been altered from the originals.
12+
13+
""" Test warm start QAOA optimizer with legacy MinimumEigensolver. """
14+
15+
import unittest
16+
from test import QiskitOptimizationTestCase
17+
18+
import numpy as np
19+
20+
from docplex.mp.model import Model
21+
from qiskit import BasicAer
22+
from qiskit.algorithms import QAOA
23+
24+
import qiskit_optimization.optionals as _optionals
25+
from qiskit_optimization.algorithms import SlsqpOptimizer
26+
from qiskit_optimization.algorithms.goemans_williamson_optimizer import (
27+
GoemansWilliamsonOptimizer,
28+
)
29+
from qiskit_optimization.algorithms.warm_start_qaoa_optimizer import (
30+
MeanAggregator,
31+
WarmStartQAOAOptimizer,
32+
)
33+
from qiskit_optimization.applications.max_cut import Maxcut
34+
from qiskit_optimization.translators import from_docplex_mp
35+
36+
37+
class TestWarmStartQAOAOptimizer(QiskitOptimizationTestCase):
38+
"""Tests for the warm start QAOA optimizer."""
39+
40+
@unittest.skipIf(not _optionals.HAS_CVXPY, "CVXPY not available.")
41+
def test_max_cut(self):
42+
"""Basic test on the max cut problem."""
43+
graph = np.array(
44+
[
45+
[0.0, 1.0, 2.0, 0.0],
46+
[1.0, 0.0, 1.0, 0.0],
47+
[2.0, 1.0, 0.0, 1.0],
48+
[0.0, 0.0, 1.0, 0.0],
49+
]
50+
)
51+
52+
presolver = GoemansWilliamsonOptimizer(num_cuts=10)
53+
problem = Maxcut(graph).to_quadratic_program()
54+
55+
backend = BasicAer.get_backend("statevector_simulator")
56+
qaoa = QAOA(quantum_instance=backend, reps=1)
57+
aggregator = MeanAggregator()
58+
optimizer = WarmStartQAOAOptimizer(
59+
pre_solver=presolver,
60+
relax_for_pre_solver=False,
61+
qaoa=qaoa,
62+
epsilon=0.25,
63+
num_initial_solutions=10,
64+
aggregator=aggregator,
65+
)
66+
result_warm = optimizer.solve(problem)
67+
68+
self.assertIsNotNone(result_warm)
69+
self.assertIsNotNone(result_warm.x)
70+
np.testing.assert_almost_equal([0, 0, 1, 0], result_warm.x, 3)
71+
self.assertIsNotNone(result_warm.fval)
72+
np.testing.assert_almost_equal(4, result_warm.fval, 3)
73+
74+
def test_constrained_binary(self):
75+
"""Constrained binary optimization problem."""
76+
model = Model()
77+
v = model.binary_var(name="v")
78+
w = model.binary_var(name="w")
79+
# pylint:disable=invalid-name
80+
t = model.binary_var(name="t")
81+
82+
model.minimize(v + w + t)
83+
model.add_constraint(2 * v + 10 * w + t <= 3, "cons1")
84+
model.add_constraint(v + w + t >= 2, "cons2")
85+
86+
problem = from_docplex_mp(model)
87+
88+
backend = BasicAer.get_backend("statevector_simulator")
89+
qaoa = QAOA(quantum_instance=backend, reps=1)
90+
aggregator = MeanAggregator()
91+
optimizer = WarmStartQAOAOptimizer(
92+
pre_solver=SlsqpOptimizer(),
93+
relax_for_pre_solver=True,
94+
qaoa=qaoa,
95+
epsilon=0.25,
96+
aggregator=aggregator,
97+
)
98+
result_warm = optimizer.solve(problem)
99+
100+
self.assertIsNotNone(result_warm)
101+
self.assertIsNotNone(result_warm.x)
102+
np.testing.assert_almost_equal([1, 0, 1], result_warm.x, 3)
103+
self.assertIsNotNone(result_warm.fval)
104+
np.testing.assert_almost_equal(2, result_warm.fval, 3)
105+
106+
def test_simple_qubo(self):
107+
"""Test on a simple QUBO problem."""
108+
model = Model()
109+
# pylint:disable=invalid-name
110+
u = model.binary_var(name="u")
111+
v = model.binary_var(name="v")
112+
113+
model.minimize((u - v + 2) ** 2)
114+
problem = from_docplex_mp(model)
115+
116+
backend = BasicAer.get_backend("statevector_simulator")
117+
qaoa = QAOA(quantum_instance=backend, reps=1)
118+
optimizer = WarmStartQAOAOptimizer(
119+
pre_solver=SlsqpOptimizer(),
120+
relax_for_pre_solver=True,
121+
qaoa=qaoa,
122+
epsilon=0.25,
123+
)
124+
result_warm = optimizer.solve(problem)
125+
126+
self.assertIsNotNone(result_warm)
127+
self.assertIsNotNone(result_warm.x)
128+
np.testing.assert_almost_equal([0, 1], result_warm.x, 3)
129+
self.assertIsNotNone(result_warm.fval)
130+
np.testing.assert_almost_equal(1, result_warm.fval, 3)
131+
132+
133+
if __name__ == "__main__":
134+
unittest.main()

0 commit comments

Comments
 (0)