qiskit 1.4.0__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 +7 -140
  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 +168 -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 +5 -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 +27 -12
  291. qiskit/visualization/timeline/interface.py +23 -18
  292. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
  295. {qiskit-1.4.0.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.0.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -34,12 +34,6 @@ def dagdependency_to_circuit(dagdependency):
34
34
  )
35
35
  circuit.metadata = dagdependency.metadata
36
36
 
37
- if hasattr(dagdependency, "_calibrations_prop"):
38
- circuit._calibrations_prop = dagdependency._calibrations_prop
39
- else:
40
- # This can be _DAGDependencyV2
41
- circuit._calibrations_prop = dagdependency.calibrations
42
-
43
37
  for node in dagdependency.topological_nodes():
44
38
  circuit._append(CircuitInstruction(node.op.copy(), node.qargs, node.cargs))
45
39
 
@@ -12,7 +12,6 @@
12
12
 
13
13
  """Helper function for converting a dag dependency to a dag circuit"""
14
14
  from qiskit.dagcircuit.dagcircuit import DAGCircuit
15
- from qiskit.dagcircuit.dagdependency import DAGDependency
16
15
 
17
16
 
18
17
  def dagdependency_to_dag(dagdependency):
@@ -45,10 +44,5 @@ def dagdependency_to_dag(dagdependency):
45
44
 
46
45
  # copy metadata
47
46
  dagcircuit.global_phase = dagdependency.global_phase
48
- if isinstance(dagdependency, DAGDependency):
49
- dagcircuit._calibrations_prop = dagdependency._calibrations_prop
50
- else:
51
- # This can be _DAGDependencyV2
52
- dagcircuit._calibrations_prop = dagdependency.calibrations
53
47
 
54
48
  return dagcircuit
@@ -139,7 +139,9 @@ class BlockCollector:
139
139
  """Returns whether there are uncollected (pending) nodes"""
140
140
  return len(self._pending_nodes) > 0
141
141
 
142
- def collect_matching_block(self, filter_fn: Callable) -> list[DAGOpNode | DAGDepNode]:
142
+ def collect_matching_block(
143
+ self, filter_fn: Callable, max_block_width: int | None
144
+ ) -> list[DAGOpNode | DAGDepNode]:
143
145
  """Iteratively collects the largest block of input nodes (that is, nodes with
144
146
  ``_in_degree`` equal to 0) that match a given filtering function.
145
147
  Examples of this include collecting blocks of swap gates,
@@ -150,6 +152,7 @@ class BlockCollector:
150
152
  Returns the block of collected nodes.
151
153
  """
152
154
  current_block = []
155
+ current_block_qargs = set()
153
156
  unprocessed_pending_nodes = self._pending_nodes
154
157
  self._pending_nodes = []
155
158
 
@@ -158,19 +161,28 @@ class BlockCollector:
158
161
  # - any node that match filter_fn is added to the current_block,
159
162
  # and some of its successors may be moved to unprocessed_pending_nodes.
160
163
  while unprocessed_pending_nodes:
161
- new_pending_nodes = []
162
- for node in unprocessed_pending_nodes:
163
- if filter_fn(node):
164
- current_block.append(node)
165
-
166
- # update the _in_degree of node's successors
167
- for suc in self._direct_succs(node):
168
- self._in_degree[suc] -= 1
169
- if self._in_degree[suc] == 0:
170
- new_pending_nodes.append(suc)
171
- else:
172
- self._pending_nodes.append(node)
173
- unprocessed_pending_nodes = new_pending_nodes
164
+ node = unprocessed_pending_nodes.pop()
165
+
166
+ if max_block_width is not None:
167
+ # for efficiency, only update new_qargs when max_block_width is specified
168
+ new_qargs = current_block_qargs.copy()
169
+ new_qargs.update(node.qargs)
170
+ width_within_budget = len(new_qargs) <= max_block_width
171
+ else:
172
+ new_qargs = set()
173
+ width_within_budget = True
174
+
175
+ if filter_fn(node) and width_within_budget:
176
+ current_block.append(node)
177
+ current_block_qargs = new_qargs
178
+
179
+ # update the _in_degree of node's successors
180
+ for suc in self._direct_succs(node):
181
+ self._in_degree[suc] -= 1
182
+ if self._in_degree[suc] == 0:
183
+ unprocessed_pending_nodes.append(suc)
184
+ else:
185
+ self._pending_nodes.append(node)
174
186
 
175
187
  return current_block
176
188
 
@@ -181,6 +193,7 @@ class BlockCollector:
181
193
  min_block_size=2,
182
194
  split_layers=False,
183
195
  collect_from_back=False,
196
+ max_block_width=None,
184
197
  ):
185
198
  """Collects all blocks that match a given filtering function filter_fn.
186
199
  This iteratively finds the largest block that does not match filter_fn,
@@ -193,6 +206,8 @@ class BlockCollector:
193
206
  qubit subsets. The option ``split_layers`` allows to split collected blocks
194
207
  into layers of non-overlapping instructions. The option ``min_block_size``
195
208
  specifies the minimum number of gates in the block for the block to be collected.
209
+ The option ``max_block_width`` specificies the maximum number of qubits over
210
+ which a block can be defined.
196
211
 
197
212
  By default, blocks are collected in the direction from the inputs towards the outputs
198
213
  of the circuit. The option ``collect_from_back`` allows to change this direction,
@@ -212,8 +227,8 @@ class BlockCollector:
212
227
  # Iteratively collect non-matching and matching blocks.
213
228
  matching_blocks: list[list[DAGOpNode | DAGDepNode]] = []
214
229
  while self._have_uncollected_nodes():
215
- self.collect_matching_block(not_filter_fn)
216
- matching_block = self.collect_matching_block(filter_fn)
230
+ self.collect_matching_block(not_filter_fn, max_block_width=None)
231
+ matching_block = self.collect_matching_block(filter_fn, max_block_width=max_block_width)
217
232
  if matching_block:
218
233
  matching_blocks.append(matching_block)
219
234
 
@@ -377,10 +392,7 @@ class BlockCollapser:
377
392
  wire_pos_map.update({qb: ix for ix, qb in enumerate(sorted_clbits)})
378
393
 
379
394
  for node in block:
380
- instructions = qc.append(CircuitInstruction(node.op, node.qargs, node.cargs))
381
- cond = getattr(node.op, "_condition", None)
382
- if cond is not None:
383
- instructions.c_if(*cond)
395
+ qc.append(CircuitInstruction(node.op, node.qargs, node.cargs))
384
396
 
385
397
  # Collapse this quantum circuit into an operation.
386
398
  op = collapse_fn(qc)
@@ -17,19 +17,17 @@ from __future__ import annotations
17
17
  import math
18
18
  import heapq
19
19
  import typing
20
- from collections import OrderedDict, defaultdict
20
+ from collections import OrderedDict
21
21
  from collections.abc import Iterator
22
22
 
23
23
  import rustworkx as rx
24
24
 
25
25
  from qiskit.circuit.commutation_library import SessionCommutationChecker as scc
26
26
  from qiskit.circuit.controlflow import condition_resources
27
- from qiskit.circuit.quantumregister import QuantumRegister, Qubit
28
- from qiskit.circuit.classicalregister import ClassicalRegister, Clbit
27
+ from qiskit.circuit import QuantumRegister, Qubit
28
+ from qiskit.circuit import ClassicalRegister, Clbit
29
29
  from qiskit.dagcircuit.exceptions import DAGDependencyError
30
30
  from qiskit.dagcircuit.dagdepnode import DAGDepNode
31
- from qiskit.pulse import Schedule
32
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
33
31
 
34
32
  if typing.TYPE_CHECKING:
35
33
  from qiskit.circuit.parameterexpression import ParameterExpression
@@ -115,7 +113,6 @@ class DAGDependency:
115
113
  self.clbits = []
116
114
 
117
115
  self._global_phase: float | ParameterExpression = 0.0
118
- self._calibrations: dict[str, dict[tuple, Schedule]] = defaultdict(dict)
119
116
 
120
117
  self.duration = None
121
118
  self.unit = "dt"
@@ -146,37 +143,6 @@ class DAGDependency:
146
143
  else:
147
144
  self._global_phase = angle % (2 * math.pi)
148
145
 
149
- @property
150
- @deprecate_pulse_dependency(is_property=True)
151
- def calibrations(self) -> dict[str, dict[tuple, Schedule]]:
152
- """Return calibration dictionary.
153
-
154
- The custom pulse definition of a given gate is of the form
155
- ``{'gate_name': {(qubits, params): schedule}}``.
156
- """
157
- return self._calibrations_prop
158
-
159
- @calibrations.setter
160
- @deprecate_pulse_dependency(is_property=True)
161
- def calibrations(self, calibrations: dict[str, dict[tuple, Schedule]]):
162
- """Set the circuit calibration data from a dictionary of calibration definition.
163
-
164
- Args:
165
- calibrations (dict): A dictionary of input in the format
166
- {'gate_name': {(qubits, gate_params): schedule}}
167
- """
168
- self._calibrations_prop = calibrations
169
-
170
- @property
171
- def _calibrations_prop(self) -> dict[str, dict[tuple, Schedule]]:
172
- """An alternative path to be used internally to avoid deprecation warnings"""
173
- return dict(self._calibrations)
174
-
175
- @_calibrations_prop.setter
176
- def _calibrations_prop(self, calibrations: dict[str, dict[tuple, Schedule]]):
177
- """An alternative path to be used internally to avoid deprecation warnings"""
178
- self._calibrations = defaultdict(dict, calibrations)
179
-
180
146
  def to_retworkx(self):
181
147
  """Returns the DAGDependency in retworkx format."""
182
148
  return self._multi_graph
@@ -15,10 +15,9 @@
15
15
 
16
16
  import itertools
17
17
  import math
18
- from collections import OrderedDict, defaultdict, namedtuple
18
+ from collections import OrderedDict, namedtuple
19
19
  from typing import Dict, List, Generator, Any
20
20
 
21
- import numpy as np
22
21
  import rustworkx as rx
23
22
 
24
23
  from qiskit.circuit import (
@@ -26,11 +25,10 @@ from qiskit.circuit import (
26
25
  ClassicalRegister,
27
26
  Qubit,
28
27
  Clbit,
29
- Gate,
30
28
  ParameterExpression,
31
29
  )
32
30
  from qiskit.circuit.controlflow import condition_resources
33
- from qiskit.circuit.bit import Bit
31
+ from qiskit.circuit import Bit
34
32
  from qiskit.dagcircuit.dagnode import DAGOpNode
35
33
  from qiskit.dagcircuit.exceptions import DAGDependencyError
36
34
  from qiskit.circuit.commutation_checker import CommutationChecker
@@ -110,7 +108,6 @@ class _DAGDependencyV2:
110
108
  self._clbit_indices: Dict[Clbit, BitLocations] = {}
111
109
 
112
110
  self._global_phase = 0
113
- self._calibrations = defaultdict(dict)
114
111
 
115
112
  # Map of number of each kind of op, keyed on op name
116
113
  self._op_names = {}
@@ -142,81 +139,6 @@ class _DAGDependencyV2:
142
139
  else:
143
140
  self._global_phase = angle % (2 * math.pi)
144
141
 
145
- @property
146
- def calibrations(self):
147
- """Return calibration dictionary.
148
-
149
- The custom pulse definition of a given gate is of the form
150
- ``{'gate_name': {(qubits, params): schedule}}``.
151
- """
152
- return dict(self._calibrations)
153
-
154
- @calibrations.setter
155
- def calibrations(self, calibrations):
156
- """Set the circuit calibration data from a dictionary of calibration definition.
157
-
158
- Args:
159
- calibrations (dict): A dictionary of input in the format
160
- {'gate_name': {(qubits, gate_params): schedule}}
161
- """
162
- self._calibrations = defaultdict(dict, calibrations)
163
-
164
- def add_calibration(self, gate, qubits, schedule, params=None):
165
- """Register a low-level, custom pulse definition for the given gate.
166
-
167
- Args:
168
- gate (Union[Gate, str]): Gate information.
169
- qubits (Union[int, Tuple[int]]): List of qubits to be measured.
170
- schedule (Schedule): Schedule information.
171
- params (Optional[List[Union[float, Parameter]]]): A list of parameters.
172
-
173
- Raises:
174
- Exception: if the gate is of type string and params is None.
175
- """
176
-
177
- def _format(operand):
178
- try:
179
- # Using float/complex value as a dict key is not good idea.
180
- # This makes the mapping quite sensitive to the rounding error.
181
- # However, the mechanism is already tied to the execution model (i.e. pulse gate)
182
- # and we cannot easily update this rule.
183
- # The same logic exists in QuantumCircuit.add_calibration.
184
- evaluated = complex(operand)
185
- if np.isreal(evaluated):
186
- evaluated = float(evaluated.real)
187
- if evaluated.is_integer():
188
- evaluated = int(evaluated)
189
- return evaluated
190
- except TypeError:
191
- # Unassigned parameter
192
- return operand
193
-
194
- if isinstance(gate, Gate):
195
- params = gate.params
196
- gate = gate.name
197
- if params is not None:
198
- params = tuple(map(_format, params))
199
- else:
200
- params = ()
201
-
202
- self._calibrations[gate][(tuple(qubits), params)] = schedule
203
-
204
- def has_calibration_for(self, node):
205
- """Return True if the dag has a calibration defined for the node operation. In this
206
- case, the operation does not need to be translated to the device basis.
207
- """
208
- if not self.calibrations or node.op.name not in self.calibrations:
209
- return False
210
- qubits = tuple(self.qubits.index(qubit) for qubit in node.qargs)
211
- params = []
212
- for p in node.op.params:
213
- if isinstance(p, ParameterExpression) and not p.parameters:
214
- params.append(float(p))
215
- else:
216
- params.append(p)
217
- params = tuple(params)
218
- return (qubits, params) in self.calibrations[node.op.name]
219
-
220
142
  def size(self):
221
143
  """Returns the number of gates in the circuit"""
222
144
  return len(self._multi_graph)
@@ -19,6 +19,7 @@ import uuid
19
19
 
20
20
  import qiskit._accelerate.circuit
21
21
  from qiskit.circuit import (
22
+ BoxOp,
22
23
  Clbit,
23
24
  ClassicalRegister,
24
25
  IfElseOp,
@@ -92,8 +93,12 @@ def _make_expr_key(bit_indices):
92
93
 
93
94
 
94
95
  def _condition_op_eq(node1, node2, bit_indices1, bit_indices2):
95
- cond1 = node1.condition
96
- cond2 = node2.condition
96
+ cond1 = None
97
+ cond2 = None
98
+ if node1.is_control_flow():
99
+ cond1 = node1.op.condition
100
+ if node2.is_control_flow():
101
+ cond2 = node2.op.condition
97
102
  if isinstance(cond1, expr.Expr) and isinstance(cond2, expr.Expr):
98
103
  if not expr.structurally_equivalent(
99
104
  cond1, cond2, _make_expr_key(bit_indices1), _make_expr_key(bit_indices2)
@@ -166,11 +171,18 @@ def _for_loop_eq(node1, node2, bit_indices1, bit_indices2):
166
171
  )
167
172
 
168
173
 
174
+ def _box_eq(node1, node2, bit_indices1, bit_indices2):
175
+ return node1.op.duration == node2.op.duration and _circuit_to_dag(
176
+ node1.op.blocks[0], node1.qargs, node1.cargs, bit_indices1
177
+ ) == _circuit_to_dag(node2.op.blocks[0], node2.qargs, node2.cargs, bit_indices2)
178
+
179
+
169
180
  _SEMANTIC_EQ_CONTROL_FLOW = {
170
181
  IfElseOp: _condition_op_eq,
171
182
  WhileLoopOp: _condition_op_eq,
172
183
  SwitchCaseOp: _switch_case_eq,
173
184
  ForLoopOp: _for_loop_eq,
185
+ BoxOp: _box_eq,
174
186
  }
175
187
 
176
188
  _SEMANTIC_EQ_SYMMETRIC = frozenset({"barrier", "swap", "break_loop", "continue_loop"})
@@ -87,7 +87,10 @@ Such task might be easily done by converting the input numbers into string.
87
87
  We use the pass manager framework here, putting the efficiency aside for
88
88
  a moment to learn how to build a custom Qiskit compiler.
89
89
 
90
- .. code-block:: python
90
+ .. plot::
91
+ :include-source:
92
+ :nofigs:
93
+ :context:
91
94
 
92
95
  from qiskit.passmanager import BasePassManager, GenericPass, ConditionalController
93
96
 
@@ -111,7 +114,10 @@ the final conversion.
111
114
 
112
115
  Next, we implement a pass that removes a digit when the number is five.
113
116
 
114
- .. code-block:: python
117
+ .. plot::
118
+ :include-source:
119
+ :nofigs:
120
+ :context:
115
121
 
116
122
  class RemoveFive(GenericPass):
117
123
 
@@ -124,7 +130,10 @@ Finally, we instantiate a pass manager and schedule the task with it.
124
130
  Running the pass manager with random row of numbers returns
125
131
  new numbers that don't contain five.
126
132
 
127
- .. code-block:: python
133
+ .. plot::
134
+ :include-source:
135
+ :nofigs:
136
+ :context:
128
137
 
129
138
  pm = ToyPassManager()
130
139
  pm.append(task)
@@ -143,7 +152,10 @@ six digits or less. Such control can be implemented by a flow controller.
143
152
  We start from an analysis pass that provides the flow controller
144
153
  with information about the number of digits.
145
154
 
146
- .. code-block:: python
155
+ .. plot::
156
+ :include-source:
157
+ :nofigs:
158
+ :context:
147
159
 
148
160
  class CountDigits(GenericPass):
149
161
 
@@ -155,7 +167,10 @@ with information about the number of digits.
155
167
  Then, we wrap the remove five task with the :class:`.ConditionalController`
156
168
  that runs the stored tasks only when the condition is met.
157
169
 
158
- .. code-block:: python
170
+ .. plot::
171
+ :include-source:
172
+ :nofigs:
173
+ :context:
159
174
 
160
175
  def digit_condition(property_set):
161
176
  # Return True when condition is met.
@@ -168,7 +183,10 @@ that runs the stored tasks only when the condition is met.
168
183
 
169
184
  As before, we schedule these passes with the pass manager and run.
170
185
 
171
- .. code-block:: python
186
+ .. plot::
187
+ :include-source:
188
+ :nofigs:
189
+ :context:
172
190
 
173
191
  pm = ToyPassManager()
174
192
  pm.append(analysis_task)
@@ -14,7 +14,6 @@
14
14
  from __future__ import annotations
15
15
 
16
16
  import logging
17
- import warnings
18
17
  from abc import ABC, abstractmethod
19
18
  from collections.abc import Callable, Iterable
20
19
  from itertools import chain
@@ -30,8 +29,6 @@ from .compilation_status import PropertySet, WorkflowStatus, PassManagerState
30
29
 
31
30
  logger = logging.getLogger(__name__)
32
31
 
33
- _MISSING = object()
34
-
35
32
 
36
33
  class BasePassManager(ABC):
37
34
  """Pass manager base class."""
@@ -178,7 +175,7 @@ class BasePassManager(ABC):
178
175
  callback: Callable = None,
179
176
  num_processes: int = None,
180
177
  *,
181
- property_set: object = _MISSING,
178
+ property_set: dict[str, object] | None = None,
182
179
  **kwargs,
183
180
  ) -> Any:
184
181
  """Run all the passes on the specified ``in_programs``.
@@ -216,25 +213,16 @@ class BasePassManager(ABC):
216
213
  execution is enabled. This argument overrides ``num_processes`` in the user
217
214
  configuration file, and the ``QISKIT_NUM_PROCS`` environment variable. If set
218
215
  to ``None`` the system default or local user configuration will be used.
219
- property_set: Currently a key that will be interpreted as all other arbitrary
220
- ``kwargs``. In Qiskit 2.0, this will instead seed the :class:`.PropertySet` of the
221
- compilation (but does not do so in this version).
216
+ property_set: If given, the initial value to use as the :class:`.PropertySet` for the
217
+ pass manager pipeline. This can be used to persist analysis from one run to
218
+ another, in cases where you know the analysis is safe to share. Beware that some
219
+ analysis will be specific to the input circuit and the particular :class:`.Target`,
220
+ so you should take a lot of care when using this argument.
222
221
  kwargs: Arbitrary arguments passed to the compiler frontend and backend.
223
222
 
224
223
  Returns:
225
224
  The transformed program(s).
226
225
  """
227
- if property_set is not _MISSING:
228
- warnings.warn(
229
- "From Qiskit 2.0, 'property_set' will be a reserved keyword argument of"
230
- " 'BasePassManager.run', and not passed on to the conversion functions."
231
- " This subclass of 'BasePassManager' needs to use a different keyword argument"
232
- " for passing on this data.",
233
- FutureWarning,
234
- stacklevel=2,
235
- )
236
- kwargs["property_set"] = property_set
237
-
238
226
  if not self._tasks and not kwargs and callback is None:
239
227
  return in_programs
240
228
 
@@ -247,7 +235,13 @@ class BasePassManager(ABC):
247
235
  # ourselves, since that can be quite expensive.
248
236
  if len(in_programs) == 1 or not should_run_in_parallel(num_processes):
249
237
  out = [
250
- _run_workflow(program=program, pass_manager=self, callback=callback, **kwargs)
238
+ _run_workflow(
239
+ program=program,
240
+ pass_manager=self,
241
+ callback=callback,
242
+ initial_property_set=property_set,
243
+ **kwargs,
244
+ )
251
245
  for program in in_programs
252
246
  ]
253
247
  if len(in_programs) == 1 and not is_list:
@@ -264,7 +258,10 @@ class BasePassManager(ABC):
264
258
  return parallel_map(
265
259
  _run_workflow_in_new_process,
266
260
  values=in_programs,
267
- task_kwargs={"pass_manager_bin": dill.dumps(self)},
261
+ task_kwargs={
262
+ "pass_manager_bin": dill.dumps(self),
263
+ "initial_property_set": property_set,
264
+ },
268
265
  num_processes=num_processes,
269
266
  )
270
267
 
@@ -288,6 +285,8 @@ class BasePassManager(ABC):
288
285
  def _run_workflow(
289
286
  program: Any,
290
287
  pass_manager: BasePassManager,
288
+ *,
289
+ initial_property_set: dict[str, object] | None = None,
291
290
  **kwargs,
292
291
  ) -> Any:
293
292
  """Run single program optimization with a pass manager.
@@ -307,12 +306,12 @@ def _run_workflow(
307
306
  input_program=program,
308
307
  **kwargs,
309
308
  )
309
+ property_set = (
310
+ PropertySet() if initial_property_set is None else PropertySet(initial_property_set)
311
+ )
310
312
  passmanager_ir, final_state = flow_controller.execute(
311
313
  passmanager_ir=passmanager_ir,
312
- state=PassManagerState(
313
- workflow_status=initial_status,
314
- property_set=PropertySet(),
315
- ),
314
+ state=PassManagerState(workflow_status=initial_status, property_set=property_set),
316
315
  callback=kwargs.get("callback", None),
317
316
  )
318
317
  # The `property_set` has historically been returned as a mutable attribute on `PassManager`
@@ -335,6 +334,8 @@ def _run_workflow(
335
334
  def _run_workflow_in_new_process(
336
335
  program: Any,
337
336
  pass_manager_bin: bytes,
337
+ *,
338
+ initial_property_set: dict[str, object] | None,
338
339
  ) -> Any:
339
340
  """Run single program optimization in new process.
340
341
 
@@ -348,4 +349,5 @@ def _run_workflow_in_new_process(
348
349
  return _run_workflow(
349
350
  program=program,
350
351
  pass_manager=dill.loads(pass_manager_bin),
352
+ initial_property_set=initial_property_set,
351
353
  )