qiskit 1.4.1__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 +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 +2 -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
@@ -10,11 +10,15 @@
10
10
  # copyright notice, and modified files need to carry a notice indicating
11
11
  # that they have been altered from the originals.
12
12
 
13
- """Read and write schedule and schedule instructions."""
13
+ """Read schedule and schedule instructions.
14
+
15
+ This module is kept post pulse-removal to allow reading legacy
16
+ payloads containing pulse gates without breaking the load flow.
17
+ The purpose of the `_read` and `_load` methods below is just to advance
18
+ the file handle while consuming pulse data."""
14
19
  import json
15
20
  import struct
16
21
  import zlib
17
- import warnings
18
22
 
19
23
  from io import BytesIO
20
24
 
@@ -22,25 +26,17 @@ import numpy as np
22
26
  import symengine as sym
23
27
 
24
28
  from qiskit.exceptions import QiskitError
25
- from qiskit.pulse import library, channels, instructions
26
- from qiskit.pulse.schedule import ScheduleBlock
27
29
  from qiskit.qpy import formats, common, type_keys
28
30
  from qiskit.qpy.binary_io import value
29
31
  from qiskit.qpy.exceptions import QpyError
30
- from qiskit.pulse.configuration import Kernel, Discriminator
31
- from qiskit.utils.deprecate_pulse import ignore_pulse_deprecation_warnings
32
-
33
-
34
- def _read_channel(file_obj, version):
35
- type_key = common.read_type_key(file_obj)
36
- index = value.read_value(file_obj, version, {})
37
32
 
38
- channel_cls = type_keys.ScheduleChannel.retrieve(type_key)
39
33
 
40
- return channel_cls(index)
34
+ def _read_channel(file_obj, version) -> None:
35
+ common.read_type_key(file_obj) # read type_key
36
+ value.read_value(file_obj, version, {}) # read index
41
37
 
42
38
 
43
- def _read_waveform(file_obj, version):
39
+ def _read_waveform(file_obj, version) -> None:
44
40
  header = formats.WAVEFORM._make(
45
41
  struct.unpack(
46
42
  formats.WAVEFORM_PACK,
@@ -48,15 +44,8 @@ def _read_waveform(file_obj, version):
48
44
  )
49
45
  )
50
46
  samples_raw = file_obj.read(header.data_size)
51
- samples = common.data_from_binary(samples_raw, np.load)
52
- name = value.read_value(file_obj, version, {})
53
-
54
- return library.Waveform(
55
- samples=samples,
56
- name=name,
57
- epsilon=header.epsilon,
58
- limit_amplitude=header.amp_limited,
59
- )
47
+ common.data_from_binary(samples_raw, np.load) # read samples
48
+ value.read_value(file_obj, version, {}) # read name
60
49
 
61
50
 
62
51
  def _loads_obj(type_key, binary_data, version, vectors):
@@ -77,26 +66,25 @@ def _loads_obj(type_key, binary_data, version, vectors):
77
66
  return value.loads_value(type_key, binary_data, version, vectors)
78
67
 
79
68
 
80
- def _read_kernel(file_obj, version):
81
- params = common.read_mapping(
69
+ def _read_kernel(file_obj, version) -> None:
70
+ common.read_mapping(
82
71
  file_obj=file_obj,
83
72
  deserializer=_loads_obj,
84
73
  version=version,
85
74
  vectors={},
86
75
  )
87
- name = value.read_value(file_obj, version, {})
88
- return Kernel(name=name, **params)
76
+ value.read_value(file_obj, version, {}) # read name
89
77
 
90
78
 
91
- def _read_discriminator(file_obj, version):
92
- params = common.read_mapping(
79
+ def _read_discriminator(file_obj, version) -> None:
80
+ # read params
81
+ common.read_mapping(
93
82
  file_obj=file_obj,
94
83
  deserializer=_loads_obj,
95
84
  version=version,
96
85
  vectors={},
97
86
  )
98
- name = value.read_value(file_obj, version, {})
99
- return Discriminator(name=name, **params)
87
+ value.read_value(file_obj, version, {}) # read name
100
88
 
101
89
 
102
90
  def _loads_symbolic_expr(expr_bytes, use_symengine=False):
@@ -113,7 +101,7 @@ def _loads_symbolic_expr(expr_bytes, use_symengine=False):
113
101
  return sym.sympify(expr)
114
102
 
115
103
 
116
- def _read_symbolic_pulse(file_obj, version):
104
+ def _read_symbolic_pulse(file_obj, version) -> None:
117
105
  make = formats.SYMBOLIC_PULSE._make
118
106
  pack = formats.SYMBOLIC_PULSE_PACK
119
107
  size = formats.SYMBOLIC_PULSE_SIZE
@@ -125,10 +113,13 @@ def _read_symbolic_pulse(file_obj, version):
125
113
  )
126
114
  )
127
115
  pulse_type = file_obj.read(header.type_size).decode(common.ENCODE)
128
- envelope = _loads_symbolic_expr(file_obj.read(header.envelope_size))
129
- constraints = _loads_symbolic_expr(file_obj.read(header.constraints_size))
130
- valid_amp_conditions = _loads_symbolic_expr(file_obj.read(header.valid_amp_conditions_size))
131
- parameters = common.read_mapping(
116
+ _loads_symbolic_expr(file_obj.read(header.envelope_size)) # read envelope
117
+ _loads_symbolic_expr(file_obj.read(header.constraints_size)) # read constraints
118
+ _loads_symbolic_expr(
119
+ file_obj.read(header.valid_amp_conditions_size)
120
+ ) # read valid amp conditions
121
+ # read parameters
122
+ common.read_mapping(
132
123
  file_obj,
133
124
  deserializer=value.loads_value,
134
125
  version=version,
@@ -146,50 +137,16 @@ def _read_symbolic_pulse(file_obj, version):
146
137
  class_name = "SymbolicPulse" # Default class name, if not in the library
147
138
 
148
139
  if pulse_type in legacy_library_pulses:
149
- parameters["angle"] = np.angle(parameters["amp"])
150
- parameters["amp"] = np.abs(parameters["amp"])
151
- _amp, _angle = sym.symbols("amp, angle")
152
- envelope = envelope.subs(_amp, _amp * sym.exp(sym.I * _angle))
153
-
154
- warnings.warn(
155
- f"Library pulses with complex amp are no longer supported. "
156
- f"{pulse_type} with complex amp was converted to (amp,angle) representation.",
157
- UserWarning,
158
- )
159
140
  class_name = "ScalableSymbolicPulse"
160
141
 
161
- duration = value.read_value(file_obj, version, {})
162
- name = value.read_value(file_obj, version, {})
163
-
164
- if class_name == "SymbolicPulse":
165
- return library.SymbolicPulse(
166
- pulse_type=pulse_type,
167
- duration=duration,
168
- parameters=parameters,
169
- name=name,
170
- limit_amplitude=header.amp_limited,
171
- envelope=envelope,
172
- constraints=constraints,
173
- valid_amp_conditions=valid_amp_conditions,
174
- )
175
- elif class_name == "ScalableSymbolicPulse":
176
- return library.ScalableSymbolicPulse(
177
- pulse_type=pulse_type,
178
- duration=duration,
179
- amp=parameters["amp"],
180
- angle=parameters["angle"],
181
- parameters=parameters,
182
- name=name,
183
- limit_amplitude=header.amp_limited,
184
- envelope=envelope,
185
- constraints=constraints,
186
- valid_amp_conditions=valid_amp_conditions,
187
- )
188
- else:
142
+ value.read_value(file_obj, version, {}) # read duration
143
+ value.read_value(file_obj, version, {}) # read name
144
+
145
+ if class_name not in {"SymbolicPulse", "ScalableSymbolicPulse"}:
189
146
  raise NotImplementedError(f"Unknown class '{class_name}'")
190
147
 
191
148
 
192
- def _read_symbolic_pulse_v6(file_obj, version, use_symengine):
149
+ def _read_symbolic_pulse_v6(file_obj, version, use_symengine) -> None:
193
150
  make = formats.SYMBOLIC_PULSE_V2._make
194
151
  pack = formats.SYMBOLIC_PULSE_PACK_V2
195
152
  size = formats.SYMBOLIC_PULSE_SIZE_V2
@@ -201,79 +158,36 @@ def _read_symbolic_pulse_v6(file_obj, version, use_symengine):
201
158
  )
202
159
  )
203
160
  class_name = file_obj.read(header.class_name_size).decode(common.ENCODE)
204
- pulse_type = file_obj.read(header.type_size).decode(common.ENCODE)
205
- envelope = _loads_symbolic_expr(file_obj.read(header.envelope_size), use_symengine)
206
- constraints = _loads_symbolic_expr(file_obj.read(header.constraints_size), use_symengine)
207
- valid_amp_conditions = _loads_symbolic_expr(
161
+ file_obj.read(header.type_size).decode(common.ENCODE) # read pulse type
162
+ _loads_symbolic_expr(file_obj.read(header.envelope_size), use_symengine) # read envelope
163
+ _loads_symbolic_expr(file_obj.read(header.constraints_size), use_symengine) # read constraints
164
+ _loads_symbolic_expr(
208
165
  file_obj.read(header.valid_amp_conditions_size), use_symengine
209
- )
210
- parameters = common.read_mapping(
166
+ ) # read valid_amp_conditions
167
+ # read parameters
168
+ common.read_mapping(
211
169
  file_obj,
212
170
  deserializer=value.loads_value,
213
171
  version=version,
214
172
  vectors={},
215
173
  )
216
174
 
217
- duration = value.read_value(file_obj, version, {})
218
- name = value.read_value(file_obj, version, {})
219
-
220
- if class_name == "SymbolicPulse":
221
- return library.SymbolicPulse(
222
- pulse_type=pulse_type,
223
- duration=duration,
224
- parameters=parameters,
225
- name=name,
226
- limit_amplitude=header.amp_limited,
227
- envelope=envelope,
228
- constraints=constraints,
229
- valid_amp_conditions=valid_amp_conditions,
230
- )
231
- elif class_name == "ScalableSymbolicPulse":
232
- # Between Qiskit 0.40 and 0.46, the (amp, angle) representation was present,
233
- # but complex amp was still allowed. In Qiskit 1.0 and beyond complex amp
234
- # is no longer supported and so the amp needs to be checked and converted.
235
- # Once QPY version is bumped, a new reader function can be introduced without
236
- # this check.
237
- if isinstance(parameters["amp"], complex):
238
- parameters["angle"] = np.angle(parameters["amp"])
239
- parameters["amp"] = np.abs(parameters["amp"])
240
- warnings.warn(
241
- f"ScalableSymbolicPulse with complex amp are no longer supported. "
242
- f"{pulse_type} with complex amp was converted to (amp,angle) representation.",
243
- UserWarning,
244
- )
175
+ value.read_value(file_obj, version, {}) # read duration
176
+ value.read_value(file_obj, version, {}) # read name
245
177
 
246
- return library.ScalableSymbolicPulse(
247
- pulse_type=pulse_type,
248
- duration=duration,
249
- amp=parameters["amp"],
250
- angle=parameters["angle"],
251
- parameters=parameters,
252
- name=name,
253
- limit_amplitude=header.amp_limited,
254
- envelope=envelope,
255
- constraints=constraints,
256
- valid_amp_conditions=valid_amp_conditions,
257
- )
258
- else:
178
+ if class_name not in {"SymbolicPulse", "ScalableSymbolicPulse"}:
259
179
  raise NotImplementedError(f"Unknown class '{class_name}'")
260
180
 
261
181
 
262
- def _read_alignment_context(file_obj, version):
263
- type_key = common.read_type_key(file_obj)
182
+ def _read_alignment_context(file_obj, version) -> None:
183
+ common.read_type_key(file_obj)
264
184
 
265
- context_params = common.read_sequence(
185
+ common.read_sequence(
266
186
  file_obj,
267
187
  deserializer=value.loads_value,
268
188
  version=version,
269
189
  vectors={},
270
190
  )
271
- context_cls = type_keys.ScheduleAlignment.retrieve(type_key)
272
-
273
- instance = object.__new__(context_cls)
274
- instance._context_params = tuple(context_params)
275
-
276
- return instance
277
191
 
278
192
 
279
193
  # pylint: disable=too-many-return-statements
@@ -307,26 +221,23 @@ def _loads_operand(type_key, data_bytes, version, use_symengine):
307
221
  return value.loads_value(type_key, data_bytes, version, {})
308
222
 
309
223
 
310
- def _read_element(file_obj, version, metadata_deserializer, use_symengine):
224
+ def _read_element(file_obj, version, metadata_deserializer, use_symengine) -> None:
311
225
  type_key = common.read_type_key(file_obj)
312
226
 
313
227
  if type_key == type_keys.Program.SCHEDULE_BLOCK:
314
228
  return read_schedule_block(file_obj, version, metadata_deserializer, use_symengine)
315
229
 
316
- operands = common.read_sequence(
230
+ # read operands
231
+ common.read_sequence(
317
232
  file_obj, deserializer=_loads_operand, version=version, use_symengine=use_symengine
318
233
  )
319
- name = value.read_value(file_obj, version, {})
234
+ # read name
235
+ value.read_value(file_obj, version, {})
320
236
 
321
- instance = object.__new__(type_keys.ScheduleInstruction.retrieve(type_key))
322
- instance._operands = tuple(operands)
323
- instance._name = name
324
- instance._hash = None
237
+ return None
325
238
 
326
- return instance
327
239
 
328
-
329
- def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version):
240
+ def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version) -> None:
330
241
  if type_key == type_keys.Value.NULL:
331
242
  return None
332
243
  if type_key == type_keys.Program.SCHEDULE_BLOCK:
@@ -344,176 +255,8 @@ def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version):
344
255
  )
345
256
 
346
257
 
347
- def _write_channel(file_obj, data, version):
348
- type_key = type_keys.ScheduleChannel.assign(data)
349
- common.write_type_key(file_obj, type_key)
350
- value.write_value(file_obj, data.index, version=version)
351
-
352
-
353
- def _write_waveform(file_obj, data, version):
354
- samples_bytes = common.data_to_binary(data.samples, np.save)
355
-
356
- header = struct.pack(
357
- formats.WAVEFORM_PACK,
358
- data.epsilon,
359
- len(samples_bytes),
360
- data._limit_amplitude,
361
- )
362
- file_obj.write(header)
363
- file_obj.write(samples_bytes)
364
- value.write_value(file_obj, data.name, version=version)
365
-
366
-
367
- def _dumps_obj(obj, version):
368
- """Wraps `value.dumps_value` to serialize dictionary and list objects
369
- which are not supported by `value.dumps_value`.
370
- """
371
- if isinstance(obj, dict):
372
- with BytesIO() as container:
373
- common.write_mapping(
374
- file_obj=container, mapping=obj, serializer=_dumps_obj, version=version
375
- )
376
- binary_data = container.getvalue()
377
- return b"D", binary_data
378
- elif isinstance(obj, list):
379
- with BytesIO() as container:
380
- common.write_sequence(
381
- file_obj=container, sequence=obj, serializer=_dumps_obj, version=version
382
- )
383
- binary_data = container.getvalue()
384
- return b"l", binary_data
385
- else:
386
- return value.dumps_value(obj, version=version)
387
-
388
-
389
- def _write_kernel(file_obj, data, version):
390
- name = data.name
391
- params = data.params
392
- common.write_mapping(file_obj=file_obj, mapping=params, serializer=_dumps_obj, version=version)
393
- value.write_value(file_obj, name, version=version)
394
-
395
-
396
- def _write_discriminator(file_obj, data, version):
397
- name = data.name
398
- params = data.params
399
- common.write_mapping(file_obj=file_obj, mapping=params, serializer=_dumps_obj, version=version)
400
- value.write_value(file_obj, name, version=version)
401
-
402
-
403
- def _dumps_symbolic_expr(expr, use_symengine):
404
- if expr is None:
405
- return b""
406
- if use_symengine:
407
- expr_bytes = expr.__reduce__()[1][0]
408
- else:
409
- from sympy import srepr, sympify
410
-
411
- expr_bytes = srepr(sympify(expr)).encode(common.ENCODE)
412
- return zlib.compress(expr_bytes)
413
-
414
-
415
- def _write_symbolic_pulse(file_obj, data, use_symengine, version):
416
- class_name_bytes = data.__class__.__name__.encode(common.ENCODE)
417
- pulse_type_bytes = data.pulse_type.encode(common.ENCODE)
418
- envelope_bytes = _dumps_symbolic_expr(data.envelope, use_symengine)
419
- constraints_bytes = _dumps_symbolic_expr(data.constraints, use_symengine)
420
- valid_amp_conditions_bytes = _dumps_symbolic_expr(data.valid_amp_conditions, use_symengine)
421
-
422
- header_bytes = struct.pack(
423
- formats.SYMBOLIC_PULSE_PACK_V2,
424
- len(class_name_bytes),
425
- len(pulse_type_bytes),
426
- len(envelope_bytes),
427
- len(constraints_bytes),
428
- len(valid_amp_conditions_bytes),
429
- data._limit_amplitude,
430
- )
431
- file_obj.write(header_bytes)
432
- file_obj.write(class_name_bytes)
433
- file_obj.write(pulse_type_bytes)
434
- file_obj.write(envelope_bytes)
435
- file_obj.write(constraints_bytes)
436
- file_obj.write(valid_amp_conditions_bytes)
437
- common.write_mapping(
438
- file_obj,
439
- mapping=data._params,
440
- serializer=value.dumps_value,
441
- version=version,
442
- )
443
- value.write_value(file_obj, data.duration, version=version)
444
- value.write_value(file_obj, data.name, version=version)
445
-
446
-
447
- def _write_alignment_context(file_obj, context, version):
448
- type_key = type_keys.ScheduleAlignment.assign(context)
449
- common.write_type_key(file_obj, type_key)
450
- common.write_sequence(
451
- file_obj, sequence=context._context_params, serializer=value.dumps_value, version=version
452
- )
453
-
454
-
455
- def _dumps_operand(operand, use_symengine, version):
456
- if isinstance(operand, library.Waveform):
457
- type_key = type_keys.ScheduleOperand.WAVEFORM
458
- data_bytes = common.data_to_binary(operand, _write_waveform, version=version)
459
- elif isinstance(operand, library.SymbolicPulse):
460
- type_key = type_keys.ScheduleOperand.SYMBOLIC_PULSE
461
- data_bytes = common.data_to_binary(
462
- operand, _write_symbolic_pulse, use_symengine=use_symengine, version=version
463
- )
464
- elif isinstance(operand, channels.Channel):
465
- type_key = type_keys.ScheduleOperand.CHANNEL
466
- data_bytes = common.data_to_binary(operand, _write_channel, version=version)
467
- elif isinstance(operand, str):
468
- type_key = type_keys.ScheduleOperand.OPERAND_STR
469
- data_bytes = operand.encode(common.ENCODE)
470
- elif isinstance(operand, Kernel):
471
- type_key = type_keys.ScheduleOperand.KERNEL
472
- data_bytes = common.data_to_binary(operand, _write_kernel, version=version)
473
- elif isinstance(operand, Discriminator):
474
- type_key = type_keys.ScheduleOperand.DISCRIMINATOR
475
- data_bytes = common.data_to_binary(operand, _write_discriminator, version=version)
476
- else:
477
- type_key, data_bytes = value.dumps_value(operand, version=version)
478
-
479
- return type_key, data_bytes
480
-
481
-
482
- def _write_element(file_obj, element, metadata_serializer, use_symengine, version):
483
- if isinstance(element, ScheduleBlock):
484
- common.write_type_key(file_obj, type_keys.Program.SCHEDULE_BLOCK)
485
- write_schedule_block(file_obj, element, metadata_serializer, use_symengine, version=version)
486
- else:
487
- type_key = type_keys.ScheduleInstruction.assign(element)
488
- common.write_type_key(file_obj, type_key)
489
- common.write_sequence(
490
- file_obj,
491
- sequence=element.operands,
492
- serializer=_dumps_operand,
493
- use_symengine=use_symengine,
494
- version=version,
495
- )
496
- value.write_value(file_obj, element.name, version=version)
497
-
498
-
499
- def _dumps_reference_item(schedule, metadata_serializer, version):
500
- if schedule is None:
501
- type_key = type_keys.Value.NULL
502
- data_bytes = b""
503
- else:
504
- type_key = type_keys.Program.SCHEDULE_BLOCK
505
- data_bytes = common.data_to_binary(
506
- obj=schedule,
507
- serializer=write_schedule_block,
508
- metadata_serializer=metadata_serializer,
509
- version=version,
510
- )
511
- return type_key, data_bytes
512
-
513
-
514
- @ignore_pulse_deprecation_warnings
515
258
  def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symengine=False):
516
- """Read a single ScheduleBlock from the file like object.
259
+ """Consume a single ScheduleBlock from the file like object.
517
260
 
518
261
  Args:
519
262
  file_obj (File): A file like object that contains the QPY binary data.
@@ -530,7 +273,9 @@ def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symen
530
273
  platforms. Please check that your target platform is supported by the symengine library
531
274
  before setting this option, as it will be required by qpy to deserialize the payload.
532
275
  Returns:
533
- ScheduleBlock: The schedule block object from the file.
276
+ QuantumCircuit: Returns a dummy QuantumCircuit object, containing just name and metadata.
277
+ This function exists just to allow reading legacy payloads containing pulse information
278
+ without breaking the entire load flow.
534
279
 
535
280
  Raises:
536
281
  TypeError: If any of the instructions is invalid data format.
@@ -545,91 +290,19 @@ def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symen
545
290
  file_obj.read(formats.SCHEDULE_BLOCK_HEADER_SIZE),
546
291
  )
547
292
  )
548
- name = file_obj.read(data.name_size).decode(common.ENCODE)
293
+ file_obj.read(data.name_size).decode(common.ENCODE) # read name
549
294
  metadata_raw = file_obj.read(data.metadata_size)
550
- metadata = json.loads(metadata_raw, cls=metadata_deserializer)
551
- context = _read_alignment_context(file_obj, version)
295
+ json.loads(metadata_raw, cls=metadata_deserializer) # read metadata
296
+ _read_alignment_context(file_obj, version)
552
297
 
553
- block = ScheduleBlock(
554
- name=name,
555
- metadata=metadata,
556
- alignment_context=context,
557
- )
558
298
  for _ in range(data.num_elements):
559
- block_elm = _read_element(file_obj, version, metadata_deserializer, use_symengine)
560
- block.append(block_elm, inplace=True)
299
+ _read_element(file_obj, version, metadata_deserializer, use_symengine)
561
300
 
562
301
  # Load references
563
302
  if version >= 7:
564
- flat_key_refdict = common.read_mapping(
303
+ common.read_mapping(
565
304
  file_obj=file_obj,
566
305
  deserializer=_loads_reference_item,
567
306
  version=version,
568
307
  metadata_deserializer=metadata_deserializer,
569
308
  )
570
- ref_dict = {}
571
- for key_str, schedule in flat_key_refdict.items():
572
- if schedule is not None:
573
- composite_key = tuple(key_str.split(instructions.Reference.key_delimiter))
574
- ref_dict[composite_key] = schedule
575
- if ref_dict:
576
- block.assign_references(ref_dict, inplace=True)
577
-
578
- return block
579
-
580
-
581
- def write_schedule_block(
582
- file_obj, block, metadata_serializer=None, use_symengine=False, version=common.QPY_VERSION
583
- ):
584
- """Write a single ScheduleBlock object in the file like object.
585
-
586
- Args:
587
- file_obj (File): The file like object to write the circuit data in.
588
- block (ScheduleBlock): A schedule block data to write.
589
- metadata_serializer (JSONEncoder): An optional JSONEncoder class that
590
- will be passed the :attr:`.ScheduleBlock.metadata` dictionary for
591
- ``block`` and will be used as the ``cls`` kwarg
592
- on the ``json.dump()`` call to JSON serialize that dictionary.
593
- use_symengine (bool): If True, symbolic objects will be serialized using symengine's
594
- native mechanism. This is a faster serialization alternative, but not supported in all
595
- platforms. Please check that your target platform is supported by the symengine library
596
- before setting this option, as it will be required by qpy to deserialize the payload.
597
- version (int): The QPY format version to use for serializing this circuit block
598
- Raises:
599
- TypeError: If any of the instructions is invalid data format.
600
- """
601
- metadata = json.dumps(block.metadata, separators=(",", ":"), cls=metadata_serializer).encode(
602
- common.ENCODE
603
- )
604
- block_name = block.name.encode(common.ENCODE)
605
-
606
- # Write schedule block header
607
- header_raw = formats.SCHEDULE_BLOCK_HEADER(
608
- name_size=len(block_name),
609
- metadata_size=len(metadata),
610
- num_elements=len(block),
611
- )
612
- header = struct.pack(formats.SCHEDULE_BLOCK_HEADER_PACK, *header_raw)
613
- file_obj.write(header)
614
- file_obj.write(block_name)
615
- file_obj.write(metadata)
616
-
617
- _write_alignment_context(file_obj, block.alignment_context, version=version)
618
- for block_elm in block._blocks:
619
- # Do not call block.blocks. This implicitly assigns references to instruction.
620
- # This breaks original reference structure.
621
- _write_element(file_obj, block_elm, metadata_serializer, use_symengine, version=version)
622
-
623
- # Write references
624
- flat_key_refdict = {}
625
- for ref_keys, schedule in block._reference_manager.items():
626
- # Do not call block.reference. This returns the reference of most outer program by design.
627
- key_str = instructions.Reference.key_delimiter.join(ref_keys)
628
- flat_key_refdict[key_str] = schedule
629
- common.write_mapping(
630
- file_obj=file_obj,
631
- mapping=flat_key_refdict,
632
- serializer=_dumps_reference_item,
633
- metadata_serializer=metadata_serializer,
634
- version=version,
635
- )