qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__cp39-abi3-win32.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 (360) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +20 -1
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/assembler/assemble_schedules.py +2 -0
  5. qiskit/circuit/__init__.py +44 -1
  6. qiskit/circuit/_standard_gates_commutations.py +585 -0
  7. qiskit/circuit/barrier.py +2 -0
  8. qiskit/circuit/controlflow/builder.py +3 -3
  9. qiskit/circuit/controlflow/if_else.py +13 -5
  10. qiskit/circuit/controlflow/while_loop.py +10 -2
  11. qiskit/circuit/delay.py +20 -3
  12. qiskit/circuit/equivalence.py +13 -214
  13. qiskit/circuit/gate.py +3 -1
  14. qiskit/circuit/instruction.py +32 -11
  15. qiskit/circuit/instructionset.py +2 -0
  16. qiskit/circuit/library/__init__.py +110 -14
  17. qiskit/circuit/library/arithmetic/__init__.py +9 -2
  18. qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
  19. qiskit/circuit/library/arithmetic/adders/adder.py +154 -2
  20. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
  21. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
  22. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
  23. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  24. qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
  25. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
  26. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
  27. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
  28. qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
  29. qiskit/circuit/library/basis_change/qft.py +20 -38
  30. qiskit/circuit/library/blueprintcircuit.py +64 -0
  31. qiskit/circuit/library/boolean_logic/__init__.py +4 -4
  32. qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
  33. qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
  34. qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
  35. qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
  36. qiskit/circuit/library/data_preparation/__init__.py +6 -3
  37. qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
  38. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  39. qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
  40. qiskit/circuit/library/fourier_checking.py +72 -11
  41. qiskit/circuit/library/generalized_gates/__init__.py +1 -1
  42. qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
  43. qiskit/circuit/library/generalized_gates/gms.py +67 -14
  44. qiskit/circuit/library/generalized_gates/gr.py +4 -4
  45. qiskit/circuit/library/generalized_gates/isometry.py +2 -2
  46. qiskit/circuit/library/generalized_gates/linear_function.py +12 -6
  47. qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
  48. qiskit/circuit/library/generalized_gates/permutation.py +8 -6
  49. qiskit/circuit/library/generalized_gates/rv.py +8 -9
  50. qiskit/circuit/library/graph_state.py +93 -10
  51. qiskit/circuit/library/grover_operator.py +270 -2
  52. qiskit/circuit/library/hidden_linear_function.py +83 -20
  53. qiskit/circuit/library/iqp.py +99 -20
  54. qiskit/circuit/library/n_local/__init__.py +19 -7
  55. qiskit/circuit/library/n_local/efficient_su2.py +118 -5
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
  57. qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
  58. qiskit/circuit/library/n_local/n_local.py +406 -5
  59. qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
  60. qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
  61. qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
  62. qiskit/circuit/library/n_local/two_local.py +14 -7
  63. qiskit/circuit/library/overlap.py +91 -26
  64. qiskit/circuit/library/pauli_evolution.py +17 -15
  65. qiskit/circuit/library/phase_estimation.py +80 -4
  66. qiskit/circuit/library/quantum_volume.py +72 -20
  67. qiskit/circuit/library/standard_gates/__init__.py +20 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +2 -1
  69. qiskit/circuit/library/standard_gates/ecr.py +2 -2
  70. qiskit/circuit/library/standard_gates/h.py +4 -3
  71. qiskit/circuit/library/standard_gates/i.py +2 -1
  72. qiskit/circuit/library/standard_gates/iswap.py +2 -2
  73. qiskit/circuit/library/standard_gates/p.py +20 -12
  74. qiskit/circuit/library/standard_gates/r.py +1 -1
  75. qiskit/circuit/library/standard_gates/rx.py +4 -3
  76. qiskit/circuit/library/standard_gates/rxx.py +2 -2
  77. qiskit/circuit/library/standard_gates/ry.py +4 -3
  78. qiskit/circuit/library/standard_gates/ryy.py +2 -2
  79. qiskit/circuit/library/standard_gates/rz.py +13 -12
  80. qiskit/circuit/library/standard_gates/rzx.py +6 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +1 -1
  82. qiskit/circuit/library/standard_gates/s.py +4 -4
  83. qiskit/circuit/library/standard_gates/swap.py +3 -3
  84. qiskit/circuit/library/standard_gates/sx.py +4 -3
  85. qiskit/circuit/library/standard_gates/t.py +2 -2
  86. qiskit/circuit/library/standard_gates/u.py +11 -3
  87. qiskit/circuit/library/standard_gates/u1.py +65 -15
  88. qiskit/circuit/library/standard_gates/u2.py +4 -1
  89. qiskit/circuit/library/standard_gates/u3.py +31 -3
  90. qiskit/circuit/library/standard_gates/x.py +7 -5
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
  93. qiskit/circuit/library/standard_gates/y.py +4 -3
  94. qiskit/circuit/library/standard_gates/z.py +3 -3
  95. qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
  96. qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
  97. qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
  98. qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
  99. qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
  100. qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
  101. qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
  102. qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
  103. qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
  104. qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
  105. qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
  106. qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
  107. qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
  108. qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
  109. qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
  110. qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
  111. qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
  112. qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
  113. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
  114. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
  115. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
  116. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
  117. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
  118. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
  119. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
  120. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
  121. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
  122. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
  123. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
  124. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
  125. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
  126. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
  127. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
  128. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
  129. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
  130. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
  131. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
  132. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
  133. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
  134. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
  135. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
  136. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
  137. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
  138. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
  139. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
  140. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
  141. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
  142. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
  143. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
  144. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
  145. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
  146. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
  147. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
  148. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
  149. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
  150. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
  151. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
  152. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
  153. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
  154. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
  155. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
  156. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
  157. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
  158. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
  159. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
  160. qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
  161. qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
  162. qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
  163. qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
  164. qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
  165. qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
  166. qiskit/circuit/parameter.py +4 -0
  167. qiskit/circuit/parameterexpression.py +167 -34
  168. qiskit/circuit/quantumcircuit.py +162 -126
  169. qiskit/circuit/singleton.py +2 -0
  170. qiskit/circuit/store.py +2 -0
  171. qiskit/circuit/twirling.py +145 -0
  172. qiskit/compiler/assembler.py +17 -4
  173. qiskit/compiler/scheduler.py +2 -0
  174. qiskit/compiler/sequencer.py +2 -0
  175. qiskit/compiler/transpiler.py +81 -26
  176. qiskit/converters/circuit_to_dag.py +2 -2
  177. qiskit/converters/circuit_to_dagdependency.py +1 -1
  178. qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
  179. qiskit/converters/circuit_to_instruction.py +1 -1
  180. qiskit/converters/dag_to_circuit.py +7 -5
  181. qiskit/converters/dag_to_dagdependency.py +1 -1
  182. qiskit/converters/dag_to_dagdependency_v2.py +1 -1
  183. qiskit/converters/dagdependency_to_circuit.py +5 -1
  184. qiskit/converters/dagdependency_to_dag.py +6 -1
  185. qiskit/dagcircuit/collect_blocks.py +3 -3
  186. qiskit/dagcircuit/dagdependency.py +18 -5
  187. qiskit/dagcircuit/dagdependency_v2.py +1 -1
  188. qiskit/dagcircuit/dagnode.py +2 -2
  189. qiskit/passmanager/__init__.py +2 -2
  190. qiskit/primitives/backend_estimator.py +5 -2
  191. qiskit/primitives/backend_sampler_v2.py +61 -18
  192. qiskit/primitives/base/base_estimator.py +2 -2
  193. qiskit/primitives/containers/data_bin.py +9 -1
  194. qiskit/primitives/statevector_sampler.py +1 -1
  195. qiskit/primitives/utils.py +1 -1
  196. qiskit/providers/__init__.py +3 -3
  197. qiskit/providers/backend.py +12 -1
  198. qiskit/providers/backend_compat.py +23 -3
  199. qiskit/providers/basic_provider/basic_simulator.py +12 -2
  200. qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
  201. qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
  202. qiskit/providers/models/pulsedefaults.py +2 -0
  203. qiskit/pulse/builder.py +59 -18
  204. qiskit/pulse/calibration_entries.py +4 -1
  205. qiskit/pulse/channels.py +2 -0
  206. qiskit/pulse/exceptions.py +2 -0
  207. qiskit/pulse/instruction_schedule_map.py +21 -6
  208. qiskit/pulse/instructions/acquire.py +2 -0
  209. qiskit/pulse/instructions/delay.py +2 -0
  210. qiskit/pulse/instructions/directives.py +8 -0
  211. qiskit/pulse/instructions/frequency.py +3 -0
  212. qiskit/pulse/instructions/instruction.py +2 -0
  213. qiskit/pulse/instructions/phase.py +3 -0
  214. qiskit/pulse/instructions/play.py +2 -0
  215. qiskit/pulse/instructions/reference.py +2 -0
  216. qiskit/pulse/instructions/snapshot.py +2 -0
  217. qiskit/pulse/library/pulse.py +2 -0
  218. qiskit/pulse/library/symbolic_pulses.py +28 -0
  219. qiskit/pulse/library/waveform.py +2 -0
  220. qiskit/pulse/macros.py +1 -1
  221. qiskit/pulse/schedule.py +12 -13
  222. qiskit/pulse/transforms/alignments.py +5 -3
  223. qiskit/pulse/transforms/dag.py +7 -0
  224. qiskit/qasm2/export.py +5 -3
  225. qiskit/qasm2/parse.py +46 -2
  226. qiskit/qasm3/__init__.py +1 -0
  227. qiskit/qasm3/ast.py +123 -15
  228. qiskit/qasm3/exporter.py +103 -77
  229. qiskit/qobj/converters/pulse_instruction.py +6 -4
  230. qiskit/qpy/__init__.py +181 -0
  231. qiskit/qpy/binary_io/circuits.py +20 -5
  232. qiskit/qpy/binary_io/schedules.py +3 -4
  233. qiskit/qpy/binary_io/value.py +310 -13
  234. qiskit/qpy/common.py +46 -2
  235. qiskit/qpy/formats.py +7 -0
  236. qiskit/qpy/interface.py +40 -4
  237. qiskit/quantum_info/__init__.py +4 -0
  238. qiskit/quantum_info/operators/channel/transformations.py +28 -21
  239. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  240. qiskit/quantum_info/operators/operator.py +54 -8
  241. qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
  242. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  243. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
  244. qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
  245. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  246. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
  247. qiskit/quantum_info/states/densitymatrix.py +5 -5
  248. qiskit/quantum_info/states/stabilizerstate.py +1 -1
  249. qiskit/quantum_info/states/statevector.py +6 -6
  250. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  251. qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
  252. qiskit/result/mitigation/local_readout_mitigator.py +9 -1
  253. qiskit/result/mitigation/utils.py +57 -0
  254. qiskit/scheduler/config.py +2 -0
  255. qiskit/scheduler/methods/basic.py +3 -0
  256. qiskit/scheduler/schedule_circuit.py +2 -0
  257. qiskit/scheduler/sequence.py +2 -0
  258. qiskit/synthesis/__init__.py +25 -0
  259. qiskit/synthesis/arithmetic/__init__.py +16 -0
  260. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  261. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  262. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  263. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  264. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  265. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  266. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  267. qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
  268. qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
  269. qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
  270. qiskit/synthesis/evolution/__init__.py +1 -0
  271. qiskit/synthesis/evolution/lie_trotter.py +16 -42
  272. qiskit/synthesis/evolution/pauli_network.py +80 -0
  273. qiskit/synthesis/evolution/product_formula.py +165 -238
  274. qiskit/synthesis/evolution/qdrift.py +36 -29
  275. qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
  276. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  277. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  278. qiskit/synthesis/qft/qft_decompose_full.py +19 -1
  279. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
  280. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
  281. qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
  282. qiskit/synthesis/unitary/qsd.py +5 -5
  283. qiskit/transpiler/__init__.py +21 -14
  284. qiskit/transpiler/basepasses.py +1 -1
  285. qiskit/transpiler/passes/__init__.py +2 -0
  286. qiskit/transpiler/passes/basis/basis_translator.py +9 -565
  287. qiskit/transpiler/passes/basis/decompose.py +45 -12
  288. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  289. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  290. qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
  291. qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
  292. qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
  293. qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
  294. qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
  295. qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
  296. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  297. qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
  298. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  299. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  300. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  301. qiskit/transpiler/passes/optimization/consolidate_blocks.py +48 -131
  302. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
  303. qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
  304. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
  305. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  306. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  307. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  308. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  309. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  310. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  311. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  312. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  313. qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
  314. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  315. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  316. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  317. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  318. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
  319. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  320. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  321. qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
  322. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
  323. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  324. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
  325. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
  326. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
  327. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
  328. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +262 -99
  329. qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
  330. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  331. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
  332. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
  333. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
  334. qiskit/transpiler/passes/utils/gate_direction.py +12 -275
  335. qiskit/transpiler/passes/utils/gates_basis.py +7 -30
  336. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
  337. qiskit/transpiler/passmanager_config.py +22 -4
  338. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
  339. qiskit/transpiler/preset_passmanagers/common.py +5 -3
  340. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +125 -42
  341. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  342. qiskit/transpiler/target.py +74 -16
  343. qiskit/utils/deprecate_pulse.py +119 -0
  344. qiskit/visualization/circuit/_utils.py +2 -2
  345. qiskit/visualization/circuit/circuit_visualization.py +3 -2
  346. qiskit/visualization/circuit/matplotlib.py +1 -1
  347. qiskit/visualization/dag_visualization.py +1 -1
  348. qiskit/visualization/pass_manager_visualization.py +3 -14
  349. qiskit/visualization/pulse_v2/interface.py +3 -1
  350. qiskit/visualization/timeline/core.py +25 -2
  351. qiskit/visualization/timeline/interface.py +12 -0
  352. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/METADATA +9 -8
  353. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
  354. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
  355. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/entry_points.txt +19 -0
  356. qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
  357. qiskit/synthesis/two_qubit/weyl.py +0 -97
  358. qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
  359. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/LICENSE.txt +0 -0
  360. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,145 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2024
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
+ """The twirling module."""
14
+
15
+ from __future__ import annotations
16
+ import typing
17
+
18
+ from qiskit._accelerate.twirling import twirl_circuit as twirl_rs
19
+ from qiskit.circuit.quantumcircuit import QuantumCircuit, _copy_metadata
20
+ from qiskit.circuit.gate import Gate
21
+ from qiskit.circuit.library.standard_gates import CXGate, ECRGate, CZGate, iSwapGate
22
+ from qiskit.exceptions import QiskitError
23
+
24
+ if typing.TYPE_CHECKING:
25
+ from qiskit.transpiler.target import Target
26
+
27
+
28
+ NAME_TO_CLASS = {
29
+ "cx": CXGate._standard_gate,
30
+ "ecr": ECRGate._standard_gate,
31
+ "cz": CZGate._standard_gate,
32
+ "iswap": iSwapGate._standard_gate,
33
+ }
34
+
35
+
36
+ def pauli_twirl_2q_gates(
37
+ circuit: QuantumCircuit,
38
+ twirling_gate: None | str | Gate | list[str] | list[Gate] = None,
39
+ seed: int | None = None,
40
+ num_twirls: int | None = None,
41
+ target: Target | None = None,
42
+ ) -> QuantumCircuit | list[QuantumCircuit]:
43
+ """Create copies of a given circuit with Pauli twirling applied around specified two qubit
44
+ gates.
45
+
46
+ If you're running this function with the intent to twirl a circuit to run on hardware this
47
+ may not be the most efficient way to perform twirling. Especially if the hardware vendor
48
+ has implemented the :mod:`.primitives` execution interface with :class:`.SamplerV2` and
49
+ :class:`.EstimatorV2` this most likely is not the best way to apply twirling to your
50
+ circuit and you'll want to refer to the implementation of :class:`.SamplerV2` and/or
51
+ :class:`.EstimatorV2` for the specified hardware vendor.
52
+
53
+ If the intent of this function is to be run after :func:`.transpile` or
54
+ :meth:`.PassManager.run` the optional ``target`` argument can be used
55
+ so that the inserted 1 qubit Pauli gates are synthesized to be
56
+ compatible with the given :class:`.Target` so the output circuit(s) are
57
+ still compatible.
58
+
59
+ Args:
60
+ circuit: The circuit to twirl
61
+ twirling_gate: The gate to twirl, defaults to `None` which means twirl all default gates:
62
+ :class:`.CXGate`, :class:`.CZGate`, :class:`.ECRGate`, and :class:`.iSwapGate`.
63
+ If supplied it can either be a single gate or a list of gates either as either a gate
64
+ object or its string name. Currently only the names `"cx"`, `"cz"`, `"ecr"`, and
65
+ `"iswap"` are supported. If a gate object is provided outside the default gates it must
66
+ have a matrix defined from its :class:`~.Gate.to_matrix` method for the gate to potentially
67
+ be twirled. If a valid twirling configuration can't be computed that particular gate will
68
+ be silently ignored and not twirled.
69
+ seed: An integer seed for the random number generator used internally by this function.
70
+ If specified this must be between 0 and 18,446,744,073,709,551,615.
71
+ num_twirls: The number of twirling circuits to build. This defaults to ``None`` and will return
72
+ a single circuit. If it is an integer a list of circuits with `num_twirls` circuits
73
+ will be returned.
74
+ target: If specified an :class:`.Target` instance to use for running single qubit decomposition
75
+ as part of the Pauli twirling to optimize and map the pauli gates added to the circuit
76
+ to the specified target.
77
+
78
+ Returns:
79
+ A copy of the given circuit with Pauli twirling applied to each
80
+ instance of the specified twirling gate.
81
+ """
82
+ custom_gates = None
83
+ if isinstance(twirling_gate, str):
84
+ gate = NAME_TO_CLASS.get(twirling_gate, None)
85
+ if gate is None:
86
+ raise QiskitError(f"The specified gate name {twirling_gate} is not supported")
87
+ twirling_std_gate = [gate]
88
+ elif isinstance(twirling_gate, list):
89
+ custom_gates = []
90
+ twirling_std_gate = []
91
+ for gate in twirling_gate:
92
+ if isinstance(gate, str):
93
+ gate = NAME_TO_CLASS.get(gate, None)
94
+ if gate is None:
95
+ raise QiskitError(f"The specified gate name {twirling_gate} is not supported")
96
+ twirling_std_gate.append(gate)
97
+ else:
98
+ twirling_gate = getattr(gate, "_standard_gate", None)
99
+
100
+ if twirling_gate is None:
101
+ custom_gates.append(gate)
102
+ else:
103
+ if twirling_gate in NAME_TO_CLASS.values():
104
+ twirling_std_gate.append(twirling_gate)
105
+ else:
106
+ custom_gates.append(gate)
107
+ if not custom_gates:
108
+ custom_gates = None
109
+ if not twirling_std_gate:
110
+ twirling_std_gate = None
111
+ elif twirling_gate is not None:
112
+ std_gate = getattr(twirling_gate, "_standard_gate", None)
113
+ if std_gate is None:
114
+ twirling_std_gate = None
115
+ custom_gates = [twirling_gate]
116
+ else:
117
+ if std_gate in NAME_TO_CLASS.values():
118
+ twirling_std_gate = [std_gate]
119
+ else:
120
+ twirling_std_gate = None
121
+ custom_gates = [twirling_gate]
122
+ else:
123
+ twirling_std_gate = twirling_gate
124
+ out_twirls = num_twirls
125
+ if out_twirls is None:
126
+ out_twirls = 1
127
+ new_data = twirl_rs(
128
+ circuit._data,
129
+ twirling_std_gate,
130
+ custom_gates,
131
+ seed,
132
+ out_twirls,
133
+ target,
134
+ )
135
+ if num_twirls is not None:
136
+ out_list = []
137
+ for circ in new_data:
138
+ new_circ = QuantumCircuit._from_circuit_data(circ)
139
+ _copy_metadata(circuit, new_circ, "alike")
140
+ out_list.append(new_circ)
141
+ return out_list
142
+ else:
143
+ out_circ = QuantumCircuit._from_circuit_data(new_data[0])
144
+ _copy_metadata(circuit, out_circ, "alike")
145
+ return out_circ
@@ -189,6 +189,16 @@ def assemble(
189
189
  )
190
190
 
191
191
 
192
+ # Note for future: this method is used in `BasicSimulator` and may need to be kept past the
193
+ # `assemble` removal deadline (2.0). If it is kept (potentially in a different location),
194
+ # we will need an alternative for the backend.configuration() access that currently takes
195
+ # place in L566 (`parse_circuit_args`) and L351 (`parse_common_args`)
196
+ # because backend.configuration() is also set for removal in 2.0.
197
+ # The ultimate goal will be to move away from relying on any kind of `assemble` implementation
198
+ # because of how tightly coupled it is to these legacy data structures. But as a transition step,
199
+ # given that we would only have to support the subcase of `BasicSimulator`, we could probably just
200
+ # inline the relevant config values that are already hardcoded in the basic simulator configuration
201
+ # generator.
192
202
  def _assemble(
193
203
  experiments: Union[
194
204
  QuantumCircuit,
@@ -229,7 +239,7 @@ def _assemble(
229
239
  experiments = experiments if isinstance(experiments, list) else [experiments]
230
240
  pulse_qobj = any(isinstance(exp, (ScheduleBlock, Schedule, Instruction)) for exp in experiments)
231
241
  with warnings.catch_warnings():
232
- # The Qobj is deprecated
242
+ # The Qobj class is deprecated, the backend.configuration() method is too
233
243
  warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
234
244
  qobj_id, qobj_header, run_config_common_dict = _parse_common_args(
235
245
  backend,
@@ -554,9 +564,12 @@ def _parse_circuit_args(
554
564
  run_config_dict = {"parameter_binds": parameter_binds, **run_config}
555
565
  if parametric_pulses is None:
556
566
  if backend:
557
- run_config_dict["parametric_pulses"] = getattr(
558
- backend.configuration(), "parametric_pulses", []
559
- )
567
+ with warnings.catch_warnings():
568
+ # TODO (2.0): See comment on L192 regarding backend.configuration removal
569
+ warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
570
+ run_config_dict["parametric_pulses"] = getattr(
571
+ backend.configuration(), "parametric_pulses", []
572
+ )
560
573
  else:
561
574
  run_config_dict["parametric_pulses"] = []
562
575
  else:
@@ -26,6 +26,7 @@ from qiskit.providers.backend import Backend
26
26
  from qiskit.scheduler.config import ScheduleConfig
27
27
  from qiskit.scheduler.schedule_circuit import schedule_circuit
28
28
  from qiskit.utils.parallel import parallel_map
29
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
29
30
 
30
31
  logger = logging.getLogger(__name__)
31
32
 
@@ -35,6 +36,7 @@ def _log_schedule_time(start_time, end_time):
35
36
  logger.info(log_msg)
36
37
 
37
38
 
39
+ @deprecate_pulse_dependency(moving_to_dynamics=True)
38
40
  def schedule(
39
41
  circuits: Union[QuantumCircuit, List[QuantumCircuit]],
40
42
  backend: Optional[Backend] = None,
@@ -21,8 +21,10 @@ from qiskit.providers.backend import Backend
21
21
  from qiskit.pulse import InstructionScheduleMap, Schedule
22
22
  from qiskit.scheduler import ScheduleConfig
23
23
  from qiskit.scheduler.sequence import sequence as _sequence
24
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
24
25
 
25
26
 
27
+ @deprecate_pulse_dependency(moving_to_dynamics=True)
26
28
  def sequence(
27
29
  scheduled_circuits: Union[QuantumCircuit, List[QuantumCircuit]],
28
30
  backend: Optional[Backend] = None,
@@ -32,12 +32,41 @@ from qiskit.transpiler.instruction_durations import InstructionDurationsType
32
32
  from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig
33
33
  from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
34
34
  from qiskit.transpiler.target import Target
35
+ from qiskit.utils import deprecate_arg
36
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_arg
35
37
 
36
38
  logger = logging.getLogger(__name__)
37
39
 
38
40
  _CircuitT = TypeVar("_CircuitT", bound=Union[QuantumCircuit, List[QuantumCircuit]])
39
41
 
40
42
 
43
+ @deprecate_arg(
44
+ name="instruction_durations",
45
+ since="1.3",
46
+ package_name="Qiskit",
47
+ removal_timeline="in Qiskit 2.0",
48
+ additional_msg="The `target` parameter should be used instead. You can build a `Target` instance "
49
+ "with defined instruction durations with "
50
+ "`Target.from_configuration(..., instruction_durations=...)`",
51
+ )
52
+ @deprecate_arg(
53
+ name="timing_constraints",
54
+ since="1.3",
55
+ package_name="Qiskit",
56
+ removal_timeline="in Qiskit 2.0",
57
+ additional_msg="The `target` parameter should be used instead. You can build a `Target` instance "
58
+ "with defined timing constraints with "
59
+ "`Target.from_configuration(..., timing_constraints=...)`",
60
+ )
61
+ @deprecate_arg(
62
+ name="backend_properties",
63
+ since="1.3",
64
+ package_name="Qiskit",
65
+ removal_timeline="in Qiskit 2.0",
66
+ additional_msg="The `target` parameter should be used instead. You can build a `Target` instance "
67
+ "with defined properties with Target.from_configuration(..., backend_properties=...)",
68
+ )
69
+ @deprecate_pulse_arg("inst_map", predicate=lambda inst_map: inst_map is not None)
41
70
  def transpile( # pylint: disable=too-many-return-statements
42
71
  circuits: _CircuitT,
43
72
  backend: Optional[Backend] = None,
@@ -104,7 +133,7 @@ def transpile( # pylint: disable=too-many-return-statements
104
133
  will override the backend's.
105
134
  basis_gates: List of basis gate names to unroll to
106
135
  (e.g: ``['u1', 'u2', 'u3', 'cx']``). If ``None``, do not unroll.
107
- inst_map: Mapping of unrolled gates to pulse schedules. If this is not provided,
136
+ inst_map: DEPRECATED. Mapping of unrolled gates to pulse schedules. If this is not provided,
108
137
  transpiler tries to get from the backend. If any user defined calibration
109
138
  is found in the map and this is used in a circuit, transpiler attaches
110
139
  the custom gate definition to the circuit. This enables one to flexibly
@@ -365,31 +394,57 @@ def transpile( # pylint: disable=too-many-return-statements
365
394
  # Edge cases require using the old model (loose constraints) instead of building a target,
366
395
  # but we don't populate the passmanager config with loose constraints unless it's one of
367
396
  # the known edge cases to control the execution path.
368
- pm = generate_preset_pass_manager(
369
- optimization_level,
370
- target=target,
371
- backend=backend,
372
- basis_gates=basis_gates,
373
- coupling_map=coupling_map,
374
- instruction_durations=instruction_durations,
375
- backend_properties=backend_properties,
376
- timing_constraints=timing_constraints,
377
- inst_map=inst_map,
378
- initial_layout=initial_layout,
379
- layout_method=layout_method,
380
- routing_method=routing_method,
381
- translation_method=translation_method,
382
- scheduling_method=scheduling_method,
383
- approximation_degree=approximation_degree,
384
- seed_transpiler=seed_transpiler,
385
- unitary_synthesis_method=unitary_synthesis_method,
386
- unitary_synthesis_plugin_config=unitary_synthesis_plugin_config,
387
- hls_config=hls_config,
388
- init_method=init_method,
389
- optimization_method=optimization_method,
390
- dt=dt,
391
- qubits_initially_zero=qubits_initially_zero,
392
- )
397
+ # Filter instruction_durations, timing_constraints, backend_properties and inst_map deprecation
398
+ with warnings.catch_warnings():
399
+ warnings.filterwarnings(
400
+ "ignore",
401
+ category=DeprecationWarning,
402
+ message=".*``inst_map`` is deprecated as of Qiskit 1.3.*",
403
+ module="qiskit",
404
+ )
405
+ warnings.filterwarnings(
406
+ "ignore",
407
+ category=DeprecationWarning,
408
+ message=".*``timing_constraints`` is deprecated as of Qiskit 1.3.*",
409
+ module="qiskit",
410
+ )
411
+ warnings.filterwarnings(
412
+ "ignore",
413
+ category=DeprecationWarning,
414
+ message=".*``instruction_durations`` is deprecated as of Qiskit 1.3.*",
415
+ module="qiskit",
416
+ )
417
+ warnings.filterwarnings(
418
+ "ignore",
419
+ category=DeprecationWarning,
420
+ message=".*``backend_properties`` is deprecated as of Qiskit 1.3.*",
421
+ module="qiskit",
422
+ )
423
+ pm = generate_preset_pass_manager(
424
+ optimization_level,
425
+ target=target,
426
+ backend=backend,
427
+ basis_gates=basis_gates,
428
+ coupling_map=coupling_map,
429
+ instruction_durations=instruction_durations,
430
+ backend_properties=backend_properties,
431
+ timing_constraints=timing_constraints,
432
+ inst_map=inst_map,
433
+ initial_layout=initial_layout,
434
+ layout_method=layout_method,
435
+ routing_method=routing_method,
436
+ translation_method=translation_method,
437
+ scheduling_method=scheduling_method,
438
+ approximation_degree=approximation_degree,
439
+ seed_transpiler=seed_transpiler,
440
+ unitary_synthesis_method=unitary_synthesis_method,
441
+ unitary_synthesis_plugin_config=unitary_synthesis_plugin_config,
442
+ hls_config=hls_config,
443
+ init_method=init_method,
444
+ optimization_method=optimization_method,
445
+ dt=dt,
446
+ qubits_initially_zero=qubits_initially_zero,
447
+ )
393
448
 
394
449
  out_circuits = pm.run(circuits, callback=callback, num_processes=num_processes)
395
450
 
@@ -73,6 +73,6 @@ def circuit_to_dag(circuit, copy_operations=True, *, qubit_order=None, clbit_ord
73
73
 
74
74
  dagcircuit = core_circuit_to_dag(circuit, copy_operations, qubit_order, clbit_order)
75
75
 
76
- dagcircuit.duration = circuit.duration
77
- dagcircuit.unit = circuit.unit
76
+ dagcircuit.duration = circuit._duration
77
+ dagcircuit.unit = circuit._unit
78
78
  return dagcircuit
@@ -46,6 +46,6 @@ def circuit_to_dagdependency(circuit, create_preds_and_succs=True):
46
46
  dagdependency._add_predecessors()
47
47
  dagdependency._add_successors()
48
48
 
49
- dagdependency.calibrations = circuit.calibrations
49
+ dagdependency._calibrations = circuit._calibrations_prop
50
50
 
51
51
  return dagdependency
@@ -27,7 +27,7 @@ def _circuit_to_dagdependency_v2(circuit):
27
27
  dagdependency = _DAGDependencyV2()
28
28
  dagdependency.name = circuit.name
29
29
  dagdependency.metadata = circuit.metadata
30
- dagdependency.calibrations = circuit.calibrations
30
+ dagdependency._calibrations = circuit._calibrations_prop
31
31
  dagdependency.global_phase = circuit.global_phase
32
32
 
33
33
  dagdependency.add_qubits(circuit.qubits)
@@ -125,7 +125,7 @@ def circuit_to_instruction(circuit, parameter_map=None, equivalence_library=None
125
125
  if (out := operation_map.get(original_id)) is not None:
126
126
  return out
127
127
 
128
- condition = getattr(op, "condition", None)
128
+ condition = getattr(op, "_condition", None)
129
129
  if condition:
130
130
  reg, val = condition
131
131
  if isinstance(reg, Clbit):
@@ -13,6 +13,7 @@
13
13
  """Helper function for converting a dag to a circuit."""
14
14
 
15
15
  from qiskit.circuit import QuantumCircuit
16
+ from qiskit._accelerate.converters import dag_to_circuit as dag_to_circuit_rs
16
17
 
17
18
 
18
19
  def dag_to_circuit(dag, copy_operations=True):
@@ -54,6 +55,8 @@ def dag_to_circuit(dag, copy_operations=True):
54
55
  """
55
56
 
56
57
  name = dag.name or None
58
+
59
+ circuit_data = dag_to_circuit_rs(dag, copy_operations)
57
60
  circuit = QuantumCircuit(
58
61
  dag.qubits,
59
62
  dag.clbits,
@@ -67,11 +70,10 @@ def dag_to_circuit(dag, copy_operations=True):
67
70
  for var in dag.iter_declared_vars():
68
71
  circuit.add_uninitialized_var(var)
69
72
  circuit.metadata = dag.metadata
70
- circuit.calibrations = dag.calibrations
73
+ circuit._calibrations_prop = dag._calibrations_prop
71
74
 
72
- for node in dag.topological_op_nodes():
73
- circuit._append(node._to_circuit_instruction(deepcopy=copy_operations))
75
+ circuit._data = circuit_data
74
76
 
75
- circuit.duration = dag.duration
76
- circuit.unit = dag.unit
77
+ circuit._duration = dag.duration
78
+ circuit._unit = dag.unit
77
79
  return circuit
@@ -50,6 +50,6 @@ def dag_to_dagdependency(dag, create_preds_and_succs=True):
50
50
 
51
51
  # copy metadata
52
52
  dagdependency.global_phase = dag.global_phase
53
- dagdependency.calibrations = dag.calibrations
53
+ dagdependency._calibrations_prop = dag._calibrations_prop
54
54
 
55
55
  return dagdependency
@@ -27,7 +27,7 @@ def _dag_to_dagdependency_v2(dag):
27
27
  dagdependency.name = dag.name
28
28
  dagdependency.metadata = dag.metadata
29
29
  dagdependency.global_phase = dag.global_phase
30
- dagdependency.calibrations = dag.calibrations
30
+ dagdependency.calibrations = dag._calibrations_prop
31
31
 
32
32
  dagdependency.add_qubits(dag.qubits)
33
33
  dagdependency.add_clbits(dag.clbits)
@@ -34,7 +34,11 @@ def dagdependency_to_circuit(dagdependency):
34
34
  )
35
35
  circuit.metadata = dagdependency.metadata
36
36
 
37
- circuit.calibrations = dagdependency.calibrations
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
38
42
 
39
43
  for node in dagdependency.topological_nodes():
40
44
  circuit._append(CircuitInstruction(node.op.copy(), node.qargs, node.cargs))
@@ -12,6 +12,7 @@
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
15
16
 
16
17
 
17
18
  def dagdependency_to_dag(dagdependency):
@@ -44,6 +45,10 @@ def dagdependency_to_dag(dagdependency):
44
45
 
45
46
  # copy metadata
46
47
  dagcircuit.global_phase = dagdependency.global_phase
47
- dagcircuit.calibrations = dagdependency.calibrations
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
48
53
 
49
54
  return dagcircuit
@@ -306,7 +306,7 @@ def split_block_into_layers(block: list[DAGOpNode | DAGDepNode]):
306
306
  cur_bits = set(node.qargs)
307
307
  cur_bits.update(node.cargs)
308
308
 
309
- cond = getattr(node.op, "condition", None)
309
+ cond = getattr(node.op, "_condition", None)
310
310
  if cond is not None:
311
311
  cur_bits.update(condition_resources(cond).clbits)
312
312
 
@@ -356,7 +356,7 @@ class BlockCollapser:
356
356
  for node in block:
357
357
  cur_qubits.update(node.qargs)
358
358
  cur_clbits.update(node.cargs)
359
- cond = getattr(node.op, "condition", None)
359
+ cond = getattr(node.op, "_condition", None)
360
360
  if cond is not None:
361
361
  cur_clbits.update(condition_resources(cond).clbits)
362
362
  if isinstance(cond[0], ClassicalRegister):
@@ -378,7 +378,7 @@ class BlockCollapser:
378
378
 
379
379
  for node in block:
380
380
  instructions = qc.append(CircuitInstruction(node.op, node.qargs, node.cargs))
381
- cond = getattr(node.op, "condition", None)
381
+ cond = getattr(node.op, "_condition", None)
382
382
  if cond is not None:
383
383
  instructions.c_if(*cond)
384
384
 
@@ -29,6 +29,7 @@ from qiskit.circuit.classicalregister import ClassicalRegister, Clbit
29
29
  from qiskit.dagcircuit.exceptions import DAGDependencyError
30
30
  from qiskit.dagcircuit.dagdepnode import DAGDepNode
31
31
  from qiskit.pulse import Schedule
32
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
32
33
 
33
34
  if typing.TYPE_CHECKING:
34
35
  from qiskit.circuit.parameterexpression import ParameterExpression
@@ -71,7 +72,7 @@ class DAGDependency:
71
72
 
72
73
  Bell circuit with no measurement.
73
74
 
74
- .. parsed-literal::
75
+ .. code-block:: text
75
76
 
76
77
  ┌───┐
77
78
  qr_0: ┤ H ├──■──
@@ -146,15 +147,17 @@ class DAGDependency:
146
147
  self._global_phase = angle % (2 * math.pi)
147
148
 
148
149
  @property
150
+ @deprecate_pulse_dependency(is_property=True)
149
151
  def calibrations(self) -> dict[str, dict[tuple, Schedule]]:
150
152
  """Return calibration dictionary.
151
153
 
152
154
  The custom pulse definition of a given gate is of the form
153
155
  ``{'gate_name': {(qubits, params): schedule}}``.
154
156
  """
155
- return dict(self._calibrations)
157
+ return self._calibrations_prop
156
158
 
157
159
  @calibrations.setter
160
+ @deprecate_pulse_dependency(is_property=True)
158
161
  def calibrations(self, calibrations: dict[str, dict[tuple, Schedule]]):
159
162
  """Set the circuit calibration data from a dictionary of calibration definition.
160
163
 
@@ -162,6 +165,16 @@ class DAGDependency:
162
165
  calibrations (dict): A dictionary of input in the format
163
166
  {'gate_name': {(qubits, gate_params): schedule}}
164
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"""
165
178
  self._calibrations = defaultdict(dict, calibrations)
166
179
 
167
180
  def to_retworkx(self):
@@ -396,13 +409,13 @@ class DAGDependency:
396
409
  for elem in qargs:
397
410
  qindices_list.append(self.qubits.index(elem))
398
411
 
399
- if getattr(operation, "condition", None):
412
+ if getattr(operation, "_condition", None):
400
413
  # The change to handling operation.condition follows code patterns in quantum_circuit.py.
401
414
  # However:
402
415
  # (1) cindices_list are specific to template optimization and should not be computed
403
416
  # in this place.
404
417
  # (2) Template optimization pass needs currently does not handle general conditions.
405
- cond_bits = condition_resources(operation.condition).clbits
418
+ cond_bits = condition_resources(operation._condition).clbits
406
419
  cindices_list = [self.clbits.index(clbit) for clbit in cond_bits]
407
420
  else:
408
421
  cindices_list = []
@@ -596,7 +609,7 @@ class DAGDependency:
596
609
  for nd in node_block:
597
610
  block_qargs |= set(nd.qargs)
598
611
  block_cargs |= set(nd.cargs)
599
- cond = getattr(nd.op, "condition", None)
612
+ cond = getattr(nd.op, "_condition", None)
600
613
  if cond is not None:
601
614
  block_cargs.update(condition_resources(cond).clbits)
602
615
 
@@ -56,7 +56,7 @@ class _DAGDependencyV2:
56
56
 
57
57
  Bell circuit with no measurement.
58
58
 
59
- .. parsed-literal::
59
+ .. code-block:: text
60
60
 
61
61
  ┌───┐
62
62
  qr_0: ┤ H ├──■──
@@ -92,8 +92,8 @@ def _make_expr_key(bit_indices):
92
92
 
93
93
 
94
94
  def _condition_op_eq(node1, node2, bit_indices1, bit_indices2):
95
- cond1 = node1.op.condition
96
- cond2 = node2.op.condition
95
+ cond1 = node1.condition
96
+ cond2 = node2.condition
97
97
  if isinstance(cond1, expr.Expr) and isinstance(cond2, expr.Expr):
98
98
  if not expr.structurally_equivalent(
99
99
  cond1, cond2, _make_expr_key(bit_indices1), _make_expr_key(bit_indices2)
@@ -133,7 +133,7 @@ new numbers that don't contain five.
133
133
 
134
134
  Output:
135
135
 
136
- .. parsed-literal::
136
+ .. code-block:: text
137
137
 
138
138
  [12346789, 464, 36784]
139
139
 
@@ -178,7 +178,7 @@ As before, we schedule these passes with the pass manager and run.
178
178
 
179
179
  Output:
180
180
 
181
- .. parsed-literal::
181
+ .. code-block:: text
182
182
 
183
183
  [12346789, 45654, 36784]
184
184
 
@@ -44,13 +44,15 @@ from .utils import _circuit_key, _observable_key, init_observable
44
44
  def _run_circuits(
45
45
  circuits: QuantumCircuit | list[QuantumCircuit],
46
46
  backend: BackendV1 | BackendV2,
47
+ clear_metadata: bool = True,
47
48
  **run_options,
48
49
  ) -> tuple[list[Result], list[dict]]:
49
50
  """Remove metadata of circuits and run the circuits on a backend.
50
51
  Args:
51
52
  circuits: The circuits
52
53
  backend: The backend
53
- monitor: Enable job minotor if True
54
+ clear_metadata: Clear circuit metadata before passing to backend.run if
55
+ True.
54
56
  **run_options: run_options
55
57
  Returns:
56
58
  The result and the metadata of the circuits
@@ -60,7 +62,8 @@ def _run_circuits(
60
62
  metadata = []
61
63
  for circ in circuits:
62
64
  metadata.append(circ.metadata)
63
- circ.metadata = {}
65
+ if clear_metadata:
66
+ circ.metadata = {}
64
67
  if isinstance(backend, BackendV1):
65
68
  max_circuits = getattr(backend.configuration(), "max_experiments", None)
66
69
  elif isinstance(backend, BackendV2):