qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +236 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +11 -0
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/circuit/tools/pi_check.py +3 -0
  104. qiskit/compiler/__init__.py +1 -7
  105. qiskit/compiler/transpiler.py +38 -196
  106. qiskit/converters/circuit_to_dag.py +6 -4
  107. qiskit/converters/circuit_to_dagdependency.py +0 -2
  108. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  109. qiskit/converters/circuit_to_gate.py +1 -1
  110. qiskit/converters/circuit_to_instruction.py +16 -29
  111. qiskit/converters/dag_to_circuit.py +7 -8
  112. qiskit/converters/dag_to_dagdependency.py +0 -1
  113. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  114. qiskit/converters/dagdependency_to_circuit.py +0 -6
  115. qiskit/converters/dagdependency_to_dag.py +0 -6
  116. qiskit/dagcircuit/collect_blocks.py +32 -20
  117. qiskit/dagcircuit/dagdependency.py +3 -37
  118. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  119. qiskit/dagcircuit/dagnode.py +14 -2
  120. qiskit/passmanager/__init__.py +24 -6
  121. qiskit/passmanager/passmanager.py +26 -24
  122. qiskit/primitives/__init__.py +44 -35
  123. qiskit/primitives/backend_estimator_v2.py +102 -23
  124. qiskit/primitives/backend_sampler_v2.py +5 -20
  125. qiskit/primitives/base/__init__.py +4 -4
  126. qiskit/primitives/base/base_estimator.py +77 -82
  127. qiskit/primitives/base/base_primitive_job.py +2 -2
  128. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  129. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  130. qiskit/primitives/base/base_sampler.py +52 -60
  131. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  132. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  133. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  134. qiskit/primitives/containers/bindings_array.py +3 -1
  135. qiskit/primitives/containers/bit_array.py +23 -0
  136. qiskit/primitives/containers/data_bin.py +3 -1
  137. qiskit/primitives/containers/observables_array.py +19 -2
  138. qiskit/primitives/statevector_sampler.py +6 -8
  139. qiskit/primitives/utils.py +14 -189
  140. qiskit/providers/__init__.py +4 -130
  141. qiskit/providers/backend.py +11 -314
  142. qiskit/providers/basic_provider/__init__.py +3 -1
  143. qiskit/providers/basic_provider/basic_provider.py +29 -9
  144. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  145. qiskit/providers/exceptions.py +0 -33
  146. qiskit/providers/fake_provider/__init__.py +0 -37
  147. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  148. qiskit/qasm2/__init__.py +21 -6
  149. qiskit/qasm2/export.py +2 -10
  150. qiskit/qasm2/parse.py +11 -25
  151. qiskit/qasm3/__init__.py +5 -1
  152. qiskit/qasm3/ast.py +44 -0
  153. qiskit/qasm3/exporter.py +65 -27
  154. qiskit/qasm3/printer.py +35 -4
  155. qiskit/qpy/__init__.py +162 -19
  156. qiskit/qpy/binary_io/__init__.py +0 -1
  157. qiskit/qpy/binary_io/circuits.py +96 -116
  158. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  159. qiskit/qpy/binary_io/schedules.py +61 -388
  160. qiskit/qpy/binary_io/value.py +159 -33
  161. qiskit/qpy/common.py +10 -7
  162. qiskit/qpy/formats.py +41 -0
  163. qiskit/qpy/interface.py +29 -62
  164. qiskit/qpy/type_keys.py +58 -221
  165. qiskit/quantum_info/analysis/distance.py +3 -1
  166. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  167. qiskit/quantum_info/operators/operator.py +6 -2
  168. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  169. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  170. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  171. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  172. qiskit/quantum_info/states/densitymatrix.py +16 -6
  173. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  174. qiskit/quantum_info/states/statevector.py +16 -6
  175. qiskit/result/__init__.py +5 -17
  176. qiskit/result/models.py +18 -11
  177. qiskit/result/result.py +38 -134
  178. qiskit/result/sampled_expval.py +1 -2
  179. qiskit/result/utils.py +3 -4
  180. qiskit/synthesis/__init__.py +21 -1
  181. qiskit/synthesis/arithmetic/__init__.py +3 -1
  182. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  183. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  184. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  185. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  186. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  187. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  188. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  189. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  190. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  191. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  192. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  193. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  194. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  195. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  196. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  197. qiskit/synthesis/evolution/product_formula.py +44 -35
  198. qiskit/synthesis/evolution/qdrift.py +17 -24
  199. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  200. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  201. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  202. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  203. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  204. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  205. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  206. qiskit/synthesis/two_qubit/__init__.py +1 -0
  207. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  208. qiskit/transpiler/__init__.py +32 -232
  209. qiskit/transpiler/basepasses.py +20 -51
  210. qiskit/transpiler/layout.py +1 -1
  211. qiskit/transpiler/passes/__init__.py +4 -40
  212. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  213. qiskit/transpiler/passes/basis/decompose.py +1 -15
  214. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  215. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  216. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  217. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  218. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  219. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  220. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  221. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  222. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  223. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  224. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  225. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  226. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  227. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  228. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  229. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  230. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  231. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  232. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  233. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  234. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  235. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  236. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  237. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  238. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
  239. qiskit/transpiler/passes/routing/__init__.py +0 -1
  240. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  241. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  242. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  243. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  244. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  245. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  246. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  247. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  248. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  249. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  250. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  251. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  252. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  253. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  254. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  255. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  256. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  257. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  258. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  259. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  260. qiskit/transpiler/passes/utils/__init__.py +0 -1
  261. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  262. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  263. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  264. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  265. qiskit/transpiler/passmanager.py +13 -0
  266. qiskit/transpiler/passmanager_config.py +5 -81
  267. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  268. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  269. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  270. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  272. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  273. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  274. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  275. qiskit/transpiler/target.py +78 -524
  276. qiskit/user_config.py +8 -4
  277. qiskit/utils/__init__.py +13 -12
  278. qiskit/utils/deprecation.py +4 -112
  279. qiskit/utils/optionals.py +11 -4
  280. qiskit/utils/parallel.py +214 -87
  281. qiskit/utils/units.py +4 -1
  282. qiskit/visualization/__init__.py +3 -7
  283. qiskit/visualization/array.py +4 -1
  284. qiskit/visualization/bloch.py +1 -1
  285. qiskit/visualization/circuit/_utils.py +19 -19
  286. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  287. qiskit/visualization/circuit/matplotlib.py +13 -23
  288. qiskit/visualization/circuit/text.py +7 -3
  289. qiskit/visualization/counts_visualization.py +4 -0
  290. qiskit/visualization/dag_visualization.py +2 -1
  291. qiskit/visualization/gate_map.py +39 -154
  292. qiskit/visualization/library.py +4 -1
  293. qiskit/visualization/pass_manager_visualization.py +6 -2
  294. qiskit/visualization/state_visualization.py +19 -2
  295. qiskit/visualization/timeline/core.py +19 -13
  296. qiskit/visualization/timeline/interface.py +19 -18
  297. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  298. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  299. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
  300. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  301. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  302. qiskit/assembler/__init__.py +0 -42
  303. qiskit/assembler/assemble_circuits.py +0 -451
  304. qiskit/assembler/assemble_schedules.py +0 -367
  305. qiskit/assembler/disassemble.py +0 -310
  306. qiskit/assembler/run_config.py +0 -77
  307. qiskit/circuit/bit.py +0 -106
  308. qiskit/circuit/classicalfunction/__init__.py +0 -152
  309. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  310. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  311. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  312. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  313. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  314. qiskit/circuit/classicalfunction/types.py +0 -18
  315. qiskit/circuit/classicalfunction/utils.py +0 -91
  316. qiskit/circuit/classicalregister.py +0 -57
  317. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  318. qiskit/circuit/quantumregister.py +0 -75
  319. qiskit/circuit/register.py +0 -246
  320. qiskit/compiler/assembler.py +0 -689
  321. qiskit/compiler/scheduler.py +0 -109
  322. qiskit/compiler/sequencer.py +0 -71
  323. qiskit/primitives/backend_estimator.py +0 -486
  324. qiskit/primitives/backend_sampler.py +0 -222
  325. qiskit/primitives/estimator.py +0 -172
  326. qiskit/primitives/sampler.py +0 -162
  327. qiskit/providers/backend_compat.py +0 -507
  328. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  333. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  351. qiskit/providers/fake_provider/fake_1q.py +0 -91
  352. qiskit/providers/fake_provider/fake_backend.py +0 -165
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  357. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  358. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  359. qiskit/providers/models/__init__.py +0 -89
  360. qiskit/providers/models/backendconfiguration.py +0 -1040
  361. qiskit/providers/models/backendproperties.py +0 -535
  362. qiskit/providers/models/backendstatus.py +0 -104
  363. qiskit/providers/models/jobstatus.py +0 -77
  364. qiskit/providers/models/pulsedefaults.py +0 -305
  365. qiskit/providers/provider.py +0 -95
  366. qiskit/pulse/__init__.py +0 -158
  367. qiskit/pulse/builder.py +0 -2262
  368. qiskit/pulse/calibration_entries.py +0 -381
  369. qiskit/pulse/channels.py +0 -227
  370. qiskit/pulse/configuration.py +0 -245
  371. qiskit/pulse/exceptions.py +0 -45
  372. qiskit/pulse/filters.py +0 -309
  373. qiskit/pulse/instruction_schedule_map.py +0 -424
  374. qiskit/pulse/instructions/__init__.py +0 -67
  375. qiskit/pulse/instructions/acquire.py +0 -150
  376. qiskit/pulse/instructions/delay.py +0 -71
  377. qiskit/pulse/instructions/directives.py +0 -154
  378. qiskit/pulse/instructions/frequency.py +0 -135
  379. qiskit/pulse/instructions/instruction.py +0 -270
  380. qiskit/pulse/instructions/phase.py +0 -152
  381. qiskit/pulse/instructions/play.py +0 -99
  382. qiskit/pulse/instructions/reference.py +0 -100
  383. qiskit/pulse/instructions/snapshot.py +0 -82
  384. qiskit/pulse/library/__init__.py +0 -97
  385. qiskit/pulse/library/continuous.py +0 -430
  386. qiskit/pulse/library/pulse.py +0 -148
  387. qiskit/pulse/library/samplers/__init__.py +0 -15
  388. qiskit/pulse/library/samplers/decorators.py +0 -295
  389. qiskit/pulse/library/samplers/strategies.py +0 -71
  390. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  391. qiskit/pulse/library/waveform.py +0 -136
  392. qiskit/pulse/macros.py +0 -262
  393. qiskit/pulse/parameter_manager.py +0 -445
  394. qiskit/pulse/parser.py +0 -314
  395. qiskit/pulse/reference_manager.py +0 -58
  396. qiskit/pulse/schedule.py +0 -1854
  397. qiskit/pulse/transforms/__init__.py +0 -106
  398. qiskit/pulse/transforms/alignments.py +0 -406
  399. qiskit/pulse/transforms/base_transforms.py +0 -71
  400. qiskit/pulse/transforms/canonicalization.py +0 -498
  401. qiskit/pulse/transforms/dag.py +0 -122
  402. qiskit/pulse/utils.py +0 -149
  403. qiskit/qobj/__init__.py +0 -75
  404. qiskit/qobj/common.py +0 -81
  405. qiskit/qobj/converters/__init__.py +0 -18
  406. qiskit/qobj/converters/lo_config.py +0 -177
  407. qiskit/qobj/converters/pulse_instruction.py +0 -897
  408. qiskit/qobj/pulse_qobj.py +0 -709
  409. qiskit/qobj/qasm_qobj.py +0 -708
  410. qiskit/qobj/utils.py +0 -46
  411. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  412. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  413. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  414. qiskit/result/mitigation/utils.py +0 -217
  415. qiskit/scheduler/__init__.py +0 -40
  416. qiskit/scheduler/config.py +0 -37
  417. qiskit/scheduler/lowering.py +0 -187
  418. qiskit/scheduler/methods/__init__.py +0 -15
  419. qiskit/scheduler/methods/basic.py +0 -140
  420. qiskit/scheduler/schedule_circuit.py +0 -69
  421. qiskit/scheduler/sequence.py +0 -104
  422. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  423. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  424. qiskit/transpiler/passes/calibration/builders.py +0 -20
  425. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  426. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  427. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  428. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  429. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  430. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  431. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  432. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  433. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  434. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  435. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  436. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  437. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  438. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  439. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  440. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  441. qiskit/utils/deprecate_pulse.py +0 -119
  442. qiskit/utils/multiprocessing.py +0 -56
  443. qiskit/visualization/pulse_v2/__init__.py +0 -21
  444. qiskit/visualization/pulse_v2/core.py +0 -901
  445. qiskit/visualization/pulse_v2/device_info.py +0 -173
  446. qiskit/visualization/pulse_v2/drawings.py +0 -253
  447. qiskit/visualization/pulse_v2/events.py +0 -254
  448. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  449. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  450. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  451. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  452. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  453. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  454. qiskit/visualization/pulse_v2/interface.py +0 -459
  455. qiskit/visualization/pulse_v2/layouts.py +0 -387
  456. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  457. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  458. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  459. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  460. qiskit/visualization/pulse_v2/types.py +0 -242
  461. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  462. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -23,7 +23,7 @@ import numpy as np
23
23
  import symengine
24
24
 
25
25
 
26
- from qiskit.circuit import CASE_DEFAULT, Clbit, ClassicalRegister
26
+ from qiskit.circuit import CASE_DEFAULT, Clbit, ClassicalRegister, Duration
27
27
  from qiskit.circuit.classical import expr, types
28
28
  from qiskit.circuit.parameter import Parameter
29
29
  from qiskit.circuit.parameterexpression import (
@@ -34,6 +34,7 @@ from qiskit.circuit.parameterexpression import (
34
34
  )
35
35
  from qiskit.circuit.parametervector import ParameterVector, ParameterVectorElement
36
36
  from qiskit.qpy import common, formats, exceptions, type_keys
37
+ from qiskit.qpy.binary_io.parse_sympy_repr import parse_sympy_repr
37
38
 
38
39
 
39
40
  def _write_parameter(file_obj, obj):
@@ -165,17 +166,9 @@ def _write_parameter_expression_v13(file_obj, obj, version):
165
166
 
166
167
  def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
167
168
  extra_symbols = None
168
- if version < 13:
169
- if use_symengine:
170
- expr_bytes = obj._symbol_expr.__reduce__()[1][0]
171
- else:
172
- from sympy import srepr, sympify
173
-
174
- expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
175
- else:
176
- with io.BytesIO() as buf:
177
- extra_symbols = _write_parameter_expression_v13(buf, obj, version)
178
- expr_bytes = buf.getvalue()
169
+ with io.BytesIO() as buf:
170
+ extra_symbols = _write_parameter_expression_v13(buf, obj, version)
171
+ expr_bytes = buf.getvalue()
179
172
  symbol_table_len = len(obj._parameter_symbols)
180
173
  if extra_symbols:
181
174
  symbol_table_len += 2 * len(extra_symbols)
@@ -271,12 +264,15 @@ class _ExprWriter(expr.ExprVisitor[None]):
271
264
  self.standalone_var_indices = standalone_var_indices
272
265
  self.version = version
273
266
 
267
+ def _write_expr_type(self, type_, /):
268
+ _write_expr_type(self.file_obj, type_, self.version)
269
+
274
270
  def visit_generic(self, node, /):
275
271
  raise exceptions.QpyError(f"unhandled Expr object '{node}'")
276
272
 
277
273
  def visit_var(self, node, /):
278
274
  self.file_obj.write(type_keys.Expression.VAR)
279
- _write_expr_type(self.file_obj, node.type)
275
+ self._write_expr_type(node.type)
280
276
  if node.standalone:
281
277
  self.file_obj.write(type_keys.ExprVar.UUID)
282
278
  self.file_obj.write(
@@ -304,9 +300,19 @@ class _ExprWriter(expr.ExprVisitor[None]):
304
300
  else:
305
301
  raise exceptions.QpyError(f"unhandled Var object '{node.var}'")
306
302
 
303
+ def visit_stretch(self, node, /):
304
+ self.file_obj.write(type_keys.Expression.STRETCH)
305
+ self._write_expr_type(node.type)
306
+ self.file_obj.write(
307
+ struct.pack(
308
+ formats.EXPRESSION_STRETCH_PACK,
309
+ *formats.EXPRESSION_STRETCH(self.standalone_var_indices[node]),
310
+ )
311
+ )
312
+
307
313
  def visit_value(self, node, /):
308
314
  self.file_obj.write(type_keys.Expression.VALUE)
309
- _write_expr_type(self.file_obj, node.type)
315
+ self._write_expr_type(node.type)
310
316
  if node.value is True or node.value is False:
311
317
  self.file_obj.write(type_keys.ExprValue.BOOL)
312
318
  self.file_obj.write(
@@ -327,12 +333,20 @@ class _ExprWriter(expr.ExprVisitor[None]):
327
333
  struct.pack(formats.EXPR_VALUE_INT_PACK, *formats.EXPR_VALUE_INT(num_bytes))
328
334
  )
329
335
  self.file_obj.write(buffer)
336
+ elif isinstance(node.value, float):
337
+ self.file_obj.write(type_keys.ExprValue.FLOAT)
338
+ self.file_obj.write(
339
+ struct.pack(formats.EXPR_VALUE_FLOAT_PACK, *formats.EXPR_VALUE_FLOAT(node.value))
340
+ )
341
+ elif isinstance(node.value, Duration):
342
+ self.file_obj.write(type_keys.ExprValue.DURATION)
343
+ _write_duration(self.file_obj, node.value)
330
344
  else:
331
345
  raise exceptions.QpyError(f"unhandled Value object '{node.value}'")
332
346
 
333
347
  def visit_cast(self, node, /):
334
348
  self.file_obj.write(type_keys.Expression.CAST)
335
- _write_expr_type(self.file_obj, node.type)
349
+ self._write_expr_type(node.type)
336
350
  self.file_obj.write(
337
351
  struct.pack(formats.EXPRESSION_CAST_PACK, *formats.EXPRESSION_CAST(node.implicit))
338
352
  )
@@ -340,7 +354,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
340
354
 
341
355
  def visit_unary(self, node, /):
342
356
  self.file_obj.write(type_keys.Expression.UNARY)
343
- _write_expr_type(self.file_obj, node.type)
357
+ self._write_expr_type(node.type)
344
358
  self.file_obj.write(
345
359
  struct.pack(formats.EXPRESSION_UNARY_PACK, *formats.EXPRESSION_UNARY(node.op.value))
346
360
  )
@@ -348,7 +362,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
348
362
 
349
363
  def visit_binary(self, node, /):
350
364
  self.file_obj.write(type_keys.Expression.BINARY)
351
- _write_expr_type(self.file_obj, node.type)
365
+ self._write_expr_type(node.type)
352
366
  self.file_obj.write(
353
367
  struct.pack(formats.EXPRESSION_BINARY_PACK, *formats.EXPRESSION_BINARY(node.op.value))
354
368
  )
@@ -361,7 +375,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
361
375
  "the 'Index' expression", required=12, target=self.version
362
376
  )
363
377
  self.file_obj.write(type_keys.Expression.INDEX)
364
- _write_expr_type(self.file_obj, node.type)
378
+ self._write_expr_type(node.type)
365
379
  node.target.accept(self)
366
380
  node.index.accept(self)
367
381
 
@@ -376,7 +390,7 @@ def _write_expr(
376
390
  node.accept(_ExprWriter(file_obj, clbit_indices, standalone_var_indices, version))
377
391
 
378
392
 
379
- def _write_expr_type(file_obj, type_: types.Type):
393
+ def _write_expr_type(file_obj, type_: types.Type, version: int):
380
394
  if type_.kind is types.Bool:
381
395
  file_obj.write(type_keys.ExprType.BOOL)
382
396
  elif type_.kind is types.Uint:
@@ -384,10 +398,51 @@ def _write_expr_type(file_obj, type_: types.Type):
384
398
  file_obj.write(
385
399
  struct.pack(formats.EXPR_TYPE_UINT_PACK, *formats.EXPR_TYPE_UINT(type_.width))
386
400
  )
401
+ elif type_.kind is types.Float:
402
+ if version < 14:
403
+ raise exceptions.UnsupportedFeatureForVersion(
404
+ "float-typed expressions", required=14, target=version
405
+ )
406
+ file_obj.write(type_keys.ExprType.FLOAT)
407
+ elif type_.kind is types.Duration:
408
+ if version < 14:
409
+ raise exceptions.UnsupportedFeatureForVersion(
410
+ "duration-typed expressions", required=14, target=version
411
+ )
412
+ file_obj.write(type_keys.ExprType.DURATION)
387
413
  else:
388
414
  raise exceptions.QpyError(f"unhandled Type object '{type_};")
389
415
 
390
416
 
417
+ def _write_duration(file_obj, duration: Duration):
418
+ unit = duration.unit()
419
+ if unit == "dt":
420
+ file_obj.write(type_keys.CircuitDuration.DT)
421
+ file_obj.write(
422
+ struct.pack(formats.DURATION_DT_PACK, *formats.DURATION_DT(duration.value()))
423
+ )
424
+ elif unit == "ns":
425
+ file_obj.write(type_keys.CircuitDuration.NS)
426
+ file_obj.write(
427
+ struct.pack(formats.DURATION_NS_PACK, *formats.DURATION_NS(duration.value()))
428
+ )
429
+ elif unit == "us":
430
+ file_obj.write(type_keys.CircuitDuration.US)
431
+ file_obj.write(
432
+ struct.pack(formats.DURATION_US_PACK, *formats.DURATION_US(duration.value()))
433
+ )
434
+ elif unit == "ms":
435
+ file_obj.write(type_keys.CircuitDuration.MS)
436
+ file_obj.write(
437
+ struct.pack(formats.DURATION_MS_PACK, *formats.DURATION_MS(duration.value()))
438
+ )
439
+ elif unit == "s":
440
+ file_obj.write(type_keys.CircuitDuration.S)
441
+ file_obj.write(struct.pack(formats.DURATION_S_PACK, *formats.DURATION_S(duration.value())))
442
+ else:
443
+ raise exceptions.QpyError(f"unhandled Duration object '{duration};")
444
+
445
+
391
446
  def _read_parameter(file_obj):
392
447
  data = formats.PARAMETER(
393
448
  *struct.unpack(formats.PARAMETER_PACK, file_obj.read(formats.PARAMETER_SIZE))
@@ -419,9 +474,9 @@ def _read_parameter_expression(file_obj):
419
474
  data = formats.PARAMETER_EXPR(
420
475
  *struct.unpack(formats.PARAMETER_EXPR_PACK, file_obj.read(formats.PARAMETER_EXPR_SIZE))
421
476
  )
422
- from sympy.parsing.sympy_parser import parse_expr
423
477
 
424
- expr_ = symengine.sympify(parse_expr(file_obj.read(data.expr_size).decode(common.ENCODE)))
478
+ sympy_str = file_obj.read(data.expr_size).decode(common.ENCODE)
479
+ expr_ = symengine.sympify(parse_sympy_repr(sympy_str))
425
480
  symbol_map = {}
426
481
  for _ in range(data.map_elements):
427
482
  elem_data = formats.PARAM_EXPR_MAP_ELEM(
@@ -460,9 +515,8 @@ def _read_parameter_expression_v3(file_obj, vectors, use_symengine):
460
515
  if use_symengine:
461
516
  expr_ = common.load_symengine_payload(payload)
462
517
  else:
463
- from sympy.parsing.sympy_parser import parse_expr
464
-
465
- expr_ = symengine.sympify(parse_expr(payload.decode(common.ENCODE)))
518
+ sympy_str = payload.decode(common.ENCODE)
519
+ expr_ = symengine.sympify(parse_sympy_repr(sympy_str))
466
520
 
467
521
  symbol_map = {}
468
522
  for _ in range(data.map_elements):
@@ -676,6 +730,13 @@ def _read_expr(
676
730
  name = file_obj.read(payload.reg_name_size).decode(common.ENCODE)
677
731
  return expr.Var(cregs[name], type_)
678
732
  raise exceptions.QpyError("Invalid classical-expression Var key '{var_type_key}'")
733
+ if type_key == type_keys.Expression.STRETCH:
734
+ payload = formats.EXPRESSION_STRETCH._make(
735
+ struct.unpack(
736
+ formats.EXPRESSION_STRETCH_PACK, file_obj.read(formats.EXPRESSION_STRETCH_SIZE)
737
+ )
738
+ )
739
+ return standalone_vars[payload.var_index]
679
740
  if type_key == type_keys.Expression.VALUE:
680
741
  value_type_key = file_obj.read(formats.EXPR_VALUE_DISCRIMINATOR_SIZE)
681
742
  if value_type_key == type_keys.ExprValue.BOOL:
@@ -694,6 +755,16 @@ def _read_expr(
694
755
  return expr.Value(
695
756
  int.from_bytes(file_obj.read(payload.num_bytes), "big", signed=True), type_
696
757
  )
758
+ if value_type_key == type_keys.ExprValue.FLOAT:
759
+ payload = formats.EXPR_VALUE_FLOAT._make(
760
+ struct.unpack(
761
+ formats.EXPR_VALUE_FLOAT_PACK, file_obj.read(formats.EXPR_VALUE_FLOAT_SIZE)
762
+ )
763
+ )
764
+ return expr.Value(payload.value, type_)
765
+ if value_type_key == type_keys.ExprValue.DURATION:
766
+ value = _read_duration(file_obj)
767
+ return expr.Value(value, type_)
697
768
  raise exceptions.QpyError("Invalid classical-expression Value key '{value_type_key}'")
698
769
  if type_key == type_keys.Expression.CAST:
699
770
  payload = formats.EXPRESSION_CAST._make(
@@ -743,9 +814,43 @@ def _read_expr_type(file_obj) -> types.Type:
743
814
  struct.unpack(formats.EXPR_TYPE_UINT_PACK, file_obj.read(formats.EXPR_TYPE_UINT_SIZE))
744
815
  )
745
816
  return types.Uint(elem.width)
817
+ if type_key == type_keys.ExprType.FLOAT:
818
+ return types.Float()
819
+ if type_key == type_keys.ExprType.DURATION:
820
+ return types.Duration()
746
821
  raise exceptions.QpyError(f"Invalid classical-expression Type key '{type_key}'")
747
822
 
748
823
 
824
+ def _read_duration(file_obj) -> Duration:
825
+ type_key = file_obj.read(formats.DURATION_DISCRIMINATOR_SIZE)
826
+ if type_key == type_keys.CircuitDuration.DT:
827
+ elem = formats.DURATION_DT._make(
828
+ struct.unpack(formats.DURATION_DT_PACK, file_obj.read(formats.DURATION_DT_SIZE))
829
+ )
830
+ return Duration.dt(elem.value)
831
+ if type_key == type_keys.CircuitDuration.NS:
832
+ elem = formats.DURATION_NS._make(
833
+ struct.unpack(formats.DURATION_NS_PACK, file_obj.read(formats.DURATION_NS_SIZE))
834
+ )
835
+ return Duration.ns(elem.value)
836
+ if type_key == type_keys.CircuitDuration.US:
837
+ elem = formats.DURATION_US._make(
838
+ struct.unpack(formats.DURATION_US_PACK, file_obj.read(formats.DURATION_US_SIZE))
839
+ )
840
+ return Duration.us(elem.value)
841
+ if type_key == type_keys.CircuitDuration.MS:
842
+ elem = formats.DURATION_MS._make(
843
+ struct.unpack(formats.DURATION_MS_PACK, file_obj.read(formats.DURATION_MS_SIZE))
844
+ )
845
+ return Duration.ms(elem.value)
846
+ if type_key == type_keys.CircuitDuration.S:
847
+ elem = formats.DURATION_S._make(
848
+ struct.unpack(formats.DURATION_S_PACK, file_obj.read(formats.DURATION_S_SIZE))
849
+ )
850
+ return Duration.s(elem.value)
851
+ raise exceptions.QpyError(f"Invalid duration Type key '{type_key}'")
852
+
853
+
749
854
  def read_standalone_vars(file_obj, num_vars):
750
855
  """Read the ``num_vars`` standalone variable declarations from the file.
751
856
 
@@ -762,6 +867,8 @@ def read_standalone_vars(file_obj, num_vars):
762
867
  type_keys.ExprVarDeclaration.INPUT: [],
763
868
  type_keys.ExprVarDeclaration.CAPTURE: [],
764
869
  type_keys.ExprVarDeclaration.LOCAL: [],
870
+ type_keys.ExprVarDeclaration.STRETCH_CAPTURE: [],
871
+ type_keys.ExprVarDeclaration.STRETCH_LOCAL: [],
765
872
  }
766
873
  var_order = []
767
874
  for _ in range(num_vars):
@@ -773,13 +880,19 @@ def read_standalone_vars(file_obj, num_vars):
773
880
  )
774
881
  type_ = _read_expr_type(file_obj)
775
882
  name = file_obj.read(data.name_size).decode(common.ENCODE)
776
- var = expr.Var(uuid.UUID(bytes=data.uuid_bytes), type_, name=name)
883
+ if data.usage in {
884
+ type_keys.ExprVarDeclaration.STRETCH_CAPTURE,
885
+ type_keys.ExprVarDeclaration.STRETCH_LOCAL,
886
+ }:
887
+ var = expr.Stretch(uuid.UUID(bytes=data.uuid_bytes), name)
888
+ else:
889
+ var = expr.Var(uuid.UUID(bytes=data.uuid_bytes), type_, name=name)
777
890
  read_vars[data.usage].append(var)
778
891
  var_order.append(var)
779
892
  return read_vars, var_order
780
893
 
781
894
 
782
- def _write_standalone_var(file_obj, var, type_key):
895
+ def _write_standalone_var(file_obj, var, type_key, version):
783
896
  name = var.name.encode(common.ENCODE)
784
897
  file_obj.write(
785
898
  struct.pack(
@@ -787,33 +900,46 @@ def _write_standalone_var(file_obj, var, type_key):
787
900
  *formats.EXPR_VAR_DECLARATION(var.var.bytes, type_key, len(name)),
788
901
  )
789
902
  )
790
- _write_expr_type(file_obj, var.type)
903
+ _write_expr_type(file_obj, var.type, version)
791
904
  file_obj.write(name)
792
905
 
793
906
 
794
- def write_standalone_vars(file_obj, circuit):
907
+ def write_standalone_vars(file_obj, circuit, version):
795
908
  """Write the standalone variables out from a circuit.
796
909
 
797
910
  Args:
798
911
  file_obj (File): the file-like object to write to.
799
912
  circuit (QuantumCircuit): the circuit to take the variables from.
913
+ version (int): the QPY target version.
800
914
 
801
915
  Returns:
802
- dict[expr.Var, int]: a mapping of the variables written to the index that they were written
803
- at.
916
+ dict[expr.Var | expr.Stretch, int]: a mapping of the variables written to the
917
+ index that they were written at.
804
918
  """
805
919
  index = 0
806
920
  out = {}
807
921
  for var in circuit.iter_input_vars():
808
- _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT)
922
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT, version)
809
923
  out[var] = index
810
924
  index += 1
811
925
  for var in circuit.iter_captured_vars():
812
- _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE)
926
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE, version)
813
927
  out[var] = index
814
928
  index += 1
815
929
  for var in circuit.iter_declared_vars():
816
- _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.LOCAL)
930
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.LOCAL, version)
931
+ out[var] = index
932
+ index += 1
933
+ if version < 14 and circuit.num_stretches:
934
+ raise exceptions.UnsupportedFeatureForVersion(
935
+ "circuits containing stretch variables", required=14, target=version
936
+ )
937
+ for var in circuit.iter_captured_stretches():
938
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.STRETCH_CAPTURE, version)
939
+ out[var] = index
940
+ index += 1
941
+ for var in circuit.iter_declared_stretches():
942
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.STRETCH_LOCAL, version)
817
943
  out[var] = index
818
944
  index += 1
819
945
  return out
qiskit/qpy/common.py CHANGED
@@ -18,15 +18,12 @@ Common functions across several serialization and deserialization modules.
18
18
  import io
19
19
  import struct
20
20
 
21
- import symengine
22
- from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
23
- load_basic,
24
- )
21
+ from qiskit.utils.optionals import HAS_SYMENGINE
25
22
 
26
23
  from qiskit.qpy import formats, exceptions
27
24
 
28
- QPY_VERSION = 13
29
- QPY_COMPATIBILITY_VERSION = 10
25
+ QPY_VERSION = 14
26
+ QPY_COMPATIBILITY_VERSION = 13
30
27
  ENCODE = "utf8"
31
28
 
32
29
 
@@ -311,13 +308,19 @@ def mapping_from_binary(binary_data, deserializer, **kwargs):
311
308
  return mapping
312
309
 
313
310
 
314
- def load_symengine_payload(payload: bytes) -> symengine.Expr:
311
+ @HAS_SYMENGINE.require_in_call("QPY versions 10 through 12 with symengine parameter serialization")
312
+ def load_symengine_payload(payload: bytes):
315
313
  """Load a symengine expression from it's serialized cereal payload."""
316
314
  # This is a horrible hack to workaround the symengine version checking
317
315
  # it's deserialization does. There were no changes to the serialization
318
316
  # format between 0.11 and 0.13 but the deserializer checks that it can't
319
317
  # load across a major or minor version boundary. This works around it
320
318
  # by just lying about the generating version.
319
+ import symengine
320
+ from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
321
+ load_basic,
322
+ )
323
+
321
324
  symengine_version = symengine.__version__.split(".")
322
325
  major = payload[2]
323
326
  minor = payload[3]
qiskit/qpy/formats.py CHANGED
@@ -357,11 +357,23 @@ EXPRESSION_BINARY = namedtuple("EXPRESSION_BINARY", ["opcode"])
357
357
  EXPRESSION_BINARY_PACK = "!B"
358
358
  EXPRESSION_BINARY_SIZE = struct.calcsize(EXPRESSION_BINARY_PACK)
359
359
 
360
+ EXPRESSION_STRETCH = namedtuple("EXPRESSION_STRETCH", ["var_index"])
361
+ EXPRESSION_STRETCH_PACK = "!H"
362
+ EXPRESSION_STRETCH_SIZE = struct.calcsize(EXPRESSION_STRETCH_PACK)
363
+
360
364
 
361
365
  # EXPR_TYPE
362
366
 
363
367
  EXPR_TYPE_DISCRIMINATOR_SIZE = 1
364
368
 
369
+ EXPR_TYPE_DURATION = namedtuple("EXPR_TYPE_DURATION", [])
370
+ EXPR_TYPE_DURATION_PACK = "!"
371
+ EXPR_TYPE_DURATION_SIZE = struct.calcsize(EXPR_TYPE_DURATION_PACK)
372
+
373
+ EXPR_TYPE_FLOAT = namedtuple("EXPR_TYPE_FLOAT", [])
374
+ EXPR_TYPE_FLOAT_PACK = "!"
375
+ EXPR_TYPE_FLOAT_SIZE = struct.calcsize(EXPR_TYPE_FLOAT_PACK)
376
+
365
377
  EXPR_TYPE_BOOL = namedtuple("EXPR_TYPE_BOOL", [])
366
378
  EXPR_TYPE_BOOL_PACK = "!"
367
379
  EXPR_TYPE_BOOL_SIZE = struct.calcsize(EXPR_TYPE_BOOL_PACK)
@@ -392,6 +404,10 @@ EXPR_VAR_UUID_SIZE = struct.calcsize(EXPR_VAR_UUID_PACK)
392
404
 
393
405
  EXPR_VALUE_DISCRIMINATOR_SIZE = 1
394
406
 
407
+ EXPR_VALUE_FLOAT = namedtuple("EXPR_VALUE_FLOAT", ["value"])
408
+ EXPR_VALUE_FLOAT_PACK = "!d"
409
+ EXPR_VALUE_FLOAT_SIZE = struct.calcsize(EXPR_VALUE_FLOAT_PACK)
410
+
395
411
  EXPR_VALUE_BOOL = namedtuple("EXPR_VALUE_BOOL", ["value"])
396
412
  EXPR_VALUE_BOOL_PACK = "!?"
397
413
  EXPR_VALUE_BOOL_SIZE = struct.calcsize(EXPR_VALUE_BOOL_PACK)
@@ -399,3 +415,28 @@ EXPR_VALUE_BOOL_SIZE = struct.calcsize(EXPR_VALUE_BOOL_PACK)
399
415
  EXPR_VALUE_INT = namedtuple("EXPR_VALUE_INT", ["num_bytes"])
400
416
  EXPR_VALUE_INT_PACK = "!B"
401
417
  EXPR_VALUE_INT_SIZE = struct.calcsize(EXPR_VALUE_INT_PACK)
418
+
419
+
420
+ # DURATION
421
+
422
+ DURATION_DISCRIMINATOR_SIZE = 1
423
+
424
+ DURATION_DT = namedtuple("DURATION_DT", ["value"])
425
+ DURATION_DT_PACK = "!Q"
426
+ DURATION_DT_SIZE = struct.calcsize(DURATION_DT_PACK)
427
+
428
+ DURATION_NS = namedtuple("DURATION_NS", ["value"])
429
+ DURATION_NS_PACK = "!d"
430
+ DURATION_NS_SIZE = struct.calcsize(DURATION_NS_PACK)
431
+
432
+ DURATION_US = namedtuple("DURATION_US", ["value"])
433
+ DURATION_US_PACK = "!d"
434
+ DURATION_US_SIZE = struct.calcsize(DURATION_US_PACK)
435
+
436
+ DURATION_MS = namedtuple("DURATION_MS", ["value"])
437
+ DURATION_MS_PACK = "!d"
438
+ DURATION_MS_SIZE = struct.calcsize(DURATION_MS_PACK)
439
+
440
+ DURATION_S = namedtuple("DURATION_S", ["value"])
441
+ DURATION_S_PACK = "!d"
442
+ DURATION_S_SIZE = struct.calcsize(DURATION_S_PACK)
qiskit/qpy/interface.py CHANGED
@@ -22,16 +22,14 @@ import warnings
22
22
  import re
23
23
 
24
24
  from qiskit.circuit import QuantumCircuit
25
- from qiskit.pulse import ScheduleBlock
26
25
  from qiskit.exceptions import QiskitError
27
26
  from qiskit.qpy import formats, common, binary_io, type_keys
28
- from qiskit.qpy.exceptions import QPYLoadingDeprecatedFeatureWarning, QpyError
27
+ from qiskit.qpy.exceptions import QpyError
29
28
  from qiskit.version import __version__
30
- from qiskit.utils.deprecate_pulse import deprecate_pulse_arg
31
29
 
32
30
 
33
31
  # pylint: disable=invalid-name
34
- QPY_SUPPORTED_TYPES = Union[QuantumCircuit, ScheduleBlock]
32
+ QPY_SUPPORTED_TYPES = QuantumCircuit
35
33
 
36
34
  # This version pattern is taken from the pypa packaging project:
37
35
  # https://github.com/pypa/packaging/blob/21.3/packaging/version.py#L223-L254
@@ -74,16 +72,11 @@ VERSION_PATTERN = (
74
72
  VERSION_PATTERN_REGEX = re.compile(VERSION_PATTERN, re.VERBOSE | re.IGNORECASE)
75
73
 
76
74
 
77
- @deprecate_pulse_arg(
78
- "programs",
79
- deprecation_description="Passing `ScheduleBlock` to `programs`",
80
- predicate=lambda p: isinstance(p, ScheduleBlock),
81
- )
82
75
  def dump(
83
76
  programs: Union[List[QPY_SUPPORTED_TYPES], QPY_SUPPORTED_TYPES],
84
77
  file_obj: BinaryIO,
85
78
  metadata_serializer: Optional[Type[JSONEncoder]] = None,
86
- use_symengine: bool = True,
79
+ use_symengine: bool = False,
87
80
  version: int = common.QPY_VERSION,
88
81
  ):
89
82
  """Write QPY binary data to a file
@@ -94,7 +87,10 @@ def dump(
94
87
 
95
88
  For example:
96
89
 
97
- .. code-block:: python
90
+ .. plot::
91
+ :include-source:
92
+ :nofigs:
93
+ :context: reset
98
94
 
99
95
  from qiskit.circuit import QuantumCircuit
100
96
  from qiskit import qpy
@@ -124,18 +120,14 @@ def dump(
124
120
 
125
121
  Args:
126
122
  programs: QPY supported object(s) to store in the specified file like object.
127
- QPY supports :class:`.QuantumCircuit` and :class:`.ScheduleBlock`.
128
- Different data types must be separately serialized.
129
- Support for :class:`.ScheduleBlock` is deprecated since Qiskit 1.3.0.
123
+ QPY supports :class:`.QuantumCircuit`.
130
124
  file_obj: The file like object to write the QPY data too
131
125
  metadata_serializer: An optional JSONEncoder class that
132
126
  will be passed the ``.metadata`` attribute for each program in ``programs`` and will be
133
127
  used as the ``cls`` kwarg on the `json.dump()`` call to JSON serialize that dictionary.
134
- use_symengine: If True, all objects containing symbolic expressions will be serialized
135
- using symengine's native mechanism. This is a faster serialization alternative,
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.
128
+ use_symengine: This flag is no longer used by QPY versions supported by this function and
129
+ will have no impact on the generated QPY payload except to set a field in a QPY v13 file
130
+ header which is unused.
139
131
  version: The QPY format version to emit. By default this defaults to
140
132
  the latest supported format of :attr:`~.qpy.QPY_VERSION`, however for
141
133
  compatibility reasons if you need to load the generated QPY payload with an older
@@ -153,7 +145,7 @@ def dump(
153
145
 
154
146
  .. note::
155
147
 
156
- If serializing a :class:`.QuantumCircuit` or :class:`.ScheduleBlock` that contain
148
+ If serializing a :class:`.QuantumCircuit` that contains
157
149
  :class:`.ParameterExpression` objects with ``version`` set low with the intent to
158
150
  load the payload using a historical release of Qiskit, it is safest to set the
159
151
  ``use_symengine`` flag to ``False``. Versions of Qiskit prior to 1.2.4 cannot load
@@ -163,32 +155,19 @@ def dump(
163
155
 
164
156
 
165
157
  Raises:
166
- QpyError: When multiple data format is mixed in the output.
167
158
  TypeError: When invalid data type is input.
168
- ValueError: When an unsupported version number is passed in for the ``version`` argument
159
+ ValueError: When an unsupported version number is passed in for the ``version`` argument.
169
160
  """
170
161
  if not isinstance(programs, Iterable):
171
162
  programs = [programs]
172
163
 
173
- program_types = set()
164
+ # dump accepts only QuantumCircuit typed objects
174
165
  for program in programs:
175
- program_types.add(type(program))
166
+ if not issubclass(type(program), QuantumCircuit):
167
+ raise TypeError(f"'{type(program)}' is not a supported data type.")
176
168
 
177
- if len(program_types) > 1:
178
- raise QpyError(
179
- "Input programs contain multiple data types. "
180
- "Different data type must be serialized separately."
181
- )
182
- program_type = next(iter(program_types))
183
-
184
- if issubclass(program_type, QuantumCircuit):
185
- type_key = type_keys.Program.CIRCUIT
186
- writer = binary_io.write_circuit
187
- elif program_type is ScheduleBlock:
188
- type_key = type_keys.Program.SCHEDULE_BLOCK
189
- writer = binary_io.write_schedule_block
190
- else:
191
- raise TypeError(f"'{program_type}' is not supported data type.")
169
+ type_key = type_keys.Program.CIRCUIT
170
+ writer = binary_io.write_circuit
192
171
 
193
172
  if version is None:
194
173
  version = common.QPY_VERSION
@@ -215,10 +194,7 @@ def dump(
215
194
  file_obj.write(header)
216
195
  common.write_type_key(file_obj, type_key)
217
196
 
218
- pulse_gates = False
219
197
  for program in programs:
220
- if type_key == type_keys.Program.CIRCUIT and program._calibrations_prop:
221
- pulse_gates = True
222
198
  writer(
223
199
  file_obj,
224
200
  program,
@@ -227,13 +203,6 @@ def dump(
227
203
  version=version,
228
204
  )
229
205
 
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
-
237
206
 
238
207
  def load(
239
208
  file_obj: BinaryIO,
@@ -242,8 +211,7 @@ def load(
242
211
  """Load a QPY binary file
243
212
 
244
213
  This function is used to load a serialized QPY Qiskit program file and create
245
- :class:`~qiskit.circuit.QuantumCircuit` objects or
246
- :class:`~qiskit.pulse.schedule.ScheduleBlock` objects from its contents.
214
+ :class:`~qiskit.circuit.QuantumCircuit` objects from its contents.
247
215
  For example:
248
216
 
249
217
  .. code-block:: python
@@ -264,12 +232,11 @@ def load(
264
232
  circuits = qpy.load(fd)
265
233
 
266
234
  which will read the contents of the qpy and return a list of
267
- :class:`~qiskit.circuit.QuantumCircuit` objects or
268
- :class:`~qiskit.pulse.schedule.ScheduleBlock` objects from the file.
235
+ :class:`~qiskit.circuit.QuantumCircuit` objects from the file.
269
236
 
270
237
  Args:
271
238
  file_obj: A file like object that contains the QPY binary
272
- data for a circuit or pulse schedule.
239
+ data for a circuit.
273
240
  metadata_deserializer: An optional JSONDecoder class
274
241
  that will be used for the ``cls`` kwarg on the internal
275
242
  ``json.load`` call used to deserialize the JSON payload used for
@@ -285,6 +252,11 @@ def load(
285
252
  Raises:
286
253
  QiskitError: if ``file_obj`` is not a valid QPY file
287
254
  TypeError: When invalid data type is loaded.
255
+ MissingOptionalLibraryError: If the ``symengine`` engine library is
256
+ not installed when loading a QPY version 10, 11, or 12 payload
257
+ that is using symengine symbolic encoding and contains
258
+ :class:`.ParameterExpression` instances.
259
+ QpyError: if known but unsupported data type is loaded.
288
260
  """
289
261
 
290
262
  # identify file header version
@@ -347,15 +319,10 @@ def load(
347
319
  if type_key == type_keys.Program.CIRCUIT:
348
320
  loader = binary_io.read_circuit
349
321
  elif type_key == type_keys.Program.SCHEDULE_BLOCK:
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.",
322
+ raise QpyError(
323
+ "Payloads of type `ScheduleBlock` cannot be loaded as of Qiskit 2.0. "
324
+ "Use an earlier version of Qiskit if you want to load `ScheduleBlock` payloads."
357
325
  )
358
-
359
326
  else:
360
327
  raise TypeError(f"Invalid payload format data kind '{type_key}'.")
361
328