qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__cp39-abi3-macosx_11_0_arm64.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 (456) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +24 -5
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +248 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +34 -5
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  60. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  61. qiskit/circuit/library/n_local/n_local.py +1 -1
  62. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  63. qiskit/circuit/library/overlap.py +2 -2
  64. qiskit/circuit/library/pauli_evolution.py +39 -24
  65. qiskit/circuit/library/phase_oracle.py +130 -51
  66. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  67. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  68. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  69. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  70. qiskit/circuit/library/standard_gates/h.py +4 -9
  71. qiskit/circuit/library/standard_gates/i.py +2 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  73. qiskit/circuit/library/standard_gates/p.py +15 -34
  74. qiskit/circuit/library/standard_gates/r.py +2 -6
  75. qiskit/circuit/library/standard_gates/rx.py +5 -15
  76. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  77. qiskit/circuit/library/standard_gates/ry.py +5 -17
  78. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  79. qiskit/circuit/library/standard_gates/rz.py +5 -17
  80. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  82. qiskit/circuit/library/standard_gates/s.py +6 -15
  83. qiskit/circuit/library/standard_gates/swap.py +4 -11
  84. qiskit/circuit/library/standard_gates/sx.py +7 -12
  85. qiskit/circuit/library/standard_gates/t.py +6 -7
  86. qiskit/circuit/library/standard_gates/u.py +2 -10
  87. qiskit/circuit/library/standard_gates/u1.py +5 -16
  88. qiskit/circuit/library/standard_gates/u2.py +2 -6
  89. qiskit/circuit/library/standard_gates/u3.py +3 -11
  90. qiskit/circuit/library/standard_gates/x.py +13 -60
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/y.py +4 -9
  94. qiskit/circuit/library/standard_gates/z.py +5 -15
  95. qiskit/circuit/measure.py +11 -2
  96. qiskit/circuit/parameterexpression.py +4 -0
  97. qiskit/circuit/quantumcircuit.py +881 -555
  98. qiskit/circuit/random/utils.py +12 -6
  99. qiskit/circuit/reset.py +5 -2
  100. qiskit/circuit/singleton.py +5 -11
  101. qiskit/circuit/store.py +0 -8
  102. qiskit/compiler/__init__.py +1 -7
  103. qiskit/compiler/transpiler.py +38 -196
  104. qiskit/converters/circuit_to_dag.py +4 -2
  105. qiskit/converters/circuit_to_dagdependency.py +0 -2
  106. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  107. qiskit/converters/circuit_to_gate.py +1 -1
  108. qiskit/converters/circuit_to_instruction.py +16 -29
  109. qiskit/converters/dag_to_circuit.py +5 -5
  110. qiskit/converters/dag_to_dagdependency.py +0 -1
  111. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  112. qiskit/converters/dagdependency_to_circuit.py +0 -6
  113. qiskit/converters/dagdependency_to_dag.py +0 -6
  114. qiskit/dagcircuit/collect_blocks.py +32 -20
  115. qiskit/dagcircuit/dagdependency.py +3 -37
  116. qiskit/dagcircuit/dagdependency_v2.py +2 -80
  117. qiskit/dagcircuit/dagnode.py +14 -2
  118. qiskit/passmanager/__init__.py +24 -6
  119. qiskit/passmanager/passmanager.py +26 -24
  120. qiskit/primitives/__init__.py +44 -35
  121. qiskit/primitives/backend_estimator_v2.py +102 -23
  122. qiskit/primitives/backend_sampler_v2.py +5 -20
  123. qiskit/primitives/base/__init__.py +4 -4
  124. qiskit/primitives/base/base_estimator.py +77 -82
  125. qiskit/primitives/base/base_primitive_job.py +2 -2
  126. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  127. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  128. qiskit/primitives/base/base_sampler.py +52 -60
  129. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  130. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  131. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  132. qiskit/primitives/containers/bindings_array.py +3 -1
  133. qiskit/primitives/containers/bit_array.py +23 -0
  134. qiskit/primitives/containers/data_bin.py +3 -1
  135. qiskit/primitives/containers/observables_array.py +19 -2
  136. qiskit/primitives/statevector_sampler.py +6 -8
  137. qiskit/primitives/utils.py +14 -189
  138. qiskit/providers/__init__.py +4 -130
  139. qiskit/providers/backend.py +11 -314
  140. qiskit/providers/basic_provider/__init__.py +3 -1
  141. qiskit/providers/basic_provider/basic_provider.py +29 -9
  142. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  143. qiskit/providers/exceptions.py +0 -33
  144. qiskit/providers/fake_provider/__init__.py +0 -37
  145. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  146. qiskit/qasm2/__init__.py +21 -6
  147. qiskit/qasm2/export.py +2 -10
  148. qiskit/qasm2/parse.py +11 -25
  149. qiskit/qasm3/__init__.py +5 -1
  150. qiskit/qasm3/ast.py +44 -0
  151. qiskit/qasm3/exporter.py +65 -27
  152. qiskit/qasm3/printer.py +35 -4
  153. qiskit/qpy/__init__.py +141 -19
  154. qiskit/qpy/binary_io/__init__.py +0 -1
  155. qiskit/qpy/binary_io/circuits.py +91 -116
  156. qiskit/qpy/binary_io/schedules.py +61 -388
  157. qiskit/qpy/binary_io/value.py +154 -28
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +29 -62
  161. qiskit/qpy/type_keys.py +58 -221
  162. qiskit/quantum_info/analysis/distance.py +3 -1
  163. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  164. qiskit/quantum_info/operators/operator.py +6 -2
  165. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  166. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  167. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  169. qiskit/quantum_info/states/densitymatrix.py +16 -6
  170. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  171. qiskit/quantum_info/states/statevector.py +16 -6
  172. qiskit/result/__init__.py +5 -17
  173. qiskit/result/models.py +18 -10
  174. qiskit/result/result.py +28 -126
  175. qiskit/result/sampled_expval.py +1 -2
  176. qiskit/result/utils.py +3 -4
  177. qiskit/synthesis/__init__.py +21 -1
  178. qiskit/synthesis/arithmetic/__init__.py +3 -1
  179. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  180. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  182. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  183. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  184. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  185. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  186. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  188. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  189. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  190. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  191. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  192. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +2 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +1 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +67 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/dag_visualization.py +2 -1
  287. qiskit/visualization/gate_map.py +39 -154
  288. qiskit/visualization/pass_manager_visualization.py +6 -2
  289. qiskit/visualization/state_visualization.py +6 -0
  290. qiskit/visualization/timeline/core.py +18 -12
  291. qiskit/visualization/timeline/interface.py +19 -18
  292. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
  295. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
  296. qiskit/assembler/__init__.py +0 -42
  297. qiskit/assembler/assemble_circuits.py +0 -451
  298. qiskit/assembler/assemble_schedules.py +0 -367
  299. qiskit/assembler/disassemble.py +0 -310
  300. qiskit/assembler/run_config.py +0 -77
  301. qiskit/circuit/bit.py +0 -106
  302. qiskit/circuit/classicalfunction/__init__.py +0 -152
  303. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  304. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  305. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  306. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  307. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  308. qiskit/circuit/classicalfunction/types.py +0 -18
  309. qiskit/circuit/classicalfunction/utils.py +0 -91
  310. qiskit/circuit/classicalregister.py +0 -57
  311. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  312. qiskit/circuit/quantumregister.py +0 -75
  313. qiskit/circuit/register.py +0 -246
  314. qiskit/compiler/assembler.py +0 -689
  315. qiskit/compiler/scheduler.py +0 -109
  316. qiskit/compiler/sequencer.py +0 -71
  317. qiskit/primitives/backend_estimator.py +0 -486
  318. qiskit/primitives/backend_sampler.py +0 -222
  319. qiskit/primitives/estimator.py +0 -172
  320. qiskit/primitives/sampler.py +0 -162
  321. qiskit/providers/backend_compat.py +0 -507
  322. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  330. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/fake_1q.py +0 -91
  346. qiskit/providers/fake_provider/fake_backend.py +0 -165
  347. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  348. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  349. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  350. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  351. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  352. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  353. qiskit/providers/models/__init__.py +0 -89
  354. qiskit/providers/models/backendconfiguration.py +0 -1040
  355. qiskit/providers/models/backendproperties.py +0 -535
  356. qiskit/providers/models/backendstatus.py +0 -104
  357. qiskit/providers/models/jobstatus.py +0 -77
  358. qiskit/providers/models/pulsedefaults.py +0 -305
  359. qiskit/providers/provider.py +0 -95
  360. qiskit/pulse/__init__.py +0 -158
  361. qiskit/pulse/builder.py +0 -2262
  362. qiskit/pulse/calibration_entries.py +0 -381
  363. qiskit/pulse/channels.py +0 -227
  364. qiskit/pulse/configuration.py +0 -245
  365. qiskit/pulse/exceptions.py +0 -45
  366. qiskit/pulse/filters.py +0 -309
  367. qiskit/pulse/instruction_schedule_map.py +0 -424
  368. qiskit/pulse/instructions/__init__.py +0 -67
  369. qiskit/pulse/instructions/acquire.py +0 -150
  370. qiskit/pulse/instructions/delay.py +0 -71
  371. qiskit/pulse/instructions/directives.py +0 -154
  372. qiskit/pulse/instructions/frequency.py +0 -135
  373. qiskit/pulse/instructions/instruction.py +0 -270
  374. qiskit/pulse/instructions/phase.py +0 -152
  375. qiskit/pulse/instructions/play.py +0 -99
  376. qiskit/pulse/instructions/reference.py +0 -100
  377. qiskit/pulse/instructions/snapshot.py +0 -82
  378. qiskit/pulse/library/__init__.py +0 -97
  379. qiskit/pulse/library/continuous.py +0 -430
  380. qiskit/pulse/library/pulse.py +0 -148
  381. qiskit/pulse/library/samplers/__init__.py +0 -15
  382. qiskit/pulse/library/samplers/decorators.py +0 -295
  383. qiskit/pulse/library/samplers/strategies.py +0 -71
  384. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  385. qiskit/pulse/library/waveform.py +0 -136
  386. qiskit/pulse/macros.py +0 -262
  387. qiskit/pulse/parameter_manager.py +0 -445
  388. qiskit/pulse/parser.py +0 -314
  389. qiskit/pulse/reference_manager.py +0 -58
  390. qiskit/pulse/schedule.py +0 -1854
  391. qiskit/pulse/transforms/__init__.py +0 -106
  392. qiskit/pulse/transforms/alignments.py +0 -406
  393. qiskit/pulse/transforms/base_transforms.py +0 -71
  394. qiskit/pulse/transforms/canonicalization.py +0 -498
  395. qiskit/pulse/transforms/dag.py +0 -122
  396. qiskit/pulse/utils.py +0 -149
  397. qiskit/qobj/__init__.py +0 -75
  398. qiskit/qobj/common.py +0 -81
  399. qiskit/qobj/converters/__init__.py +0 -18
  400. qiskit/qobj/converters/lo_config.py +0 -177
  401. qiskit/qobj/converters/pulse_instruction.py +0 -897
  402. qiskit/qobj/pulse_qobj.py +0 -709
  403. qiskit/qobj/qasm_qobj.py +0 -708
  404. qiskit/qobj/utils.py +0 -46
  405. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  406. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  407. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  408. qiskit/result/mitigation/utils.py +0 -217
  409. qiskit/scheduler/__init__.py +0 -40
  410. qiskit/scheduler/config.py +0 -37
  411. qiskit/scheduler/lowering.py +0 -187
  412. qiskit/scheduler/methods/__init__.py +0 -15
  413. qiskit/scheduler/methods/basic.py +0 -140
  414. qiskit/scheduler/schedule_circuit.py +0 -69
  415. qiskit/scheduler/sequence.py +0 -104
  416. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  417. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  418. qiskit/transpiler/passes/calibration/builders.py +0 -20
  419. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  420. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  421. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  422. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  423. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  424. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  425. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  426. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  427. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  428. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  429. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  430. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  431. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  432. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  433. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  434. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  435. qiskit/utils/deprecate_pulse.py +0 -119
  436. qiskit/utils/multiprocessing.py +0 -56
  437. qiskit/visualization/pulse_v2/__init__.py +0 -21
  438. qiskit/visualization/pulse_v2/core.py +0 -901
  439. qiskit/visualization/pulse_v2/device_info.py +0 -173
  440. qiskit/visualization/pulse_v2/drawings.py +0 -253
  441. qiskit/visualization/pulse_v2/events.py +0 -254
  442. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  443. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  444. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  445. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  446. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  447. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  448. qiskit/visualization/pulse_v2/interface.py +0 -459
  449. qiskit/visualization/pulse_v2/layouts.py +0 -387
  450. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  451. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  452. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  453. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  454. qiskit/visualization/pulse_v2/types.py +0 -242
  455. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -17,7 +17,9 @@ to run on the simulator. It is exponential in the number of qubits.
17
17
 
18
18
  The simulator is run using
19
19
 
20
- .. code-block:: python
20
+ .. plot::
21
+ :include-source:
22
+ :nofigs:
21
23
 
22
24
  BasicSimulator().run(run_input)
23
25
 
@@ -41,14 +43,10 @@ import numpy as np
41
43
  from qiskit.circuit import QuantumCircuit
42
44
  from qiskit.circuit.library import UnitaryGate
43
45
  from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping, GlobalPhaseGate
44
- from qiskit.providers import Provider
45
46
  from qiskit.providers.backend import BackendV2
46
- from qiskit.providers.models.backendconfiguration import BackendConfiguration
47
47
  from qiskit.providers.options import Options
48
- from qiskit.qobj import QasmQobj, QasmQobjConfig, QasmQobjExperiment
49
48
  from qiskit.result import Result
50
49
  from qiskit.transpiler import Target
51
- from qiskit.utils.deprecation import deprecate_func
52
50
 
53
51
  from .basic_provider_job import BasicProviderJob
54
52
  from .basic_provider_tools import single_gate_matrix
@@ -74,14 +72,13 @@ class BasicSimulator(BackendV2):
74
72
 
75
73
  def __init__(
76
74
  self,
77
- provider: Provider | None = None,
75
+ provider=None,
78
76
  target: Target | None = None,
79
77
  **fields,
80
78
  ) -> None:
81
79
  """
82
80
  Args:
83
- provider: An optional backwards reference to the
84
- :class:`~qiskit.providers.Provider` object that the backend
81
+ provider: An optional backwards reference to the provider object that the backend
85
82
  is from.
86
83
  target: An optional target to configure the simulator.
87
84
  fields: kwargs for the values to use to override the default
@@ -95,27 +92,24 @@ class BasicSimulator(BackendV2):
95
92
  super().__init__(
96
93
  provider=provider,
97
94
  name="basic_simulator",
98
- description="A python simulator for quantum experiments",
95
+ description="A Python simulator for basic quantum experiments",
99
96
  backend_version="0.1",
100
97
  **fields,
101
98
  )
102
99
 
103
100
  self._target = target
104
- self._configuration = None
105
101
 
106
102
  # Internal simulator variables
107
- self._local_random = None
108
103
  self._classical_memory = 0
109
- self._classical_register = 0
110
104
  self._statevector = 0
111
105
  self._number_of_cmembits = 0
112
106
  self._number_of_qubits = 0
113
- self._shots = 0
114
- self._memory = False
115
- self._initial_statevector = self.options.get("initial_statevector")
116
- self._chop_threshold = self.options.get("chop_threashold")
117
- self._qobj_config = None
107
+ self._local_rng = None
118
108
  self._sample_measure = False
109
+ self._shots = self.options.get("shots")
110
+ self._memory = self.options.get("memory")
111
+ self._initial_statevector = self.options.get("initial_statevector")
112
+ self._seed_simulator = self.options.get("seed_simulator")
119
113
 
120
114
  @property
121
115
  def max_circuits(self) -> None:
@@ -129,7 +123,7 @@ class BasicSimulator(BackendV2):
129
123
 
130
124
  def _build_basic_target(self) -> Target:
131
125
  """Helper method that returns a minimal target with a basis gate set but
132
- no coupling map, instruction properties or calibrations.
126
+ no coupling map or instruction properties.
133
127
 
134
128
  Returns:
135
129
  The configured target.
@@ -213,76 +207,13 @@ class BasicSimulator(BackendV2):
213
207
  )
214
208
  return target
215
209
 
216
- @deprecate_func(
217
- since="1.3.0",
218
- removal_timeline="in Qiskit 2.0.0",
219
- additional_msg="The `BackendConfiguration` class is part of the deprecated `BackendV1` "
220
- "workflow, and no longer necessary for `BackendV2`. The individual configuration elements "
221
- "can be retrieved directly from the backend or from the contained `Target` instance "
222
- "(`backend.target)`).",
223
- )
224
- def configuration(self) -> BackendConfiguration:
225
- """Return the simulator backend configuration.
226
-
227
- Returns:
228
- The configuration for the backend.
229
- """
230
- # Note: this is a custom attribute of the BasicSimulator class and
231
- # not part of the BackendV2 interface. It has only been added for
232
- # compatibility with the `assemble` function (currently used in `run`),
233
- # which still relies on legacy BackendV1 attributes. Once the internal
234
- # use of `assemble` is resolved, this attribute will no longer be
235
- # necessary.
236
-
237
- if self._configuration:
238
- return self._configuration
239
-
240
- gates = [
241
- {
242
- "name": name,
243
- "parameters": self.target.operation_from_name(name).params,
244
- }
245
- for name in self.target.operation_names
246
- ]
247
-
248
- with warnings.catch_warnings():
249
- # TODO Provider models are deprecated
250
- # https://github.com/Qiskit/qiskit/issues/12843
251
- warnings.filterwarnings(
252
- "ignore",
253
- category=DeprecationWarning,
254
- message=r".+qiskit\.providers\.models\.backendconfiguration\..+",
255
- )
256
- self._configuration = BackendConfiguration(
257
- backend_name=self.name,
258
- backend_version=self.backend_version,
259
- n_qubits=self.num_qubits,
260
- basis_gates=list(self.target.operation_names),
261
- gates=gates,
262
- local=True,
263
- simulator=True,
264
- conditional=True,
265
- open_pulse=False,
266
- memory=True,
267
- # This max_shots is used by the assembler, setting it to 0
268
- # to maintain the behavior from the previous implementation.
269
- # Not related to the actual shots set in the backend options
270
- max_shots=0,
271
- coupling_map=None,
272
- description="A python simulator for quantum experiments",
273
- )
274
- return self._configuration
275
-
276
210
  @classmethod
277
211
  def _default_options(cls) -> Options:
278
212
  return Options(
279
213
  shots=1024,
280
- memory=False,
214
+ memory=True,
281
215
  initial_statevector=None,
282
- chop_threshold=1e-15,
283
- allow_sample_measuring=True,
284
216
  seed_simulator=None,
285
- parameter_binds=None,
286
217
  )
287
218
 
288
219
  def _add_unitary(self, gate: np.ndarray, qubits: list[int]) -> None:
@@ -307,7 +238,7 @@ class BasicSimulator(BackendV2):
307
238
  """Simulate the outcome of measurement of a qubit.
308
239
 
309
240
  Args:
310
- qubit: the qubit to measure
241
+ qubit: index indicating the qubit to measure
311
242
 
312
243
  Return:
313
244
  pair (outcome, probability) where outcome is '0' or '1' and
@@ -318,14 +249,14 @@ class BasicSimulator(BackendV2):
318
249
  axis.remove(self._number_of_qubits - 1 - qubit)
319
250
  probabilities = np.sum(np.abs(self._statevector) ** 2, axis=tuple(axis))
320
251
  # Compute einsum index string for 1-qubit matrix multiplication
321
- random_number = self._local_random.random()
252
+ random_number = self._local_rng.random()
322
253
  if random_number < probabilities[0]:
323
254
  return "0", probabilities[0]
324
255
  # Else outcome was '1'
325
256
  return "1", probabilities[1]
326
257
 
327
258
  def _add_sample_measure(
328
- self, measure_params: list[list[int, int]], num_samples: int
259
+ self, measure_params: list[tuple[int, int]], num_samples: int
329
260
  ) -> list[hex]:
330
261
  """Generate memory samples from current statevector.
331
262
 
@@ -339,7 +270,7 @@ class BasicSimulator(BackendV2):
339
270
  """
340
271
  # Get unique qubits that are actually measured and sort in
341
272
  # ascending order
342
- measured_qubits = sorted({qubit for qubit, cmembit in measure_params})
273
+ measured_qubits = sorted({qubit for qubit, _ in measure_params})
343
274
  num_measured = len(measured_qubits)
344
275
  # We use the axis kwarg for numpy.sum to compute probabilities
345
276
  # this sums over all non-measured qubits to return a vector
@@ -355,7 +286,7 @@ class BasicSimulator(BackendV2):
355
286
  # Generate samples on measured qubits as ints with qubit
356
287
  # position in the bit-string for each int given by the qubit
357
288
  # position in the sorted measured_qubits list
358
- samples = self._local_random.choice(range(2**num_measured), num_samples, p=probabilities)
289
+ samples = self._local_rng.choice(range(2**num_measured), num_samples, p=probabilities)
359
290
  # Convert the ints to bitstrings
360
291
  memory = []
361
292
  for sample in samples:
@@ -369,13 +300,12 @@ class BasicSimulator(BackendV2):
369
300
  memory.append(hex(int(value, 2)))
370
301
  return memory
371
302
 
372
- def _add_measure(self, qubit: int, cmembit: int, cregbit: int | None = None) -> None:
303
+ def _add_measure(self, qubit: int, cmembit: int) -> None:
373
304
  """Apply a measure instruction to a qubit.
374
305
 
375
306
  Args:
376
- qubit: qubit is the qubit measured.
377
- cmembit: is the classical memory bit to store outcome in.
378
- cregbit: is the classical register bit to store outcome in.
307
+ qubit: index of the qubit measured.
308
+ cmembit: index of the classical memory bit to store outcome in.
379
309
  """
380
310
  # get measure outcome
381
311
  outcome, probability = self._get_measure_outcome(qubit)
@@ -383,12 +313,6 @@ class BasicSimulator(BackendV2):
383
313
  membit = 1 << cmembit
384
314
  self._classical_memory = (self._classical_memory & (~membit)) | (int(outcome) << cmembit)
385
315
 
386
- if cregbit is not None:
387
- regbit = 1 << cregbit
388
- self._classical_register = (self._classical_register & (~regbit)) | (
389
- int(outcome) << cregbit
390
- )
391
-
392
316
  # update quantum state
393
317
  if outcome == "0":
394
318
  update_diag = [[1 / math.sqrt(probability), 0], [0, 0]]
@@ -430,38 +354,35 @@ class BasicSimulator(BackendV2):
430
354
  f"initial statevector is incorrect length: {length} != {required_dim}"
431
355
  )
432
356
 
433
- def _set_options(
434
- self, qobj_config: QasmQobjConfig | None = None, backend_options: dict | None = None
435
- ) -> None:
436
- """Set the backend options for all experiments in a qobj"""
437
- # Reset default options
357
+ def _set_run_options(self, run_options: dict | None = None) -> None:
358
+ """Set the backend run options for all circuits"""
359
+
360
+ # Reset internal variables every time "run" is called using saved options
361
+ self._shots = self.options.get("shots")
362
+ self._memory = self.options.get("memory")
438
363
  self._initial_statevector = self.options.get("initial_statevector")
439
- self._chop_threshold = self.options.get("chop_threshold")
440
- if "backend_options" in backend_options and backend_options["backend_options"]:
441
- backend_options = backend_options["backend_options"]
442
-
443
- # Check for custom initial statevector in backend_options first,
444
- # then config second
445
- if (
446
- "initial_statevector" in backend_options
447
- and backend_options["initial_statevector"] is not None
448
- ):
449
- self._initial_statevector = np.array(
450
- backend_options["initial_statevector"], dtype=complex
451
- )
452
- elif hasattr(qobj_config, "initial_statevector"):
453
- self._initial_statevector = np.array(qobj_config.initial_statevector, dtype=complex)
364
+ self._seed_simulator = self.options.get("seed_simulator")
365
+
366
+ # Apply custom run options
367
+ if run_options.get("initial_statevector", None) is not None:
368
+ self._initial_statevector = np.array(run_options["initial_statevector"], dtype=complex)
454
369
  if self._initial_statevector is not None:
455
370
  # Check the initial statevector is normalized
456
371
  norm = np.linalg.norm(self._initial_statevector)
457
372
  if round(norm, 12) != 1:
458
- raise BasicProviderError(f"initial statevector is not normalized: norm {norm} != 1")
459
- # Check for custom chop threshold
460
- # Replace with custom options
461
- if "chop_threshold" in backend_options:
462
- self._chop_threshold = backend_options["chop_threshold"]
463
- elif hasattr(qobj_config, "chop_threshold"):
464
- self._chop_threshold = qobj_config.chop_threshold
373
+ raise BasicProviderError(f"Initial statevector is not normalized: norm {norm} != 1")
374
+ if "shots" in run_options:
375
+ self._shots = run_options["shots"]
376
+ if "seed_simulator" in run_options:
377
+ self._seed_simulator = run_options["seed_simulator"]
378
+ elif self._seed_simulator is None:
379
+ # For compatibility on Windows force dtype to be int32
380
+ # and set the maximum value to be (2 ** 31) - 1
381
+ self._seed_simulator = np.random.randint(2147483647, dtype="int32")
382
+ if "memory" in run_options:
383
+ self._memory = run_options["memory"]
384
+ # Set seed for local random number gen.
385
+ self._local_rng = np.random.default_rng(seed=self._seed_simulator)
465
386
 
466
387
  def _initialize_statevector(self) -> None:
467
388
  """Set the initial statevector for simulation"""
@@ -474,28 +395,14 @@ class BasicSimulator(BackendV2):
474
395
  # Reshape to rank-N tensor
475
396
  self._statevector = np.reshape(self._statevector, self._number_of_qubits * [2])
476
397
 
477
- def _validate_measure_sampling(self, experiment: QasmQobjExperiment) -> None:
478
- """Determine if measure sampling is allowed for an experiment
479
-
480
- Args:
481
- experiment: a qobj experiment.
482
- """
398
+ def _validate_measure_sampling(self, circuit: QuantumCircuit) -> None:
399
+ """Determine if measure sampling is allowed for an experiment"""
400
+ measure_flag = False
483
401
  # If shots=1 we should disable measure sampling.
484
402
  # This is also required for statevector simulator to return the
485
403
  # correct final statevector without silently dropping final measurements.
486
- if self._shots <= 1:
487
- self._sample_measure = False
488
- return
489
-
490
- # Check for config flag
491
- if hasattr(experiment.config, "allows_measure_sampling"):
492
- self._sample_measure = experiment.config.allows_measure_sampling
493
- # If flag isn't found do a simple test to see if a circuit contains
494
- # no reset instructions, and no gates instructions after
495
- # the first measure.
496
- else:
497
- measure_flag = False
498
- for instruction in experiment.instructions:
404
+ if self._shots > 1:
405
+ for instruction in circuit.data:
499
406
  # If circuit contains reset operations we cannot sample
500
407
  if instruction.name == "reset":
501
408
  self._sample_measure = False
@@ -510,114 +417,112 @@ class BasicSimulator(BackendV2):
510
417
  return
511
418
  elif instruction.name == "measure":
512
419
  measure_flag = True
513
- # If we made it to the end of the circuit without returning
514
- # measure sampling is allowed
515
- self._sample_measure = True
420
+ self._sample_measure = measure_flag
516
421
 
517
422
  def run(
518
- self, run_input: QuantumCircuit | list[QuantumCircuit], **backend_options
423
+ self, run_input: QuantumCircuit | list[QuantumCircuit], **run_options
519
424
  ) -> BasicProviderJob:
520
425
  """Run on the backend.
521
426
 
522
427
  Args:
523
- run_input: payload of the experiment
524
- backend_options: backend options
428
+ run_input (QuantumCircuit or list): the QuantumCircuit (or list
429
+ of QuantumCircuit objects) to run
430
+ run_options (kwargs): additional runtime backend options
525
431
 
526
432
  Returns:
527
433
  BasicProviderJob: derived from BaseJob
528
434
 
529
435
  Additional Information:
530
- backend_options: Is a dict of options for the backend. It may contain
531
- * "initial_statevector": vector_like
436
+ * kwarg options specified in ``run_options`` will temporarily override
437
+ any set options of the same name for the current run. These may include:
438
+
439
+ * "initial_statevector": vector-like. The "initial_statevector"
440
+ option specifies a custom initial statevector to be used instead
441
+ of the all-zero state. The size of this vector must correspond to
442
+ the number of qubits in the ``run_input`` argument.
443
+
444
+ * "seed_simulator": int. This is the internal seed for sample
445
+ generation.
532
446
 
533
- The "initial_statevector" option specifies a custom initial
534
- initial statevector for the simulator to be used instead of the all
535
- zero state. This size of this vector must be correct for the number
536
- of qubits in ``run_input`` parameter.
447
+ * "shots": int. Number of shots used in the simulation.
448
+
449
+ * "memory": bool. If True, the result will contain the results
450
+ of every individual shot simulation.
537
451
 
538
452
  Example::
539
453
 
540
- backend_options = {
541
- "initial_statevector": np.array([1, 0, 0, 1j]) / math.sqrt(2),
542
- }
454
+ backend.run(
455
+ circuit_2q,
456
+ initial_statevector = np.array([1, 0, 0, 1j]) / math.sqrt(2)
457
+ )
543
458
  """
544
- # TODO: replace assemble with new run flow. If this is not achieved before 2.0,
545
- # see removal note on `def _assemble`, L192 of qiskit/compiler/assembler.py
546
- from qiskit.compiler.assembler import _assemble
547
-
548
459
  out_options = {}
549
- for key, value in backend_options.items():
460
+ for key, value in run_options.items():
550
461
  if not hasattr(self.options, key):
551
462
  warnings.warn(
552
463
  f"Option {key} is not used by this backend", UserWarning, stacklevel=2
553
464
  )
554
465
  else:
555
466
  out_options[key] = value
556
- qobj = _assemble(run_input, self, **out_options)
557
- qobj_options = qobj.config
558
- self._set_options(qobj_config=qobj_options, backend_options=backend_options)
467
+ self._set_run_options(run_options=run_options)
559
468
  job_id = str(uuid.uuid4())
560
- job = BasicProviderJob(self, job_id, self._run_job(job_id, qobj))
469
+ job = BasicProviderJob(self, job_id, self._run_job(job_id, run_input))
561
470
  return job
562
471
 
563
- def _run_job(self, job_id: str, qobj: QasmQobj) -> Result:
564
- """Run experiments in qobj
472
+ def _run_job(self, job_id: str, run_input) -> Result:
473
+ """Run circuits in run_input.
565
474
 
566
475
  Args:
567
476
  job_id: unique id for the job.
568
- qobj: job description
477
+ run_input: circuits to be run.
569
478
 
570
479
  Returns:
571
480
  Result object
572
481
  """
573
- self._validate(qobj)
482
+ if isinstance(run_input, QuantumCircuit):
483
+ run_input = [run_input]
484
+
485
+ self._validate(run_input)
574
486
  result_list = []
575
- self._shots = qobj.config.shots
576
- self._memory = getattr(qobj.config, "memory", False)
577
- self._qobj_config = qobj.config
578
487
  start = time.time()
579
- with warnings.catch_warnings():
580
- warnings.filterwarnings(
581
- "ignore",
582
- category=DeprecationWarning,
583
- message=r".+qiskit\.providers\.basic_provider\.basic_simulator\..+",
584
- )
585
- for experiment in qobj.experiments:
586
- result_list.append(self.run_experiment(experiment))
488
+ for circuit in run_input:
489
+ result_list.append(self._run_circuit(circuit))
587
490
  end = time.time()
588
491
  result = {
589
492
  "backend_name": self.name,
590
493
  "backend_version": self.backend_version,
591
- "qobj_id": qobj.qobj_id,
592
494
  "job_id": job_id,
593
495
  "results": result_list,
594
496
  "status": "COMPLETED",
595
497
  "success": True,
596
498
  "time_taken": (end - start),
597
- "header": qobj.header.to_dict(),
598
499
  }
500
+
599
501
  return Result.from_dict(result)
600
502
 
601
- @deprecate_func(
602
- since="1.4.0",
603
- removal_timeline="in Qiskit 2.0.0",
604
- additional_msg="This method takes a `QasmQobjExperiment` as input argument. "
605
- "The `Qobj` class and related functionality are part of the deprecated "
606
- "`BackendV1` workflow, and no longer necessary for `BackendV2`. Use `run` instead.",
607
- )
608
- def run_experiment(self, experiment: QasmQobjExperiment) -> dict[str, ...]:
609
- """Run an experiment (circuit) and return a single experiment result.
503
+ def _run_circuit(self, circuit) -> dict:
504
+ """Simulate a single circuit run.
610
505
 
611
506
  Args:
612
- experiment: experiment from qobj experiments list
507
+ circuit: circuit to be run.
613
508
 
614
509
  Returns:
615
510
  A result dictionary which looks something like::
616
-
617
511
  {
618
- "name": name of this experiment (obtained from qobj.experiment header)
512
+ "name": name of this experiment
619
513
  "seed": random seed used for simulation
620
514
  "shots": number of shots used in the simulation
515
+ "header": {
516
+ "name": "circuit-206",
517
+ "n_qubits": 3,
518
+ "qreg_sizes": [['qr', 3]],
519
+ "creg_sizes": [['cr', 3]],
520
+ "qubit_labels": [['qr', 0], ['qr', 1], ['qr', 2]],
521
+ "clbit_labels": [['cr', 0], ['cr', 1], ['cr', 2]],
522
+ "memory_slots": 3,
523
+ "global_phase": 0.0,
524
+ "metadata": {},
525
+ }
621
526
  "data":
622
527
  {
623
528
  "counts": {'0x9: 5, ...},
@@ -631,30 +536,17 @@ class BasicSimulator(BackendV2):
631
536
  BasicProviderError: if an error occurred.
632
537
  """
633
538
  start = time.time()
634
- self._number_of_qubits = experiment.config.n_qubits
635
- self._number_of_cmembits = experiment.config.memory_slots
539
+
540
+ self._number_of_qubits = circuit.num_qubits
541
+ self._number_of_cmembits = circuit.num_clbits
636
542
  self._statevector = 0
637
543
  self._classical_memory = 0
638
- self._classical_register = 0
639
- self._sample_measure = False
640
- global_phase = experiment.header.global_phase
641
544
 
642
545
  # Validate the dimension of initial statevector if set
643
546
  self._validate_initial_statevector()
644
547
 
645
- # Get the seed looking in circuit, qobj, and then random.
646
- if hasattr(experiment.config, "seed_simulator"):
647
- seed_simulator = experiment.config.seed_simulator
648
- elif hasattr(self._qobj_config, "seed_simulator"):
649
- seed_simulator = self._qobj_config.seed_simulator
650
- else:
651
- # For compatibility on Windows force dyte to be int32
652
- # and set the maximum value to be (2 ** 31) - 1
653
- seed_simulator = np.random.randint(2147483647, dtype="int32")
654
-
655
- self._local_random = np.random.default_rng(seed=seed_simulator)
656
548
  # Check if measure sampling is supported for current circuit
657
- self._validate_measure_sampling(experiment)
549
+ self._validate_measure_sampling(circuit)
658
550
 
659
551
  # List of final counts for all shots
660
552
  memory = []
@@ -667,31 +559,18 @@ class BasicSimulator(BackendV2):
667
559
  measure_sample_ops = []
668
560
  else:
669
561
  shots = self._shots
562
+
670
563
  for _ in range(shots):
671
564
  self._initialize_statevector()
672
565
  # apply global_phase
673
- self._statevector *= np.exp(1j * global_phase)
566
+ self._statevector *= np.exp(1j * circuit.global_phase)
674
567
  # Initialize classical memory to all 0
675
568
  self._classical_memory = 0
676
- self._classical_register = 0
677
- for operation in experiment.instructions:
678
- conditional = getattr(operation, "conditional", None)
679
- if isinstance(conditional, int):
680
- conditional_bit_set = (self._classical_register >> conditional) & 1
681
- if not conditional_bit_set:
682
- continue
683
- elif conditional is not None:
684
- mask = int(operation.conditional.mask, 16)
685
- if mask > 0:
686
- value = self._classical_memory & mask
687
- while (mask & 0x1) == 0:
688
- mask >>= 1
689
- value >>= 1
690
- if value != int(operation.conditional.val, 16):
691
- continue
569
+
570
+ for operation in circuit.data:
692
571
  if operation.name == "unitary":
693
- qubits = operation.qubits
694
- gate = operation.params[0]
572
+ qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
573
+ gate = operation.operation.params[0]
695
574
  self._add_unitary(gate, qubits)
696
575
  elif operation.name in ("id", "u0", "delay"):
697
576
  pass
@@ -702,83 +581,50 @@ class BasicSimulator(BackendV2):
702
581
  # Check if single qubit gate
703
582
  elif operation.name in SINGLE_QUBIT_GATES:
704
583
  params = getattr(operation, "params", None)
705
- qubit = operation.qubits[0]
584
+ qubit = [circuit.find_bit(bit).index for bit in operation.qubits][0]
706
585
  gate = single_gate_matrix(operation.name, params)
707
586
  self._add_unitary(gate, [qubit])
708
587
  elif operation.name in TWO_QUBIT_GATES_WITH_PARAMETERS:
709
588
  params = getattr(operation, "params", None)
710
- qubit0 = operation.qubits[0]
711
- qubit1 = operation.qubits[1]
589
+ qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
590
+ qubit0 = qubits[0]
591
+ qubit1 = qubits[1]
712
592
  gate = TWO_QUBIT_GATES_WITH_PARAMETERS[operation.name](*params).to_matrix()
713
593
  self._add_unitary(gate, [qubit0, qubit1])
714
594
  elif operation.name in ("id", "u0"):
715
595
  pass
716
596
  elif operation.name in TWO_QUBIT_GATES:
717
- qubit0 = operation.qubits[0]
718
- qubit1 = operation.qubits[1]
597
+ qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
598
+ qubit0 = qubits[0]
599
+ qubit1 = qubits[1]
719
600
  gate = TWO_QUBIT_GATES[operation.name]
720
601
  self._add_unitary(gate, [qubit0, qubit1])
721
602
  elif operation.name in THREE_QUBIT_GATES:
722
- qubit0 = operation.qubits[0]
723
- qubit1 = operation.qubits[1]
724
- qubit2 = operation.qubits[2]
603
+ qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
604
+ qubit0 = qubits[0]
605
+ qubit1 = qubits[1]
606
+ qubit2 = qubits[2]
725
607
  gate = THREE_QUBIT_GATES[operation.name]
726
608
  self._add_unitary(gate, [qubit0, qubit1, qubit2])
727
609
  # Check if reset
728
610
  elif operation.name == "reset":
729
- qubit = operation.qubits[0]
611
+ qubits = [circuit.find_bit(bit).index for bit in operation.qubits]
612
+ qubit = qubits[0]
730
613
  self._add_reset(qubit)
731
614
  # Check if barrier
732
615
  elif operation.name == "barrier":
733
616
  pass
734
617
  # Check if measure
735
618
  elif operation.name == "measure":
736
- qubit = operation.qubits[0]
737
- cmembit = operation.memory[0]
738
- cregbit = operation.register[0] if hasattr(operation, "register") else None
739
-
619
+ qubit = [circuit.find_bit(bit).index for bit in operation.qubits][0]
620
+ cmembit = [circuit.find_bit(bit).index for bit in operation.clbits][0]
740
621
  if self._sample_measure:
741
622
  # If sampling measurements record the qubit and cmembit
742
623
  # for this measurement for later sampling
743
624
  measure_sample_ops.append((qubit, cmembit))
744
625
  else:
745
626
  # If not sampling perform measurement as normal
746
- self._add_measure(qubit, cmembit, cregbit)
747
- elif operation.name == "bfunc":
748
- mask = int(operation.mask, 16)
749
- relation = operation.relation
750
- val = int(operation.val, 16)
751
-
752
- cregbit = operation.register
753
- cmembit = operation.memory if hasattr(operation, "memory") else None
754
-
755
- compared = (self._classical_register & mask) - val
756
-
757
- if relation == "==":
758
- outcome = compared == 0
759
- elif relation == "!=":
760
- outcome = compared != 0
761
- elif relation == "<":
762
- outcome = compared < 0
763
- elif relation == "<=":
764
- outcome = compared <= 0
765
- elif relation == ">":
766
- outcome = compared > 0
767
- elif relation == ">=":
768
- outcome = compared >= 0
769
- else:
770
- raise BasicProviderError("Invalid boolean function relation.")
771
-
772
- # Store outcome in register and optionally memory slot
773
- regbit = 1 << cregbit
774
- self._classical_register = (self._classical_register & (~regbit)) | (
775
- int(outcome) << cregbit
776
- )
777
- if cmembit is not None:
778
- membit = 1 << cmembit
779
- self._classical_memory = (self._classical_memory & (~membit)) | (
780
- int(outcome) << cmembit
781
- )
627
+ self._add_measure(qubit, cmembit)
782
628
  else:
783
629
  backend = self.name
784
630
  err_msg = '{0} encountered unrecognized operation "{1}"'
@@ -794,39 +640,53 @@ class BasicSimulator(BackendV2):
794
640
  outcome = bin(self._classical_memory)[2:]
795
641
  memory.append(hex(int(outcome, 2)))
796
642
 
797
- # Add data
643
+ # Add counts to result data
798
644
  data = {"counts": dict(Counter(memory))}
799
- # Optionally add memory list
645
+ # Optionally, add memory list to result data
800
646
  if self._memory:
801
647
  data["memory"] = memory
802
648
  end = time.time()
649
+
650
+ # Define header to be used by Result class to interpret counts
651
+ header = {
652
+ "name": circuit.name,
653
+ "n_qubits": circuit.num_qubits,
654
+ "qreg_sizes": [[qreg.name, qreg.size] for qreg in circuit.qregs],
655
+ "creg_sizes": [[creg.name, creg.size] for creg in circuit.cregs],
656
+ "qubit_labels": [[qreg.name, j] for qreg in circuit.qregs for j in range(qreg.size)],
657
+ "clbit_labels": [[creg.name, j] for creg in circuit.cregs for j in range(creg.size)],
658
+ "memory_slots": circuit.num_clbits,
659
+ "global_phase": circuit.global_phase,
660
+ "metadata": circuit.metadata if circuit.metadata is not None else {},
661
+ }
662
+ # Return result dictionary
803
663
  return {
804
- "name": experiment.header.name,
805
- "seed_simulator": seed_simulator,
664
+ "name": circuit.name,
665
+ "seed_simulator": self._seed_simulator,
806
666
  "shots": self._shots,
807
667
  "data": data,
808
668
  "status": "DONE",
809
669
  "success": True,
670
+ "header": header,
810
671
  "time_taken": (end - start),
811
- "header": experiment.header.to_dict(),
812
672
  }
813
673
 
814
- def _validate(self, qobj: QasmQobj) -> None:
815
- """Semantic validations of the qobj which cannot be done via schemas."""
816
- n_qubits = qobj.config.n_qubits
674
+ def _validate(self, run_input: list[QuantumCircuit]) -> None:
675
+ """Semantic validations of the input."""
817
676
  max_qubits = self.MAX_QUBITS_MEMORY
818
- if n_qubits > max_qubits:
819
- raise BasicProviderError(
820
- f"Number of qubits {n_qubits} is greater than maximum ({max_qubits}) "
821
- f'for "{self.name}".'
822
- )
823
- for experiment in qobj.experiments:
824
- name = experiment.header.name
825
- if experiment.config.memory_slots == 0:
677
+
678
+ for circuit in run_input:
679
+ if circuit.num_qubits > max_qubits:
680
+ raise BasicProviderError(
681
+ f"Number of qubits {circuit.num_qubits} is greater than maximum ({max_qubits}) "
682
+ f'for "{self.name}".'
683
+ )
684
+ name = circuit.name
685
+ if len(circuit.cregs) == 0:
826
686
  logger.warning(
827
687
  'No classical registers in circuit "%s", counts will be empty.', name
828
688
  )
829
- elif "measure" not in [op.name for op in experiment.instructions]:
689
+ elif "measure" not in [op.name for op in circuit.data]:
830
690
  logger.warning(
831
691
  'No measurements in circuit "%s", classical register will remain all zeros.',
832
692
  name,