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.
Files changed (83) hide show
  1. qiskit_aer/VERSION.txt +1 -0
  2. qiskit_aer/__init__.py +89 -0
  3. qiskit_aer/aererror.py +30 -0
  4. qiskit_aer/aerprovider.py +119 -0
  5. qiskit_aer/backends/__init__.py +20 -0
  6. qiskit_aer/backends/aer_compiler.py +1085 -0
  7. qiskit_aer/backends/aer_simulator.py +1025 -0
  8. qiskit_aer/backends/aerbackend.py +679 -0
  9. qiskit_aer/backends/backend_utils.py +567 -0
  10. qiskit_aer/backends/backendconfiguration.py +395 -0
  11. qiskit_aer/backends/backendproperties.py +590 -0
  12. qiskit_aer/backends/compatibility.py +287 -0
  13. qiskit_aer/backends/controller_wrappers.cp314-win_amd64.pyd +0 -0
  14. qiskit_aer/backends/libopenblas.dll +0 -0
  15. qiskit_aer/backends/name_mapping.py +306 -0
  16. qiskit_aer/backends/qasm_simulator.py +925 -0
  17. qiskit_aer/backends/statevector_simulator.py +330 -0
  18. qiskit_aer/backends/unitary_simulator.py +316 -0
  19. qiskit_aer/jobs/__init__.py +35 -0
  20. qiskit_aer/jobs/aerjob.py +143 -0
  21. qiskit_aer/jobs/utils.py +66 -0
  22. qiskit_aer/library/__init__.py +204 -0
  23. qiskit_aer/library/control_flow_instructions/__init__.py +16 -0
  24. qiskit_aer/library/control_flow_instructions/jump.py +47 -0
  25. qiskit_aer/library/control_flow_instructions/mark.py +30 -0
  26. qiskit_aer/library/control_flow_instructions/store.py +29 -0
  27. qiskit_aer/library/default_qubits.py +44 -0
  28. qiskit_aer/library/instructions_table.csv +21 -0
  29. qiskit_aer/library/save_instructions/__init__.py +44 -0
  30. qiskit_aer/library/save_instructions/save_amplitudes.py +168 -0
  31. qiskit_aer/library/save_instructions/save_clifford.py +63 -0
  32. qiskit_aer/library/save_instructions/save_data.py +129 -0
  33. qiskit_aer/library/save_instructions/save_density_matrix.py +91 -0
  34. qiskit_aer/library/save_instructions/save_expectation_value.py +257 -0
  35. qiskit_aer/library/save_instructions/save_matrix_product_state.py +71 -0
  36. qiskit_aer/library/save_instructions/save_probabilities.py +156 -0
  37. qiskit_aer/library/save_instructions/save_stabilizer.py +70 -0
  38. qiskit_aer/library/save_instructions/save_state.py +79 -0
  39. qiskit_aer/library/save_instructions/save_statevector.py +120 -0
  40. qiskit_aer/library/save_instructions/save_superop.py +62 -0
  41. qiskit_aer/library/save_instructions/save_unitary.py +63 -0
  42. qiskit_aer/library/set_instructions/__init__.py +19 -0
  43. qiskit_aer/library/set_instructions/set_density_matrix.py +78 -0
  44. qiskit_aer/library/set_instructions/set_matrix_product_state.py +83 -0
  45. qiskit_aer/library/set_instructions/set_stabilizer.py +77 -0
  46. qiskit_aer/library/set_instructions/set_statevector.py +78 -0
  47. qiskit_aer/library/set_instructions/set_superop.py +78 -0
  48. qiskit_aer/library/set_instructions/set_unitary.py +78 -0
  49. qiskit_aer/noise/__init__.py +265 -0
  50. qiskit_aer/noise/device/__init__.py +25 -0
  51. qiskit_aer/noise/device/models.py +397 -0
  52. qiskit_aer/noise/device/parameters.py +202 -0
  53. qiskit_aer/noise/errors/__init__.py +30 -0
  54. qiskit_aer/noise/errors/base_quantum_error.py +119 -0
  55. qiskit_aer/noise/errors/pauli_error.py +283 -0
  56. qiskit_aer/noise/errors/pauli_lindblad_error.py +363 -0
  57. qiskit_aer/noise/errors/quantum_error.py +451 -0
  58. qiskit_aer/noise/errors/readout_error.py +355 -0
  59. qiskit_aer/noise/errors/standard_errors.py +498 -0
  60. qiskit_aer/noise/noise_model.py +1231 -0
  61. qiskit_aer/noise/noiseerror.py +30 -0
  62. qiskit_aer/noise/passes/__init__.py +18 -0
  63. qiskit_aer/noise/passes/local_noise_pass.py +160 -0
  64. qiskit_aer/noise/passes/relaxation_noise_pass.py +137 -0
  65. qiskit_aer/primitives/__init__.py +44 -0
  66. qiskit_aer/primitives/estimator.py +751 -0
  67. qiskit_aer/primitives/estimator_v2.py +159 -0
  68. qiskit_aer/primitives/sampler.py +361 -0
  69. qiskit_aer/primitives/sampler_v2.py +256 -0
  70. qiskit_aer/quantum_info/__init__.py +32 -0
  71. qiskit_aer/quantum_info/states/__init__.py +16 -0
  72. qiskit_aer/quantum_info/states/aer_densitymatrix.py +313 -0
  73. qiskit_aer/quantum_info/states/aer_state.py +525 -0
  74. qiskit_aer/quantum_info/states/aer_statevector.py +302 -0
  75. qiskit_aer/utils/__init__.py +44 -0
  76. qiskit_aer/utils/noise_model_inserter.py +66 -0
  77. qiskit_aer/utils/noise_transformation.py +431 -0
  78. qiskit_aer/version.py +86 -0
  79. qiskit_aer-0.17.2.dist-info/METADATA +209 -0
  80. qiskit_aer-0.17.2.dist-info/RECORD +83 -0
  81. qiskit_aer-0.17.2.dist-info/WHEEL +5 -0
  82. qiskit_aer-0.17.2.dist-info/licenses/LICENSE.txt +203 -0
  83. 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