qiskit 1.4.0__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__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 (456) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +24 -5
  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 +248 -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 +7 -140
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +34 -5
  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/hamiltonian_gate.py +1 -1
  60. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  61. qiskit/circuit/library/n_local/n_local.py +1 -1
  62. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  63. qiskit/circuit/library/overlap.py +2 -2
  64. qiskit/circuit/library/pauli_evolution.py +39 -24
  65. qiskit/circuit/library/phase_oracle.py +130 -51
  66. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  67. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  68. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  69. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  70. qiskit/circuit/library/standard_gates/h.py +4 -9
  71. qiskit/circuit/library/standard_gates/i.py +2 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  73. qiskit/circuit/library/standard_gates/p.py +15 -34
  74. qiskit/circuit/library/standard_gates/r.py +2 -6
  75. qiskit/circuit/library/standard_gates/rx.py +5 -15
  76. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  77. qiskit/circuit/library/standard_gates/ry.py +5 -17
  78. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  79. qiskit/circuit/library/standard_gates/rz.py +5 -17
  80. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  82. qiskit/circuit/library/standard_gates/s.py +6 -15
  83. qiskit/circuit/library/standard_gates/swap.py +4 -11
  84. qiskit/circuit/library/standard_gates/sx.py +7 -12
  85. qiskit/circuit/library/standard_gates/t.py +6 -7
  86. qiskit/circuit/library/standard_gates/u.py +2 -10
  87. qiskit/circuit/library/standard_gates/u1.py +5 -16
  88. qiskit/circuit/library/standard_gates/u2.py +2 -6
  89. qiskit/circuit/library/standard_gates/u3.py +3 -11
  90. qiskit/circuit/library/standard_gates/x.py +13 -60
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/y.py +4 -9
  94. qiskit/circuit/library/standard_gates/z.py +5 -15
  95. qiskit/circuit/measure.py +11 -2
  96. qiskit/circuit/parameterexpression.py +4 -0
  97. qiskit/circuit/quantumcircuit.py +881 -555
  98. qiskit/circuit/random/utils.py +12 -6
  99. qiskit/circuit/reset.py +5 -2
  100. qiskit/circuit/singleton.py +5 -11
  101. qiskit/circuit/store.py +0 -8
  102. qiskit/compiler/__init__.py +1 -7
  103. qiskit/compiler/transpiler.py +38 -196
  104. qiskit/converters/circuit_to_dag.py +4 -2
  105. qiskit/converters/circuit_to_dagdependency.py +0 -2
  106. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  107. qiskit/converters/circuit_to_gate.py +1 -1
  108. qiskit/converters/circuit_to_instruction.py +16 -29
  109. qiskit/converters/dag_to_circuit.py +5 -5
  110. qiskit/converters/dag_to_dagdependency.py +0 -1
  111. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  112. qiskit/converters/dagdependency_to_circuit.py +0 -6
  113. qiskit/converters/dagdependency_to_dag.py +0 -6
  114. qiskit/dagcircuit/collect_blocks.py +32 -20
  115. qiskit/dagcircuit/dagdependency.py +3 -37
  116. qiskit/dagcircuit/dagdependency_v2.py +2 -80
  117. qiskit/dagcircuit/dagnode.py +14 -2
  118. qiskit/passmanager/__init__.py +24 -6
  119. qiskit/passmanager/passmanager.py +26 -24
  120. qiskit/primitives/__init__.py +44 -35
  121. qiskit/primitives/backend_estimator_v2.py +102 -23
  122. qiskit/primitives/backend_sampler_v2.py +5 -20
  123. qiskit/primitives/base/__init__.py +4 -4
  124. qiskit/primitives/base/base_estimator.py +77 -82
  125. qiskit/primitives/base/base_primitive_job.py +2 -2
  126. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  127. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  128. qiskit/primitives/base/base_sampler.py +52 -60
  129. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  130. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  131. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  132. qiskit/primitives/containers/bindings_array.py +3 -1
  133. qiskit/primitives/containers/bit_array.py +23 -0
  134. qiskit/primitives/containers/data_bin.py +3 -1
  135. qiskit/primitives/containers/observables_array.py +19 -2
  136. qiskit/primitives/statevector_sampler.py +6 -8
  137. qiskit/primitives/utils.py +14 -189
  138. qiskit/providers/__init__.py +4 -130
  139. qiskit/providers/backend.py +11 -314
  140. qiskit/providers/basic_provider/__init__.py +3 -1
  141. qiskit/providers/basic_provider/basic_provider.py +29 -9
  142. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  143. qiskit/providers/exceptions.py +0 -33
  144. qiskit/providers/fake_provider/__init__.py +0 -37
  145. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  146. qiskit/qasm2/__init__.py +21 -6
  147. qiskit/qasm2/export.py +2 -10
  148. qiskit/qasm2/parse.py +11 -25
  149. qiskit/qasm3/__init__.py +5 -1
  150. qiskit/qasm3/ast.py +44 -0
  151. qiskit/qasm3/exporter.py +65 -27
  152. qiskit/qasm3/printer.py +35 -4
  153. qiskit/qpy/__init__.py +141 -19
  154. qiskit/qpy/binary_io/__init__.py +0 -1
  155. qiskit/qpy/binary_io/circuits.py +91 -116
  156. qiskit/qpy/binary_io/schedules.py +61 -388
  157. qiskit/qpy/binary_io/value.py +168 -28
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +29 -62
  161. qiskit/qpy/type_keys.py +58 -221
  162. qiskit/quantum_info/analysis/distance.py +3 -1
  163. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  164. qiskit/quantum_info/operators/operator.py +6 -2
  165. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  166. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  167. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  169. qiskit/quantum_info/states/densitymatrix.py +16 -6
  170. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  171. qiskit/quantum_info/states/statevector.py +16 -6
  172. qiskit/result/__init__.py +5 -17
  173. qiskit/result/models.py +18 -10
  174. qiskit/result/result.py +28 -126
  175. qiskit/result/sampled_expval.py +1 -2
  176. qiskit/result/utils.py +3 -4
  177. qiskit/synthesis/__init__.py +21 -1
  178. qiskit/synthesis/arithmetic/__init__.py +3 -1
  179. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  180. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  182. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  183. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  184. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  185. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  186. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  188. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  189. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  190. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  191. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  192. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -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 +2 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  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 +5 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -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 +1 -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 +30 -2
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  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 +127 -59
  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 +101 -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 +67 -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/dag_visualization.py +2 -1
  287. qiskit/visualization/gate_map.py +39 -154
  288. qiskit/visualization/pass_manager_visualization.py +6 -2
  289. qiskit/visualization/state_visualization.py +6 -0
  290. qiskit/visualization/timeline/core.py +27 -12
  291. qiskit/visualization/timeline/interface.py +23 -18
  292. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
  295. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
  296. qiskit/assembler/__init__.py +0 -42
  297. qiskit/assembler/assemble_circuits.py +0 -451
  298. qiskit/assembler/assemble_schedules.py +0 -367
  299. qiskit/assembler/disassemble.py +0 -310
  300. qiskit/assembler/run_config.py +0 -77
  301. qiskit/circuit/bit.py +0 -106
  302. qiskit/circuit/classicalfunction/__init__.py +0 -152
  303. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  304. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  305. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  306. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  307. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  308. qiskit/circuit/classicalfunction/types.py +0 -18
  309. qiskit/circuit/classicalfunction/utils.py +0 -91
  310. qiskit/circuit/classicalregister.py +0 -57
  311. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  312. qiskit/circuit/quantumregister.py +0 -75
  313. qiskit/circuit/register.py +0 -246
  314. qiskit/compiler/assembler.py +0 -689
  315. qiskit/compiler/scheduler.py +0 -109
  316. qiskit/compiler/sequencer.py +0 -71
  317. qiskit/primitives/backend_estimator.py +0 -486
  318. qiskit/primitives/backend_sampler.py +0 -222
  319. qiskit/primitives/estimator.py +0 -172
  320. qiskit/primitives/sampler.py +0 -162
  321. qiskit/providers/backend_compat.py +0 -507
  322. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  330. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/fake_1q.py +0 -91
  346. qiskit/providers/fake_provider/fake_backend.py +0 -165
  347. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  348. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  349. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  350. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  351. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  352. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  353. qiskit/providers/models/__init__.py +0 -89
  354. qiskit/providers/models/backendconfiguration.py +0 -1040
  355. qiskit/providers/models/backendproperties.py +0 -535
  356. qiskit/providers/models/backendstatus.py +0 -104
  357. qiskit/providers/models/jobstatus.py +0 -77
  358. qiskit/providers/models/pulsedefaults.py +0 -305
  359. qiskit/providers/provider.py +0 -95
  360. qiskit/pulse/__init__.py +0 -158
  361. qiskit/pulse/builder.py +0 -2262
  362. qiskit/pulse/calibration_entries.py +0 -381
  363. qiskit/pulse/channels.py +0 -227
  364. qiskit/pulse/configuration.py +0 -245
  365. qiskit/pulse/exceptions.py +0 -45
  366. qiskit/pulse/filters.py +0 -309
  367. qiskit/pulse/instruction_schedule_map.py +0 -424
  368. qiskit/pulse/instructions/__init__.py +0 -67
  369. qiskit/pulse/instructions/acquire.py +0 -150
  370. qiskit/pulse/instructions/delay.py +0 -71
  371. qiskit/pulse/instructions/directives.py +0 -154
  372. qiskit/pulse/instructions/frequency.py +0 -135
  373. qiskit/pulse/instructions/instruction.py +0 -270
  374. qiskit/pulse/instructions/phase.py +0 -152
  375. qiskit/pulse/instructions/play.py +0 -99
  376. qiskit/pulse/instructions/reference.py +0 -100
  377. qiskit/pulse/instructions/snapshot.py +0 -82
  378. qiskit/pulse/library/__init__.py +0 -97
  379. qiskit/pulse/library/continuous.py +0 -430
  380. qiskit/pulse/library/pulse.py +0 -148
  381. qiskit/pulse/library/samplers/__init__.py +0 -15
  382. qiskit/pulse/library/samplers/decorators.py +0 -295
  383. qiskit/pulse/library/samplers/strategies.py +0 -71
  384. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  385. qiskit/pulse/library/waveform.py +0 -136
  386. qiskit/pulse/macros.py +0 -262
  387. qiskit/pulse/parameter_manager.py +0 -445
  388. qiskit/pulse/parser.py +0 -314
  389. qiskit/pulse/reference_manager.py +0 -58
  390. qiskit/pulse/schedule.py +0 -1854
  391. qiskit/pulse/transforms/__init__.py +0 -106
  392. qiskit/pulse/transforms/alignments.py +0 -406
  393. qiskit/pulse/transforms/base_transforms.py +0 -71
  394. qiskit/pulse/transforms/canonicalization.py +0 -498
  395. qiskit/pulse/transforms/dag.py +0 -122
  396. qiskit/pulse/utils.py +0 -149
  397. qiskit/qobj/__init__.py +0 -75
  398. qiskit/qobj/common.py +0 -81
  399. qiskit/qobj/converters/__init__.py +0 -18
  400. qiskit/qobj/converters/lo_config.py +0 -177
  401. qiskit/qobj/converters/pulse_instruction.py +0 -897
  402. qiskit/qobj/pulse_qobj.py +0 -709
  403. qiskit/qobj/qasm_qobj.py +0 -708
  404. qiskit/qobj/utils.py +0 -46
  405. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  406. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  407. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  408. qiskit/result/mitigation/utils.py +0 -217
  409. qiskit/scheduler/__init__.py +0 -40
  410. qiskit/scheduler/config.py +0 -37
  411. qiskit/scheduler/lowering.py +0 -187
  412. qiskit/scheduler/methods/__init__.py +0 -15
  413. qiskit/scheduler/methods/basic.py +0 -140
  414. qiskit/scheduler/schedule_circuit.py +0 -69
  415. qiskit/scheduler/sequence.py +0 -104
  416. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  417. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  418. qiskit/transpiler/passes/calibration/builders.py +0 -20
  419. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  420. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  421. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  422. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  423. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  424. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  425. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  426. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  427. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  428. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  429. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  430. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  431. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  432. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  433. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  434. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  435. qiskit/utils/deprecate_pulse.py +0 -119
  436. qiskit/utils/multiprocessing.py +0 -56
  437. qiskit/visualization/pulse_v2/__init__.py +0 -21
  438. qiskit/visualization/pulse_v2/core.py +0 -901
  439. qiskit/visualization/pulse_v2/device_info.py +0 -173
  440. qiskit/visualization/pulse_v2/drawings.py +0 -253
  441. qiskit/visualization/pulse_v2/events.py +0 -254
  442. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  443. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  444. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  445. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  446. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  447. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  448. qiskit/visualization/pulse_v2/interface.py +0 -459
  449. qiskit/visualization/pulse_v2/layouts.py +0 -387
  450. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  451. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  452. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  453. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  454. qiskit/visualization/pulse_v2/types.py +0 -242
  455. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.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 (
@@ -142,6 +142,8 @@ def _encode_replay_subs(subs, file_obj, version):
142
142
 
143
143
 
144
144
  def _write_parameter_expression_v13(file_obj, obj, version):
145
+ # A symbol is `Parameter` or `ParameterVectorElement`.
146
+ # `symbol_map` maps symbols to ParameterExpression (which may be a symbol).
145
147
  symbol_map = {}
146
148
  for inst in obj._qpy_replay:
147
149
  if isinstance(inst, _SUBS):
@@ -163,17 +165,9 @@ def _write_parameter_expression_v13(file_obj, obj, version):
163
165
 
164
166
  def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
165
167
  extra_symbols = None
166
- if version < 13:
167
- if use_symengine:
168
- expr_bytes = obj._symbol_expr.__reduce__()[1][0]
169
- else:
170
- from sympy import srepr, sympify
171
-
172
- expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
173
- else:
174
- with io.BytesIO() as buf:
175
- extra_symbols = _write_parameter_expression_v13(buf, obj, version)
176
- expr_bytes = buf.getvalue()
168
+ with io.BytesIO() as buf:
169
+ extra_symbols = _write_parameter_expression_v13(buf, obj, version)
170
+ expr_bytes = buf.getvalue()
177
171
  symbol_table_len = len(obj._parameter_symbols)
178
172
  if extra_symbols:
179
173
  symbol_table_len += 2 * len(extra_symbols)
@@ -234,9 +228,17 @@ def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
234
228
  # serialize key
235
229
  if symbol_key == type_keys.Value.PARAMETER_VECTOR:
236
230
  symbol_data = common.data_to_binary(symbol, _write_parameter_vec)
231
+ elif symbol_key == type_keys.Value.PARAMETER_EXPRESSION:
232
+ symbol_data = common.data_to_binary(
233
+ symbol,
234
+ _write_parameter_expression,
235
+ use_symengine=use_symengine,
236
+ version=version,
237
+ )
237
238
  else:
238
239
  symbol_data = common.data_to_binary(symbol, _write_parameter)
239
240
  # serialize value
241
+
240
242
  value_key, value_data = dumps_value(
241
243
  symbol, version=version, use_symengine=use_symengine
242
244
  )
@@ -261,12 +263,15 @@ class _ExprWriter(expr.ExprVisitor[None]):
261
263
  self.standalone_var_indices = standalone_var_indices
262
264
  self.version = version
263
265
 
266
+ def _write_expr_type(self, type_, /):
267
+ _write_expr_type(self.file_obj, type_, self.version)
268
+
264
269
  def visit_generic(self, node, /):
265
270
  raise exceptions.QpyError(f"unhandled Expr object '{node}'")
266
271
 
267
272
  def visit_var(self, node, /):
268
273
  self.file_obj.write(type_keys.Expression.VAR)
269
- _write_expr_type(self.file_obj, node.type)
274
+ self._write_expr_type(node.type)
270
275
  if node.standalone:
271
276
  self.file_obj.write(type_keys.ExprVar.UUID)
272
277
  self.file_obj.write(
@@ -294,9 +299,19 @@ class _ExprWriter(expr.ExprVisitor[None]):
294
299
  else:
295
300
  raise exceptions.QpyError(f"unhandled Var object '{node.var}'")
296
301
 
302
+ def visit_stretch(self, node, /):
303
+ self.file_obj.write(type_keys.Expression.STRETCH)
304
+ self._write_expr_type(node.type)
305
+ self.file_obj.write(
306
+ struct.pack(
307
+ formats.EXPRESSION_STRETCH_PACK,
308
+ *formats.EXPRESSION_STRETCH(self.standalone_var_indices[node]),
309
+ )
310
+ )
311
+
297
312
  def visit_value(self, node, /):
298
313
  self.file_obj.write(type_keys.Expression.VALUE)
299
- _write_expr_type(self.file_obj, node.type)
314
+ self._write_expr_type(node.type)
300
315
  if node.value is True or node.value is False:
301
316
  self.file_obj.write(type_keys.ExprValue.BOOL)
302
317
  self.file_obj.write(
@@ -317,12 +332,20 @@ class _ExprWriter(expr.ExprVisitor[None]):
317
332
  struct.pack(formats.EXPR_VALUE_INT_PACK, *formats.EXPR_VALUE_INT(num_bytes))
318
333
  )
319
334
  self.file_obj.write(buffer)
335
+ elif isinstance(node.value, float):
336
+ self.file_obj.write(type_keys.ExprValue.FLOAT)
337
+ self.file_obj.write(
338
+ struct.pack(formats.EXPR_VALUE_FLOAT_PACK, *formats.EXPR_VALUE_FLOAT(node.value))
339
+ )
340
+ elif isinstance(node.value, Duration):
341
+ self.file_obj.write(type_keys.ExprValue.DURATION)
342
+ _write_duration(self.file_obj, node.value)
320
343
  else:
321
344
  raise exceptions.QpyError(f"unhandled Value object '{node.value}'")
322
345
 
323
346
  def visit_cast(self, node, /):
324
347
  self.file_obj.write(type_keys.Expression.CAST)
325
- _write_expr_type(self.file_obj, node.type)
348
+ self._write_expr_type(node.type)
326
349
  self.file_obj.write(
327
350
  struct.pack(formats.EXPRESSION_CAST_PACK, *formats.EXPRESSION_CAST(node.implicit))
328
351
  )
@@ -330,7 +353,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
330
353
 
331
354
  def visit_unary(self, node, /):
332
355
  self.file_obj.write(type_keys.Expression.UNARY)
333
- _write_expr_type(self.file_obj, node.type)
356
+ self._write_expr_type(node.type)
334
357
  self.file_obj.write(
335
358
  struct.pack(formats.EXPRESSION_UNARY_PACK, *formats.EXPRESSION_UNARY(node.op.value))
336
359
  )
@@ -338,7 +361,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
338
361
 
339
362
  def visit_binary(self, node, /):
340
363
  self.file_obj.write(type_keys.Expression.BINARY)
341
- _write_expr_type(self.file_obj, node.type)
364
+ self._write_expr_type(node.type)
342
365
  self.file_obj.write(
343
366
  struct.pack(formats.EXPRESSION_BINARY_PACK, *formats.EXPRESSION_BINARY(node.op.value))
344
367
  )
@@ -351,7 +374,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
351
374
  "the 'Index' expression", required=12, target=self.version
352
375
  )
353
376
  self.file_obj.write(type_keys.Expression.INDEX)
354
- _write_expr_type(self.file_obj, node.type)
377
+ self._write_expr_type(node.type)
355
378
  node.target.accept(self)
356
379
  node.index.accept(self)
357
380
 
@@ -366,7 +389,7 @@ def _write_expr(
366
389
  node.accept(_ExprWriter(file_obj, clbit_indices, standalone_var_indices, version))
367
390
 
368
391
 
369
- def _write_expr_type(file_obj, type_: types.Type):
392
+ def _write_expr_type(file_obj, type_: types.Type, version: int):
370
393
  if type_.kind is types.Bool:
371
394
  file_obj.write(type_keys.ExprType.BOOL)
372
395
  elif type_.kind is types.Uint:
@@ -374,10 +397,51 @@ def _write_expr_type(file_obj, type_: types.Type):
374
397
  file_obj.write(
375
398
  struct.pack(formats.EXPR_TYPE_UINT_PACK, *formats.EXPR_TYPE_UINT(type_.width))
376
399
  )
400
+ elif type_.kind is types.Float:
401
+ if version < 14:
402
+ raise exceptions.UnsupportedFeatureForVersion(
403
+ "float-typed expressions", required=14, target=version
404
+ )
405
+ file_obj.write(type_keys.ExprType.FLOAT)
406
+ elif type_.kind is types.Duration:
407
+ if version < 14:
408
+ raise exceptions.UnsupportedFeatureForVersion(
409
+ "duration-typed expressions", required=14, target=version
410
+ )
411
+ file_obj.write(type_keys.ExprType.DURATION)
377
412
  else:
378
413
  raise exceptions.QpyError(f"unhandled Type object '{type_};")
379
414
 
380
415
 
416
+ def _write_duration(file_obj, duration: Duration):
417
+ unit = duration.unit()
418
+ if unit == "dt":
419
+ file_obj.write(type_keys.CircuitDuration.DT)
420
+ file_obj.write(
421
+ struct.pack(formats.DURATION_DT_PACK, *formats.DURATION_DT(duration.value()))
422
+ )
423
+ elif unit == "ns":
424
+ file_obj.write(type_keys.CircuitDuration.NS)
425
+ file_obj.write(
426
+ struct.pack(formats.DURATION_NS_PACK, *formats.DURATION_NS(duration.value()))
427
+ )
428
+ elif unit == "us":
429
+ file_obj.write(type_keys.CircuitDuration.US)
430
+ file_obj.write(
431
+ struct.pack(formats.DURATION_US_PACK, *formats.DURATION_US(duration.value()))
432
+ )
433
+ elif unit == "ms":
434
+ file_obj.write(type_keys.CircuitDuration.MS)
435
+ file_obj.write(
436
+ struct.pack(formats.DURATION_MS_PACK, *formats.DURATION_MS(duration.value()))
437
+ )
438
+ elif unit == "s":
439
+ file_obj.write(type_keys.CircuitDuration.S)
440
+ file_obj.write(struct.pack(formats.DURATION_S_PACK, *formats.DURATION_S(duration.value())))
441
+ else:
442
+ raise exceptions.QpyError(f"unhandled Duration object '{duration};")
443
+
444
+
381
445
  def _read_parameter(file_obj):
382
446
  data = formats.PARAMETER(
383
447
  *struct.unpack(formats.PARAMETER_PACK, file_obj.read(formats.PARAMETER_SIZE))
@@ -516,10 +580,13 @@ def _read_parameter_expression_v13(file_obj, vectors, version):
516
580
  symbol = _read_parameter(file_obj)
517
581
  elif symbol_key == type_keys.Value.PARAMETER_VECTOR:
518
582
  symbol = _read_parameter_vec(file_obj, vectors)
583
+ elif symbol_key == type_keys.Value.PARAMETER_EXPRESSION:
584
+ symbol = _read_parameter_expression_v13(file_obj, vectors, version)
519
585
  else:
520
586
  raise exceptions.QpyError(f"Invalid parameter expression map type: {symbol_key}")
521
587
 
522
588
  elem_key = type_keys.Value(elem_data.type)
589
+
523
590
  binary_data = file_obj.read(elem_data.size)
524
591
  if elem_key == type_keys.Value.INTEGER:
525
592
  value = struct.unpack("!q", binary_data)
@@ -534,6 +601,7 @@ def _read_parameter_expression_v13(file_obj, vectors, version):
534
601
  binary_data,
535
602
  _read_parameter_expression_v13,
536
603
  vectors=vectors,
604
+ version=version,
537
605
  )
538
606
  else:
539
607
  raise exceptions.QpyError(f"Invalid parameter expression map type: {elem_key}")
@@ -662,6 +730,13 @@ def _read_expr(
662
730
  name = file_obj.read(payload.reg_name_size).decode(common.ENCODE)
663
731
  return expr.Var(cregs[name], type_)
664
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]
665
740
  if type_key == type_keys.Expression.VALUE:
666
741
  value_type_key = file_obj.read(formats.EXPR_VALUE_DISCRIMINATOR_SIZE)
667
742
  if value_type_key == type_keys.ExprValue.BOOL:
@@ -680,6 +755,16 @@ def _read_expr(
680
755
  return expr.Value(
681
756
  int.from_bytes(file_obj.read(payload.num_bytes), "big", signed=True), type_
682
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_)
683
768
  raise exceptions.QpyError("Invalid classical-expression Value key '{value_type_key}'")
684
769
  if type_key == type_keys.Expression.CAST:
685
770
  payload = formats.EXPRESSION_CAST._make(
@@ -729,9 +814,43 @@ def _read_expr_type(file_obj) -> types.Type:
729
814
  struct.unpack(formats.EXPR_TYPE_UINT_PACK, file_obj.read(formats.EXPR_TYPE_UINT_SIZE))
730
815
  )
731
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()
732
821
  raise exceptions.QpyError(f"Invalid classical-expression Type key '{type_key}'")
733
822
 
734
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
+
735
854
  def read_standalone_vars(file_obj, num_vars):
736
855
  """Read the ``num_vars`` standalone variable declarations from the file.
737
856
 
@@ -748,6 +867,8 @@ def read_standalone_vars(file_obj, num_vars):
748
867
  type_keys.ExprVarDeclaration.INPUT: [],
749
868
  type_keys.ExprVarDeclaration.CAPTURE: [],
750
869
  type_keys.ExprVarDeclaration.LOCAL: [],
870
+ type_keys.ExprVarDeclaration.STRETCH_CAPTURE: [],
871
+ type_keys.ExprVarDeclaration.STRETCH_LOCAL: [],
751
872
  }
752
873
  var_order = []
753
874
  for _ in range(num_vars):
@@ -759,13 +880,19 @@ def read_standalone_vars(file_obj, num_vars):
759
880
  )
760
881
  type_ = _read_expr_type(file_obj)
761
882
  name = file_obj.read(data.name_size).decode(common.ENCODE)
762
- 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)
763
890
  read_vars[data.usage].append(var)
764
891
  var_order.append(var)
765
892
  return read_vars, var_order
766
893
 
767
894
 
768
- def _write_standalone_var(file_obj, var, type_key):
895
+ def _write_standalone_var(file_obj, var, type_key, version):
769
896
  name = var.name.encode(common.ENCODE)
770
897
  file_obj.write(
771
898
  struct.pack(
@@ -773,33 +900,46 @@ def _write_standalone_var(file_obj, var, type_key):
773
900
  *formats.EXPR_VAR_DECLARATION(var.var.bytes, type_key, len(name)),
774
901
  )
775
902
  )
776
- _write_expr_type(file_obj, var.type)
903
+ _write_expr_type(file_obj, var.type, version)
777
904
  file_obj.write(name)
778
905
 
779
906
 
780
- def write_standalone_vars(file_obj, circuit):
907
+ def write_standalone_vars(file_obj, circuit, version):
781
908
  """Write the standalone variables out from a circuit.
782
909
 
783
910
  Args:
784
911
  file_obj (File): the file-like object to write to.
785
912
  circuit (QuantumCircuit): the circuit to take the variables from.
913
+ version (int): the QPY target version.
786
914
 
787
915
  Returns:
788
- dict[expr.Var, int]: a mapping of the variables written to the index that they were written
789
- at.
916
+ dict[expr.Var | expr.Stretch, int]: a mapping of the variables written to the
917
+ index that they were written at.
790
918
  """
791
919
  index = 0
792
920
  out = {}
793
921
  for var in circuit.iter_input_vars():
794
- _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT)
922
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT, version)
795
923
  out[var] = index
796
924
  index += 1
797
925
  for var in circuit.iter_captured_vars():
798
- _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE)
926
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE, version)
799
927
  out[var] = index
800
928
  index += 1
801
929
  for var in circuit.iter_declared_vars():
802
- _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)
803
943
  out[var] = index
804
944
  index += 1
805
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