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
@@ -15,20 +15,23 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import collections.abc
18
+ import io
18
19
  import struct
19
20
  import uuid
20
21
 
21
22
  import numpy as np
22
23
  import symengine
23
- from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
24
- load_basic,
25
- )
26
24
 
27
25
 
28
26
  from qiskit.circuit import CASE_DEFAULT, Clbit, ClassicalRegister
29
27
  from qiskit.circuit.classical import expr, types
30
28
  from qiskit.circuit.parameter import Parameter
31
- from qiskit.circuit.parameterexpression import ParameterExpression
29
+ from qiskit.circuit.parameterexpression import (
30
+ ParameterExpression,
31
+ op_code_to_method,
32
+ _OPCode,
33
+ _SUBS,
34
+ )
32
35
  from qiskit.circuit.parametervector import ParameterVector, ParameterVectorElement
33
36
  from qiskit.qpy import common, formats, exceptions, type_keys
34
37
 
@@ -53,20 +56,132 @@ def _write_parameter_vec(file_obj, obj):
53
56
  file_obj.write(name_bytes)
54
57
 
55
58
 
56
- def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
57
- if use_symengine:
58
- expr_bytes = obj._symbol_expr.__reduce__()[1][0]
59
+ def _encode_replay_entry(inst, file_obj, version, r_side=False):
60
+ inst_type = None
61
+ inst_data = None
62
+ if inst is None:
63
+ inst_type = "n"
64
+ inst_data = b"\x00"
65
+ elif isinstance(inst, Parameter):
66
+ inst_type = "p"
67
+ inst_data = inst.uuid.bytes
68
+ elif isinstance(inst, complex):
69
+ inst_type = "c"
70
+ inst_data = struct.pack("!dd", inst.real, inst.imag)
71
+ elif isinstance(inst, float):
72
+ inst_type = "f"
73
+ inst_data = struct.pack("!Qd", 0, inst)
74
+ elif isinstance(inst, int):
75
+ inst_type = "i"
76
+ inst_data = struct.pack("!Qq", 0, inst)
77
+ elif isinstance(inst, ParameterExpression):
78
+ if not r_side:
79
+ entry = struct.pack(
80
+ formats.PARAM_EXPR_ELEM_V13_PACK,
81
+ 255,
82
+ "s".encode("utf8"),
83
+ b"\x00",
84
+ "n".encode("utf8"),
85
+ b"\x00",
86
+ )
87
+ else:
88
+ entry = struct.pack(
89
+ formats.PARAM_EXPR_ELEM_V13_PACK,
90
+ 255,
91
+ "n".encode("utf8"),
92
+ b"\x00",
93
+ "s".encode("utf8"),
94
+ b"\x00",
95
+ )
96
+ file_obj.write(entry)
97
+ _write_parameter_expression_v13(file_obj, inst, version)
98
+ if not r_side:
99
+ entry = struct.pack(
100
+ formats.PARAM_EXPR_ELEM_V13_PACK,
101
+ 255,
102
+ "e".encode("utf8"),
103
+ b"\x00",
104
+ "n".encode("utf8"),
105
+ b"\x00",
106
+ )
107
+ else:
108
+ entry = struct.pack(
109
+ formats.PARAM_EXPR_ELEM_V13_PACK,
110
+ 255,
111
+ "n".encode("utf8"),
112
+ b"\x00",
113
+ "e".encode("utf8"),
114
+ b"\x00",
115
+ )
116
+ file_obj.write(entry)
117
+ inst_type = "n"
118
+ inst_data = b"\x00"
59
119
  else:
60
- from sympy import srepr, sympify
120
+ raise exceptions.QpyError("Invalid parameter expression type")
121
+ return inst_type, inst_data
122
+
61
123
 
62
- expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
124
+ def _encode_replay_subs(subs, file_obj, version):
125
+ with io.BytesIO() as mapping_buf:
126
+ subs_dict = {k.name: v for k, v in subs.binds.items()}
127
+ common.write_mapping(
128
+ mapping_buf, mapping=subs_dict, serializer=dumps_value, version=version
129
+ )
130
+ data = mapping_buf.getvalue()
131
+ entry = struct.pack(
132
+ formats.PARAM_EXPR_ELEM_V13_PACK,
133
+ subs.op,
134
+ "u".encode("utf8"),
135
+ struct.pack("!QQ", len(data), 0),
136
+ "n".encode("utf8"),
137
+ b"\x00",
138
+ )
139
+ file_obj.write(entry)
140
+ file_obj.write(data)
141
+ return subs.binds
142
+
143
+
144
+ def _write_parameter_expression_v13(file_obj, obj, version):
145
+ symbol_map = {}
146
+ for inst in obj._qpy_replay:
147
+ if isinstance(inst, _SUBS):
148
+ symbol_map.update(_encode_replay_subs(inst, file_obj, version))
149
+ continue
150
+ lhs_type, lhs = _encode_replay_entry(inst.lhs, file_obj, version)
151
+ rhs_type, rhs = _encode_replay_entry(inst.rhs, file_obj, version, True)
152
+ entry = struct.pack(
153
+ formats.PARAM_EXPR_ELEM_V13_PACK,
154
+ inst.op,
155
+ lhs_type.encode("utf8"),
156
+ lhs,
157
+ rhs_type.encode("utf8"),
158
+ rhs,
159
+ )
160
+ file_obj.write(entry)
161
+ return symbol_map
63
162
 
163
+
164
+ def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
165
+ extra_symbols = None
166
+ if version < 13:
167
+ if use_symengine:
168
+ expr_bytes = obj._symbol_expr.__reduce__()[1][0]
169
+ else:
170
+ from sympy import srepr, sympify
171
+
172
+ expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
173
+ else:
174
+ with io.BytesIO() as buf:
175
+ extra_symbols = _write_parameter_expression_v13(buf, obj, version)
176
+ expr_bytes = buf.getvalue()
177
+ symbol_table_len = len(obj._parameter_symbols)
178
+ if extra_symbols:
179
+ symbol_table_len += 2 * len(extra_symbols)
64
180
  param_expr_header_raw = struct.pack(
65
- formats.PARAMETER_EXPR_PACK, len(obj._parameter_symbols), len(expr_bytes)
181
+ formats.PARAMETER_EXPR_PACK, symbol_table_len, len(expr_bytes)
66
182
  )
67
183
  file_obj.write(param_expr_header_raw)
68
184
  file_obj.write(expr_bytes)
69
-
70
185
  for symbol, value in obj._parameter_symbols.items():
71
186
  symbol_key = type_keys.Value.assign(symbol)
72
187
 
@@ -92,6 +207,49 @@ def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
92
207
  file_obj.write(elem_header)
93
208
  file_obj.write(symbol_data)
94
209
  file_obj.write(value_data)
210
+ if extra_symbols:
211
+ for symbol in extra_symbols:
212
+ symbol_key = type_keys.Value.assign(symbol)
213
+ # serialize key
214
+ if symbol_key == type_keys.Value.PARAMETER_VECTOR:
215
+ symbol_data = common.data_to_binary(symbol, _write_parameter_vec)
216
+ else:
217
+ symbol_data = common.data_to_binary(symbol, _write_parameter)
218
+ # serialize value
219
+ value_key, value_data = dumps_value(
220
+ symbol, version=version, use_symengine=use_symengine
221
+ )
222
+
223
+ elem_header = struct.pack(
224
+ formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
225
+ symbol_key,
226
+ value_key,
227
+ len(value_data),
228
+ )
229
+ file_obj.write(elem_header)
230
+ file_obj.write(symbol_data)
231
+ file_obj.write(value_data)
232
+ for symbol in extra_symbols.values():
233
+ symbol_key = type_keys.Value.assign(symbol)
234
+ # serialize key
235
+ if symbol_key == type_keys.Value.PARAMETER_VECTOR:
236
+ symbol_data = common.data_to_binary(symbol, _write_parameter_vec)
237
+ else:
238
+ symbol_data = common.data_to_binary(symbol, _write_parameter)
239
+ # serialize value
240
+ value_key, value_data = dumps_value(
241
+ symbol, version=version, use_symengine=use_symengine
242
+ )
243
+
244
+ elem_header = struct.pack(
245
+ formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
246
+ symbol_key,
247
+ value_key,
248
+ len(value_data),
249
+ )
250
+ file_obj.write(elem_header)
251
+ file_obj.write(symbol_data)
252
+ file_obj.write(value_data)
95
253
 
96
254
 
97
255
  class _ExprWriter(expr.ExprVisitor[None]):
@@ -290,7 +448,7 @@ def _read_parameter_expression_v3(file_obj, vectors, use_symengine):
290
448
 
291
449
  payload = file_obj.read(data.expr_size)
292
450
  if use_symengine:
293
- expr_ = load_basic(payload)
451
+ expr_ = common.load_symengine_payload(payload)
294
452
  else:
295
453
  from sympy.parsing.sympy_parser import parse_expr
296
454
 
@@ -337,6 +495,141 @@ def _read_parameter_expression_v3(file_obj, vectors, use_symengine):
337
495
  return ParameterExpression(symbol_map, expr_)
338
496
 
339
497
 
498
+ def _read_parameter_expression_v13(file_obj, vectors, version):
499
+ data = formats.PARAMETER_EXPR(
500
+ *struct.unpack(formats.PARAMETER_EXPR_PACK, file_obj.read(formats.PARAMETER_EXPR_SIZE))
501
+ )
502
+
503
+ payload = file_obj.read(data.expr_size)
504
+
505
+ symbol_map = {}
506
+ for _ in range(data.map_elements):
507
+ elem_data = formats.PARAM_EXPR_MAP_ELEM_V3(
508
+ *struct.unpack(
509
+ formats.PARAM_EXPR_MAP_ELEM_V3_PACK,
510
+ file_obj.read(formats.PARAM_EXPR_MAP_ELEM_V3_SIZE),
511
+ )
512
+ )
513
+ symbol_key = type_keys.Value(elem_data.symbol_type)
514
+
515
+ if symbol_key == type_keys.Value.PARAMETER:
516
+ symbol = _read_parameter(file_obj)
517
+ elif symbol_key == type_keys.Value.PARAMETER_VECTOR:
518
+ symbol = _read_parameter_vec(file_obj, vectors)
519
+ else:
520
+ raise exceptions.QpyError(f"Invalid parameter expression map type: {symbol_key}")
521
+
522
+ elem_key = type_keys.Value(elem_data.type)
523
+ binary_data = file_obj.read(elem_data.size)
524
+ if elem_key == type_keys.Value.INTEGER:
525
+ value = struct.unpack("!q", binary_data)
526
+ elif elem_key == type_keys.Value.FLOAT:
527
+ value = struct.unpack("!d", binary_data)
528
+ elif elem_key == type_keys.Value.COMPLEX:
529
+ value = complex(*struct.unpack(formats.COMPLEX_PACK, binary_data))
530
+ elif elem_key in (type_keys.Value.PARAMETER, type_keys.Value.PARAMETER_VECTOR):
531
+ value = symbol._symbol_expr
532
+ elif elem_key == type_keys.Value.PARAMETER_EXPRESSION:
533
+ value = common.data_from_binary(
534
+ binary_data,
535
+ _read_parameter_expression_v13,
536
+ vectors=vectors,
537
+ )
538
+ else:
539
+ raise exceptions.QpyError(f"Invalid parameter expression map type: {elem_key}")
540
+ symbol_map[symbol] = value
541
+ with io.BytesIO(payload) as buf:
542
+ return _read_parameter_expr_v13(buf, symbol_map, version, vectors)
543
+
544
+
545
+ def _read_parameter_expr_v13(buf, symbol_map, version, vectors):
546
+ param_uuid_map = {symbol.uuid: symbol for symbol in symbol_map if isinstance(symbol, Parameter)}
547
+ name_map = {str(v): k for k, v in symbol_map.items()}
548
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
549
+ stack = []
550
+ while data:
551
+ expression_data = formats.PARAM_EXPR_ELEM_V13._make(
552
+ struct.unpack(formats.PARAM_EXPR_ELEM_V13_PACK, data)
553
+ )
554
+ # LHS
555
+ if expression_data.LHS_TYPE == b"p":
556
+ stack.append(param_uuid_map[uuid.UUID(bytes=expression_data.LHS)])
557
+ elif expression_data.LHS_TYPE == b"f":
558
+ stack.append(struct.unpack("!Qd", expression_data.LHS)[1])
559
+ elif expression_data.LHS_TYPE == b"n":
560
+ pass
561
+ elif expression_data.LHS_TYPE == b"c":
562
+ stack.append(complex(*struct.unpack("!dd", expression_data.LHS)))
563
+ elif expression_data.LHS_TYPE == b"i":
564
+ stack.append(struct.unpack("!Qq", expression_data.LHS)[1])
565
+ elif expression_data.LHS_TYPE == b"s":
566
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
567
+ continue
568
+ elif expression_data.LHS_TYPE == b"e":
569
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
570
+ continue
571
+ elif expression_data.LHS_TYPE == b"u":
572
+ size = struct.unpack_from("!QQ", expression_data.LHS)[0]
573
+ subs_map_data = buf.read(size)
574
+ with io.BytesIO(subs_map_data) as mapping_buf:
575
+ mapping = common.read_mapping(
576
+ mapping_buf, deserializer=loads_value, version=version, vectors=vectors
577
+ )
578
+ stack.append({name_map[k]: v for k, v in mapping.items()})
579
+ else:
580
+ raise exceptions.QpyError(
581
+ "Unknown ParameterExpression operation type {expression_data.LHS_TYPE}"
582
+ )
583
+ # RHS
584
+ if expression_data.RHS_TYPE == b"p":
585
+ stack.append(param_uuid_map[uuid.UUID(bytes=expression_data.RHS)])
586
+ elif expression_data.RHS_TYPE == b"f":
587
+ stack.append(struct.unpack("!Qd", expression_data.RHS)[1])
588
+ elif expression_data.RHS_TYPE == b"n":
589
+ pass
590
+ elif expression_data.RHS_TYPE == b"c":
591
+ stack.append(complex(*struct.unpack("!dd", expression_data.RHS)))
592
+ elif expression_data.RHS_TYPE == b"i":
593
+ stack.append(struct.unpack("!Qq", expression_data.RHS)[1])
594
+ elif expression_data.RHS_TYPE == b"s":
595
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
596
+ continue
597
+ elif expression_data.RHS_TYPE == b"e":
598
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
599
+ continue
600
+ else:
601
+ raise exceptions.QpyError(
602
+ f"Unknown ParameterExpression operation type {expression_data.RHS_TYPE}"
603
+ )
604
+ if expression_data.OP_CODE == 255:
605
+ continue
606
+ method_str = op_code_to_method(_OPCode(expression_data.OP_CODE))
607
+ if expression_data.OP_CODE in {0, 1, 2, 3, 4, 13, 15, 18, 19, 20}:
608
+ rhs = stack.pop()
609
+ lhs = stack.pop()
610
+ # Reverse ops for commutative ops, which are add, mul (0 and 2 respectively)
611
+ # op codes 13 and 15 can never be reversed and 18, 19, 20
612
+ # are the reversed versions of non-commuative operations
613
+ # so 1, 3, 4 and 18, 19, 20 handle this explicitly.
614
+ if (
615
+ not isinstance(lhs, ParameterExpression)
616
+ and isinstance(rhs, ParameterExpression)
617
+ and expression_data.OP_CODE in {0, 2}
618
+ ):
619
+ if expression_data.OP_CODE == 0:
620
+ method_str = "__radd__"
621
+ elif expression_data.OP_CODE == 2:
622
+ method_str = "__rmul__"
623
+ stack.append(getattr(rhs, method_str)(lhs))
624
+ else:
625
+ stack.append(getattr(lhs, method_str)(rhs))
626
+ else:
627
+ lhs = stack.pop()
628
+ stack.append(getattr(lhs, method_str)())
629
+ data = buf.read(formats.PARAM_EXPR_ELEM_V13_SIZE)
630
+ return stack.pop()
631
+
632
+
340
633
  def _read_expr(
341
634
  file_obj,
342
635
  clbits: collections.abc.Sequence[Clbit],
@@ -667,13 +960,17 @@ def loads_value(
667
960
  if type_key == type_keys.Value.PARAMETER_EXPRESSION:
668
961
  if version < 3:
669
962
  return common.data_from_binary(binary_data, _read_parameter_expression)
670
- else:
963
+ elif version < 13:
671
964
  return common.data_from_binary(
672
965
  binary_data,
673
966
  _read_parameter_expression_v3,
674
967
  vectors=vectors,
675
968
  use_symengine=use_symengine,
676
969
  )
970
+ else:
971
+ return common.data_from_binary(
972
+ binary_data, _read_parameter_expression_v13, vectors=vectors, version=version
973
+ )
677
974
  if type_key == type_keys.Value.EXPRESSION:
678
975
  return common.data_from_binary(
679
976
  binary_data,
qiskit/qpy/common.py CHANGED
@@ -18,9 +18,14 @@ Common functions across several serialization and deserialization modules.
18
18
  import io
19
19
  import struct
20
20
 
21
- from qiskit.qpy import formats
21
+ import symengine
22
+ from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
23
+ load_basic,
24
+ )
22
25
 
23
- QPY_VERSION = 12
26
+ from qiskit.qpy import formats, exceptions
27
+
28
+ QPY_VERSION = 13
24
29
  QPY_COMPATIBILITY_VERSION = 10
25
30
  ENCODE = "utf8"
26
31
 
@@ -304,3 +309,42 @@ def mapping_from_binary(binary_data, deserializer, **kwargs):
304
309
  mapping = read_mapping(container, deserializer, **kwargs)
305
310
 
306
311
  return mapping
312
+
313
+
314
+ def load_symengine_payload(payload: bytes) -> symengine.Expr:
315
+ """Load a symengine expression from it's serialized cereal payload."""
316
+ # This is a horrible hack to workaround the symengine version checking
317
+ # it's deserialization does. There were no changes to the serialization
318
+ # format between 0.11 and 0.13 but the deserializer checks that it can't
319
+ # load across a major or minor version boundary. This works around it
320
+ # by just lying about the generating version.
321
+ symengine_version = symengine.__version__.split(".")
322
+ major = payload[2]
323
+ minor = payload[3]
324
+ if int(symengine_version[1]) != minor:
325
+ if major != 0:
326
+ raise exceptions.QpyError(
327
+ "Qiskit doesn't support loading a symengine payload generated with symengine >= 1.0"
328
+ )
329
+ if minor == 9:
330
+ raise exceptions.QpyError(
331
+ "Qiskit doesn't support loading a historical QPY file with `use_symengine=True` "
332
+ "generated in an environment using symengine 0.9.0. If you need to load this file "
333
+ "you can do so with Qiskit 0.45.x or 0.46.x and re-export the QPY file using "
334
+ "`use_symengine=False`."
335
+ )
336
+ if minor not in (11, 13):
337
+ raise exceptions.QpyError(
338
+ f"Incompatible symengine version {major}.{minor} used to generate the QPY "
339
+ "payload"
340
+ )
341
+ minor_version = int(symengine_version[1])
342
+ if minor_version not in (11, 13):
343
+ raise exceptions.QpyError(
344
+ f"Incompatible installed symengine version {symengine.__version__} to load "
345
+ "this QPY payload"
346
+ )
347
+ payload = bytearray(payload)
348
+ payload[3] = minor_version
349
+ payload = bytes(payload)
350
+ return load_basic(payload)
qiskit/qpy/formats.py CHANGED
@@ -259,6 +259,13 @@ PARAMETER = namedtuple("PARAMETER", ["name_size", "uuid"])
259
259
  PARAMETER_PACK = "!H16s"
260
260
  PARAMETER_SIZE = struct.calcsize(PARAMETER_PACK)
261
261
 
262
+ # PARAMETEREXPRESSION_ENTRY
263
+ PARAM_EXPR_ELEM_V13 = namedtuple(
264
+ "PARAM_EXPR_ELEM_V13", ["OP_CODE", "LHS_TYPE", "LHS", "RHS_TYPE", "RHS"]
265
+ )
266
+ PARAM_EXPR_ELEM_V13_PACK = "!Bc16sc16s"
267
+ PARAM_EXPR_ELEM_V13_SIZE = struct.calcsize(PARAM_EXPR_ELEM_V13_PACK)
268
+
262
269
  # COMPLEX
263
270
  COMPLEX = namedtuple("COMPLEX", ["real", "imag"])
264
271
  COMPLEX_PACK = "!dd"
qiskit/qpy/interface.py CHANGED
@@ -25,8 +25,9 @@ from qiskit.circuit import QuantumCircuit
25
25
  from qiskit.pulse import ScheduleBlock
26
26
  from qiskit.exceptions import QiskitError
27
27
  from qiskit.qpy import formats, common, binary_io, type_keys
28
- from qiskit.qpy.exceptions import QpyError
28
+ from qiskit.qpy.exceptions import QPYLoadingDeprecatedFeatureWarning, QpyError
29
29
  from qiskit.version import __version__
30
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_arg
30
31
 
31
32
 
32
33
  # pylint: disable=invalid-name
@@ -73,6 +74,11 @@ VERSION_PATTERN = (
73
74
  VERSION_PATTERN_REGEX = re.compile(VERSION_PATTERN, re.VERBOSE | re.IGNORECASE)
74
75
 
75
76
 
77
+ @deprecate_pulse_arg(
78
+ "programs",
79
+ deprecation_description="Passing `ScheduleBlock` to `programs`",
80
+ predicate=lambda p: isinstance(p, ScheduleBlock),
81
+ )
76
82
  def dump(
77
83
  programs: Union[List[QPY_SUPPORTED_TYPES], QPY_SUPPORTED_TYPES],
78
84
  file_obj: BinaryIO,
@@ -120,15 +126,16 @@ def dump(
120
126
  programs: QPY supported object(s) to store in the specified file like object.
121
127
  QPY supports :class:`.QuantumCircuit` and :class:`.ScheduleBlock`.
122
128
  Different data types must be separately serialized.
129
+ Support for :class:`.ScheduleBlock` is deprecated since Qiskit 1.3.0.
123
130
  file_obj: The file like object to write the QPY data too
124
131
  metadata_serializer: An optional JSONEncoder class that
125
132
  will be passed the ``.metadata`` attribute for each program in ``programs`` and will be
126
133
  used as the ``cls`` kwarg on the `json.dump()`` call to JSON serialize that dictionary.
127
134
  use_symengine: If True, all objects containing symbolic expressions will be serialized
128
135
  using symengine's native mechanism. This is a faster serialization alternative,
129
- but not supported in all platforms. Please check that your target platform is supported
130
- by the symengine library before setting this option, as it will be required by qpy to
131
- deserialize the payload. For this reason, the option defaults to False.
136
+ but not supported in all platforms. This flag only has an effect if the emitted QPY format
137
+ version is 10, 11, or 12. For QPY format version >= 13 (which is the default starting in
138
+ Qiskit 1.3.0) this flag is no longer used.
132
139
  version: The QPY format version to emit. By default this defaults to
133
140
  the latest supported format of :attr:`~.qpy.QPY_VERSION`, however for
134
141
  compatibility reasons if you need to load the generated QPY payload with an older
@@ -144,6 +151,17 @@ def dump(
144
151
  from the QPY format at that version will persist. This should only be used if
145
152
  compatibility with loading the payload with an older version of Qiskit is necessary.
146
153
 
154
+ .. note::
155
+
156
+ If serializing a :class:`.QuantumCircuit` or :class:`.ScheduleBlock` that contain
157
+ :class:`.ParameterExpression` objects with ``version`` set low with the intent to
158
+ load the payload using a historical release of Qiskit, it is safest to set the
159
+ ``use_symengine`` flag to ``False``. Versions of Qiskit prior to 1.2.4 cannot load
160
+ QPY files containing ``symengine``-serialized :class:`.ParameterExpression` objects
161
+ unless the version of ``symengine`` used between the loading and generating
162
+ environments matches.
163
+
164
+
147
165
  Raises:
148
166
  QpyError: When multiple data format is mixed in the output.
149
167
  TypeError: When invalid data type is input.
@@ -197,7 +215,10 @@ def dump(
197
215
  file_obj.write(header)
198
216
  common.write_type_key(file_obj, type_key)
199
217
 
218
+ pulse_gates = False
200
219
  for program in programs:
220
+ if type_key == type_keys.Program.CIRCUIT and program._calibrations_prop:
221
+ pulse_gates = True
201
222
  writer(
202
223
  file_obj,
203
224
  program,
@@ -206,6 +227,13 @@ def dump(
206
227
  version=version,
207
228
  )
208
229
 
230
+ if pulse_gates:
231
+ warnings.warn(
232
+ category=DeprecationWarning,
233
+ message="Pulse gates serialization is deprecated as of Qiskit 1.3. "
234
+ "It will be removed in Qiskit 2.0.",
235
+ )
236
+
209
237
 
210
238
  def load(
211
239
  file_obj: BinaryIO,
@@ -320,6 +348,14 @@ def load(
320
348
  loader = binary_io.read_circuit
321
349
  elif type_key == type_keys.Program.SCHEDULE_BLOCK:
322
350
  loader = binary_io.read_schedule_block
351
+ warnings.warn(
352
+ category=QPYLoadingDeprecatedFeatureWarning,
353
+ message="Pulse gates deserialization is deprecated as of Qiskit 1.3 and "
354
+ "will be removed in Qiskit 2.0. This is part of the deprecation plan for "
355
+ "the entire Qiskit Pulse package. Once Pulse is removed, `ScheduleBlock` "
356
+ "sections will be ignored when loading QPY files with pulse data.",
357
+ )
358
+
323
359
  else:
324
360
  raise TypeError(f"Invalid payload format data kind '{type_key}'.")
325
361
 
@@ -28,6 +28,7 @@ Operators
28
28
  Pauli
29
29
  Clifford
30
30
  ScalarOp
31
+ SparseObservable
31
32
  SparsePauliOp
32
33
  CNOTDihedral
33
34
  PauliList
@@ -113,6 +114,9 @@ Analysis
113
114
  """
114
115
 
115
116
  from __future__ import annotations
117
+
118
+ from qiskit._accelerate.sparse_observable import SparseObservable
119
+
116
120
  from .analysis import hellinger_distance, hellinger_fidelity, Z2Symmetries
117
121
  from .operators import (
118
122
  Clifford,
@@ -220,32 +220,39 @@ def _kraus_to_choi(data):
220
220
 
221
221
  def _choi_to_kraus(data, input_dim, output_dim, atol=ATOL_DEFAULT):
222
222
  """Transform Choi representation to Kraus representation."""
223
- from scipy import linalg as la
223
+ import scipy.linalg
224
224
 
225
225
  # Check if hermitian matrix
226
226
  if is_hermitian_matrix(data, atol=atol):
227
- # Get eigen-decomposition of Choi-matrix
228
- # This should be a call to la.eigh, but there is an OpenBlas
229
- # threading issue that is causing segfaults.
230
- # Need schur here since la.eig does not
231
- # guarantee orthogonality in degenerate subspaces
232
- w, v = la.schur(data, output="complex")
233
- w = w.diagonal().real
234
- # Check eigenvalues are non-negative
235
- if len(w[w < -atol]) == 0:
236
- # CP-map Kraus representation
237
- kraus = []
238
- for val, vec in zip(w, v.T):
239
- if abs(val) > atol:
240
- k = np.sqrt(val) * vec.reshape((output_dim, input_dim), order="F")
241
- kraus.append(k)
242
- # If we are converting a zero matrix, we need to return a Kraus set
243
- # with a single zero-element Kraus matrix
227
+ # Ideally we'd use `eigh`, but `scipy.linalg.eigh` has stability problems on macOS (at a
228
+ # minimum from SciPy 1.1 to 1.13 with the bundled OpenBLAS, or ~0.3.6 before they started
229
+ # bundling one in). The Schur form of a Hermitian matrix is guaranteed diagonal:
230
+ #
231
+ # H = U T U+ for upper-triangular T.
232
+ # => H+ = U T+ U+
233
+ # => T = T+ because H = H+, and thus T cannot have super-diagonal elements.
234
+ #
235
+ # So the eigenvalues are on the diagonal, therefore the basis-transformation matrix must be
236
+ # a spanning set of the eigenspace.
237
+ triangular, vecs = scipy.linalg.schur(data)
238
+ values = triangular.diagonal().real
239
+ # If we're not a CP map, fall-through back to the generalization handling. Since we needed
240
+ # to get the eigenvalues anyway, we can do the CP check manually rather than deferring to a
241
+ # separate re-calculation.
242
+ if all(values >= -atol):
243
+ kraus = [
244
+ math.sqrt(value) * vec.reshape((output_dim, input_dim), order="F")
245
+ for value, vec in zip(values, vecs.T)
246
+ if abs(value) > atol
247
+ ]
248
+ # If we are converting a zero matrix, we need to return a Kraus set with a single
249
+ # zero-element Kraus matrix
244
250
  if not kraus:
245
- kraus.append(np.zeros((output_dim, input_dim), dtype=complex))
251
+ kraus = [np.zeros((output_dim, input_dim), dtype=complex)]
246
252
  return kraus, None
247
- # Non-CP-map generalized Kraus representation
248
- mat_u, svals, mat_vh = la.svd(data)
253
+ # Fall through.
254
+ # Non-CP-map generalized Kraus representation.
255
+ mat_u, svals, mat_vh = scipy.linalg.svd(data)
249
256
  kraus_l = []
250
257
  kraus_r = []
251
258
  for val, vec_l, vec_r in zip(svals, mat_u.T, mat_vh.conj()):
@@ -62,7 +62,7 @@ class CNOTDihedral(BaseOperator, AdjointMixin):
62
62
  # Print the CNOTDihedral element
63
63
  print(elem)
64
64
 
65
- .. parsed-literal::
65
+ .. code-block:: text
66
66
 
67
67
  phase polynomial =
68
68
  0 + 3*x_0 + 3*x_1 + 2*x_0*x_1