qiskit 1.4.2__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 (459) 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 +7 -1
  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/compiler/__init__.py +1 -7
  104. qiskit/compiler/transpiler.py +38 -196
  105. qiskit/converters/circuit_to_dag.py +6 -4
  106. qiskit/converters/circuit_to_dagdependency.py +0 -2
  107. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  108. qiskit/converters/circuit_to_gate.py +1 -1
  109. qiskit/converters/circuit_to_instruction.py +16 -29
  110. qiskit/converters/dag_to_circuit.py +7 -8
  111. qiskit/converters/dag_to_dagdependency.py +0 -1
  112. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  113. qiskit/converters/dagdependency_to_circuit.py +0 -6
  114. qiskit/converters/dagdependency_to_dag.py +0 -6
  115. qiskit/dagcircuit/collect_blocks.py +32 -20
  116. qiskit/dagcircuit/dagdependency.py +3 -37
  117. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  118. qiskit/dagcircuit/dagnode.py +14 -2
  119. qiskit/passmanager/__init__.py +24 -6
  120. qiskit/passmanager/passmanager.py +26 -24
  121. qiskit/primitives/__init__.py +44 -35
  122. qiskit/primitives/backend_estimator_v2.py +102 -23
  123. qiskit/primitives/backend_sampler_v2.py +5 -20
  124. qiskit/primitives/base/__init__.py +4 -4
  125. qiskit/primitives/base/base_estimator.py +77 -82
  126. qiskit/primitives/base/base_primitive_job.py +2 -2
  127. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  128. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  129. qiskit/primitives/base/base_sampler.py +52 -60
  130. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  131. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  132. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  133. qiskit/primitives/containers/bindings_array.py +3 -1
  134. qiskit/primitives/containers/bit_array.py +23 -0
  135. qiskit/primitives/containers/data_bin.py +3 -1
  136. qiskit/primitives/containers/observables_array.py +19 -2
  137. qiskit/primitives/statevector_sampler.py +6 -8
  138. qiskit/primitives/utils.py +14 -189
  139. qiskit/providers/__init__.py +4 -130
  140. qiskit/providers/backend.py +11 -314
  141. qiskit/providers/basic_provider/__init__.py +3 -1
  142. qiskit/providers/basic_provider/basic_provider.py +29 -9
  143. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  144. qiskit/providers/exceptions.py +0 -33
  145. qiskit/providers/fake_provider/__init__.py +0 -37
  146. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  147. qiskit/qasm2/__init__.py +21 -6
  148. qiskit/qasm2/export.py +2 -10
  149. qiskit/qasm2/parse.py +11 -25
  150. qiskit/qasm3/__init__.py +5 -1
  151. qiskit/qasm3/ast.py +44 -0
  152. qiskit/qasm3/exporter.py +65 -27
  153. qiskit/qasm3/printer.py +35 -4
  154. qiskit/qpy/__init__.py +162 -19
  155. qiskit/qpy/binary_io/__init__.py +0 -1
  156. qiskit/qpy/binary_io/circuits.py +98 -130
  157. qiskit/qpy/binary_io/schedules.py +69 -439
  158. qiskit/qpy/binary_io/value.py +154 -31
  159. qiskit/qpy/common.py +10 -7
  160. qiskit/qpy/formats.py +41 -0
  161. qiskit/qpy/interface.py +34 -81
  162. qiskit/qpy/type_keys.py +58 -221
  163. qiskit/quantum_info/analysis/distance.py +3 -1
  164. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  165. qiskit/quantum_info/operators/operator.py +6 -2
  166. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  167. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  168. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  169. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  170. qiskit/quantum_info/states/densitymatrix.py +16 -6
  171. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  172. qiskit/quantum_info/states/statevector.py +16 -6
  173. qiskit/result/__init__.py +5 -17
  174. qiskit/result/models.py +18 -11
  175. qiskit/result/result.py +38 -134
  176. qiskit/result/sampled_expval.py +1 -2
  177. qiskit/result/utils.py +3 -4
  178. qiskit/synthesis/__init__.py +21 -1
  179. qiskit/synthesis/arithmetic/__init__.py +3 -1
  180. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  182. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  183. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  184. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  185. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  186. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  188. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  189. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  190. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  191. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  192. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +4 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +78 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/counts_visualization.py +4 -0
  287. qiskit/visualization/dag_visualization.py +2 -1
  288. qiskit/visualization/gate_map.py +39 -154
  289. qiskit/visualization/library.py +4 -1
  290. qiskit/visualization/pass_manager_visualization.py +6 -2
  291. qiskit/visualization/state_visualization.py +19 -2
  292. qiskit/visualization/timeline/core.py +19 -13
  293. qiskit/visualization/timeline/interface.py +19 -18
  294. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  295. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  296. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
  297. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  298. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  299. qiskit/assembler/__init__.py +0 -42
  300. qiskit/assembler/assemble_circuits.py +0 -451
  301. qiskit/assembler/assemble_schedules.py +0 -367
  302. qiskit/assembler/disassemble.py +0 -310
  303. qiskit/assembler/run_config.py +0 -77
  304. qiskit/circuit/bit.py +0 -106
  305. qiskit/circuit/classicalfunction/__init__.py +0 -152
  306. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  307. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  308. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  309. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  310. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  311. qiskit/circuit/classicalfunction/types.py +0 -18
  312. qiskit/circuit/classicalfunction/utils.py +0 -91
  313. qiskit/circuit/classicalregister.py +0 -57
  314. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  315. qiskit/circuit/quantumregister.py +0 -75
  316. qiskit/circuit/register.py +0 -246
  317. qiskit/compiler/assembler.py +0 -689
  318. qiskit/compiler/scheduler.py +0 -109
  319. qiskit/compiler/sequencer.py +0 -71
  320. qiskit/primitives/backend_estimator.py +0 -486
  321. qiskit/primitives/backend_sampler.py +0 -222
  322. qiskit/primitives/estimator.py +0 -172
  323. qiskit/primitives/sampler.py +0 -162
  324. qiskit/providers/backend_compat.py +0 -507
  325. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  340. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/fake_1q.py +0 -91
  349. qiskit/providers/fake_provider/fake_backend.py +0 -165
  350. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  351. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  352. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  353. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  354. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  355. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  356. qiskit/providers/models/__init__.py +0 -89
  357. qiskit/providers/models/backendconfiguration.py +0 -1040
  358. qiskit/providers/models/backendproperties.py +0 -535
  359. qiskit/providers/models/backendstatus.py +0 -104
  360. qiskit/providers/models/jobstatus.py +0 -77
  361. qiskit/providers/models/pulsedefaults.py +0 -305
  362. qiskit/providers/provider.py +0 -95
  363. qiskit/pulse/__init__.py +0 -158
  364. qiskit/pulse/builder.py +0 -2262
  365. qiskit/pulse/calibration_entries.py +0 -381
  366. qiskit/pulse/channels.py +0 -227
  367. qiskit/pulse/configuration.py +0 -245
  368. qiskit/pulse/exceptions.py +0 -45
  369. qiskit/pulse/filters.py +0 -309
  370. qiskit/pulse/instruction_schedule_map.py +0 -424
  371. qiskit/pulse/instructions/__init__.py +0 -67
  372. qiskit/pulse/instructions/acquire.py +0 -150
  373. qiskit/pulse/instructions/delay.py +0 -71
  374. qiskit/pulse/instructions/directives.py +0 -154
  375. qiskit/pulse/instructions/frequency.py +0 -135
  376. qiskit/pulse/instructions/instruction.py +0 -270
  377. qiskit/pulse/instructions/phase.py +0 -152
  378. qiskit/pulse/instructions/play.py +0 -99
  379. qiskit/pulse/instructions/reference.py +0 -100
  380. qiskit/pulse/instructions/snapshot.py +0 -82
  381. qiskit/pulse/library/__init__.py +0 -97
  382. qiskit/pulse/library/continuous.py +0 -430
  383. qiskit/pulse/library/pulse.py +0 -148
  384. qiskit/pulse/library/samplers/__init__.py +0 -15
  385. qiskit/pulse/library/samplers/decorators.py +0 -295
  386. qiskit/pulse/library/samplers/strategies.py +0 -71
  387. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  388. qiskit/pulse/library/waveform.py +0 -136
  389. qiskit/pulse/macros.py +0 -262
  390. qiskit/pulse/parameter_manager.py +0 -445
  391. qiskit/pulse/parser.py +0 -314
  392. qiskit/pulse/reference_manager.py +0 -58
  393. qiskit/pulse/schedule.py +0 -1854
  394. qiskit/pulse/transforms/__init__.py +0 -106
  395. qiskit/pulse/transforms/alignments.py +0 -406
  396. qiskit/pulse/transforms/base_transforms.py +0 -71
  397. qiskit/pulse/transforms/canonicalization.py +0 -498
  398. qiskit/pulse/transforms/dag.py +0 -122
  399. qiskit/pulse/utils.py +0 -149
  400. qiskit/qobj/__init__.py +0 -75
  401. qiskit/qobj/common.py +0 -81
  402. qiskit/qobj/converters/__init__.py +0 -18
  403. qiskit/qobj/converters/lo_config.py +0 -177
  404. qiskit/qobj/converters/pulse_instruction.py +0 -897
  405. qiskit/qobj/pulse_qobj.py +0 -709
  406. qiskit/qobj/qasm_qobj.py +0 -708
  407. qiskit/qobj/utils.py +0 -46
  408. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  409. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  410. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  411. qiskit/result/mitigation/utils.py +0 -217
  412. qiskit/scheduler/__init__.py +0 -40
  413. qiskit/scheduler/config.py +0 -37
  414. qiskit/scheduler/lowering.py +0 -187
  415. qiskit/scheduler/methods/__init__.py +0 -15
  416. qiskit/scheduler/methods/basic.py +0 -140
  417. qiskit/scheduler/schedule_circuit.py +0 -69
  418. qiskit/scheduler/sequence.py +0 -104
  419. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  420. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  421. qiskit/transpiler/passes/calibration/builders.py +0 -20
  422. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  423. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  424. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  425. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  426. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  427. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  428. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  429. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  430. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  431. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  432. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  433. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  434. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  435. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  436. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  437. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  438. qiskit/utils/deprecate_pulse.py +0 -119
  439. qiskit/utils/multiprocessing.py +0 -56
  440. qiskit/visualization/pulse_v2/__init__.py +0 -21
  441. qiskit/visualization/pulse_v2/core.py +0 -901
  442. qiskit/visualization/pulse_v2/device_info.py +0 -173
  443. qiskit/visualization/pulse_v2/drawings.py +0 -253
  444. qiskit/visualization/pulse_v2/events.py +0 -254
  445. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  446. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  447. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  448. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  449. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  450. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  451. qiskit/visualization/pulse_v2/interface.py +0 -459
  452. qiskit/visualization/pulse_v2/layouts.py +0 -387
  453. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  454. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  455. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  456. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  457. qiskit/visualization/pulse_v2/types.py +0 -242
  458. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  459. {qiskit-1.4.2.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 (
@@ -166,20 +166,9 @@ def _write_parameter_expression_v13(file_obj, obj, version):
166
166
 
167
167
  def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
168
168
  extra_symbols = None
169
- if version < 13:
170
- if use_symengine:
171
- expr_bytes = obj._symbol_expr.__reduce__()[1][0]
172
- else:
173
- from sympy import srepr, sympify
174
-
175
- if not isinstance(obj._symbol_expr, symengine.Basic):
176
- raise exceptions.QpyError("Invalid ParameterExpression")
177
-
178
- expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
179
- else:
180
- with io.BytesIO() as buf:
181
- extra_symbols = _write_parameter_expression_v13(buf, obj, version)
182
- 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()
183
172
  symbol_table_len = len(obj._parameter_symbols)
184
173
  if extra_symbols:
185
174
  symbol_table_len += 2 * len(extra_symbols)
@@ -275,12 +264,15 @@ class _ExprWriter(expr.ExprVisitor[None]):
275
264
  self.standalone_var_indices = standalone_var_indices
276
265
  self.version = version
277
266
 
267
+ def _write_expr_type(self, type_, /):
268
+ _write_expr_type(self.file_obj, type_, self.version)
269
+
278
270
  def visit_generic(self, node, /):
279
271
  raise exceptions.QpyError(f"unhandled Expr object '{node}'")
280
272
 
281
273
  def visit_var(self, node, /):
282
274
  self.file_obj.write(type_keys.Expression.VAR)
283
- _write_expr_type(self.file_obj, node.type)
275
+ self._write_expr_type(node.type)
284
276
  if node.standalone:
285
277
  self.file_obj.write(type_keys.ExprVar.UUID)
286
278
  self.file_obj.write(
@@ -308,9 +300,19 @@ class _ExprWriter(expr.ExprVisitor[None]):
308
300
  else:
309
301
  raise exceptions.QpyError(f"unhandled Var object '{node.var}'")
310
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
+
311
313
  def visit_value(self, node, /):
312
314
  self.file_obj.write(type_keys.Expression.VALUE)
313
- _write_expr_type(self.file_obj, node.type)
315
+ self._write_expr_type(node.type)
314
316
  if node.value is True or node.value is False:
315
317
  self.file_obj.write(type_keys.ExprValue.BOOL)
316
318
  self.file_obj.write(
@@ -331,12 +333,20 @@ class _ExprWriter(expr.ExprVisitor[None]):
331
333
  struct.pack(formats.EXPR_VALUE_INT_PACK, *formats.EXPR_VALUE_INT(num_bytes))
332
334
  )
333
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)
334
344
  else:
335
345
  raise exceptions.QpyError(f"unhandled Value object '{node.value}'")
336
346
 
337
347
  def visit_cast(self, node, /):
338
348
  self.file_obj.write(type_keys.Expression.CAST)
339
- _write_expr_type(self.file_obj, node.type)
349
+ self._write_expr_type(node.type)
340
350
  self.file_obj.write(
341
351
  struct.pack(formats.EXPRESSION_CAST_PACK, *formats.EXPRESSION_CAST(node.implicit))
342
352
  )
@@ -344,7 +354,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
344
354
 
345
355
  def visit_unary(self, node, /):
346
356
  self.file_obj.write(type_keys.Expression.UNARY)
347
- _write_expr_type(self.file_obj, node.type)
357
+ self._write_expr_type(node.type)
348
358
  self.file_obj.write(
349
359
  struct.pack(formats.EXPRESSION_UNARY_PACK, *formats.EXPRESSION_UNARY(node.op.value))
350
360
  )
@@ -352,7 +362,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
352
362
 
353
363
  def visit_binary(self, node, /):
354
364
  self.file_obj.write(type_keys.Expression.BINARY)
355
- _write_expr_type(self.file_obj, node.type)
365
+ self._write_expr_type(node.type)
356
366
  self.file_obj.write(
357
367
  struct.pack(formats.EXPRESSION_BINARY_PACK, *formats.EXPRESSION_BINARY(node.op.value))
358
368
  )
@@ -365,7 +375,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
365
375
  "the 'Index' expression", required=12, target=self.version
366
376
  )
367
377
  self.file_obj.write(type_keys.Expression.INDEX)
368
- _write_expr_type(self.file_obj, node.type)
378
+ self._write_expr_type(node.type)
369
379
  node.target.accept(self)
370
380
  node.index.accept(self)
371
381
 
@@ -380,7 +390,7 @@ def _write_expr(
380
390
  node.accept(_ExprWriter(file_obj, clbit_indices, standalone_var_indices, version))
381
391
 
382
392
 
383
- def _write_expr_type(file_obj, type_: types.Type):
393
+ def _write_expr_type(file_obj, type_: types.Type, version: int):
384
394
  if type_.kind is types.Bool:
385
395
  file_obj.write(type_keys.ExprType.BOOL)
386
396
  elif type_.kind is types.Uint:
@@ -388,10 +398,51 @@ def _write_expr_type(file_obj, type_: types.Type):
388
398
  file_obj.write(
389
399
  struct.pack(formats.EXPR_TYPE_UINT_PACK, *formats.EXPR_TYPE_UINT(type_.width))
390
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)
391
413
  else:
392
414
  raise exceptions.QpyError(f"unhandled Type object '{type_};")
393
415
 
394
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
+
395
446
  def _read_parameter(file_obj):
396
447
  data = formats.PARAMETER(
397
448
  *struct.unpack(formats.PARAMETER_PACK, file_obj.read(formats.PARAMETER_SIZE))
@@ -679,6 +730,13 @@ def _read_expr(
679
730
  name = file_obj.read(payload.reg_name_size).decode(common.ENCODE)
680
731
  return expr.Var(cregs[name], type_)
681
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]
682
740
  if type_key == type_keys.Expression.VALUE:
683
741
  value_type_key = file_obj.read(formats.EXPR_VALUE_DISCRIMINATOR_SIZE)
684
742
  if value_type_key == type_keys.ExprValue.BOOL:
@@ -697,6 +755,16 @@ def _read_expr(
697
755
  return expr.Value(
698
756
  int.from_bytes(file_obj.read(payload.num_bytes), "big", signed=True), type_
699
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_)
700
768
  raise exceptions.QpyError("Invalid classical-expression Value key '{value_type_key}'")
701
769
  if type_key == type_keys.Expression.CAST:
702
770
  payload = formats.EXPRESSION_CAST._make(
@@ -746,9 +814,43 @@ def _read_expr_type(file_obj) -> types.Type:
746
814
  struct.unpack(formats.EXPR_TYPE_UINT_PACK, file_obj.read(formats.EXPR_TYPE_UINT_SIZE))
747
815
  )
748
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()
749
821
  raise exceptions.QpyError(f"Invalid classical-expression Type key '{type_key}'")
750
822
 
751
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
+
752
854
  def read_standalone_vars(file_obj, num_vars):
753
855
  """Read the ``num_vars`` standalone variable declarations from the file.
754
856
 
@@ -765,6 +867,8 @@ def read_standalone_vars(file_obj, num_vars):
765
867
  type_keys.ExprVarDeclaration.INPUT: [],
766
868
  type_keys.ExprVarDeclaration.CAPTURE: [],
767
869
  type_keys.ExprVarDeclaration.LOCAL: [],
870
+ type_keys.ExprVarDeclaration.STRETCH_CAPTURE: [],
871
+ type_keys.ExprVarDeclaration.STRETCH_LOCAL: [],
768
872
  }
769
873
  var_order = []
770
874
  for _ in range(num_vars):
@@ -776,13 +880,19 @@ def read_standalone_vars(file_obj, num_vars):
776
880
  )
777
881
  type_ = _read_expr_type(file_obj)
778
882
  name = file_obj.read(data.name_size).decode(common.ENCODE)
779
- 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)
780
890
  read_vars[data.usage].append(var)
781
891
  var_order.append(var)
782
892
  return read_vars, var_order
783
893
 
784
894
 
785
- def _write_standalone_var(file_obj, var, type_key):
895
+ def _write_standalone_var(file_obj, var, type_key, version):
786
896
  name = var.name.encode(common.ENCODE)
787
897
  file_obj.write(
788
898
  struct.pack(
@@ -790,33 +900,46 @@ def _write_standalone_var(file_obj, var, type_key):
790
900
  *formats.EXPR_VAR_DECLARATION(var.var.bytes, type_key, len(name)),
791
901
  )
792
902
  )
793
- _write_expr_type(file_obj, var.type)
903
+ _write_expr_type(file_obj, var.type, version)
794
904
  file_obj.write(name)
795
905
 
796
906
 
797
- def write_standalone_vars(file_obj, circuit):
907
+ def write_standalone_vars(file_obj, circuit, version):
798
908
  """Write the standalone variables out from a circuit.
799
909
 
800
910
  Args:
801
911
  file_obj (File): the file-like object to write to.
802
912
  circuit (QuantumCircuit): the circuit to take the variables from.
913
+ version (int): the QPY target version.
803
914
 
804
915
  Returns:
805
- dict[expr.Var, int]: a mapping of the variables written to the index that they were written
806
- at.
916
+ dict[expr.Var | expr.Stretch, int]: a mapping of the variables written to the
917
+ index that they were written at.
807
918
  """
808
919
  index = 0
809
920
  out = {}
810
921
  for var in circuit.iter_input_vars():
811
- _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT)
922
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT, version)
812
923
  out[var] = index
813
924
  index += 1
814
925
  for var in circuit.iter_captured_vars():
815
- _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE)
926
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE, version)
816
927
  out[var] = index
817
928
  index += 1
818
929
  for var in circuit.iter_declared_vars():
819
- _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)
820
943
  out[var] = index
821
944
  index += 1
822
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,24 +203,15 @@ 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,
240
209
  metadata_deserializer: Optional[Type[JSONDecoder]] = None,
241
- trust_payload: bool = False,
242
210
  ) -> List[QPY_SUPPORTED_TYPES]:
243
211
  """Load a QPY binary file
244
212
 
245
213
  This function is used to load a serialized QPY Qiskit program file and create
246
- :class:`~qiskit.circuit.QuantumCircuit` objects or
247
- :class:`~qiskit.pulse.schedule.ScheduleBlock` objects from its contents.
214
+ :class:`~qiskit.circuit.QuantumCircuit` objects from its contents.
248
215
  For example:
249
216
 
250
217
  .. code-block:: python
@@ -265,12 +232,11 @@ def load(
265
232
  circuits = qpy.load(fd)
266
233
 
267
234
  which will read the contents of the qpy and return a list of
268
- :class:`~qiskit.circuit.QuantumCircuit` objects or
269
- :class:`~qiskit.pulse.schedule.ScheduleBlock` objects from the file.
235
+ :class:`~qiskit.circuit.QuantumCircuit` objects from the file.
270
236
 
271
237
  Args:
272
238
  file_obj: A file like object that contains the QPY binary
273
- data for a circuit or pulse schedule.
239
+ data for a circuit.
274
240
  metadata_deserializer: An optional JSONDecoder class
275
241
  that will be used for the ``cls`` kwarg on the internal
276
242
  ``json.load`` call used to deserialize the JSON payload used for
@@ -278,18 +244,6 @@ def load(
278
244
  If this is not specified the circuit metadata will
279
245
  be parsed as JSON with the stdlib ``json.load()`` function using
280
246
  the default ``JSONDecoder`` class.
281
- trust_payload: if set to ``False`` (the default),
282
- :class:`.ScheduleBlock` objects in the payload that were
283
- serialized using ``sympy`` are not allowed and will error. This
284
- is because the ``sympy`` parsing uses :func:`eval`, which
285
- can allow for arbitrary code execution.
286
- The flag should only be set
287
- to ``True`` if you trust the QPY payload you are loading.
288
-
289
- .. warning::
290
-
291
- If ``trust_payload`` is set to ``True`` this can enable arbitrary
292
- code execution because internally ``sympy`` relies on :func:`eval`.
293
247
 
294
248
  Returns:
295
249
  The list of Qiskit programs contained in the QPY data.
@@ -298,6 +252,11 @@ def load(
298
252
  Raises:
299
253
  QiskitError: if ``file_obj`` is not a valid QPY file
300
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.
301
260
  """
302
261
 
303
262
  # identify file header version
@@ -357,26 +316,21 @@ def load(
357
316
  else:
358
317
  type_key = common.read_type_key(file_obj)
359
318
 
360
- if data.qpy_version < 10:
361
- use_symengine = False
362
- else:
363
- use_symengine = data.symbolic_encoding == type_keys.SymExprEncoding.SYMENGINE
364
-
365
319
  if type_key == type_keys.Program.CIRCUIT:
366
320
  loader = binary_io.read_circuit
367
321
  elif type_key == type_keys.Program.SCHEDULE_BLOCK:
368
- loader = binary_io.read_schedule_block
369
- warnings.warn(
370
- category=QPYLoadingDeprecatedFeatureWarning,
371
- message="Pulse gates deserialization is deprecated as of Qiskit 1.3 and "
372
- "will be removed in Qiskit 2.0. This is part of the deprecation plan for "
373
- "the entire Qiskit Pulse package. Once Pulse is removed, `ScheduleBlock` "
374
- "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."
375
325
  )
376
-
377
326
  else:
378
327
  raise TypeError(f"Invalid payload format data kind '{type_key}'.")
379
328
 
329
+ if data.qpy_version < 10:
330
+ use_symengine = False
331
+ else:
332
+ use_symengine = data.symbolic_encoding == type_keys.SymExprEncoding.SYMENGINE
333
+
380
334
  programs = []
381
335
  for _ in range(data.num_programs):
382
336
  programs.append(
@@ -385,7 +339,6 @@ def load(
385
339
  data.qpy_version,
386
340
  metadata_deserializer=metadata_deserializer,
387
341
  use_symengine=use_symengine,
388
- trust_input=trust_payload,
389
342
  )
390
343
  )
391
344
  return programs