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
qiskit/qasm3/exporter.py CHANGED
@@ -30,7 +30,6 @@ from qiskit.circuit import (
30
30
  Barrier,
31
31
  CircuitInstruction,
32
32
  Clbit,
33
- ControlledGate,
34
33
  Gate,
35
34
  Measure,
36
35
  Parameter,
@@ -140,9 +139,16 @@ class Exporter:
140
139
  ):
141
140
  """
142
141
  Args:
143
- includes: the filenames that should be emitted as includes. These files will be parsed
144
- for gates, and any objects dumped from this exporter will use those definitions
145
- where possible.
142
+ includes: the filenames that should be emitted as includes.
143
+
144
+ .. note::
145
+
146
+ At present, only the standard-library file ``stdgates.inc`` is properly
147
+ understood by the exporter, in the sense that it knows the gates it defines.
148
+ You can specify other includes, but you will need to pass the names of the gates
149
+ they define in the ``basis_gates`` argument to avoid the exporter outputting a
150
+ separate ``gate`` definition.
151
+
146
152
  basis_gates: the basic defined gate set of the backend.
147
153
  disable_constants: if ``True``, always emit floating-point constants for numeric
148
154
  parameter values. If ``False`` (the default), then values close to multiples of
@@ -202,46 +208,60 @@ class Exporter:
202
208
  # comparisons will work.
203
209
  _FIXED_PARAMETERS = (Parameter("p0"), Parameter("p1"), Parameter("p2"), Parameter("p3"))
204
210
 
211
+ _CANONICAL_STANDARD_GATES = {
212
+ standard: standard.gate_class(*_FIXED_PARAMETERS[: standard.num_params])
213
+ for standard in StandardGate.all_gates()
214
+ if not standard.is_controlled_gate
215
+ }
216
+ _CANONICAL_CONTROLLED_STANDARD_GATES = {
217
+ standard: [
218
+ standard.gate_class(*_FIXED_PARAMETERS[: standard.num_params], ctrl_state=ctrl_state)
219
+ for ctrl_state in range(1 << standard.num_ctrl_qubits)
220
+ ]
221
+ for standard in StandardGate.all_gates()
222
+ if standard.is_controlled_gate
223
+ }
224
+
205
225
  # Mapping of symbols defined by `stdgates.inc` to their gate definition source.
206
226
  _KNOWN_INCLUDES = {
207
227
  "stdgates.inc": {
208
- "p": library.PhaseGate(*_FIXED_PARAMETERS[:1]),
209
- "x": library.XGate(),
210
- "y": library.YGate(),
211
- "z": library.ZGate(),
212
- "h": library.HGate(),
213
- "s": library.SGate(),
214
- "sdg": library.SdgGate(),
215
- "t": library.TGate(),
216
- "tdg": library.TdgGate(),
217
- "sx": library.SXGate(),
218
- "rx": library.RXGate(*_FIXED_PARAMETERS[:1]),
219
- "ry": library.RYGate(*_FIXED_PARAMETERS[:1]),
220
- "rz": library.RZGate(*_FIXED_PARAMETERS[:1]),
221
- "cx": library.CXGate(),
222
- "cy": library.CYGate(),
223
- "cz": library.CZGate(),
224
- "cp": library.CPhaseGate(*_FIXED_PARAMETERS[:1]),
225
- "crx": library.CRXGate(*_FIXED_PARAMETERS[:1]),
226
- "cry": library.CRYGate(*_FIXED_PARAMETERS[:1]),
227
- "crz": library.CRZGate(*_FIXED_PARAMETERS[:1]),
228
- "ch": library.CHGate(),
229
- "swap": library.SwapGate(),
230
- "ccx": library.CCXGate(),
231
- "cswap": library.CSwapGate(),
232
- "cu": library.CUGate(*_FIXED_PARAMETERS[:4]),
233
- "CX": library.CXGate(),
234
- "phase": library.PhaseGate(*_FIXED_PARAMETERS[:1]),
235
- "cphase": library.CPhaseGate(*_FIXED_PARAMETERS[:1]),
236
- "id": library.IGate(),
237
- "u1": library.U1Gate(*_FIXED_PARAMETERS[:1]),
238
- "u2": library.U2Gate(*_FIXED_PARAMETERS[:2]),
239
- "u3": library.U3Gate(*_FIXED_PARAMETERS[:3]),
228
+ "p": _CANONICAL_STANDARD_GATES[StandardGate.PhaseGate],
229
+ "x": _CANONICAL_STANDARD_GATES[StandardGate.XGate],
230
+ "y": _CANONICAL_STANDARD_GATES[StandardGate.YGate],
231
+ "z": _CANONICAL_STANDARD_GATES[StandardGate.ZGate],
232
+ "h": _CANONICAL_STANDARD_GATES[StandardGate.HGate],
233
+ "s": _CANONICAL_STANDARD_GATES[StandardGate.SGate],
234
+ "sdg": _CANONICAL_STANDARD_GATES[StandardGate.SdgGate],
235
+ "t": _CANONICAL_STANDARD_GATES[StandardGate.TGate],
236
+ "tdg": _CANONICAL_STANDARD_GATES[StandardGate.TdgGate],
237
+ "sx": _CANONICAL_STANDARD_GATES[StandardGate.SXGate],
238
+ "rx": _CANONICAL_STANDARD_GATES[StandardGate.RXGate],
239
+ "ry": _CANONICAL_STANDARD_GATES[StandardGate.RYGate],
240
+ "rz": _CANONICAL_STANDARD_GATES[StandardGate.RZGate],
241
+ "cx": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CXGate][1],
242
+ "cy": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CYGate][1],
243
+ "cz": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CZGate][1],
244
+ "cp": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CPhaseGate][1],
245
+ "crx": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CRXGate][1],
246
+ "cry": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CRYGate][1],
247
+ "crz": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CRZGate][1],
248
+ "ch": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CHGate][1],
249
+ "swap": _CANONICAL_STANDARD_GATES[StandardGate.SwapGate],
250
+ "ccx": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CCXGate][3],
251
+ "cswap": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CSwapGate][1],
252
+ "cu": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CUGate][1],
253
+ "CX": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CXGate][1],
254
+ "phase": _CANONICAL_STANDARD_GATES[StandardGate.PhaseGate],
255
+ "cphase": _CANONICAL_CONTROLLED_STANDARD_GATES[StandardGate.CPhaseGate][1],
256
+ "id": _CANONICAL_STANDARD_GATES[StandardGate.IGate],
257
+ "u1": _CANONICAL_STANDARD_GATES[StandardGate.U1Gate],
258
+ "u2": _CANONICAL_STANDARD_GATES[StandardGate.U2Gate],
259
+ "u3": _CANONICAL_STANDARD_GATES[StandardGate.U3Gate],
240
260
  },
241
261
  }
242
262
 
243
263
  _BUILTIN_GATES = {
244
- "U": library.UGate(*_FIXED_PARAMETERS[:3]),
264
+ "U": _CANONICAL_STANDARD_GATES[StandardGate.UGate],
245
265
  }
246
266
 
247
267
 
@@ -472,9 +492,14 @@ class SymbolTable:
472
492
  def get_gate(self, gate: Gate) -> ast.Identifier | None:
473
493
  """Lookup the identifier for a given `Gate`, if it exists."""
474
494
  canonical = _gate_canonical_form(gate)
475
- # `our_defn.canonical is None` means a basis gate that we should assume is always valid.
476
495
  if (our_defn := self.gates.get(gate.name)) is not None and (
477
- our_defn.canonical is None or our_defn.canonical == canonical
496
+ # We arrange things such that the known definitions for the vast majority of gates we
497
+ # will encounter are the exact same canonical instance, so an `is` check saves time.
498
+ our_defn.canonical is canonical
499
+ # `our_defn.canonical is None` means a basis gate that we should assume is always valid.
500
+ or our_defn.canonical is None
501
+ # The last catch, if the canonical form is some custom gate that compares equal to this.
502
+ or our_defn.canonical == canonical
478
503
  ):
479
504
  return ast.Identifier(gate.name)
480
505
  if canonical._standard_gate is not None:
@@ -499,11 +524,14 @@ def _gate_canonical_form(gate: Gate) -> Gate:
499
524
  # If a gate is part of the Qiskit standard-library gates, we know we can safely produce a
500
525
  # reparameterised gate by passing the parameters positionally to the standard-gate constructor
501
526
  # (and control state, if appropriate).
502
- if gate._standard_gate and not isinstance(gate, ControlledGate):
503
- return gate.base_class(*_FIXED_PARAMETERS[: len(gate.params)])
504
- elif gate._standard_gate:
505
- return gate.base_class(*_FIXED_PARAMETERS[: len(gate.params)], ctrl_state=gate.ctrl_state)
506
- return gate
527
+ standard = gate._standard_gate
528
+ if standard is None:
529
+ return gate
530
+ return (
531
+ _CANONICAL_CONTROLLED_STANDARD_GATES[standard][gate.ctrl_state]
532
+ if standard.is_controlled_gate
533
+ else _CANONICAL_STANDARD_GATES[standard]
534
+ )
507
535
 
508
536
 
509
537
  @dataclasses.dataclass
@@ -590,12 +618,10 @@ class QASM3Builder:
590
618
  self.scope = old_scope
591
619
  self.symbols = old_symbols
592
620
 
593
- def _lookup_variable(self, variable) -> ast.Identifier:
594
- """Lookup a Qiskit object within the current context, and return the name that should be
621
+ def _lookup_bit(self, bit) -> ast.Identifier:
622
+ """Lookup a Qiskit bit within the current context, and return the name that should be
595
623
  used to represent it in OpenQASM 3 programmes."""
596
- if isinstance(variable, Bit):
597
- variable = self.scope.bit_map[variable]
598
- return self.symbols.get_variable(variable)
624
+ return self.symbols.get_variable(self.scope.bit_map[bit])
599
625
 
600
626
  def build_program(self):
601
627
  """Builds a Program"""
@@ -675,9 +701,9 @@ class QASM3Builder:
675
701
  def build_includes(self):
676
702
  """Builds a list of included files."""
677
703
  for filename in self.includes:
678
- if (definitions := _KNOWN_INCLUDES.get(filename)) is None:
679
- raise QASM3ExporterError(f"Unknown OpenQASM 3 include file: '{filename}'")
680
- for name, gate in definitions.items():
704
+ # Note: unknown include files have a corresponding `include` statement generated, but do
705
+ # not actually define any gates; we rely on the user to pass those in `basis_gates`.
706
+ for name, gate in _KNOWN_INCLUDES.get(filename, {}).items():
681
707
  self.symbols.register_gate_without_definition(name, gate)
682
708
  yield ast.Include(filename)
683
709
 
@@ -902,7 +928,7 @@ class QASM3Builder:
902
928
  out = []
903
929
  for register in registers:
904
930
  name = self.symbols.register_variable(register.name, register, allow_rename=True)
905
- elements = [self._lookup_variable(bit) for bit in register]
931
+ elements = [self._lookup_bit(bit) for bit in register]
906
932
  for i, bit in enumerate(register):
907
933
  # This might shadow previous definitions, but that's not a problem.
908
934
  self.symbols.set_object_ident(
@@ -949,18 +975,17 @@ class QASM3Builder:
949
975
  if isinstance(instruction.operation, Gate):
950
976
  nodes = [self.build_gate_call(instruction)]
951
977
  elif isinstance(instruction.operation, Barrier):
952
- operands = [self._lookup_variable(operand) for operand in instruction.qubits]
978
+ operands = [self._lookup_bit(operand) for operand in instruction.qubits]
953
979
  nodes = [ast.QuantumBarrier(operands)]
954
980
  elif isinstance(instruction.operation, Measure):
955
981
  measurement = ast.QuantumMeasurement(
956
- [self._lookup_variable(operand) for operand in instruction.qubits]
982
+ [self._lookup_bit(operand) for operand in instruction.qubits]
957
983
  )
958
- qubit = self._lookup_variable(instruction.clbits[0])
984
+ qubit = self._lookup_bit(instruction.clbits[0])
959
985
  nodes = [ast.QuantumMeasurementAssignment(qubit, measurement)]
960
986
  elif isinstance(instruction.operation, Reset):
961
987
  nodes = [
962
- ast.QuantumReset(self._lookup_variable(operand))
963
- for operand in instruction.qubits
988
+ ast.QuantumReset(self._lookup_bit(operand)) for operand in instruction.qubits
964
989
  ]
965
990
  elif isinstance(instruction.operation, Delay):
966
991
  nodes = [self.build_delay(instruction)]
@@ -981,13 +1006,13 @@ class QASM3Builder:
981
1006
  f" but received '{instruction.operation}'"
982
1007
  )
983
1008
 
984
- if instruction.operation.condition is None:
1009
+ if instruction.operation._condition is None:
985
1010
  statements.extend(nodes)
986
1011
  else:
987
1012
  body = ast.ProgramBlock(nodes)
988
1013
  statements.append(
989
1014
  ast.BranchingStatement(
990
- self.build_expression(_lift_condition(instruction.operation.condition)),
1015
+ self.build_expression(_lift_condition(instruction.operation._condition)),
991
1016
  body,
992
1017
  )
993
1018
  )
@@ -1094,9 +1119,14 @@ class QASM3Builder:
1094
1119
  body_ast = ast.ProgramBlock(self.build_current_scope())
1095
1120
  return ast.ForLoopStatement(indexset_ast, loop_parameter_ast, body_ast)
1096
1121
 
1122
+ def _lookup_variable_for_expression(self, var):
1123
+ if isinstance(var, Bit):
1124
+ return self._lookup_bit(var)
1125
+ return self.symbols.get_variable(var)
1126
+
1097
1127
  def build_expression(self, node: expr.Expr) -> ast.Expression:
1098
1128
  """Build an expression."""
1099
- return node.accept(_ExprBuilder(self._lookup_variable))
1129
+ return node.accept(_ExprBuilder(self._lookup_variable_for_expression))
1100
1130
 
1101
1131
  def build_delay(self, instruction: CircuitInstruction) -> ast.QuantumDelay:
1102
1132
  """Build a built-in delay statement."""
@@ -1116,9 +1146,7 @@ class QASM3Builder:
1116
1146
  "dt": ast.DurationUnit.SAMPLE,
1117
1147
  }
1118
1148
  duration = ast.DurationLiteral(duration_value, unit_map[unit])
1119
- return ast.QuantumDelay(
1120
- duration, [self._lookup_variable(qubit) for qubit in instruction.qubits]
1121
- )
1149
+ return ast.QuantumDelay(duration, [self._lookup_bit(qubit) for qubit in instruction.qubits])
1122
1150
 
1123
1151
  def build_integer(self, value) -> ast.IntegerLiteral:
1124
1152
  """Build an integer literal, raising a :obj:`.QASM3ExporterError` if the input is not
@@ -1138,9 +1166,11 @@ class QASM3Builder:
1138
1166
  # missing, pending a new system in Terra to replace it (2022-03-07).
1139
1167
  if not isinstance(expression, ParameterExpression):
1140
1168
  return expression
1169
+ if isinstance(expression, Parameter):
1170
+ return self.symbols.get_variable(expression).string
1141
1171
  return expression.subs(
1142
1172
  {
1143
- param: Parameter(self._lookup_variable(param).string)
1173
+ param: Parameter(self.symbols.get_variable(param).string, uuid=param.uuid)
1144
1174
  for param in expression.parameters
1145
1175
  }
1146
1176
  )
@@ -1153,18 +1183,14 @@ class QASM3Builder:
1153
1183
  ident = self.symbols.get_gate(instruction.operation)
1154
1184
  if ident is None:
1155
1185
  ident = self.define_gate(instruction.operation)
1156
- qubits = [self._lookup_variable(qubit) for qubit in instruction.qubits]
1157
- if self.disable_constants:
1158
- parameters = [
1159
- ast.StringifyAndPray(self._rebind_scoped_parameters(param))
1160
- for param in instruction.operation.params
1161
- ]
1162
- else:
1163
- parameters = [
1164
- ast.StringifyAndPray(pi_check(self._rebind_scoped_parameters(param), output="qasm"))
1165
- for param in instruction.operation.params
1166
- ]
1167
-
1186
+ qubits = [self._lookup_bit(qubit) for qubit in instruction.qubits]
1187
+ parameters = [
1188
+ ast.StringifyAndPray(self._rebind_scoped_parameters(param))
1189
+ for param in instruction.operation.params
1190
+ ]
1191
+ if not self.disable_constants:
1192
+ for parameter in parameters:
1193
+ parameter.obj = pi_check(parameter.obj, output="qasm")
1168
1194
  return ast.QuantumGateCall(ident, qubits, parameters=parameters)
1169
1195
 
1170
1196
 
@@ -31,6 +31,7 @@ from qiskit.pulse.schedule import Schedule
31
31
  from qiskit.qobj import QobjMeasurementOption, PulseLibraryItem, PulseQobjInstruction
32
32
  from qiskit.qobj.utils import MeasLevel
33
33
  from qiskit.utils import deprecate_func
34
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
34
35
 
35
36
 
36
37
  class ParametricPulseShapes(Enum):
@@ -87,9 +88,9 @@ class InstructionToQobjConverter:
87
88
  This converter converts the Qiskit Pulse in-memory representation into
88
89
  the transfer layer format to submit the data from client to the server.
89
90
 
90
- The transfer layer format must be the text representation that coforms to
91
+ The transfer layer format must be the text representation that conforms to
91
92
  the `OpenPulse specification<https://arxiv.org/abs/1809.03452>`__.
92
- Extention to the OpenPulse can be achieved by subclassing this this with
93
+ Extension to the OpenPulse can be achieved by subclassing this this with
93
94
  extra methods corresponding to each augmented instruction. For example,
94
95
 
95
96
  .. code-block:: python
@@ -509,9 +510,9 @@ class QobjToInstructionConverter:
509
510
  This converter converts data from transfer layer into the in-memory representation of
510
511
  the front-end of Qiskit Pulse.
511
512
 
512
- The transfer layer format must be the text representation that coforms to
513
+ The transfer layer format must be the text representation that conforms to
513
514
  the `OpenPulse specification<https://arxiv.org/abs/1809.03452>`__.
514
- Extention to the OpenPulse can be achieved by subclassing this this with
515
+ Extension to the OpenPulse can be achieved by subclassing this this with
515
516
  extra methods corresponding to each augmented instruction. For example,
516
517
 
517
518
  .. code-block:: python
@@ -532,6 +533,7 @@ class QobjToInstructionConverter:
532
533
 
533
534
  __chan_regex__ = re.compile(r"([a-zA-Z]+)(\d+)")
534
535
 
536
+ @deprecate_pulse_dependency
535
537
  def __init__(
536
538
  self,
537
539
  pulse_library: Optional[List[PulseLibraryItem]] = None,
qiskit/qpy/__init__.py CHANGED
@@ -97,6 +97,8 @@ Attributes:
97
97
  will be able to load all released format versions of QPY (up until
98
98
  ``QPY_VERSION``).
99
99
 
100
+ .. _qpy_compatibility:
101
+
100
102
  QPY Compatibility
101
103
  =================
102
104
 
@@ -116,6 +118,30 @@ and how the feature will be internally handled.
116
118
 
117
119
  .. autoexception:: QPYLoadingDeprecatedFeatureWarning
118
120
 
121
+ .. note::
122
+
123
+ With versions of Qiskit before 1.2.4, the ``use_symengine=True`` argument to :func:`.qpy.dump`
124
+ could cause problems with backwards compatibility if there were :class:`.ParameterExpression`
125
+ objects to serialize. In particular:
126
+
127
+ * When the loading version of Qiskit is 1.2.4 or greater, QPY files generated with any version
128
+ of Qiskit >= 0.46.0 can be loaded. If a version of Qiskit between 0.45.0 and 0.45.3 was used
129
+ to generate the files, and the non-default argument ``use_symengine=True`` was given to
130
+ :func:`.qpy.dump`, the file can only be read if the version of ``symengine`` used in the
131
+ generating environment was in the 0.11 or 0.13 series, but if the environment was created
132
+ during the support window of Qiskit 0.45, it is likely that ``symengine==0.9.2`` was used.
133
+
134
+ * When the loading version of Qiskit is between 0.46.0 and 1.2.2 inclusive, the file can only be
135
+ read if the installed version of ``symengine`` in the loading environment matches the version
136
+ used in the generating environment.
137
+
138
+ To recover a QPY file that fails with ``symengine`` version-related errors during a call to
139
+ :func:`.qpy.load`, first attempt to use Qiskit >= 1.2.4 to load the file. If this still fails,
140
+ it is likely because Qiskit 0.45.x was used to generate the file with ``use_symengine=True``.
141
+ In this case, use Qiskit 0.45.3 with ``symengine==0.9.2`` to load the file, and then re-export
142
+ it to QPY setting ``use_symengine=False``. The resulting file can then be loaded by any later
143
+ version of Qiskit.
144
+
119
145
  QPY format version history
120
146
  --------------------------
121
147
 
@@ -133,6 +159,24 @@ of QPY in qiskit-terra 0.18.0.
133
159
  * - Qiskit (qiskit-terra for < 1.0.0) version
134
160
  - :func:`.dump` format(s) output versions
135
161
  - :func:`.load` maximum supported version (older format versions can always be read)
162
+ * - 1.3.0
163
+ - 10, 11, 12, 13
164
+ - 13
165
+ * - 1.2.4
166
+ - 10, 11, 12
167
+ - 12
168
+ * - 1.2.3 (yanked)
169
+ - 10, 11, 12
170
+ - 12
171
+ * - 1.2.2
172
+ - 10, 11, 12
173
+ - 12
174
+ * - 1.2.1
175
+ - 10, 11, 12
176
+ - 12
177
+ * - 1.2.0
178
+ - 10, 11, 12
179
+ - 12
136
180
  * - 1.1.0
137
181
  - 10, 11, 12
138
182
  - 12
@@ -298,6 +342,141 @@ There is a circuit payload for each circuit (where the total number is dictated
298
342
  by ``num_circuits`` in the file header). There is no padding between the
299
343
  circuits in the data.
300
344
 
345
+ .. _qpy_version_13:
346
+
347
+ Version 13
348
+ ----------
349
+
350
+ Version 13 added a native Qiskit serialization representation for :class:`.ParameterExpression`.
351
+ Previous QPY versions relied on either ``sympy`` or ``symengine`` to serialize the underlying symbolic
352
+ expression. Starting in Version 13, QPY now represents the sequence of API calls used to create the
353
+ :class:`.ParameterExpression`.
354
+
355
+ The main change in the serialization format is in the :ref:`qpy_param_expr_v3` payload. The
356
+ ``expr_size`` bytes following the head now contain an array of ``PARAM_EXPR_ELEM_V13`` structs. The
357
+ intent is for this array to be read one struct at a time, where each struct describes one of the
358
+ calls to make to reconstruct the :class:`.ParameterExpression`.
359
+
360
+ PARAM_EXPR_ELEM_V13
361
+ ~~~~~~~~~~~~~~~~~~~
362
+
363
+ The struct format is defined as:
364
+
365
+ .. code-block:: c
366
+
367
+ struct {
368
+ unsigned char op_code;
369
+ char lhs_type;
370
+ char lhs[16];
371
+ char rhs_type;
372
+ char rhs[16];
373
+ } PARAM_EXPR_ELEM_V13;
374
+
375
+ The ``op_code`` field is used to define the operation added to the :class:`.ParameterExpression`.
376
+ The value can be:
377
+
378
+ .. list-table:: PARAM_EXPR_ELEM_V13 op code values
379
+ :header-rows: 1
380
+
381
+ * - ``op_code``
382
+ - :class:`.ParameterExpression` method
383
+ * - 0
384
+ - :meth:`~.ParameterExpression.__add__`
385
+ * - 1
386
+ - :meth:`~.ParameterExpression.__sub__`
387
+ * - 2
388
+ - :meth:`~.ParameterExpression.__mul__`
389
+ * - 3
390
+ - :meth:`~.ParameterExpression.__truediv__`
391
+ * - 4
392
+ - :meth:`~.ParameterExpression.__pow__`
393
+ * - 5
394
+ - :meth:`~.ParameterExpression.sin`
395
+ * - 6
396
+ - :meth:`~.ParameterExpression.cos`
397
+ * - 7
398
+ - :meth:`~.ParameterExpression.tan`
399
+ * - 8
400
+ - :meth:`~.ParameterExpression.arcsin`
401
+ * - 9
402
+ - :meth:`~.ParameterExpression.arccos`
403
+ * - 10
404
+ - :meth:`~.ParameterExpression.exp`
405
+ * - 11
406
+ - :meth:`~.ParameterExpression.log`
407
+ * - 12
408
+ - :meth:`~.ParameterExpression.sign`
409
+ * - 13
410
+ - :meth:`~.ParameterExpression.gradient`
411
+ * - 14
412
+ - :meth:`~.ParameterExpression.conjugate`
413
+ * - 15
414
+ - :meth:`~.ParameterExpression.subs`
415
+ * - 16
416
+ - :meth:`~.ParameterExpression.abs`
417
+ * - 17
418
+ - :meth:`~.ParameterExpression.arctan`
419
+ * - 255
420
+ - NULL
421
+
422
+ The ``NULL`` value of 255 is only used to fill the op code field for
423
+ entries that are not actual operations but indicate recursive definitions.
424
+ Then the ``lhs_type`` and ``rhs_type`` fields are used to describe
425
+ the operand types and can be one of the following UTF-8 encoded
426
+ characters:
427
+
428
+ .. list-table:: PARAM_EXPR_ELEM_V13 operand type values
429
+ :header-rows: 1
430
+
431
+ * - Value
432
+ - Type
433
+ * - ``n``
434
+ - ``None``
435
+ * - ``p``
436
+ - :class:`.Parameter`
437
+ * - ``f``
438
+ - ``float``
439
+ * - ``c``
440
+ - ``complex``
441
+ * - ``i``
442
+ - ``int``
443
+ * - ``s``
444
+ - Recursive :class:`.ParameterExpression` definition start
445
+ * - ``e``
446
+ - Recursive :class:`.ParameterExpression` definition stop
447
+ * - ``u``
448
+ - substitution
449
+
450
+ If the type value is ``f`` ,``c`` or ``i``, the corresponding ``lhs`` or `rhs``
451
+ field widths are 128 bits each. In the case of floats, the literal value is encoded as a double
452
+ with 0 padding, while complex numbers are encoded as real part followed by imaginary part,
453
+ taking up 64 bits each. For ``i`, the value is encoded as a 64 bit signed integer with 0 padding
454
+ for the full 128 bit width. ``n`` is used to represent a ``None`` and typically isn't directly used
455
+ as it indicates an argument that's not used. For ``p`` the data is the UUID for the
456
+ :class:`.Parameter` which can be looked up in the symbol map described in the
457
+ ``map_elements`` outer :ref:`qpy_param_expr_v3` payload. If the type value is
458
+ ``s`` this marks the start of a a new recursive section for a nested
459
+ :class:`.ParameterExpression`. For example, in the following snippet there is an inner ``expr``
460
+ contained in ``final_expr``, constituting a nested expression::
461
+
462
+ from qiskit.circuit import Parameter
463
+
464
+ x = Parameter("x")
465
+ y = Parameter("y")
466
+ z = Parameter("z")
467
+
468
+ expr = (x + y) / 2
469
+ final_expr = z**2 + expr
470
+
471
+ When ``s`` is encountered, this indicates that until an ``e` struct is reached, the next structs
472
+ are used for a recursive definition. For both
473
+ ``s`` and ``e`` types, the data values are not used, and always set to 0. The type value
474
+ of ``u`` is used to represent a substitution call. This is only used for ``lhs_type``
475
+ and is always paired with an ``rhs_type`` of ``n``. The data value is the size in bytes of
476
+ a :ref:`qpy_mapping` encoded mapping of :class:`.Parameter` names to their value for the
477
+ :meth:`~.ParameterExpression.subs` call. The mapping data is immediately following the
478
+ struct, and the next struct starts immediately after the mapping data.
479
+
301
480
  .. _qpy_version_12:
302
481
 
303
482
  Version 12
@@ -1621,6 +1800,8 @@ struct is used:
1621
1800
 
1622
1801
  this matches the internal C representation of Python's complex type. [#f3]_
1623
1802
 
1803
+ References
1804
+ ==========
1624
1805
 
1625
1806
  .. [#f1] https://tools.ietf.org/html/rfc1700
1626
1807
  .. [#f2] https://numpy.org/doc/stable/reference/generated/numpy.lib.format.html
@@ -318,6 +318,13 @@ def _read_instruction(
318
318
  use_symengine,
319
319
  standalone_vars,
320
320
  )
321
+ if condition is not None:
322
+ warnings.warn(
323
+ f"The .condition attribute on {gate_name} will be loaded as an IfElseOp "
324
+ "starting in Qiskit 2.0",
325
+ FutureWarning,
326
+ stacklevel=3,
327
+ )
321
328
  inst_obj.condition = condition
322
329
  if instruction.label_size > 0:
323
330
  inst_obj.label = label
@@ -414,6 +421,12 @@ def _read_instruction(
414
421
  gate = gate_class(*params)
415
422
  if condition:
416
423
  if not isinstance(gate, ControlFlowOp):
424
+ warnings.warn(
425
+ f"The .condition attribute on {gate} will be loaded as an "
426
+ "IfElseOp starting in Qiskit 2.0",
427
+ FutureWarning,
428
+ stacklevel=3,
429
+ )
417
430
  gate = gate.c_if(*condition)
418
431
  else:
419
432
  gate.condition = condition
@@ -761,13 +774,13 @@ def _write_instruction(
761
774
  condition_type = type_keys.Condition.NONE
762
775
  condition_register = b""
763
776
  condition_value = 0
764
- if (op_condition := getattr(instruction.operation, "condition", None)) is not None:
777
+ if (op_condition := getattr(instruction.operation, "_condition", None)) is not None:
765
778
  if isinstance(op_condition, expr.Expr):
766
779
  condition_type = type_keys.Condition.EXPRESSION
767
780
  else:
768
781
  condition_type = type_keys.Condition.TWO_TUPLE
769
- condition_register = _dumps_register(instruction.operation.condition[0], index_map)
770
- condition_value = int(instruction.operation.condition[1])
782
+ condition_register = _dumps_register(instruction.operation._condition[0], index_map)
783
+ condition_value = int(instruction.operation._condition[1])
771
784
 
772
785
  gate_class_name = gate_class_name.encode(common.ENCODE)
773
786
  label = getattr(instruction.operation, "label", None)
@@ -1310,7 +1323,7 @@ def write_circuit(
1310
1323
  instruction_buffer.close()
1311
1324
 
1312
1325
  # Write calibrations
1313
- _write_calibrations(file_obj, circuit.calibrations, metadata_serializer, version=version)
1326
+ _write_calibrations(file_obj, circuit._calibrations_prop, metadata_serializer, version=version)
1314
1327
  _write_layout(file_obj, circuit)
1315
1328
 
1316
1329
 
@@ -1440,7 +1453,9 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1440
1453
 
1441
1454
  # Read calibrations
1442
1455
  if version >= 5:
1443
- circ.calibrations = _read_calibrations(file_obj, version, vectors, metadata_deserializer)
1456
+ circ._calibrations_prop = _read_calibrations(
1457
+ file_obj, version, vectors, metadata_deserializer
1458
+ )
1444
1459
 
1445
1460
  for vec_name, (vector, initialized_params) in vectors.items():
1446
1461
  if len(initialized_params) != len(vector):
@@ -20,9 +20,6 @@ from io import BytesIO
20
20
 
21
21
  import numpy as np
22
22
  import symengine as sym
23
- from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
24
- load_basic,
25
- )
26
23
 
27
24
  from qiskit.exceptions import QiskitError
28
25
  from qiskit.pulse import library, channels, instructions
@@ -31,6 +28,7 @@ from qiskit.qpy import formats, common, type_keys
31
28
  from qiskit.qpy.binary_io import value
32
29
  from qiskit.qpy.exceptions import QpyError
33
30
  from qiskit.pulse.configuration import Kernel, Discriminator
31
+ from qiskit.utils.deprecate_pulse import ignore_pulse_deprecation_warnings
34
32
 
35
33
 
36
34
  def _read_channel(file_obj, version):
@@ -106,7 +104,7 @@ def _loads_symbolic_expr(expr_bytes, use_symengine=False):
106
104
  return None
107
105
  expr_bytes = zlib.decompress(expr_bytes)
108
106
  if use_symengine:
109
- return load_basic(expr_bytes)
107
+ return common.load_symengine_payload(expr_bytes)
110
108
  else:
111
109
  from sympy import parse_expr
112
110
 
@@ -513,6 +511,7 @@ def _dumps_reference_item(schedule, metadata_serializer, version):
513
511
  return type_key, data_bytes
514
512
 
515
513
 
514
+ @ignore_pulse_deprecation_warnings
516
515
  def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symengine=False):
517
516
  """Read a single ScheduleBlock from the file like object.
518
517