qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0rc1__cp39-abi3-win_amd64.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.pyd +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 +2 -141
  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 +154 -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 +4 -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 +18 -12
  291. qiskit/visualization/timeline/interface.py +19 -18
  292. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +1 -1
  295. {qiskit-1.4.1.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.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.1.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 (
@@ -165,17 +165,9 @@ def _write_parameter_expression_v13(file_obj, obj, version):
165
165
 
166
166
  def _write_parameter_expression(file_obj, obj, use_symengine, *, version):
167
167
  extra_symbols = None
168
- if version < 13:
169
- if use_symengine:
170
- expr_bytes = obj._symbol_expr.__reduce__()[1][0]
171
- else:
172
- from sympy import srepr, sympify
173
-
174
- expr_bytes = srepr(sympify(obj._symbol_expr)).encode(common.ENCODE)
175
- else:
176
- with io.BytesIO() as buf:
177
- extra_symbols = _write_parameter_expression_v13(buf, obj, version)
178
- expr_bytes = buf.getvalue()
168
+ with io.BytesIO() as buf:
169
+ extra_symbols = _write_parameter_expression_v13(buf, obj, version)
170
+ expr_bytes = buf.getvalue()
179
171
  symbol_table_len = len(obj._parameter_symbols)
180
172
  if extra_symbols:
181
173
  symbol_table_len += 2 * len(extra_symbols)
@@ -271,12 +263,15 @@ class _ExprWriter(expr.ExprVisitor[None]):
271
263
  self.standalone_var_indices = standalone_var_indices
272
264
  self.version = version
273
265
 
266
+ def _write_expr_type(self, type_, /):
267
+ _write_expr_type(self.file_obj, type_, self.version)
268
+
274
269
  def visit_generic(self, node, /):
275
270
  raise exceptions.QpyError(f"unhandled Expr object '{node}'")
276
271
 
277
272
  def visit_var(self, node, /):
278
273
  self.file_obj.write(type_keys.Expression.VAR)
279
- _write_expr_type(self.file_obj, node.type)
274
+ self._write_expr_type(node.type)
280
275
  if node.standalone:
281
276
  self.file_obj.write(type_keys.ExprVar.UUID)
282
277
  self.file_obj.write(
@@ -304,9 +299,19 @@ class _ExprWriter(expr.ExprVisitor[None]):
304
299
  else:
305
300
  raise exceptions.QpyError(f"unhandled Var object '{node.var}'")
306
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
+
307
312
  def visit_value(self, node, /):
308
313
  self.file_obj.write(type_keys.Expression.VALUE)
309
- _write_expr_type(self.file_obj, node.type)
314
+ self._write_expr_type(node.type)
310
315
  if node.value is True or node.value is False:
311
316
  self.file_obj.write(type_keys.ExprValue.BOOL)
312
317
  self.file_obj.write(
@@ -327,12 +332,20 @@ class _ExprWriter(expr.ExprVisitor[None]):
327
332
  struct.pack(formats.EXPR_VALUE_INT_PACK, *formats.EXPR_VALUE_INT(num_bytes))
328
333
  )
329
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)
330
343
  else:
331
344
  raise exceptions.QpyError(f"unhandled Value object '{node.value}'")
332
345
 
333
346
  def visit_cast(self, node, /):
334
347
  self.file_obj.write(type_keys.Expression.CAST)
335
- _write_expr_type(self.file_obj, node.type)
348
+ self._write_expr_type(node.type)
336
349
  self.file_obj.write(
337
350
  struct.pack(formats.EXPRESSION_CAST_PACK, *formats.EXPRESSION_CAST(node.implicit))
338
351
  )
@@ -340,7 +353,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
340
353
 
341
354
  def visit_unary(self, node, /):
342
355
  self.file_obj.write(type_keys.Expression.UNARY)
343
- _write_expr_type(self.file_obj, node.type)
356
+ self._write_expr_type(node.type)
344
357
  self.file_obj.write(
345
358
  struct.pack(formats.EXPRESSION_UNARY_PACK, *formats.EXPRESSION_UNARY(node.op.value))
346
359
  )
@@ -348,7 +361,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
348
361
 
349
362
  def visit_binary(self, node, /):
350
363
  self.file_obj.write(type_keys.Expression.BINARY)
351
- _write_expr_type(self.file_obj, node.type)
364
+ self._write_expr_type(node.type)
352
365
  self.file_obj.write(
353
366
  struct.pack(formats.EXPRESSION_BINARY_PACK, *formats.EXPRESSION_BINARY(node.op.value))
354
367
  )
@@ -361,7 +374,7 @@ class _ExprWriter(expr.ExprVisitor[None]):
361
374
  "the 'Index' expression", required=12, target=self.version
362
375
  )
363
376
  self.file_obj.write(type_keys.Expression.INDEX)
364
- _write_expr_type(self.file_obj, node.type)
377
+ self._write_expr_type(node.type)
365
378
  node.target.accept(self)
366
379
  node.index.accept(self)
367
380
 
@@ -376,7 +389,7 @@ def _write_expr(
376
389
  node.accept(_ExprWriter(file_obj, clbit_indices, standalone_var_indices, version))
377
390
 
378
391
 
379
- def _write_expr_type(file_obj, type_: types.Type):
392
+ def _write_expr_type(file_obj, type_: types.Type, version: int):
380
393
  if type_.kind is types.Bool:
381
394
  file_obj.write(type_keys.ExprType.BOOL)
382
395
  elif type_.kind is types.Uint:
@@ -384,10 +397,51 @@ def _write_expr_type(file_obj, type_: types.Type):
384
397
  file_obj.write(
385
398
  struct.pack(formats.EXPR_TYPE_UINT_PACK, *formats.EXPR_TYPE_UINT(type_.width))
386
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)
387
412
  else:
388
413
  raise exceptions.QpyError(f"unhandled Type object '{type_};")
389
414
 
390
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
+
391
445
  def _read_parameter(file_obj):
392
446
  data = formats.PARAMETER(
393
447
  *struct.unpack(formats.PARAMETER_PACK, file_obj.read(formats.PARAMETER_SIZE))
@@ -676,6 +730,13 @@ def _read_expr(
676
730
  name = file_obj.read(payload.reg_name_size).decode(common.ENCODE)
677
731
  return expr.Var(cregs[name], type_)
678
732
  raise exceptions.QpyError("Invalid classical-expression Var key '{var_type_key}'")
733
+ if type_key == type_keys.Expression.STRETCH:
734
+ payload = formats.EXPRESSION_STRETCH._make(
735
+ struct.unpack(
736
+ formats.EXPRESSION_STRETCH_PACK, file_obj.read(formats.EXPRESSION_STRETCH_SIZE)
737
+ )
738
+ )
739
+ return standalone_vars[payload.var_index]
679
740
  if type_key == type_keys.Expression.VALUE:
680
741
  value_type_key = file_obj.read(formats.EXPR_VALUE_DISCRIMINATOR_SIZE)
681
742
  if value_type_key == type_keys.ExprValue.BOOL:
@@ -694,6 +755,16 @@ def _read_expr(
694
755
  return expr.Value(
695
756
  int.from_bytes(file_obj.read(payload.num_bytes), "big", signed=True), type_
696
757
  )
758
+ if value_type_key == type_keys.ExprValue.FLOAT:
759
+ payload = formats.EXPR_VALUE_FLOAT._make(
760
+ struct.unpack(
761
+ formats.EXPR_VALUE_FLOAT_PACK, file_obj.read(formats.EXPR_VALUE_FLOAT_SIZE)
762
+ )
763
+ )
764
+ return expr.Value(payload.value, type_)
765
+ if value_type_key == type_keys.ExprValue.DURATION:
766
+ value = _read_duration(file_obj)
767
+ return expr.Value(value, type_)
697
768
  raise exceptions.QpyError("Invalid classical-expression Value key '{value_type_key}'")
698
769
  if type_key == type_keys.Expression.CAST:
699
770
  payload = formats.EXPRESSION_CAST._make(
@@ -743,9 +814,43 @@ def _read_expr_type(file_obj) -> types.Type:
743
814
  struct.unpack(formats.EXPR_TYPE_UINT_PACK, file_obj.read(formats.EXPR_TYPE_UINT_SIZE))
744
815
  )
745
816
  return types.Uint(elem.width)
817
+ if type_key == type_keys.ExprType.FLOAT:
818
+ return types.Float()
819
+ if type_key == type_keys.ExprType.DURATION:
820
+ return types.Duration()
746
821
  raise exceptions.QpyError(f"Invalid classical-expression Type key '{type_key}'")
747
822
 
748
823
 
824
+ def _read_duration(file_obj) -> Duration:
825
+ type_key = file_obj.read(formats.DURATION_DISCRIMINATOR_SIZE)
826
+ if type_key == type_keys.CircuitDuration.DT:
827
+ elem = formats.DURATION_DT._make(
828
+ struct.unpack(formats.DURATION_DT_PACK, file_obj.read(formats.DURATION_DT_SIZE))
829
+ )
830
+ return Duration.dt(elem.value)
831
+ if type_key == type_keys.CircuitDuration.NS:
832
+ elem = formats.DURATION_NS._make(
833
+ struct.unpack(formats.DURATION_NS_PACK, file_obj.read(formats.DURATION_NS_SIZE))
834
+ )
835
+ return Duration.ns(elem.value)
836
+ if type_key == type_keys.CircuitDuration.US:
837
+ elem = formats.DURATION_US._make(
838
+ struct.unpack(formats.DURATION_US_PACK, file_obj.read(formats.DURATION_US_SIZE))
839
+ )
840
+ return Duration.us(elem.value)
841
+ if type_key == type_keys.CircuitDuration.MS:
842
+ elem = formats.DURATION_MS._make(
843
+ struct.unpack(formats.DURATION_MS_PACK, file_obj.read(formats.DURATION_MS_SIZE))
844
+ )
845
+ return Duration.ms(elem.value)
846
+ if type_key == type_keys.CircuitDuration.S:
847
+ elem = formats.DURATION_S._make(
848
+ struct.unpack(formats.DURATION_S_PACK, file_obj.read(formats.DURATION_S_SIZE))
849
+ )
850
+ return Duration.s(elem.value)
851
+ raise exceptions.QpyError(f"Invalid duration Type key '{type_key}'")
852
+
853
+
749
854
  def read_standalone_vars(file_obj, num_vars):
750
855
  """Read the ``num_vars`` standalone variable declarations from the file.
751
856
 
@@ -762,6 +867,8 @@ def read_standalone_vars(file_obj, num_vars):
762
867
  type_keys.ExprVarDeclaration.INPUT: [],
763
868
  type_keys.ExprVarDeclaration.CAPTURE: [],
764
869
  type_keys.ExprVarDeclaration.LOCAL: [],
870
+ type_keys.ExprVarDeclaration.STRETCH_CAPTURE: [],
871
+ type_keys.ExprVarDeclaration.STRETCH_LOCAL: [],
765
872
  }
766
873
  var_order = []
767
874
  for _ in range(num_vars):
@@ -773,13 +880,19 @@ def read_standalone_vars(file_obj, num_vars):
773
880
  )
774
881
  type_ = _read_expr_type(file_obj)
775
882
  name = file_obj.read(data.name_size).decode(common.ENCODE)
776
- var = expr.Var(uuid.UUID(bytes=data.uuid_bytes), type_, name=name)
883
+ if data.usage in {
884
+ type_keys.ExprVarDeclaration.STRETCH_CAPTURE,
885
+ type_keys.ExprVarDeclaration.STRETCH_LOCAL,
886
+ }:
887
+ var = expr.Stretch(uuid.UUID(bytes=data.uuid_bytes), name)
888
+ else:
889
+ var = expr.Var(uuid.UUID(bytes=data.uuid_bytes), type_, name=name)
777
890
  read_vars[data.usage].append(var)
778
891
  var_order.append(var)
779
892
  return read_vars, var_order
780
893
 
781
894
 
782
- def _write_standalone_var(file_obj, var, type_key):
895
+ def _write_standalone_var(file_obj, var, type_key, version):
783
896
  name = var.name.encode(common.ENCODE)
784
897
  file_obj.write(
785
898
  struct.pack(
@@ -787,33 +900,46 @@ def _write_standalone_var(file_obj, var, type_key):
787
900
  *formats.EXPR_VAR_DECLARATION(var.var.bytes, type_key, len(name)),
788
901
  )
789
902
  )
790
- _write_expr_type(file_obj, var.type)
903
+ _write_expr_type(file_obj, var.type, version)
791
904
  file_obj.write(name)
792
905
 
793
906
 
794
- def write_standalone_vars(file_obj, circuit):
907
+ def write_standalone_vars(file_obj, circuit, version):
795
908
  """Write the standalone variables out from a circuit.
796
909
 
797
910
  Args:
798
911
  file_obj (File): the file-like object to write to.
799
912
  circuit (QuantumCircuit): the circuit to take the variables from.
913
+ version (int): the QPY target version.
800
914
 
801
915
  Returns:
802
- dict[expr.Var, int]: a mapping of the variables written to the index that they were written
803
- at.
916
+ dict[expr.Var | expr.Stretch, int]: a mapping of the variables written to the
917
+ index that they were written at.
804
918
  """
805
919
  index = 0
806
920
  out = {}
807
921
  for var in circuit.iter_input_vars():
808
- _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT)
922
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.INPUT, version)
809
923
  out[var] = index
810
924
  index += 1
811
925
  for var in circuit.iter_captured_vars():
812
- _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE)
926
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.CAPTURE, version)
813
927
  out[var] = index
814
928
  index += 1
815
929
  for var in circuit.iter_declared_vars():
816
- _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.LOCAL)
930
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.LOCAL, version)
931
+ out[var] = index
932
+ index += 1
933
+ if version < 14 and circuit.num_stretches:
934
+ raise exceptions.UnsupportedFeatureForVersion(
935
+ "circuits containing stretch variables", required=14, target=version
936
+ )
937
+ for var in circuit.iter_captured_stretches():
938
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.STRETCH_CAPTURE, version)
939
+ out[var] = index
940
+ index += 1
941
+ for var in circuit.iter_declared_stretches():
942
+ _write_standalone_var(file_obj, var, type_keys.ExprVarDeclaration.STRETCH_LOCAL, version)
817
943
  out[var] = index
818
944
  index += 1
819
945
  return out
qiskit/qpy/common.py CHANGED
@@ -18,15 +18,12 @@ Common functions across several serialization and deserialization modules.
18
18
  import io
19
19
  import struct
20
20
 
21
- import symengine
22
- from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
23
- load_basic,
24
- )
21
+ from qiskit.utils.optionals import HAS_SYMENGINE
25
22
 
26
23
  from qiskit.qpy import formats, exceptions
27
24
 
28
- QPY_VERSION = 13
29
- QPY_COMPATIBILITY_VERSION = 10
25
+ QPY_VERSION = 14
26
+ QPY_COMPATIBILITY_VERSION = 13
30
27
  ENCODE = "utf8"
31
28
 
32
29
 
@@ -311,13 +308,19 @@ def mapping_from_binary(binary_data, deserializer, **kwargs):
311
308
  return mapping
312
309
 
313
310
 
314
- def load_symengine_payload(payload: bytes) -> symengine.Expr:
311
+ @HAS_SYMENGINE.require_in_call("QPY versions 10 through 12 with symengine parameter serialization")
312
+ def load_symengine_payload(payload: bytes):
315
313
  """Load a symengine expression from it's serialized cereal payload."""
316
314
  # This is a horrible hack to workaround the symengine version checking
317
315
  # it's deserialization does. There were no changes to the serialization
318
316
  # format between 0.11 and 0.13 but the deserializer checks that it can't
319
317
  # load across a major or minor version boundary. This works around it
320
318
  # by just lying about the generating version.
319
+ import symengine
320
+ from symengine.lib.symengine_wrapper import ( # pylint: disable = no-name-in-module
321
+ load_basic,
322
+ )
323
+
321
324
  symengine_version = symengine.__version__.split(".")
322
325
  major = payload[2]
323
326
  minor = payload[3]
qiskit/qpy/formats.py CHANGED
@@ -357,11 +357,23 @@ EXPRESSION_BINARY = namedtuple("EXPRESSION_BINARY", ["opcode"])
357
357
  EXPRESSION_BINARY_PACK = "!B"
358
358
  EXPRESSION_BINARY_SIZE = struct.calcsize(EXPRESSION_BINARY_PACK)
359
359
 
360
+ EXPRESSION_STRETCH = namedtuple("EXPRESSION_STRETCH", ["var_index"])
361
+ EXPRESSION_STRETCH_PACK = "!H"
362
+ EXPRESSION_STRETCH_SIZE = struct.calcsize(EXPRESSION_STRETCH_PACK)
363
+
360
364
 
361
365
  # EXPR_TYPE
362
366
 
363
367
  EXPR_TYPE_DISCRIMINATOR_SIZE = 1
364
368
 
369
+ EXPR_TYPE_DURATION = namedtuple("EXPR_TYPE_DURATION", [])
370
+ EXPR_TYPE_DURATION_PACK = "!"
371
+ EXPR_TYPE_DURATION_SIZE = struct.calcsize(EXPR_TYPE_DURATION_PACK)
372
+
373
+ EXPR_TYPE_FLOAT = namedtuple("EXPR_TYPE_FLOAT", [])
374
+ EXPR_TYPE_FLOAT_PACK = "!"
375
+ EXPR_TYPE_FLOAT_SIZE = struct.calcsize(EXPR_TYPE_FLOAT_PACK)
376
+
365
377
  EXPR_TYPE_BOOL = namedtuple("EXPR_TYPE_BOOL", [])
366
378
  EXPR_TYPE_BOOL_PACK = "!"
367
379
  EXPR_TYPE_BOOL_SIZE = struct.calcsize(EXPR_TYPE_BOOL_PACK)
@@ -392,6 +404,10 @@ EXPR_VAR_UUID_SIZE = struct.calcsize(EXPR_VAR_UUID_PACK)
392
404
 
393
405
  EXPR_VALUE_DISCRIMINATOR_SIZE = 1
394
406
 
407
+ EXPR_VALUE_FLOAT = namedtuple("EXPR_VALUE_FLOAT", ["value"])
408
+ EXPR_VALUE_FLOAT_PACK = "!d"
409
+ EXPR_VALUE_FLOAT_SIZE = struct.calcsize(EXPR_VALUE_FLOAT_PACK)
410
+
395
411
  EXPR_VALUE_BOOL = namedtuple("EXPR_VALUE_BOOL", ["value"])
396
412
  EXPR_VALUE_BOOL_PACK = "!?"
397
413
  EXPR_VALUE_BOOL_SIZE = struct.calcsize(EXPR_VALUE_BOOL_PACK)
@@ -399,3 +415,28 @@ EXPR_VALUE_BOOL_SIZE = struct.calcsize(EXPR_VALUE_BOOL_PACK)
399
415
  EXPR_VALUE_INT = namedtuple("EXPR_VALUE_INT", ["num_bytes"])
400
416
  EXPR_VALUE_INT_PACK = "!B"
401
417
  EXPR_VALUE_INT_SIZE = struct.calcsize(EXPR_VALUE_INT_PACK)
418
+
419
+
420
+ # DURATION
421
+
422
+ DURATION_DISCRIMINATOR_SIZE = 1
423
+
424
+ DURATION_DT = namedtuple("DURATION_DT", ["value"])
425
+ DURATION_DT_PACK = "!Q"
426
+ DURATION_DT_SIZE = struct.calcsize(DURATION_DT_PACK)
427
+
428
+ DURATION_NS = namedtuple("DURATION_NS", ["value"])
429
+ DURATION_NS_PACK = "!d"
430
+ DURATION_NS_SIZE = struct.calcsize(DURATION_NS_PACK)
431
+
432
+ DURATION_US = namedtuple("DURATION_US", ["value"])
433
+ DURATION_US_PACK = "!d"
434
+ DURATION_US_SIZE = struct.calcsize(DURATION_US_PACK)
435
+
436
+ DURATION_MS = namedtuple("DURATION_MS", ["value"])
437
+ DURATION_MS_PACK = "!d"
438
+ DURATION_MS_SIZE = struct.calcsize(DURATION_MS_PACK)
439
+
440
+ DURATION_S = namedtuple("DURATION_S", ["value"])
441
+ DURATION_S_PACK = "!d"
442
+ DURATION_S_SIZE = struct.calcsize(DURATION_S_PACK)
qiskit/qpy/interface.py CHANGED
@@ -22,16 +22,14 @@ import warnings
22
22
  import re
23
23
 
24
24
  from qiskit.circuit import QuantumCircuit
25
- from qiskit.pulse import ScheduleBlock
26
25
  from qiskit.exceptions import QiskitError
27
26
  from qiskit.qpy import formats, common, binary_io, type_keys
28
- from qiskit.qpy.exceptions import QPYLoadingDeprecatedFeatureWarning, QpyError
27
+ from qiskit.qpy.exceptions import QpyError
29
28
  from qiskit.version import __version__
30
- from qiskit.utils.deprecate_pulse import deprecate_pulse_arg
31
29
 
32
30
 
33
31
  # pylint: disable=invalid-name
34
- QPY_SUPPORTED_TYPES = Union[QuantumCircuit, ScheduleBlock]
32
+ QPY_SUPPORTED_TYPES = QuantumCircuit
35
33
 
36
34
  # This version pattern is taken from the pypa packaging project:
37
35
  # https://github.com/pypa/packaging/blob/21.3/packaging/version.py#L223-L254
@@ -74,16 +72,11 @@ VERSION_PATTERN = (
74
72
  VERSION_PATTERN_REGEX = re.compile(VERSION_PATTERN, re.VERBOSE | re.IGNORECASE)
75
73
 
76
74
 
77
- @deprecate_pulse_arg(
78
- "programs",
79
- deprecation_description="Passing `ScheduleBlock` to `programs`",
80
- predicate=lambda p: isinstance(p, ScheduleBlock),
81
- )
82
75
  def dump(
83
76
  programs: Union[List[QPY_SUPPORTED_TYPES], QPY_SUPPORTED_TYPES],
84
77
  file_obj: BinaryIO,
85
78
  metadata_serializer: Optional[Type[JSONEncoder]] = None,
86
- use_symengine: bool = True,
79
+ use_symengine: bool = False,
87
80
  version: int = common.QPY_VERSION,
88
81
  ):
89
82
  """Write QPY binary data to a file
@@ -94,7 +87,10 @@ def dump(
94
87
 
95
88
  For example:
96
89
 
97
- .. code-block:: python
90
+ .. plot::
91
+ :include-source:
92
+ :nofigs:
93
+ :context: reset
98
94
 
99
95
  from qiskit.circuit import QuantumCircuit
100
96
  from qiskit import qpy
@@ -124,18 +120,14 @@ def dump(
124
120
 
125
121
  Args:
126
122
  programs: QPY supported object(s) to store in the specified file like object.
127
- QPY supports :class:`.QuantumCircuit` and :class:`.ScheduleBlock`.
128
- Different data types must be separately serialized.
129
- Support for :class:`.ScheduleBlock` is deprecated since Qiskit 1.3.0.
123
+ QPY supports :class:`.QuantumCircuit`.
130
124
  file_obj: The file like object to write the QPY data too
131
125
  metadata_serializer: An optional JSONEncoder class that
132
126
  will be passed the ``.metadata`` attribute for each program in ``programs`` and will be
133
127
  used as the ``cls`` kwarg on the `json.dump()`` call to JSON serialize that dictionary.
134
- use_symengine: If True, all objects containing symbolic expressions will be serialized
135
- using symengine's native mechanism. This is a faster serialization alternative,
136
- but not supported in all platforms. This flag only has an effect if the emitted QPY format
137
- version is 10, 11, or 12. For QPY format version >= 13 (which is the default starting in
138
- Qiskit 1.3.0) this flag is no longer used.
128
+ use_symengine: This flag is no longer used by QPY versions supported by this function and
129
+ will have no impact on the generated QPY payload except to set a field in a QPY v13 file
130
+ header which is unused.
139
131
  version: The QPY format version to emit. By default this defaults to
140
132
  the latest supported format of :attr:`~.qpy.QPY_VERSION`, however for
141
133
  compatibility reasons if you need to load the generated QPY payload with an older
@@ -153,7 +145,7 @@ def dump(
153
145
 
154
146
  .. note::
155
147
 
156
- If serializing a :class:`.QuantumCircuit` or :class:`.ScheduleBlock` that contain
148
+ If serializing a :class:`.QuantumCircuit` that contains
157
149
  :class:`.ParameterExpression` objects with ``version`` set low with the intent to
158
150
  load the payload using a historical release of Qiskit, it is safest to set the
159
151
  ``use_symengine`` flag to ``False``. Versions of Qiskit prior to 1.2.4 cannot load
@@ -163,32 +155,19 @@ def dump(
163
155
 
164
156
 
165
157
  Raises:
166
- QpyError: When multiple data format is mixed in the output.
167
158
  TypeError: When invalid data type is input.
168
- ValueError: When an unsupported version number is passed in for the ``version`` argument
159
+ ValueError: When an unsupported version number is passed in for the ``version`` argument.
169
160
  """
170
161
  if not isinstance(programs, Iterable):
171
162
  programs = [programs]
172
163
 
173
- program_types = set()
164
+ # dump accepts only QuantumCircuit typed objects
174
165
  for program in programs:
175
- program_types.add(type(program))
166
+ if not issubclass(type(program), QuantumCircuit):
167
+ raise TypeError(f"'{type(program)}' is not a supported data type.")
176
168
 
177
- if len(program_types) > 1:
178
- raise QpyError(
179
- "Input programs contain multiple data types. "
180
- "Different data type must be serialized separately."
181
- )
182
- program_type = next(iter(program_types))
183
-
184
- if issubclass(program_type, QuantumCircuit):
185
- type_key = type_keys.Program.CIRCUIT
186
- writer = binary_io.write_circuit
187
- elif program_type is ScheduleBlock:
188
- type_key = type_keys.Program.SCHEDULE_BLOCK
189
- writer = binary_io.write_schedule_block
190
- else:
191
- raise TypeError(f"'{program_type}' is not supported data type.")
169
+ type_key = type_keys.Program.CIRCUIT
170
+ writer = binary_io.write_circuit
192
171
 
193
172
  if version is None:
194
173
  version = common.QPY_VERSION
@@ -215,10 +194,7 @@ def dump(
215
194
  file_obj.write(header)
216
195
  common.write_type_key(file_obj, type_key)
217
196
 
218
- pulse_gates = False
219
197
  for program in programs:
220
- if type_key == type_keys.Program.CIRCUIT and program._calibrations_prop:
221
- pulse_gates = True
222
198
  writer(
223
199
  file_obj,
224
200
  program,
@@ -227,13 +203,6 @@ def dump(
227
203
  version=version,
228
204
  )
229
205
 
230
- if pulse_gates:
231
- warnings.warn(
232
- category=DeprecationWarning,
233
- message="Pulse gates serialization is deprecated as of Qiskit 1.3. "
234
- "It will be removed in Qiskit 2.0.",
235
- )
236
-
237
206
 
238
207
  def load(
239
208
  file_obj: BinaryIO,
@@ -242,8 +211,7 @@ def load(
242
211
  """Load a QPY binary file
243
212
 
244
213
  This function is used to load a serialized QPY Qiskit program file and create
245
- :class:`~qiskit.circuit.QuantumCircuit` objects or
246
- :class:`~qiskit.pulse.schedule.ScheduleBlock` objects from its contents.
214
+ :class:`~qiskit.circuit.QuantumCircuit` objects from its contents.
247
215
  For example:
248
216
 
249
217
  .. code-block:: python
@@ -264,12 +232,11 @@ def load(
264
232
  circuits = qpy.load(fd)
265
233
 
266
234
  which will read the contents of the qpy and return a list of
267
- :class:`~qiskit.circuit.QuantumCircuit` objects or
268
- :class:`~qiskit.pulse.schedule.ScheduleBlock` objects from the file.
235
+ :class:`~qiskit.circuit.QuantumCircuit` objects from the file.
269
236
 
270
237
  Args:
271
238
  file_obj: A file like object that contains the QPY binary
272
- data for a circuit or pulse schedule.
239
+ data for a circuit.
273
240
  metadata_deserializer: An optional JSONDecoder class
274
241
  that will be used for the ``cls`` kwarg on the internal
275
242
  ``json.load`` call used to deserialize the JSON payload used for
@@ -285,6 +252,11 @@ def load(
285
252
  Raises:
286
253
  QiskitError: if ``file_obj`` is not a valid QPY file
287
254
  TypeError: When invalid data type is loaded.
255
+ MissingOptionalLibraryError: If the ``symengine`` engine library is
256
+ not installed when loading a QPY version 10, 11, or 12 payload
257
+ that is using symengine symbolic encoding and contains
258
+ :class:`.ParameterExpression` instances.
259
+ QpyError: if known but unsupported data type is loaded.
288
260
  """
289
261
 
290
262
  # identify file header version
@@ -347,15 +319,10 @@ def load(
347
319
  if type_key == type_keys.Program.CIRCUIT:
348
320
  loader = binary_io.read_circuit
349
321
  elif type_key == type_keys.Program.SCHEDULE_BLOCK:
350
- loader = binary_io.read_schedule_block
351
- warnings.warn(
352
- category=QPYLoadingDeprecatedFeatureWarning,
353
- message="Pulse gates deserialization is deprecated as of Qiskit 1.3 and "
354
- "will be removed in Qiskit 2.0. This is part of the deprecation plan for "
355
- "the entire Qiskit Pulse package. Once Pulse is removed, `ScheduleBlock` "
356
- "sections will be ignored when loading QPY files with pulse data.",
322
+ raise QpyError(
323
+ "Payloads of type `ScheduleBlock` cannot be loaded as of Qiskit 2.0. "
324
+ "Use an earlier version of Qiskit if you want to load `ScheduleBlock` payloads."
357
325
  )
358
-
359
326
  else:
360
327
  raise TypeError(f"Invalid payload format data kind '{type_key}'.")
361
328