Skip to content

Commit d41dc23

Browse files
committed
Update plot to seaborn, add QAOA example
1 parent e83c866 commit d41dc23

13 files changed

+121
-22
lines changed

benchmarks/benchmark.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,13 @@ def run_benchmark(self, library_circuit, target_parameters='all', filename=None)
7373
args = self.nreps * [(ansatz, operator, state_in, free_parameters,
7474
parameter_binds)]
7575

76-
# all_results = []
77-
# for i, arg in enumerate(args):
78-
# all_results.append(single_run(arg))
79-
with Pool(processes=NUM_PROCESSES) as pool:
80-
all_results = pool.map(single_run, args)
76+
if NUM_PROCESSES == 1:
77+
all_results = []
78+
for i, arg in enumerate(args):
79+
all_results.append(single_run(arg))
80+
else:
81+
with Pool(processes=NUM_PROCESSES) as pool:
82+
all_results = pool.map(single_run, args)
8183

8284
# extract the results
8385
grad_runtimes, itgrad_runtimes = [], []
@@ -129,11 +131,12 @@ def plot(self, filename=None, saveas=None, show=False, cutoffs=None):
129131
else:
130132
data = self.load_benchmark(filename)
131133

132-
colors = ['tab:blue', 'tab:orange']
134+
plt.style.use('seaborn')
135+
colors = ['tab:blue', 'tab:green']
133136
markers = ['o', '^']
134137
linestyles = ['--', ':']
135138
methods = ['grad', 'itgrad']
136-
labels = ['reference', 'reverse mode']
139+
labels = ['standard', 'reverse mode']
137140
if cutoffs is None:
138141
cutoffs = [0, 0]
139142

@@ -166,16 +169,16 @@ def plot(self, filename=None, saveas=None, show=False, cutoffs=None):
166169

167170
handles, labels = plt.gca().get_legend_handles_labels()
168171
order = [2, 3, 0, 1]
169-
plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order], loc='best',
170-
ncol=2)
172+
plt.legend([handles[idx] for idx in order], [labels[idx] for idx in order],
173+
loc='upper left', ncol=2)
171174
# plt.legend(loc='best', ncol=2)
172175
plt.xticks([50, 100, 500], [r'$0.5 \cdot 10^2$',
173176
r'$10^2$', r'$0.5 \cdot 10^3$'])
174177
if saveas is None:
175178
saveas = f'ep_r{self.num_reps[0]}_{self.num_reps[-1]}.pdf'
176179

177-
plt.grid()
178180
plt.savefig('img/' + saveas, bbox_inches='tight')
181+
plt.ylim(top=1e4)
179182
if show:
180183
plt.show()
181184

benchmarks/featuremap.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,6 @@ def _build(self):
6161
def run_featuremap():
6262
circuit = Classification(4)
6363

64-
benchmark = Benchmark(2 ** np.arange(2, 5), H, 10)
64+
benchmark = Benchmark(2 ** np.arange(2, 8), H, 24)
6565
benchmark.run_benchmark(circuit, 'free')
6666
benchmark.plot(show=True)

benchmarks/maxcut.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
"""Maxcut example."""
2+
3+
import numpy as np
4+
from qiskit.algorithms.minimum_eigen_solvers.qaoa.var_form import QAOAVarForm
5+
from qiskit.circuit import QuantumCircuit, ParameterVector
6+
from qiskit.circuit.parametertable import ParameterTable
7+
from qiskit.opflow import Z, I, H
8+
9+
from .benchmark import Benchmark
10+
11+
class QAOAAnsatz(QuantumCircuit):
12+
"""QAOA ansatz as a quantum circuit."""
13+
14+
def __init__(self, operator, reps=1):
15+
self._reps = reps
16+
self._operator = operator
17+
super().__init__(operator.num_qubits)
18+
self._build()
19+
20+
@property
21+
def reps(self):
22+
"""Get the number of repetitions of the circuit."""
23+
return self._reps
24+
25+
@reps.setter
26+
def reps(self, value):
27+
"""Set the number of repetitions. Rebuilds the circuit."""
28+
self._reps = value
29+
self._build() # rebuild
30+
31+
def assign_parameters(self, params, inplace=False):
32+
"""Assign parameters."""
33+
if isinstance(params, (list, np.ndarray)):
34+
params = dict(zip(self._params[:], params))
35+
36+
return super().assign_parameters(params, inplace=inplace)
37+
38+
@property
39+
def ordered_parameters(self):
40+
return self._params[:]
41+
42+
def _build(self):
43+
# wipe current state
44+
self._data = []
45+
self._parameter_table = ParameterTable()
46+
47+
# get QAOA circuit
48+
qaoa = QAOAVarForm(self._operator, self._reps)
49+
params = ParameterVector('th', qaoa.num_parameters)
50+
circuit = qaoa.construct_circuit(params)
51+
52+
# store the parameters in a list for assigning them
53+
self._params = params
54+
55+
56+
# combine the circuit
57+
self.compose(circuit, inplace=True)
58+
59+
60+
def run_maxcut():
61+
operator = (I ^ I ^ Z ^ Z) + (I ^ Z ^ I ^ Z) + (Z ^ I ^ I ^ Z) + (I ^ Z ^ Z ^ I)
62+
circuit = QAOAAnsatz(operator)
63+
64+
benchmark = Benchmark(2 ** np.arange(2, 8), H, 24)
65+
benchmark.run_benchmark(circuit, 'free')
66+
benchmark.plot(show=True)
-1.6 KB
Binary file not shown.
-920 Bytes
Binary file not shown.

gradients/circuit_gradients.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,7 @@ def _accumulate_product_rule(self, gradients):
142142
# pylint: disable=inconsistent-return-statements
143143
def _bind(circuits, parameter_binds, inplace=False):
144144
if not isinstance(circuits, list):
145-
existing_parameter_binds = {
146-
p: parameter_binds[p] for p in circuits.parameters}
145+
existing_parameter_binds = {p: parameter_binds[p] for p in circuits.parameters}
147146
return circuits.assign_parameters(existing_parameter_binds, inplace=inplace)
148147

149148
bound = []

gradients/split_circuit.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from qiskit.circuit import QuantumCircuit, ParameterExpression
1+
from qiskit.circuit import QuantumCircuit, ParameterExpression, Parameter
22

33

44
def split(circuit, parameters='all',
@@ -24,10 +24,18 @@ def split(circuit, parameters='all',
2424
params = op[0].params
2525
elif parameters == 'free':
2626
params = [param for param in op[0].params if isinstance(param, ParameterExpression)]
27-
elif isinstance(parameters, ParameterExpression):
28-
params = [parameters] if parameters in op[0].params else []
27+
elif isinstance(parameters, Parameter):
28+
if op[0].definition is not None:
29+
free_op_params = op[0].definition.parameters
30+
else:
31+
free_op_params = {}
32+
params = [parameters] if parameters in free_op_params else []
2933
elif isinstance(parameters, list):
30-
params = [p for p in parameters if p in op[0].params]
34+
if op[0].definition is not None:
35+
free_op_params = op[0].definition.parameters
36+
else:
37+
free_op_params = {}
38+
params = [p for p in parameters if p in free_op_params]
3139
else:
3240
raise NotImplementedError('Unsupported type of parameters:', parameters)
3341

img/efficient_su2.pdf

19.3 KB
Binary file not shown.
-17.6 KB
Binary file not shown.
-16.7 KB
Binary file not shown.

0 commit comments

Comments
 (0)