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 @@ from __future__ import annotations
17
17
  __all__ = [
18
18
  "ExprVisitor",
19
19
  "iter_vars",
20
+ "iter_identifiers",
20
21
  "structurally_equivalent",
22
+ "is_lvalue",
21
23
  ]
22
24
 
23
25
  import typing
@@ -43,6 +45,9 @@ class ExprVisitor(typing.Generic[_T_co]):
43
45
  def visit_var(self, node: expr.Var, /) -> _T_co: # pragma: no cover
44
46
  return self.visit_generic(node)
45
47
 
48
+ def visit_stretch(self, node: expr.Stretch, /) -> _T_co: # pragma: no cover
49
+ return self.visit_generic(node)
50
+
46
51
  def visit_value(self, node: expr.Value, /) -> _T_co: # pragma: no cover
47
52
  return self.visit_generic(node)
48
53
 
@@ -65,6 +70,36 @@ class _VarWalkerImpl(ExprVisitor[typing.Iterable[expr.Var]]):
65
70
  def visit_var(self, node, /):
66
71
  yield node
67
72
 
73
+ def visit_stretch(self, node, /):
74
+ yield from ()
75
+
76
+ def visit_value(self, node, /):
77
+ yield from ()
78
+
79
+ def visit_unary(self, node, /):
80
+ yield from node.operand.accept(self)
81
+
82
+ def visit_binary(self, node, /):
83
+ yield from node.left.accept(self)
84
+ yield from node.right.accept(self)
85
+
86
+ def visit_cast(self, node, /):
87
+ yield from node.operand.accept(self)
88
+
89
+ def visit_index(self, node, /):
90
+ yield from node.target.accept(self)
91
+ yield from node.index.accept(self)
92
+
93
+
94
+ class _IdentWalkerImpl(ExprVisitor[typing.Iterable[typing.Union[expr.Var, expr.Stretch]]]):
95
+ __slots__ = ()
96
+
97
+ def visit_var(self, node, /):
98
+ yield node
99
+
100
+ def visit_stretch(self, node, /):
101
+ yield node
102
+
68
103
  def visit_value(self, node, /):
69
104
  yield from ()
70
105
 
@@ -84,6 +119,7 @@ class _VarWalkerImpl(ExprVisitor[typing.Iterable[expr.Var]]):
84
119
 
85
120
 
86
121
  _VAR_WALKER = _VarWalkerImpl()
122
+ _IDENT_WALKER = _IdentWalkerImpl()
87
123
 
88
124
 
89
125
  def iter_vars(node: expr.Expr) -> typing.Iterator[expr.Var]:
@@ -102,10 +138,39 @@ def iter_vars(node: expr.Expr) -> typing.Iterator[expr.Var]:
102
138
  for node in expr.iter_vars(expr.bit_and(expr.bit_not(cr1), cr2)):
103
139
  if isinstance(node.var, ClassicalRegister):
104
140
  print(node.var.name)
141
+
142
+ .. seealso::
143
+ :func:`iter_identifiers`
144
+ Get an iterator over all identifier nodes in the expression, including
145
+ both :class:`~.expr.Var` and :class:`~.expr.Stretch` nodes.
105
146
  """
106
147
  yield from node.accept(_VAR_WALKER)
107
148
 
108
149
 
150
+ def iter_identifiers(node: expr.Expr) -> typing.Iterator[typing.Union[expr.Var, expr.Stretch]]:
151
+ """Get an iterator over the :class:`~.expr.Var` and :class:`~.expr.Stretch`
152
+ nodes referenced at any level in the given :class:`~.expr.Expr`.
153
+
154
+ Examples:
155
+ Print out the name of each :class:`.ClassicalRegister` encountered::
156
+
157
+ from qiskit.circuit import ClassicalRegister
158
+ from qiskit.circuit.classical import expr
159
+
160
+ cr1 = ClassicalRegister(3, "a")
161
+ cr2 = ClassicalRegister(3, "b")
162
+
163
+ for node in expr.iter_vars(expr.bit_and(expr.bit_not(cr1), cr2)):
164
+ if isinstance(node.var, ClassicalRegister):
165
+ print(node.var.name)
166
+
167
+ .. seealso::
168
+ :func:`iter_vars`
169
+ Get an iterator over just the :class:`~.expr.Var` nodes in the expression.
170
+ """
171
+ yield from node.accept(_IDENT_WALKER)
172
+
173
+
109
174
  class _StructuralEquivalenceImpl(ExprVisitor[bool]):
110
175
  # The strategy here is to continue to do regular double dispatch through the visitor format,
111
176
  # since we simply exit out with a ``False`` as soon as the structure of the two trees isn't the
@@ -134,6 +199,11 @@ class _StructuralEquivalenceImpl(ExprVisitor[bool]):
134
199
  other_var = self.other.var
135
200
  return self_var == other_var
136
201
 
202
+ def visit_stretch(self, node, /):
203
+ if self.other.__class__ is not node.__class__:
204
+ return False
205
+ return node.var == self.other.var
206
+
137
207
  def visit_value(self, node, /):
138
208
  return (
139
209
  node.__class__ is self.other.__class__
@@ -240,6 +310,9 @@ class _IsLValueImpl(ExprVisitor[bool]):
240
310
  def visit_var(self, node, /):
241
311
  return True
242
312
 
313
+ def visit_stretch(self, node, /):
314
+ return False
315
+
243
316
  def visit_value(self, node, /):
244
317
  return False
245
318
 
@@ -268,6 +341,8 @@ def is_lvalue(node: expr.Expr, /) -> bool:
268
341
  the scope that attempts to write to it. This would be an access property of the containing
269
342
  program, however, and not an inherent property of the expression system.
270
343
 
344
+ A constant expression is never an lvalue.
345
+
271
346
  Examples:
272
347
  Literal values are never l-values; there's no memory location associated with (for example)
273
348
  the constant ``1``::
@@ -33,16 +33,15 @@ data, and it's best to point to the same instance of the data where possible rat
33
33
  heap-allocating a new version of the same thing. Where possible, the class constructors will return
34
34
  singleton instances to facilitate this.
35
35
 
36
- The two different types available are for Booleans (corresponding to :class:`.Clbit` and the
37
- literals ``True`` and ``False``), and unsigned integers (corresponding to
38
- :class:`.ClassicalRegister` and Python integers).
36
+ The :class:`Bool` type represents :class:`.Clbit` and the literals ``True`` and ``False``, the
37
+ :class:`Uint` type represents :class:`.ClassicalRegister` and Python integers, the :class:`Float`
38
+ type represents Python floats, and the :class:`Duration` type represents a duration for use in
39
+ timing-aware circuit operations.
39
40
 
40
41
  .. autoclass:: Bool
41
42
  .. autoclass:: Uint
42
-
43
- Note that :class:`Uint` defines a family of types parametrized by their width; it is not one single
44
- type, which may be slightly different to the 'classical' programming languages you are used to.
45
-
43
+ .. autoclass:: Float
44
+ .. autoclass:: Duration
46
45
 
47
46
  Working with types
48
47
  ==================
@@ -89,12 +88,17 @@ embedded into the :mod:`types` module. You can query the casting kinds using :f
89
88
  The return values from this function are an enumeration explaining the types of cast that are
90
89
  allowed from the left type to the right type.
91
90
 
91
+ Note that casts between :class:`Float` and :class:`Uint` are considered dangerous in either
92
+ direction, and must be done explicitly.
93
+
92
94
  .. autoclass:: CastKind
93
95
  """
94
96
 
95
97
  __all__ = [
96
98
  "Type",
97
99
  "Bool",
100
+ "Duration",
101
+ "Float",
98
102
  "Uint",
99
103
  "Ordering",
100
104
  "order",
@@ -105,5 +109,5 @@ __all__ = [
105
109
  "cast_kind",
106
110
  ]
107
111
 
108
- from .types import Type, Bool, Uint
112
+ from .types import Type, Bool, Duration, Float, Uint
109
113
  from .ordering import Ordering, order, is_subtype, is_supertype, greater, CastKind, cast_kind
@@ -26,7 +26,7 @@ __all__ = [
26
26
 
27
27
  import enum
28
28
 
29
- from .types import Type, Bool, Uint
29
+ from .types import Type, Bool, Duration, Float, Uint
30
30
 
31
31
 
32
32
  # While the type system is simple, it's overkill to represent the complete partial ordering graph of
@@ -55,10 +55,6 @@ class Ordering(enum.Enum):
55
55
  return str(self)
56
56
 
57
57
 
58
- def _order_bool_bool(_a: Bool, _b: Bool, /) -> Ordering:
59
- return Ordering.EQUAL
60
-
61
-
62
58
  def _order_uint_uint(left: Uint, right: Uint, /) -> Ordering:
63
59
  if left.width < right.width:
64
60
  return Ordering.LESS
@@ -68,8 +64,10 @@ def _order_uint_uint(left: Uint, right: Uint, /) -> Ordering:
68
64
 
69
65
 
70
66
  _ORDERERS = {
71
- (Bool, Bool): _order_bool_bool,
67
+ (Bool, Bool): lambda _a, _b, /: Ordering.EQUAL,
72
68
  (Uint, Uint): _order_uint_uint,
69
+ (Float, Float): lambda _a, _b, /: Ordering.EQUAL,
70
+ (Duration, Duration): lambda _a, _b, /: Ordering.EQUAL,
73
71
  }
74
72
 
75
73
 
@@ -195,8 +193,14 @@ def _uint_cast(from_: Uint, to_: Uint, /) -> CastKind:
195
193
  _ALLOWED_CASTS = {
196
194
  (Bool, Bool): lambda _a, _b, /: CastKind.EQUAL,
197
195
  (Bool, Uint): lambda _a, _b, /: CastKind.LOSSLESS,
196
+ (Bool, Float): lambda _a, _b, /: CastKind.LOSSLESS,
198
197
  (Uint, Bool): lambda _a, _b, /: CastKind.IMPLICIT,
199
198
  (Uint, Uint): _uint_cast,
199
+ (Uint, Float): lambda _a, _b, /: CastKind.DANGEROUS,
200
+ (Float, Float): lambda _a, _b, /: CastKind.EQUAL,
201
+ (Float, Uint): lambda _a, _b, /: CastKind.DANGEROUS,
202
+ (Float, Bool): lambda _a, _b, /: CastKind.DANGEROUS,
203
+ (Duration, Duration): lambda _a, _b, /: CastKind.EQUAL,
200
204
  }
201
205
 
202
206
 
@@ -205,7 +209,10 @@ def cast_kind(from_: Type, to_: Type, /) -> CastKind:
205
209
 
206
210
  Examples:
207
211
 
208
- .. code-block:: python
212
+ .. plot::
213
+ :include-source:
214
+ :nofigs:
215
+
209
216
 
210
217
  >>> from qiskit.circuit.classical import types
211
218
  >>> types.cast_kind(types.Bool(), types.Bool())
@@ -22,6 +22,8 @@ from __future__ import annotations
22
22
  __all__ = [
23
23
  "Type",
24
24
  "Bool",
25
+ "Duration",
26
+ "Float",
25
27
  "Uint",
26
28
  ]
27
29
 
@@ -115,3 +117,37 @@ class Uint(Type):
115
117
 
116
118
  def __eq__(self, other):
117
119
  return isinstance(other, Uint) and self.width == other.width
120
+
121
+
122
+ @typing.final
123
+ class Float(Type, metaclass=_Singleton):
124
+ """An IEEE-754 double-precision floating point number.
125
+ In the future, this may also be used to represent other fixed-width floats.
126
+ """
127
+
128
+ __slots__ = ()
129
+
130
+ def __repr__(self):
131
+ return "Float()"
132
+
133
+ def __hash__(self):
134
+ return hash(self.__class__)
135
+
136
+ def __eq__(self, other):
137
+ return isinstance(other, Float)
138
+
139
+
140
+ @typing.final
141
+ class Duration(Type, metaclass=_Singleton):
142
+ """A length of time, possibly negative."""
143
+
144
+ __slots__ = ()
145
+
146
+ def __repr__(self):
147
+ return "Duration()"
148
+
149
+ def __hash__(self):
150
+ return hash(self.__class__)
151
+
152
+ def __eq__(self, other):
153
+ return isinstance(other, Duration)
@@ -12,6 +12,7 @@
12
12
 
13
13
  """Code from commutative_analysis pass that checks commutation relations between DAG nodes."""
14
14
 
15
+ from __future__ import annotations
15
16
  from typing import List, Union, Set, Optional
16
17
 
17
18
  from qiskit.circuit.operation import Operation
@@ -19,11 +20,31 @@ from qiskit._accelerate.commutation_checker import CommutationChecker as RustChe
19
20
 
20
21
 
21
22
  class CommutationChecker:
22
- """This code is essentially copy-pasted from commutative_analysis.py.
23
- This code cleverly hashes commutativity and non-commutativity results between DAG nodes and seems
24
- quite efficient for large Clifford circuits.
25
- They may be other possible efficiency improvements: using rule-based commutativity analysis,
26
- evicting from the cache less useful entries, etc.
23
+ r"""Check commutations of two operations.
24
+
25
+ Two unitaries :math:`A` and :math:`B` on :math:`n` qubits commute if
26
+
27
+ .. math::
28
+
29
+ \frac{2^n F_{\text{process}}(AB, BA) + 1}{2^n + 1} > 1 - \varepsilon,
30
+
31
+ where
32
+
33
+ .. math::
34
+
35
+ F_{\text{process}}(U_1, U_2) = \left|\frac{\mathrm{Tr}(U_1 U_2^\dagger)}{2^n} \right|^2,
36
+
37
+ and we set :math:`\varepsilon` to :math:`10^{-12}` to account for round-off errors on
38
+ few-qubit systems. This metric is chosen for consistency with other closeness checks in
39
+ Qiskit.
40
+
41
+ When possible, commutation relations are queried from a lookup table. This is the case
42
+ for standard gates without parameters (such as :class:`.XGate` or :class:`.HGate`) or
43
+ gates with free parameters (such as :class:`.RXGate` with a :class:`.ParameterExpression` as
44
+ angle). Otherwise, a matrix-based check is performed, where two operations are said to
45
+ commute, if the average gate fidelity of performing the commutation is above a certain threshold
46
+ (see ``approximation_degree``). The result of this commutation is then added to the
47
+ cached lookup table.
27
48
  """
28
49
 
29
50
  def __init__(
@@ -40,9 +61,10 @@ class CommutationChecker:
40
61
  op1,
41
62
  op2,
42
63
  max_num_qubits: int = 3,
64
+ approximation_degree: float = 1.0,
43
65
  ) -> bool:
44
66
  """Checks if two DAGOpNodes commute."""
45
- return self.cc.commute_nodes(op1, op2, max_num_qubits)
67
+ return self.cc.commute_nodes(op1, op2, max_num_qubits, approximation_degree)
46
68
 
47
69
  def commute(
48
70
  self,
@@ -53,6 +75,7 @@ class CommutationChecker:
53
75
  qargs2: List,
54
76
  cargs2: List,
55
77
  max_num_qubits: int = 3,
78
+ approximation_degree: float = 1.0,
56
79
  ) -> bool:
57
80
  """
58
81
  Checks if two Operations commute. The return value of `True` means that the operations
@@ -69,11 +92,15 @@ class CommutationChecker:
69
92
  cargs2: second operation's clbits.
70
93
  max_num_qubits: the maximum number of qubits to consider, the check may be skipped if
71
94
  the number of qubits for either operation exceeds this amount.
95
+ approximation_degree: If the average gate fidelity in between the two operations
96
+ is above this number (up to ``1e-12``) they are assumed to commute.
72
97
 
73
98
  Returns:
74
99
  bool: whether two operations commute.
75
100
  """
76
- return self.cc.commute(op1, qargs1, cargs1, op2, qargs2, cargs2, max_num_qubits)
101
+ return self.cc.commute(
102
+ op1, qargs1, cargs1, op2, qargs2, cargs2, max_num_qubits, approximation_degree
103
+ )
77
104
 
78
105
  def num_cached_entries(self):
79
106
  """Returns number of cached entries"""
@@ -18,11 +18,42 @@ from .control_flow import ControlFlowOp
18
18
  from .continue_loop import ContinueLoopOp
19
19
  from .break_loop import BreakLoopOp
20
20
 
21
+ from .box import BoxOp
21
22
  from .if_else import IfElseOp
22
23
  from .while_loop import WhileLoopOp
23
24
  from .for_loop import ForLoopOp
24
25
  from .switch_case import SwitchCaseOp, CASE_DEFAULT
25
26
 
26
27
 
27
- CONTROL_FLOW_OP_NAMES = frozenset(("for_loop", "while_loop", "if_else", "switch_case"))
28
+ CONTROL_FLOW_OP_NAMES = frozenset(("for_loop", "while_loop", "if_else", "switch_case", "box"))
28
29
  """Set of the instruction names of Qiskit's known control-flow operations."""
30
+
31
+
32
+ def get_control_flow_name_mapping():
33
+ """Return a dictionary mapping the names of control-flow operations
34
+ to their corresponding classes."
35
+
36
+ Examples:
37
+
38
+ .. code-block:: python
39
+
40
+ from qiskit.circuit import get_control_flow_name_mapping
41
+
42
+ ctrl_flow_name_map = get_control_flow_name_mapping()
43
+ if_else_object = ctrl_flow_name_map["if_else"]
44
+
45
+ print(if_else_object)
46
+
47
+ .. code-block:: text
48
+
49
+ <class 'qiskit.circuit.controlflow.if_else.IfElseOp'>
50
+ """
51
+
52
+ name_mapping = {
53
+ "if_else": IfElseOp,
54
+ "while_loop": WhileLoopOp,
55
+ "for_loop": ForLoopOp,
56
+ "switch_case": SwitchCaseOp,
57
+ "box": BoxOp,
58
+ }
59
+ return name_mapping
@@ -17,14 +17,16 @@ from __future__ import annotations
17
17
  import dataclasses
18
18
  from typing import Iterable, Tuple, Set, Union, TypeVar, TYPE_CHECKING
19
19
 
20
+ from qiskit.circuit import ( # pylint: disable=cyclic-import
21
+ ClassicalRegister,
22
+ Clbit,
23
+ QuantumRegister,
24
+ )
20
25
  from qiskit.circuit.classical import expr, types
21
26
  from qiskit.circuit.exceptions import CircuitError
22
- from qiskit.circuit.register import Register
23
- from qiskit.circuit.classicalregister import ClassicalRegister, Clbit
24
- from qiskit.circuit.quantumregister import QuantumRegister
25
27
 
26
28
  if TYPE_CHECKING:
27
- from qiskit.circuit import QuantumCircuit
29
+ from qiskit.circuit import QuantumCircuit, Register
28
30
 
29
31
  _ConditionT = TypeVar(
30
32
  "_ConditionT", bound=Union[Tuple[ClassicalRegister, int], Tuple[Clbit, int], expr.Expr]
@@ -180,10 +182,12 @@ def _unify_circuit_resources_rebuild( # pylint: disable=invalid-name # (it's t
180
182
  *circuit.cregs,
181
183
  global_phase=circuit.global_phase,
182
184
  inputs=circuit.iter_input_vars(),
183
- captures=circuit.iter_captured_vars(),
185
+ captures=circuit.iter_captures(),
184
186
  )
185
187
  for var in circuit.iter_declared_vars():
186
188
  out.add_uninitialized_var(var)
189
+ for stretch in circuit.iter_declared_stretches():
190
+ out.add_stretch(stretch)
187
191
  for instruction in circuit.data:
188
192
  out._append(instruction)
189
193
  out_circuits.append(out)
@@ -0,0 +1,163 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2025.
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
+ """Simple box basic block."""
14
+
15
+ from __future__ import annotations
16
+
17
+ import typing
18
+
19
+ from qiskit.circuit.exceptions import CircuitError
20
+ from .control_flow import ControlFlowOp
21
+
22
+ if typing.TYPE_CHECKING:
23
+ from qiskit.circuit import QuantumCircuit
24
+
25
+
26
+ class BoxOp(ControlFlowOp):
27
+ """A scoped "box" of operations on a circuit that are treated atomically in the greater context.
28
+
29
+ A "box" is a control-flow construct that is entered unconditionally. The contents of the box
30
+ behave somewhat as if the start and end of the box were barriers, except it is permissible to
31
+ commute operations "all the way" through the box. The box is also an explicit scope for the
32
+ purposes of variables, stretches and compiler passes.
33
+
34
+ Typically you create this by using the builder-interface form of :meth:`.QuantumCircuit.box`.
35
+ """
36
+
37
+ def __init__(
38
+ self,
39
+ body: QuantumCircuit,
40
+ duration: None = None,
41
+ unit: typing.Literal["dt", "s", "ms", "us", "ns", "ps"] = "dt",
42
+ label: str | None = None,
43
+ ):
44
+ """
45
+ Default constructor of :class:`BoxOp`.
46
+
47
+ Args:
48
+ body: the circuit to use as the body of the box. This should explicit close over any
49
+ :class:`.expr.Var` variables that must be incident from the outer circuit. The
50
+ expected number of qubit and clbits for the resulting instruction are inferred from
51
+ the number in the circuit, even if they are idle.
52
+ duration: an optional duration for the box as a whole.
53
+ unit: the unit of the ``duration``.
54
+ label: an optional string label for the instruction.
55
+ """
56
+ super().__init__("box", body.num_qubits, body.num_clbits, [body], label=label)
57
+ self.duration = duration
58
+ self.unit = unit
59
+
60
+ @property
61
+ def params(self):
62
+ return self._params
63
+
64
+ @params.setter
65
+ def params(self, parameters):
66
+ # pylint: disable=cyclic-import
67
+ from qiskit.circuit import QuantumCircuit
68
+
69
+ (body,) = parameters
70
+
71
+ if not isinstance(body, QuantumCircuit):
72
+ raise CircuitError(
73
+ "BoxOp expects a body parameter of type "
74
+ f"QuantumCircuit, but received {type(body)}."
75
+ )
76
+
77
+ if body.num_qubits != self.num_qubits or body.num_clbits != self.num_clbits:
78
+ raise CircuitError(
79
+ "Attempted to assign a body parameter with a num_qubits or "
80
+ "num_clbits different than that of the BoxOp. "
81
+ f"BoxOp num_qubits/clbits: {self.num_qubits}/{self.num_clbits} "
82
+ f"Supplied body num_qubits/clbits: {body.num_qubits}/{body.num_clbits}."
83
+ )
84
+
85
+ self._params = [body]
86
+
87
+ @property
88
+ def body(self):
89
+ """The ``body`` :class:`.QuantumCircuit` of the operation.
90
+
91
+ This is the same as object returned as the sole entry in :meth:`params` and :meth:`blocks`.
92
+ """
93
+ # Not settable via this property; the only meaningful way to replace a body is via
94
+ # larger `QuantumCircuit` methods, or using `replace_blocks`.
95
+ return self.params[0]
96
+
97
+ @property
98
+ def blocks(self):
99
+ return (self._params[0],)
100
+
101
+ def replace_blocks(self, blocks):
102
+ (body,) = blocks
103
+ return BoxOp(body, duration=self.duration, unit=self.unit, label=self.label)
104
+
105
+ def __eq__(self, other):
106
+ return (
107
+ isinstance(other, BoxOp)
108
+ and self.duration == other.duration
109
+ and self.unit == other.unit
110
+ and super().__eq__(other)
111
+ )
112
+
113
+
114
+ class BoxContext:
115
+ """Context-manager that powers :meth:`.QuantumCircuit.box`.
116
+
117
+ This is not part of the public interface, and should not be instantiated by users.
118
+ """
119
+
120
+ __slots__ = ("_circuit", "_duration", "_unit", "_label")
121
+
122
+ def __init__(
123
+ self,
124
+ circuit: QuantumCircuit,
125
+ *,
126
+ duration: None = None,
127
+ unit: typing.Literal["dt", "s", "ms", "us", "ns", "ps"] = "dt",
128
+ label: str | None = None,
129
+ ):
130
+ """
131
+ Args:
132
+ circuit: the outermost scope of the circuit under construction.
133
+ duration: the final duration of the box.
134
+ unit: the unit of ``duration``.
135
+ label: an optional label for the box.
136
+ """
137
+ self._circuit = circuit
138
+ self._duration = duration
139
+ self._unit = unit
140
+ self._label = label
141
+
142
+ def __enter__(self):
143
+ # For a box to have the semantics of internal qubit alignment with a resolvable duration, we
144
+ # can't allow conditional jumps to exit it. Technically an unconditional `break` or
145
+ # `continue` could work, but we're not getting into that.
146
+ self._circuit._push_scope(allow_jumps=False)
147
+
148
+ def __exit__(self, exc_type, exc_val, exc_tb):
149
+ if exc_type is not None:
150
+ # If we're leaving the context manager because an exception was raised, there's nothing
151
+ # to do except restore the circuit state.
152
+ self._circuit._pop_scope()
153
+ return False
154
+ scope = self._circuit._pop_scope()
155
+ # Boxes do not need to pass any further resources in, because there's no jumps out of a
156
+ # `box` permitted.
157
+ body = scope.build(scope.qubits(), scope.clbits())
158
+ self._circuit.append(
159
+ BoxOp(body, duration=self._duration, unit=self._unit, label=self._label),
160
+ body.qubits,
161
+ body.clbits,
162
+ )
163
+ return False
@@ -48,7 +48,7 @@ class BreakLoopPlaceholder(InstructionPlaceholder):
48
48
 
49
49
  def concrete_instruction(self, qubits, clbits):
50
50
  return (
51
- self._copy_mutable_properties(BreakLoopOp(len(qubits), len(clbits), label=self.label)),
51
+ BreakLoopOp(len(qubits), len(clbits), label=self.label),
52
52
  InstructionResources(qubits=tuple(qubits), clbits=tuple(clbits)),
53
53
  )
54
54