qiskit-aer 0.17.2__cp314-cp314-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit_aer/VERSION.txt +1 -0
- qiskit_aer/__init__.py +89 -0
- qiskit_aer/aererror.py +30 -0
- qiskit_aer/aerprovider.py +119 -0
- qiskit_aer/backends/__init__.py +20 -0
- qiskit_aer/backends/aer_compiler.py +1085 -0
- qiskit_aer/backends/aer_simulator.py +1025 -0
- qiskit_aer/backends/aerbackend.py +679 -0
- qiskit_aer/backends/backend_utils.py +567 -0
- qiskit_aer/backends/backendconfiguration.py +395 -0
- qiskit_aer/backends/backendproperties.py +590 -0
- qiskit_aer/backends/compatibility.py +287 -0
- qiskit_aer/backends/controller_wrappers.cp314-win_amd64.pyd +0 -0
- qiskit_aer/backends/libopenblas.dll +0 -0
- qiskit_aer/backends/name_mapping.py +306 -0
- qiskit_aer/backends/qasm_simulator.py +925 -0
- qiskit_aer/backends/statevector_simulator.py +330 -0
- qiskit_aer/backends/unitary_simulator.py +316 -0
- qiskit_aer/jobs/__init__.py +35 -0
- qiskit_aer/jobs/aerjob.py +143 -0
- qiskit_aer/jobs/utils.py +66 -0
- qiskit_aer/library/__init__.py +204 -0
- qiskit_aer/library/control_flow_instructions/__init__.py +16 -0
- qiskit_aer/library/control_flow_instructions/jump.py +47 -0
- qiskit_aer/library/control_flow_instructions/mark.py +30 -0
- qiskit_aer/library/control_flow_instructions/store.py +29 -0
- qiskit_aer/library/default_qubits.py +44 -0
- qiskit_aer/library/instructions_table.csv +21 -0
- qiskit_aer/library/save_instructions/__init__.py +44 -0
- qiskit_aer/library/save_instructions/save_amplitudes.py +168 -0
- qiskit_aer/library/save_instructions/save_clifford.py +63 -0
- qiskit_aer/library/save_instructions/save_data.py +129 -0
- qiskit_aer/library/save_instructions/save_density_matrix.py +91 -0
- qiskit_aer/library/save_instructions/save_expectation_value.py +257 -0
- qiskit_aer/library/save_instructions/save_matrix_product_state.py +71 -0
- qiskit_aer/library/save_instructions/save_probabilities.py +156 -0
- qiskit_aer/library/save_instructions/save_stabilizer.py +70 -0
- qiskit_aer/library/save_instructions/save_state.py +79 -0
- qiskit_aer/library/save_instructions/save_statevector.py +120 -0
- qiskit_aer/library/save_instructions/save_superop.py +62 -0
- qiskit_aer/library/save_instructions/save_unitary.py +63 -0
- qiskit_aer/library/set_instructions/__init__.py +19 -0
- qiskit_aer/library/set_instructions/set_density_matrix.py +78 -0
- qiskit_aer/library/set_instructions/set_matrix_product_state.py +83 -0
- qiskit_aer/library/set_instructions/set_stabilizer.py +77 -0
- qiskit_aer/library/set_instructions/set_statevector.py +78 -0
- qiskit_aer/library/set_instructions/set_superop.py +78 -0
- qiskit_aer/library/set_instructions/set_unitary.py +78 -0
- qiskit_aer/noise/__init__.py +265 -0
- qiskit_aer/noise/device/__init__.py +25 -0
- qiskit_aer/noise/device/models.py +397 -0
- qiskit_aer/noise/device/parameters.py +202 -0
- qiskit_aer/noise/errors/__init__.py +30 -0
- qiskit_aer/noise/errors/base_quantum_error.py +119 -0
- qiskit_aer/noise/errors/pauli_error.py +283 -0
- qiskit_aer/noise/errors/pauli_lindblad_error.py +363 -0
- qiskit_aer/noise/errors/quantum_error.py +451 -0
- qiskit_aer/noise/errors/readout_error.py +355 -0
- qiskit_aer/noise/errors/standard_errors.py +498 -0
- qiskit_aer/noise/noise_model.py +1231 -0
- qiskit_aer/noise/noiseerror.py +30 -0
- qiskit_aer/noise/passes/__init__.py +18 -0
- qiskit_aer/noise/passes/local_noise_pass.py +160 -0
- qiskit_aer/noise/passes/relaxation_noise_pass.py +137 -0
- qiskit_aer/primitives/__init__.py +44 -0
- qiskit_aer/primitives/estimator.py +751 -0
- qiskit_aer/primitives/estimator_v2.py +159 -0
- qiskit_aer/primitives/sampler.py +361 -0
- qiskit_aer/primitives/sampler_v2.py +256 -0
- qiskit_aer/quantum_info/__init__.py +32 -0
- qiskit_aer/quantum_info/states/__init__.py +16 -0
- qiskit_aer/quantum_info/states/aer_densitymatrix.py +313 -0
- qiskit_aer/quantum_info/states/aer_state.py +525 -0
- qiskit_aer/quantum_info/states/aer_statevector.py +302 -0
- qiskit_aer/utils/__init__.py +44 -0
- qiskit_aer/utils/noise_model_inserter.py +66 -0
- qiskit_aer/utils/noise_transformation.py +431 -0
- qiskit_aer/version.py +86 -0
- qiskit_aer-0.17.2.dist-info/METADATA +209 -0
- qiskit_aer-0.17.2.dist-info/RECORD +83 -0
- qiskit_aer-0.17.2.dist-info/WHEEL +5 -0
- qiskit_aer-0.17.2.dist-info/licenses/LICENSE.txt +203 -0
- qiskit_aer-0.17.2.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,567 @@
|
|
|
1
|
+
# This code is part of Qiskit.
|
|
2
|
+
#
|
|
3
|
+
# (C) Copyright IBM 2018, 2019.
|
|
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
|
+
# pylint: disable=invalid-name
|
|
14
|
+
"""
|
|
15
|
+
Aer simulator backend utils
|
|
16
|
+
"""
|
|
17
|
+
import os
|
|
18
|
+
from math import log2
|
|
19
|
+
|
|
20
|
+
from types import SimpleNamespace
|
|
21
|
+
|
|
22
|
+
import psutil
|
|
23
|
+
from qiskit.circuit import QuantumCircuit
|
|
24
|
+
from qiskit.result import ProbDistribution
|
|
25
|
+
from qiskit.quantum_info import Clifford
|
|
26
|
+
|
|
27
|
+
from .compatibility import Statevector, DensityMatrix, StabilizerState, Operator, SuperOp
|
|
28
|
+
|
|
29
|
+
# pylint: disable=import-error, no-name-in-module, abstract-method
|
|
30
|
+
from .controller_wrappers import aer_initialize_libraries
|
|
31
|
+
|
|
32
|
+
# Available system memory
|
|
33
|
+
SYSTEM_MEMORY_GB = psutil.virtual_memory().total / (1024**3)
|
|
34
|
+
|
|
35
|
+
# Max number of qubits for complex double statevector
|
|
36
|
+
# given available system memory
|
|
37
|
+
MAX_QUBITS_STATEVECTOR = int(log2(SYSTEM_MEMORY_GB * (1024**3) / 16))
|
|
38
|
+
|
|
39
|
+
# Location where we put external libraries that will be
|
|
40
|
+
# loaded at runtime by the simulator extension
|
|
41
|
+
LIBRARY_DIR = os.path.dirname(__file__)
|
|
42
|
+
aer_initialize_libraries(LIBRARY_DIR)
|
|
43
|
+
|
|
44
|
+
LEGACY_METHOD_MAP = {
|
|
45
|
+
"statevector_cpu": ("statevector", "CPU"),
|
|
46
|
+
"statevector_gpu": ("statevector", "GPU"),
|
|
47
|
+
"statevector_thrust": ("statevector", "Thrust"),
|
|
48
|
+
"density_matrix_cpu": ("density_matrix", "CPU"),
|
|
49
|
+
"density_matrix_gpu": ("density_matrix", "GPU"),
|
|
50
|
+
"density_matrix_thrust": ("density_matrix", "Thrust"),
|
|
51
|
+
"unitary_cpu": ("unitary", "CPU"),
|
|
52
|
+
"unitary_gpu": ("unitary", "GPU"),
|
|
53
|
+
"unitary_thrust": ("unitary", "Thrust"),
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
BASIS_GATES = {
|
|
57
|
+
"statevector": sorted(
|
|
58
|
+
[
|
|
59
|
+
"u1",
|
|
60
|
+
"u2",
|
|
61
|
+
"u3",
|
|
62
|
+
"u",
|
|
63
|
+
"p",
|
|
64
|
+
"r",
|
|
65
|
+
"rx",
|
|
66
|
+
"ry",
|
|
67
|
+
"rz",
|
|
68
|
+
"id",
|
|
69
|
+
"x",
|
|
70
|
+
"y",
|
|
71
|
+
"z",
|
|
72
|
+
"h",
|
|
73
|
+
"s",
|
|
74
|
+
"sdg",
|
|
75
|
+
"sx",
|
|
76
|
+
"sxdg",
|
|
77
|
+
"t",
|
|
78
|
+
"tdg",
|
|
79
|
+
"swap",
|
|
80
|
+
"cx",
|
|
81
|
+
"cy",
|
|
82
|
+
"cz",
|
|
83
|
+
"csx",
|
|
84
|
+
"cp",
|
|
85
|
+
"cu",
|
|
86
|
+
"cu1",
|
|
87
|
+
"cu2",
|
|
88
|
+
"cu3",
|
|
89
|
+
"rxx",
|
|
90
|
+
"ryy",
|
|
91
|
+
"rzz",
|
|
92
|
+
"rzx",
|
|
93
|
+
"ccx",
|
|
94
|
+
"ccz",
|
|
95
|
+
"crx",
|
|
96
|
+
"cry",
|
|
97
|
+
"crz",
|
|
98
|
+
"cswap",
|
|
99
|
+
"mcx",
|
|
100
|
+
"mcy",
|
|
101
|
+
"mcz",
|
|
102
|
+
"mcsx",
|
|
103
|
+
"mcp",
|
|
104
|
+
"mcphase",
|
|
105
|
+
"mcu",
|
|
106
|
+
"mcu1",
|
|
107
|
+
"mcu2",
|
|
108
|
+
"mcu3",
|
|
109
|
+
"mcrx",
|
|
110
|
+
"mcry",
|
|
111
|
+
"mcrz",
|
|
112
|
+
"mcr",
|
|
113
|
+
"mcswap",
|
|
114
|
+
"unitary",
|
|
115
|
+
"diagonal",
|
|
116
|
+
"multiplexer",
|
|
117
|
+
"pauli",
|
|
118
|
+
"mcx_gray",
|
|
119
|
+
"ecr",
|
|
120
|
+
"store",
|
|
121
|
+
]
|
|
122
|
+
),
|
|
123
|
+
"density_matrix": sorted(
|
|
124
|
+
[
|
|
125
|
+
"u1",
|
|
126
|
+
"u2",
|
|
127
|
+
"u3",
|
|
128
|
+
"u",
|
|
129
|
+
"p",
|
|
130
|
+
"r",
|
|
131
|
+
"rx",
|
|
132
|
+
"ry",
|
|
133
|
+
"rz",
|
|
134
|
+
"id",
|
|
135
|
+
"x",
|
|
136
|
+
"y",
|
|
137
|
+
"z",
|
|
138
|
+
"h",
|
|
139
|
+
"s",
|
|
140
|
+
"sdg",
|
|
141
|
+
"sx",
|
|
142
|
+
"sxdg",
|
|
143
|
+
"t",
|
|
144
|
+
"tdg",
|
|
145
|
+
"swap",
|
|
146
|
+
"cx",
|
|
147
|
+
"cy",
|
|
148
|
+
"cz",
|
|
149
|
+
"cp",
|
|
150
|
+
"cu1",
|
|
151
|
+
"rxx",
|
|
152
|
+
"ryy",
|
|
153
|
+
"rzz",
|
|
154
|
+
"rzx",
|
|
155
|
+
"ccx",
|
|
156
|
+
"unitary",
|
|
157
|
+
"diagonal",
|
|
158
|
+
"pauli",
|
|
159
|
+
"ecr",
|
|
160
|
+
]
|
|
161
|
+
),
|
|
162
|
+
"matrix_product_state": sorted(
|
|
163
|
+
[
|
|
164
|
+
"u1",
|
|
165
|
+
"u2",
|
|
166
|
+
"u3",
|
|
167
|
+
"u",
|
|
168
|
+
"p",
|
|
169
|
+
"cp",
|
|
170
|
+
"cx",
|
|
171
|
+
"cy",
|
|
172
|
+
"cz",
|
|
173
|
+
"id",
|
|
174
|
+
"x",
|
|
175
|
+
"y",
|
|
176
|
+
"z",
|
|
177
|
+
"h",
|
|
178
|
+
"s",
|
|
179
|
+
"sdg",
|
|
180
|
+
"sx",
|
|
181
|
+
"sxdg",
|
|
182
|
+
"t",
|
|
183
|
+
"tdg",
|
|
184
|
+
"swap",
|
|
185
|
+
"ccx",
|
|
186
|
+
"unitary",
|
|
187
|
+
"roerror",
|
|
188
|
+
"pauli",
|
|
189
|
+
"r",
|
|
190
|
+
"rx",
|
|
191
|
+
"ry",
|
|
192
|
+
"rz",
|
|
193
|
+
"rxx",
|
|
194
|
+
"ryy",
|
|
195
|
+
"rzz",
|
|
196
|
+
"rzx",
|
|
197
|
+
"csx",
|
|
198
|
+
"cswap",
|
|
199
|
+
"diagonal",
|
|
200
|
+
"ecr",
|
|
201
|
+
"store",
|
|
202
|
+
]
|
|
203
|
+
),
|
|
204
|
+
"stabilizer": sorted(
|
|
205
|
+
[
|
|
206
|
+
"id",
|
|
207
|
+
"x",
|
|
208
|
+
"y",
|
|
209
|
+
"z",
|
|
210
|
+
"h",
|
|
211
|
+
"s",
|
|
212
|
+
"sdg",
|
|
213
|
+
"sx",
|
|
214
|
+
"sxdg",
|
|
215
|
+
"cx",
|
|
216
|
+
"cy",
|
|
217
|
+
"cz",
|
|
218
|
+
"swap",
|
|
219
|
+
"pauli",
|
|
220
|
+
"ecr",
|
|
221
|
+
"rz",
|
|
222
|
+
"store",
|
|
223
|
+
]
|
|
224
|
+
),
|
|
225
|
+
"extended_stabilizer": sorted(
|
|
226
|
+
[
|
|
227
|
+
"cx",
|
|
228
|
+
"cz",
|
|
229
|
+
"id",
|
|
230
|
+
"x",
|
|
231
|
+
"y",
|
|
232
|
+
"z",
|
|
233
|
+
"h",
|
|
234
|
+
"s",
|
|
235
|
+
"sdg",
|
|
236
|
+
"sx",
|
|
237
|
+
"sxdg",
|
|
238
|
+
"swap",
|
|
239
|
+
"u0",
|
|
240
|
+
"t",
|
|
241
|
+
"tdg",
|
|
242
|
+
"u1",
|
|
243
|
+
"p",
|
|
244
|
+
"ccx",
|
|
245
|
+
"ccz",
|
|
246
|
+
"pauli",
|
|
247
|
+
"ecr",
|
|
248
|
+
"rz",
|
|
249
|
+
"store",
|
|
250
|
+
]
|
|
251
|
+
),
|
|
252
|
+
"unitary": sorted(
|
|
253
|
+
[
|
|
254
|
+
"u1",
|
|
255
|
+
"u2",
|
|
256
|
+
"u3",
|
|
257
|
+
"u",
|
|
258
|
+
"p",
|
|
259
|
+
"r",
|
|
260
|
+
"rx",
|
|
261
|
+
"ry",
|
|
262
|
+
"rz",
|
|
263
|
+
"id",
|
|
264
|
+
"x",
|
|
265
|
+
"y",
|
|
266
|
+
"z",
|
|
267
|
+
"h",
|
|
268
|
+
"s",
|
|
269
|
+
"sdg",
|
|
270
|
+
"sx",
|
|
271
|
+
"sxdg",
|
|
272
|
+
"t",
|
|
273
|
+
"tdg",
|
|
274
|
+
"swap",
|
|
275
|
+
"cx",
|
|
276
|
+
"cy",
|
|
277
|
+
"cz",
|
|
278
|
+
"csx",
|
|
279
|
+
"cp",
|
|
280
|
+
"cu",
|
|
281
|
+
"cu1",
|
|
282
|
+
"cu2",
|
|
283
|
+
"cu3",
|
|
284
|
+
"rxx",
|
|
285
|
+
"ryy",
|
|
286
|
+
"rzz",
|
|
287
|
+
"rzx",
|
|
288
|
+
"ccx",
|
|
289
|
+
"ccz",
|
|
290
|
+
"cswap",
|
|
291
|
+
"crx",
|
|
292
|
+
"cry",
|
|
293
|
+
"crz",
|
|
294
|
+
"mcx",
|
|
295
|
+
"mcy",
|
|
296
|
+
"mcz",
|
|
297
|
+
"mcsx",
|
|
298
|
+
"mcp",
|
|
299
|
+
"mcphase",
|
|
300
|
+
"mcu",
|
|
301
|
+
"mcu1",
|
|
302
|
+
"mcu2",
|
|
303
|
+
"mcu3",
|
|
304
|
+
"mcrx",
|
|
305
|
+
"mcry",
|
|
306
|
+
"mcrz",
|
|
307
|
+
"mcr",
|
|
308
|
+
"mcswap",
|
|
309
|
+
"unitary",
|
|
310
|
+
"diagonal",
|
|
311
|
+
"multiplexer",
|
|
312
|
+
"pauli",
|
|
313
|
+
"ecr",
|
|
314
|
+
"store",
|
|
315
|
+
]
|
|
316
|
+
),
|
|
317
|
+
"superop": sorted(
|
|
318
|
+
[
|
|
319
|
+
"u1",
|
|
320
|
+
"u2",
|
|
321
|
+
"u3",
|
|
322
|
+
"u",
|
|
323
|
+
"p",
|
|
324
|
+
"r",
|
|
325
|
+
"rx",
|
|
326
|
+
"ry",
|
|
327
|
+
"rz",
|
|
328
|
+
"id",
|
|
329
|
+
"x",
|
|
330
|
+
"y",
|
|
331
|
+
"z",
|
|
332
|
+
"h",
|
|
333
|
+
"s",
|
|
334
|
+
"sdg",
|
|
335
|
+
"sx",
|
|
336
|
+
"sxdg",
|
|
337
|
+
"t",
|
|
338
|
+
"tdg",
|
|
339
|
+
"swap",
|
|
340
|
+
"cx",
|
|
341
|
+
"cy",
|
|
342
|
+
"cz",
|
|
343
|
+
"cp",
|
|
344
|
+
"cu1",
|
|
345
|
+
"rxx",
|
|
346
|
+
"ryy",
|
|
347
|
+
"rzz",
|
|
348
|
+
"rzx",
|
|
349
|
+
"ccx",
|
|
350
|
+
"unitary",
|
|
351
|
+
"diagonal",
|
|
352
|
+
"pauli",
|
|
353
|
+
"store",
|
|
354
|
+
]
|
|
355
|
+
),
|
|
356
|
+
"tensor_network": sorted(
|
|
357
|
+
[
|
|
358
|
+
"u1",
|
|
359
|
+
"u2",
|
|
360
|
+
"u3",
|
|
361
|
+
"u",
|
|
362
|
+
"p",
|
|
363
|
+
"r",
|
|
364
|
+
"rx",
|
|
365
|
+
"ry",
|
|
366
|
+
"rz",
|
|
367
|
+
"id",
|
|
368
|
+
"x",
|
|
369
|
+
"y",
|
|
370
|
+
"z",
|
|
371
|
+
"h",
|
|
372
|
+
"s",
|
|
373
|
+
"sdg",
|
|
374
|
+
"sx",
|
|
375
|
+
"sxdg",
|
|
376
|
+
"t",
|
|
377
|
+
"tdg",
|
|
378
|
+
"swap",
|
|
379
|
+
"cx",
|
|
380
|
+
"cy",
|
|
381
|
+
"cz",
|
|
382
|
+
"csx",
|
|
383
|
+
"cp",
|
|
384
|
+
"cu",
|
|
385
|
+
"cu1",
|
|
386
|
+
"cu2",
|
|
387
|
+
"cu3",
|
|
388
|
+
"rxx",
|
|
389
|
+
"ryy",
|
|
390
|
+
"rzz",
|
|
391
|
+
"rzx",
|
|
392
|
+
"ccx",
|
|
393
|
+
"ccz",
|
|
394
|
+
"cswap",
|
|
395
|
+
"crx",
|
|
396
|
+
"cry",
|
|
397
|
+
"crz",
|
|
398
|
+
"mcx",
|
|
399
|
+
"mcy",
|
|
400
|
+
"mcz",
|
|
401
|
+
"mcsx",
|
|
402
|
+
"mcp",
|
|
403
|
+
"mcphase",
|
|
404
|
+
"mcu",
|
|
405
|
+
"mcu1",
|
|
406
|
+
"mcu2",
|
|
407
|
+
"mcu3",
|
|
408
|
+
"mcrx",
|
|
409
|
+
"mcry",
|
|
410
|
+
"mcrz",
|
|
411
|
+
"mcr",
|
|
412
|
+
"mcswap",
|
|
413
|
+
"unitary",
|
|
414
|
+
"diagonal",
|
|
415
|
+
"multiplexer",
|
|
416
|
+
"pauli",
|
|
417
|
+
"mcx_gray",
|
|
418
|
+
"ecr",
|
|
419
|
+
"store",
|
|
420
|
+
]
|
|
421
|
+
),
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
# Automatic method basis gates are the union of statevector,
|
|
425
|
+
# density matrix, and stabilizer methods
|
|
426
|
+
BASIS_GATES[None] = BASIS_GATES["automatic"] = sorted(
|
|
427
|
+
set(BASIS_GATES["statevector"])
|
|
428
|
+
.union(BASIS_GATES["stabilizer"])
|
|
429
|
+
.union(BASIS_GATES["density_matrix"])
|
|
430
|
+
.union(BASIS_GATES["matrix_product_state"])
|
|
431
|
+
.union(BASIS_GATES["unitary"])
|
|
432
|
+
.union(BASIS_GATES["superop"])
|
|
433
|
+
.union(BASIS_GATES["tensor_network"])
|
|
434
|
+
)
|
|
435
|
+
|
|
436
|
+
|
|
437
|
+
def cpp_execute_circuits(controller, aer_circuits, noise_model, config):
|
|
438
|
+
"""Execute aer circuits on C++ controller wrapper"""
|
|
439
|
+
|
|
440
|
+
# Location where we put external libraries that will be
|
|
441
|
+
# loaded at runtime by the simulator extension
|
|
442
|
+
config.library_dir = LIBRARY_DIR
|
|
443
|
+
|
|
444
|
+
noise_model = noise_model.to_dict(serializable=True) if noise_model else {}
|
|
445
|
+
|
|
446
|
+
return controller.execute(aer_circuits, noise_model, config)
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
def available_methods(methods, devices):
|
|
450
|
+
"""Check available simulation methods"""
|
|
451
|
+
|
|
452
|
+
valid_methods = []
|
|
453
|
+
for method in methods:
|
|
454
|
+
if method == "tensor_network":
|
|
455
|
+
if "GPU" in devices:
|
|
456
|
+
valid_methods.append(method)
|
|
457
|
+
else:
|
|
458
|
+
valid_methods.append(method)
|
|
459
|
+
return tuple(valid_methods)
|
|
460
|
+
|
|
461
|
+
|
|
462
|
+
def available_devices(controller):
|
|
463
|
+
"""return available simulation devices"""
|
|
464
|
+
dev = controller.available_devices()
|
|
465
|
+
return tuple(dev)
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
def add_final_save_op(aer_circuits, state):
|
|
469
|
+
"""Add final save state op to all experiments in a qobj."""
|
|
470
|
+
|
|
471
|
+
for aer_circuit in aer_circuits:
|
|
472
|
+
num_qubits = aer_circuit.num_qubits
|
|
473
|
+
aer_circuit.save_state(list(range(num_qubits)), f"save_{state}", "single", state)
|
|
474
|
+
|
|
475
|
+
return aer_circuits
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
def map_legacy_method_config(config):
|
|
479
|
+
"""Map legacy method names of qasm simulator to aer simulator options"""
|
|
480
|
+
method = config.method
|
|
481
|
+
if method in LEGACY_METHOD_MAP:
|
|
482
|
+
config.method, config.device = LEGACY_METHOD_MAP[method]
|
|
483
|
+
return config
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
def format_save_type(data, save_type, save_subtype):
|
|
487
|
+
"""Format raw simulator result data based on save type."""
|
|
488
|
+
init_fns = {
|
|
489
|
+
"save_statevector": Statevector,
|
|
490
|
+
"save_density_matrix": DensityMatrix,
|
|
491
|
+
"save_unitary": Operator,
|
|
492
|
+
"save_superop": SuperOp,
|
|
493
|
+
"save_stabilizer": (lambda data: StabilizerState(Clifford.from_dict(data))),
|
|
494
|
+
"save_clifford": Clifford.from_dict,
|
|
495
|
+
"save_probabilities_dict": ProbDistribution,
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
# Non-handled cases return raw data
|
|
499
|
+
if save_type not in init_fns:
|
|
500
|
+
return data
|
|
501
|
+
|
|
502
|
+
if save_subtype in ["list", "c_list"]:
|
|
503
|
+
|
|
504
|
+
def func(data):
|
|
505
|
+
init_fn = init_fns[save_type]
|
|
506
|
+
return [init_fn(i) for i in data]
|
|
507
|
+
|
|
508
|
+
else:
|
|
509
|
+
func = init_fns[save_type]
|
|
510
|
+
|
|
511
|
+
# Conditional save
|
|
512
|
+
if save_subtype[:2] == "c_":
|
|
513
|
+
return {key: func(val) for key, val in data.items()}
|
|
514
|
+
|
|
515
|
+
return func(data)
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
def circuit_optypes(circuit):
|
|
519
|
+
"""Return set of all operation types and parent types in a circuit."""
|
|
520
|
+
if not isinstance(circuit, QuantumCircuit):
|
|
521
|
+
return set()
|
|
522
|
+
optypes = set()
|
|
523
|
+
for instruction in circuit.data:
|
|
524
|
+
optypes.update(type(instruction.operation).mro())
|
|
525
|
+
optypes.discard(object)
|
|
526
|
+
return optypes
|
|
527
|
+
|
|
528
|
+
|
|
529
|
+
class CircuitHeader(SimpleNamespace):
|
|
530
|
+
"""A class used to represent a dictionary header in circuit objects."""
|
|
531
|
+
|
|
532
|
+
def __init__(self, **kwargs):
|
|
533
|
+
"""Instantiate a new circuit dict field object.
|
|
534
|
+
|
|
535
|
+
Args:
|
|
536
|
+
kwargs: arbitrary keyword arguments that can be accessed as
|
|
537
|
+
attributes of the object.
|
|
538
|
+
"""
|
|
539
|
+
self.__dict__.update(kwargs)
|
|
540
|
+
|
|
541
|
+
def to_dict(self):
|
|
542
|
+
"""Return a dictionary format representation of the circuit.
|
|
543
|
+
|
|
544
|
+
Returns:
|
|
545
|
+
dict: The dictionary form of the CircuitHeader.
|
|
546
|
+
"""
|
|
547
|
+
return self.__dict__
|
|
548
|
+
|
|
549
|
+
@classmethod
|
|
550
|
+
def from_dict(cls, data):
|
|
551
|
+
"""Create a new header object from a dictionary.
|
|
552
|
+
|
|
553
|
+
Args:
|
|
554
|
+
data (dict): A dictionary representing the header to create. It
|
|
555
|
+
will be in the same format as output by :func:`to_dict`.
|
|
556
|
+
|
|
557
|
+
Returns:
|
|
558
|
+
CircuitHeader: The CircuitHeader from the input dictionary.
|
|
559
|
+
"""
|
|
560
|
+
|
|
561
|
+
return cls(**data)
|
|
562
|
+
|
|
563
|
+
def __eq__(self, other):
|
|
564
|
+
if isinstance(other, self.__class__):
|
|
565
|
+
if self.__dict__ == other.__dict__:
|
|
566
|
+
return True
|
|
567
|
+
return False
|