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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +236 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +7 -1
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/compiler/__init__.py +1 -7
  104. qiskit/compiler/transpiler.py +38 -196
  105. qiskit/converters/circuit_to_dag.py +6 -4
  106. qiskit/converters/circuit_to_dagdependency.py +0 -2
  107. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  108. qiskit/converters/circuit_to_gate.py +1 -1
  109. qiskit/converters/circuit_to_instruction.py +16 -29
  110. qiskit/converters/dag_to_circuit.py +7 -8
  111. qiskit/converters/dag_to_dagdependency.py +0 -1
  112. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  113. qiskit/converters/dagdependency_to_circuit.py +0 -6
  114. qiskit/converters/dagdependency_to_dag.py +0 -6
  115. qiskit/dagcircuit/collect_blocks.py +32 -20
  116. qiskit/dagcircuit/dagdependency.py +3 -37
  117. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  118. qiskit/dagcircuit/dagnode.py +14 -2
  119. qiskit/passmanager/__init__.py +24 -6
  120. qiskit/passmanager/passmanager.py +26 -24
  121. qiskit/primitives/__init__.py +44 -35
  122. qiskit/primitives/backend_estimator_v2.py +102 -23
  123. qiskit/primitives/backend_sampler_v2.py +5 -20
  124. qiskit/primitives/base/__init__.py +4 -4
  125. qiskit/primitives/base/base_estimator.py +77 -82
  126. qiskit/primitives/base/base_primitive_job.py +2 -2
  127. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  128. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  129. qiskit/primitives/base/base_sampler.py +52 -60
  130. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  131. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  132. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  133. qiskit/primitives/containers/bindings_array.py +3 -1
  134. qiskit/primitives/containers/bit_array.py +23 -0
  135. qiskit/primitives/containers/data_bin.py +3 -1
  136. qiskit/primitives/containers/observables_array.py +19 -2
  137. qiskit/primitives/statevector_sampler.py +6 -8
  138. qiskit/primitives/utils.py +14 -189
  139. qiskit/providers/__init__.py +4 -130
  140. qiskit/providers/backend.py +11 -314
  141. qiskit/providers/basic_provider/__init__.py +3 -1
  142. qiskit/providers/basic_provider/basic_provider.py +29 -9
  143. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  144. qiskit/providers/exceptions.py +0 -33
  145. qiskit/providers/fake_provider/__init__.py +0 -37
  146. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  147. qiskit/qasm2/__init__.py +21 -6
  148. qiskit/qasm2/export.py +2 -10
  149. qiskit/qasm2/parse.py +11 -25
  150. qiskit/qasm3/__init__.py +5 -1
  151. qiskit/qasm3/ast.py +44 -0
  152. qiskit/qasm3/exporter.py +65 -27
  153. qiskit/qasm3/printer.py +35 -4
  154. qiskit/qpy/__init__.py +162 -19
  155. qiskit/qpy/binary_io/__init__.py +0 -1
  156. qiskit/qpy/binary_io/circuits.py +98 -130
  157. qiskit/qpy/binary_io/schedules.py +69 -439
  158. qiskit/qpy/binary_io/value.py +154 -31
  159. qiskit/qpy/common.py +10 -7
  160. qiskit/qpy/formats.py +41 -0
  161. qiskit/qpy/interface.py +34 -81
  162. qiskit/qpy/type_keys.py +58 -221
  163. qiskit/quantum_info/analysis/distance.py +3 -1
  164. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  165. qiskit/quantum_info/operators/operator.py +6 -2
  166. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  167. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  168. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  169. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  170. qiskit/quantum_info/states/densitymatrix.py +16 -6
  171. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  172. qiskit/quantum_info/states/statevector.py +16 -6
  173. qiskit/result/__init__.py +5 -17
  174. qiskit/result/models.py +18 -11
  175. qiskit/result/result.py +38 -134
  176. qiskit/result/sampled_expval.py +1 -2
  177. qiskit/result/utils.py +3 -4
  178. qiskit/synthesis/__init__.py +21 -1
  179. qiskit/synthesis/arithmetic/__init__.py +3 -1
  180. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  182. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  183. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  184. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  185. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  186. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  188. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  189. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  190. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  191. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  192. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +4 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +78 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/counts_visualization.py +4 -0
  287. qiskit/visualization/dag_visualization.py +2 -1
  288. qiskit/visualization/gate_map.py +39 -154
  289. qiskit/visualization/library.py +4 -1
  290. qiskit/visualization/pass_manager_visualization.py +6 -2
  291. qiskit/visualization/state_visualization.py +19 -2
  292. qiskit/visualization/timeline/core.py +19 -13
  293. qiskit/visualization/timeline/interface.py +19 -18
  294. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  295. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  296. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
  297. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  298. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  299. qiskit/assembler/__init__.py +0 -42
  300. qiskit/assembler/assemble_circuits.py +0 -451
  301. qiskit/assembler/assemble_schedules.py +0 -367
  302. qiskit/assembler/disassemble.py +0 -310
  303. qiskit/assembler/run_config.py +0 -77
  304. qiskit/circuit/bit.py +0 -106
  305. qiskit/circuit/classicalfunction/__init__.py +0 -152
  306. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  307. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  308. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  309. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  310. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  311. qiskit/circuit/classicalfunction/types.py +0 -18
  312. qiskit/circuit/classicalfunction/utils.py +0 -91
  313. qiskit/circuit/classicalregister.py +0 -57
  314. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  315. qiskit/circuit/quantumregister.py +0 -75
  316. qiskit/circuit/register.py +0 -246
  317. qiskit/compiler/assembler.py +0 -689
  318. qiskit/compiler/scheduler.py +0 -109
  319. qiskit/compiler/sequencer.py +0 -71
  320. qiskit/primitives/backend_estimator.py +0 -486
  321. qiskit/primitives/backend_sampler.py +0 -222
  322. qiskit/primitives/estimator.py +0 -172
  323. qiskit/primitives/sampler.py +0 -162
  324. qiskit/providers/backend_compat.py +0 -507
  325. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  340. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/fake_1q.py +0 -91
  349. qiskit/providers/fake_provider/fake_backend.py +0 -165
  350. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  351. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  352. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  353. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  354. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  355. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  356. qiskit/providers/models/__init__.py +0 -89
  357. qiskit/providers/models/backendconfiguration.py +0 -1040
  358. qiskit/providers/models/backendproperties.py +0 -535
  359. qiskit/providers/models/backendstatus.py +0 -104
  360. qiskit/providers/models/jobstatus.py +0 -77
  361. qiskit/providers/models/pulsedefaults.py +0 -305
  362. qiskit/providers/provider.py +0 -95
  363. qiskit/pulse/__init__.py +0 -158
  364. qiskit/pulse/builder.py +0 -2262
  365. qiskit/pulse/calibration_entries.py +0 -381
  366. qiskit/pulse/channels.py +0 -227
  367. qiskit/pulse/configuration.py +0 -245
  368. qiskit/pulse/exceptions.py +0 -45
  369. qiskit/pulse/filters.py +0 -309
  370. qiskit/pulse/instruction_schedule_map.py +0 -424
  371. qiskit/pulse/instructions/__init__.py +0 -67
  372. qiskit/pulse/instructions/acquire.py +0 -150
  373. qiskit/pulse/instructions/delay.py +0 -71
  374. qiskit/pulse/instructions/directives.py +0 -154
  375. qiskit/pulse/instructions/frequency.py +0 -135
  376. qiskit/pulse/instructions/instruction.py +0 -270
  377. qiskit/pulse/instructions/phase.py +0 -152
  378. qiskit/pulse/instructions/play.py +0 -99
  379. qiskit/pulse/instructions/reference.py +0 -100
  380. qiskit/pulse/instructions/snapshot.py +0 -82
  381. qiskit/pulse/library/__init__.py +0 -97
  382. qiskit/pulse/library/continuous.py +0 -430
  383. qiskit/pulse/library/pulse.py +0 -148
  384. qiskit/pulse/library/samplers/__init__.py +0 -15
  385. qiskit/pulse/library/samplers/decorators.py +0 -295
  386. qiskit/pulse/library/samplers/strategies.py +0 -71
  387. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  388. qiskit/pulse/library/waveform.py +0 -136
  389. qiskit/pulse/macros.py +0 -262
  390. qiskit/pulse/parameter_manager.py +0 -445
  391. qiskit/pulse/parser.py +0 -314
  392. qiskit/pulse/reference_manager.py +0 -58
  393. qiskit/pulse/schedule.py +0 -1854
  394. qiskit/pulse/transforms/__init__.py +0 -106
  395. qiskit/pulse/transforms/alignments.py +0 -406
  396. qiskit/pulse/transforms/base_transforms.py +0 -71
  397. qiskit/pulse/transforms/canonicalization.py +0 -498
  398. qiskit/pulse/transforms/dag.py +0 -122
  399. qiskit/pulse/utils.py +0 -149
  400. qiskit/qobj/__init__.py +0 -75
  401. qiskit/qobj/common.py +0 -81
  402. qiskit/qobj/converters/__init__.py +0 -18
  403. qiskit/qobj/converters/lo_config.py +0 -177
  404. qiskit/qobj/converters/pulse_instruction.py +0 -897
  405. qiskit/qobj/pulse_qobj.py +0 -709
  406. qiskit/qobj/qasm_qobj.py +0 -708
  407. qiskit/qobj/utils.py +0 -46
  408. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  409. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  410. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  411. qiskit/result/mitigation/utils.py +0 -217
  412. qiskit/scheduler/__init__.py +0 -40
  413. qiskit/scheduler/config.py +0 -37
  414. qiskit/scheduler/lowering.py +0 -187
  415. qiskit/scheduler/methods/__init__.py +0 -15
  416. qiskit/scheduler/methods/basic.py +0 -140
  417. qiskit/scheduler/schedule_circuit.py +0 -69
  418. qiskit/scheduler/sequence.py +0 -104
  419. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  420. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  421. qiskit/transpiler/passes/calibration/builders.py +0 -20
  422. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  423. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  424. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  425. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  426. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  427. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  428. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  429. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  430. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  431. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  432. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  433. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  434. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  435. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  436. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  437. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  438. qiskit/utils/deprecate_pulse.py +0 -119
  439. qiskit/utils/multiprocessing.py +0 -56
  440. qiskit/visualization/pulse_v2/__init__.py +0 -21
  441. qiskit/visualization/pulse_v2/core.py +0 -901
  442. qiskit/visualization/pulse_v2/device_info.py +0 -173
  443. qiskit/visualization/pulse_v2/drawings.py +0 -253
  444. qiskit/visualization/pulse_v2/events.py +0 -254
  445. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  446. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  447. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  448. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  449. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  450. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  451. qiskit/visualization/pulse_v2/interface.py +0 -459
  452. qiskit/visualization/pulse_v2/layouts.py +0 -387
  453. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  454. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  455. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  456. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  457. qiskit/visualization/pulse_v2/types.py +0 -242
  458. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  459. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -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,29 +66,28 @@ 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
- def _loads_symbolic_expr(expr_bytes, use_symengine=False, trust_input=False):
90
+ def _loads_symbolic_expr(expr_bytes, use_symengine=False):
103
91
  if expr_bytes == b"":
104
92
  return None
105
93
  expr_bytes = zlib.decompress(expr_bytes)
@@ -108,18 +96,12 @@ def _loads_symbolic_expr(expr_bytes, use_symengine=False, trust_input=False):
108
96
  else:
109
97
  from sympy import parse_expr
110
98
 
111
- if not trust_input:
112
- raise QpyError(
113
- "This payload can not be loaded unless you set ``trust_payload`` to "
114
- "True, as it's using sympy for serialization of symbolic expressions which "
115
- "is insecure."
116
- )
117
99
  expr_txt = expr_bytes.decode(common.ENCODE)
118
100
  expr = parse_expr(expr_txt)
119
101
  return sym.sympify(expr)
120
102
 
121
103
 
122
- def _read_symbolic_pulse(file_obj, version, trust_input=False):
104
+ def _read_symbolic_pulse(file_obj, version) -> None:
123
105
  make = formats.SYMBOLIC_PULSE._make
124
106
  pack = formats.SYMBOLIC_PULSE_PACK
125
107
  size = formats.SYMBOLIC_PULSE_SIZE
@@ -131,14 +113,13 @@ def _read_symbolic_pulse(file_obj, version, trust_input=False):
131
113
  )
132
114
  )
133
115
  pulse_type = file_obj.read(header.type_size).decode(common.ENCODE)
134
- envelope = _loads_symbolic_expr(file_obj.read(header.envelope_size), trust_input=trust_input)
135
- constraints = _loads_symbolic_expr(
136
- file_obj.read(header.constraints_size), trust_input=trust_input
137
- )
138
- valid_amp_conditions = _loads_symbolic_expr(
139
- file_obj.read(header.valid_amp_conditions_size), trust_input=trust_input
140
- )
141
- 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(
142
123
  file_obj,
143
124
  deserializer=value.loads_value,
144
125
  version=version,
@@ -156,50 +137,16 @@ def _read_symbolic_pulse(file_obj, version, trust_input=False):
156
137
  class_name = "SymbolicPulse" # Default class name, if not in the library
157
138
 
158
139
  if pulse_type in legacy_library_pulses:
159
- parameters["angle"] = np.angle(parameters["amp"])
160
- parameters["amp"] = np.abs(parameters["amp"])
161
- _amp, _angle = sym.symbols("amp, angle")
162
- envelope = envelope.subs(_amp, _amp * sym.exp(sym.I * _angle))
163
-
164
- warnings.warn(
165
- f"Library pulses with complex amp are no longer supported. "
166
- f"{pulse_type} with complex amp was converted to (amp,angle) representation.",
167
- UserWarning,
168
- )
169
140
  class_name = "ScalableSymbolicPulse"
170
141
 
171
- duration = value.read_value(file_obj, version, {})
172
- name = value.read_value(file_obj, version, {})
173
-
174
- if class_name == "SymbolicPulse":
175
- return library.SymbolicPulse(
176
- pulse_type=pulse_type,
177
- duration=duration,
178
- parameters=parameters,
179
- name=name,
180
- limit_amplitude=header.amp_limited,
181
- envelope=envelope,
182
- constraints=constraints,
183
- valid_amp_conditions=valid_amp_conditions,
184
- )
185
- elif class_name == "ScalableSymbolicPulse":
186
- return library.ScalableSymbolicPulse(
187
- pulse_type=pulse_type,
188
- duration=duration,
189
- amp=parameters["amp"],
190
- angle=parameters["angle"],
191
- parameters=parameters,
192
- name=name,
193
- limit_amplitude=header.amp_limited,
194
- envelope=envelope,
195
- constraints=constraints,
196
- valid_amp_conditions=valid_amp_conditions,
197
- )
198
- 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"}:
199
146
  raise NotImplementedError(f"Unknown class '{class_name}'")
200
147
 
201
148
 
202
- def _read_symbolic_pulse_v6(file_obj, version, use_symengine, trust_input=False):
149
+ def _read_symbolic_pulse_v6(file_obj, version, use_symengine) -> None:
203
150
  make = formats.SYMBOLIC_PULSE_V2._make
204
151
  pack = formats.SYMBOLIC_PULSE_PACK_V2
205
152
  size = formats.SYMBOLIC_PULSE_SIZE_V2
@@ -211,101 +158,48 @@ def _read_symbolic_pulse_v6(file_obj, version, use_symengine, trust_input=False)
211
158
  )
212
159
  )
213
160
  class_name = file_obj.read(header.class_name_size).decode(common.ENCODE)
214
- pulse_type = file_obj.read(header.type_size).decode(common.ENCODE)
215
- envelope = _loads_symbolic_expr(
216
- file_obj.read(header.envelope_size), use_symengine, trust_input=trust_input
217
- )
218
- constraints = _loads_symbolic_expr(
219
- file_obj.read(header.constraints_size), use_symengine, trust_input=trust_input
220
- )
221
- valid_amp_conditions = _loads_symbolic_expr(
222
- file_obj.read(header.valid_amp_conditions_size), use_symengine, trust_input=trust_input
223
- )
224
- parameters = common.read_mapping(
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(
165
+ file_obj.read(header.valid_amp_conditions_size), use_symengine
166
+ ) # read valid_amp_conditions
167
+ # read parameters
168
+ common.read_mapping(
225
169
  file_obj,
226
170
  deserializer=value.loads_value,
227
171
  version=version,
228
172
  vectors={},
229
173
  )
230
174
 
231
- duration = value.read_value(file_obj, version, {})
232
- name = value.read_value(file_obj, version, {})
233
-
234
- if class_name == "SymbolicPulse":
235
- return library.SymbolicPulse(
236
- pulse_type=pulse_type,
237
- duration=duration,
238
- parameters=parameters,
239
- name=name,
240
- limit_amplitude=header.amp_limited,
241
- envelope=envelope,
242
- constraints=constraints,
243
- valid_amp_conditions=valid_amp_conditions,
244
- )
245
- elif class_name == "ScalableSymbolicPulse":
246
- # Between Qiskit 0.40 and 0.46, the (amp, angle) representation was present,
247
- # but complex amp was still allowed. In Qiskit 1.0 and beyond complex amp
248
- # is no longer supported and so the amp needs to be checked and converted.
249
- # Once QPY version is bumped, a new reader function can be introduced without
250
- # this check.
251
- if isinstance(parameters["amp"], complex):
252
- parameters["angle"] = np.angle(parameters["amp"])
253
- parameters["amp"] = np.abs(parameters["amp"])
254
- warnings.warn(
255
- f"ScalableSymbolicPulse with complex amp are no longer supported. "
256
- f"{pulse_type} with complex amp was converted to (amp,angle) representation.",
257
- UserWarning,
258
- )
175
+ value.read_value(file_obj, version, {}) # read duration
176
+ value.read_value(file_obj, version, {}) # read name
259
177
 
260
- return library.ScalableSymbolicPulse(
261
- pulse_type=pulse_type,
262
- duration=duration,
263
- amp=parameters["amp"],
264
- angle=parameters["angle"],
265
- parameters=parameters,
266
- name=name,
267
- limit_amplitude=header.amp_limited,
268
- envelope=envelope,
269
- constraints=constraints,
270
- valid_amp_conditions=valid_amp_conditions,
271
- )
272
- else:
178
+ if class_name not in {"SymbolicPulse", "ScalableSymbolicPulse"}:
273
179
  raise NotImplementedError(f"Unknown class '{class_name}'")
274
180
 
275
181
 
276
- def _read_alignment_context(file_obj, version):
277
- type_key = common.read_type_key(file_obj)
182
+ def _read_alignment_context(file_obj, version) -> None:
183
+ common.read_type_key(file_obj)
278
184
 
279
- context_params = common.read_sequence(
185
+ common.read_sequence(
280
186
  file_obj,
281
187
  deserializer=value.loads_value,
282
188
  version=version,
283
189
  vectors={},
284
190
  )
285
- context_cls = type_keys.ScheduleAlignment.retrieve(type_key)
286
-
287
- instance = object.__new__(context_cls)
288
- instance._context_params = tuple(context_params)
289
-
290
- return instance
291
191
 
292
192
 
293
193
  # pylint: disable=too-many-return-statements
294
- def _loads_operand(type_key, data_bytes, version, use_symengine, trust_input=False):
194
+ def _loads_operand(type_key, data_bytes, version, use_symengine):
295
195
  if type_key == type_keys.ScheduleOperand.WAVEFORM:
296
196
  return common.data_from_binary(data_bytes, _read_waveform, version=version)
297
197
  if type_key == type_keys.ScheduleOperand.SYMBOLIC_PULSE:
298
198
  if version < 6:
299
- return common.data_from_binary(
300
- data_bytes, _read_symbolic_pulse, version=version, trust_input=trust_input
301
- )
199
+ return common.data_from_binary(data_bytes, _read_symbolic_pulse, version=version)
302
200
  else:
303
201
  return common.data_from_binary(
304
- data_bytes,
305
- _read_symbolic_pulse_v6,
306
- version=version,
307
- use_symengine=use_symengine,
308
- trust_input=trust_input,
202
+ data_bytes, _read_symbolic_pulse_v6, version=version, use_symengine=use_symengine
309
203
  )
310
204
  if type_key == type_keys.ScheduleOperand.CHANNEL:
311
205
  return common.data_from_binary(data_bytes, _read_channel, version=version)
@@ -327,32 +221,23 @@ def _loads_operand(type_key, data_bytes, version, use_symengine, trust_input=Fal
327
221
  return value.loads_value(type_key, data_bytes, version, {})
328
222
 
329
223
 
330
- def _read_element(file_obj, version, metadata_deserializer, use_symengine, trust_input=False):
224
+ def _read_element(file_obj, version, metadata_deserializer, use_symengine) -> None:
331
225
  type_key = common.read_type_key(file_obj)
332
226
 
333
227
  if type_key == type_keys.Program.SCHEDULE_BLOCK:
334
- return read_schedule_block(
335
- file_obj, version, metadata_deserializer, use_symengine, trust_input=trust_input
336
- )
228
+ return read_schedule_block(file_obj, version, metadata_deserializer, use_symengine)
337
229
 
338
- operands = common.read_sequence(
339
- file_obj,
340
- deserializer=_loads_operand,
341
- version=version,
342
- use_symengine=use_symengine,
343
- trust_input=trust_input,
230
+ # read operands
231
+ common.read_sequence(
232
+ file_obj, deserializer=_loads_operand, version=version, use_symengine=use_symengine
344
233
  )
345
- name = value.read_value(file_obj, version, {})
346
-
347
- instance = object.__new__(type_keys.ScheduleInstruction.retrieve(type_key))
348
- instance._operands = tuple(operands)
349
- instance._name = name
350
- instance._hash = None
234
+ # read name
235
+ value.read_value(file_obj, version, {})
351
236
 
352
- return instance
237
+ return None
353
238
 
354
239
 
355
- def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version, trust_input=False):
240
+ def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version) -> None:
356
241
  if type_key == type_keys.Value.NULL:
357
242
  return None
358
243
  if type_key == type_keys.Program.SCHEDULE_BLOCK:
@@ -361,7 +246,6 @@ def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version,
361
246
  deserializer=read_schedule_block,
362
247
  version=version,
363
248
  metadata_deserializer=metadata_deserializer,
364
- trust_input=trust_input,
365
249
  )
366
250
 
367
251
  raise QpyError(
@@ -371,181 +255,8 @@ def _loads_reference_item(type_key, data_bytes, metadata_deserializer, version,
371
255
  )
372
256
 
373
257
 
374
- def _write_channel(file_obj, data, version):
375
- type_key = type_keys.ScheduleChannel.assign(data)
376
- common.write_type_key(file_obj, type_key)
377
- value.write_value(file_obj, data.index, version=version)
378
-
379
-
380
- def _write_waveform(file_obj, data, version):
381
- samples_bytes = common.data_to_binary(data.samples, np.save)
382
-
383
- header = struct.pack(
384
- formats.WAVEFORM_PACK,
385
- data.epsilon,
386
- len(samples_bytes),
387
- data._limit_amplitude,
388
- )
389
- file_obj.write(header)
390
- file_obj.write(samples_bytes)
391
- value.write_value(file_obj, data.name, version=version)
392
-
393
-
394
- def _dumps_obj(obj, version):
395
- """Wraps `value.dumps_value` to serialize dictionary and list objects
396
- which are not supported by `value.dumps_value`.
397
- """
398
- if isinstance(obj, dict):
399
- with BytesIO() as container:
400
- common.write_mapping(
401
- file_obj=container, mapping=obj, serializer=_dumps_obj, version=version
402
- )
403
- binary_data = container.getvalue()
404
- return b"D", binary_data
405
- elif isinstance(obj, list):
406
- with BytesIO() as container:
407
- common.write_sequence(
408
- file_obj=container, sequence=obj, serializer=_dumps_obj, version=version
409
- )
410
- binary_data = container.getvalue()
411
- return b"l", binary_data
412
- else:
413
- return value.dumps_value(obj, version=version)
414
-
415
-
416
- def _write_kernel(file_obj, data, version):
417
- name = data.name
418
- params = data.params
419
- common.write_mapping(file_obj=file_obj, mapping=params, serializer=_dumps_obj, version=version)
420
- value.write_value(file_obj, name, version=version)
421
-
422
-
423
- def _write_discriminator(file_obj, data, version):
424
- name = data.name
425
- params = data.params
426
- common.write_mapping(file_obj=file_obj, mapping=params, serializer=_dumps_obj, version=version)
427
- value.write_value(file_obj, name, version=version)
428
-
429
-
430
- def _dumps_symbolic_expr(expr, use_symengine):
431
- if expr is None:
432
- return b""
433
- if use_symengine:
434
- expr_bytes = expr.__reduce__()[1][0]
435
- else:
436
- from sympy import srepr, sympify
437
-
438
- if not isinstance(expr, sym.Basic):
439
- raise QiskitError("Invalid ParameterExpression")
440
-
441
- expr_bytes = srepr(sympify(expr)).encode(common.ENCODE)
442
- return zlib.compress(expr_bytes)
443
-
444
-
445
- def _write_symbolic_pulse(file_obj, data, use_symengine, version):
446
- class_name_bytes = data.__class__.__name__.encode(common.ENCODE)
447
- pulse_type_bytes = data.pulse_type.encode(common.ENCODE)
448
- envelope_bytes = _dumps_symbolic_expr(data.envelope, use_symengine)
449
- constraints_bytes = _dumps_symbolic_expr(data.constraints, use_symengine)
450
- valid_amp_conditions_bytes = _dumps_symbolic_expr(data.valid_amp_conditions, use_symengine)
451
-
452
- header_bytes = struct.pack(
453
- formats.SYMBOLIC_PULSE_PACK_V2,
454
- len(class_name_bytes),
455
- len(pulse_type_bytes),
456
- len(envelope_bytes),
457
- len(constraints_bytes),
458
- len(valid_amp_conditions_bytes),
459
- data._limit_amplitude,
460
- )
461
- file_obj.write(header_bytes)
462
- file_obj.write(class_name_bytes)
463
- file_obj.write(pulse_type_bytes)
464
- file_obj.write(envelope_bytes)
465
- file_obj.write(constraints_bytes)
466
- file_obj.write(valid_amp_conditions_bytes)
467
- common.write_mapping(
468
- file_obj,
469
- mapping=data._params,
470
- serializer=value.dumps_value,
471
- version=version,
472
- )
473
- value.write_value(file_obj, data.duration, version=version)
474
- value.write_value(file_obj, data.name, version=version)
475
-
476
-
477
- def _write_alignment_context(file_obj, context, version):
478
- type_key = type_keys.ScheduleAlignment.assign(context)
479
- common.write_type_key(file_obj, type_key)
480
- common.write_sequence(
481
- file_obj, sequence=context._context_params, serializer=value.dumps_value, version=version
482
- )
483
-
484
-
485
- def _dumps_operand(operand, use_symengine, version):
486
- if isinstance(operand, library.Waveform):
487
- type_key = type_keys.ScheduleOperand.WAVEFORM
488
- data_bytes = common.data_to_binary(operand, _write_waveform, version=version)
489
- elif isinstance(operand, library.SymbolicPulse):
490
- type_key = type_keys.ScheduleOperand.SYMBOLIC_PULSE
491
- data_bytes = common.data_to_binary(
492
- operand, _write_symbolic_pulse, use_symengine=use_symengine, version=version
493
- )
494
- elif isinstance(operand, channels.Channel):
495
- type_key = type_keys.ScheduleOperand.CHANNEL
496
- data_bytes = common.data_to_binary(operand, _write_channel, version=version)
497
- elif isinstance(operand, str):
498
- type_key = type_keys.ScheduleOperand.OPERAND_STR
499
- data_bytes = operand.encode(common.ENCODE)
500
- elif isinstance(operand, Kernel):
501
- type_key = type_keys.ScheduleOperand.KERNEL
502
- data_bytes = common.data_to_binary(operand, _write_kernel, version=version)
503
- elif isinstance(operand, Discriminator):
504
- type_key = type_keys.ScheduleOperand.DISCRIMINATOR
505
- data_bytes = common.data_to_binary(operand, _write_discriminator, version=version)
506
- else:
507
- type_key, data_bytes = value.dumps_value(operand, version=version)
508
-
509
- return type_key, data_bytes
510
-
511
-
512
- def _write_element(file_obj, element, metadata_serializer, use_symengine, version):
513
- if isinstance(element, ScheduleBlock):
514
- common.write_type_key(file_obj, type_keys.Program.SCHEDULE_BLOCK)
515
- write_schedule_block(file_obj, element, metadata_serializer, use_symengine, version=version)
516
- else:
517
- type_key = type_keys.ScheduleInstruction.assign(element)
518
- common.write_type_key(file_obj, type_key)
519
- common.write_sequence(
520
- file_obj,
521
- sequence=element.operands,
522
- serializer=_dumps_operand,
523
- use_symengine=use_symengine,
524
- version=version,
525
- )
526
- value.write_value(file_obj, element.name, version=version)
527
-
528
-
529
- def _dumps_reference_item(schedule, metadata_serializer, version):
530
- if schedule is None:
531
- type_key = type_keys.Value.NULL
532
- data_bytes = b""
533
- else:
534
- type_key = type_keys.Program.SCHEDULE_BLOCK
535
- data_bytes = common.data_to_binary(
536
- obj=schedule,
537
- serializer=write_schedule_block,
538
- metadata_serializer=metadata_serializer,
539
- version=version,
540
- )
541
- return type_key, data_bytes
542
-
543
-
544
- @ignore_pulse_deprecation_warnings
545
- def read_schedule_block(
546
- file_obj, version, metadata_deserializer=None, use_symengine=False, trust_input=False
547
- ):
548
- """Read a single ScheduleBlock from the file like object.
258
+ def read_schedule_block(file_obj, version, metadata_deserializer=None, use_symengine=False):
259
+ """Consume a single ScheduleBlock from the file like object.
549
260
 
550
261
  Args:
551
262
  file_obj (File): A file like object that contains the QPY binary data.
@@ -561,16 +272,10 @@ def read_schedule_block(
561
272
  native mechanism. This is a faster serialization alternative, but not supported in all
562
273
  platforms. Please check that your target platform is supported by the symengine library
563
274
  before setting this option, as it will be required by qpy to deserialize the payload.
564
- trust_input (bool): if set to ``False`` (the default),
565
- :class:`.ScheduleBlock` objects in the payload that were
566
- serialized using ``sympy`` are not allowed and will error. This
567
- is because the ``sympy`` parsing uses :func:`eval`, which
568
- can allow for arbitrary code execution.
569
- The flag should only be set
570
- to ``True`` if you trust the QPY payload you are loading.
571
-
572
275
  Returns:
573
- 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.
574
279
 
575
280
  Raises:
576
281
  TypeError: If any of the instructions is invalid data format.
@@ -585,94 +290,19 @@ def read_schedule_block(
585
290
  file_obj.read(formats.SCHEDULE_BLOCK_HEADER_SIZE),
586
291
  )
587
292
  )
588
- name = file_obj.read(data.name_size).decode(common.ENCODE)
293
+ file_obj.read(data.name_size).decode(common.ENCODE) # read name
589
294
  metadata_raw = file_obj.read(data.metadata_size)
590
- metadata = json.loads(metadata_raw, cls=metadata_deserializer)
591
- context = _read_alignment_context(file_obj, version)
295
+ json.loads(metadata_raw, cls=metadata_deserializer) # read metadata
296
+ _read_alignment_context(file_obj, version)
592
297
 
593
- block = ScheduleBlock(
594
- name=name,
595
- metadata=metadata,
596
- alignment_context=context,
597
- )
598
298
  for _ in range(data.num_elements):
599
- block_elm = _read_element(
600
- file_obj, version, metadata_deserializer, use_symengine, trust_input=trust_input
601
- )
602
- block.append(block_elm, inplace=True)
299
+ _read_element(file_obj, version, metadata_deserializer, use_symengine)
603
300
 
604
301
  # Load references
605
302
  if version >= 7:
606
- flat_key_refdict = common.read_mapping(
303
+ common.read_mapping(
607
304
  file_obj=file_obj,
608
305
  deserializer=_loads_reference_item,
609
306
  version=version,
610
307
  metadata_deserializer=metadata_deserializer,
611
- trust_input=trust_input,
612
308
  )
613
- ref_dict = {}
614
- for key_str, schedule in flat_key_refdict.items():
615
- if schedule is not None:
616
- composite_key = tuple(key_str.split(instructions.Reference.key_delimiter))
617
- ref_dict[composite_key] = schedule
618
- if ref_dict:
619
- block.assign_references(ref_dict, inplace=True)
620
-
621
- return block
622
-
623
-
624
- def write_schedule_block(
625
- file_obj, block, metadata_serializer=None, use_symengine=False, version=common.QPY_VERSION
626
- ):
627
- """Write a single ScheduleBlock object in the file like object.
628
-
629
- Args:
630
- file_obj (File): The file like object to write the circuit data in.
631
- block (ScheduleBlock): A schedule block data to write.
632
- metadata_serializer (JSONEncoder): An optional JSONEncoder class that
633
- will be passed the :attr:`.ScheduleBlock.metadata` dictionary for
634
- ``block`` and will be used as the ``cls`` kwarg
635
- on the ``json.dump()`` call to JSON serialize that dictionary.
636
- use_symengine (bool): If True, symbolic objects will be serialized using symengine's
637
- native mechanism. This is a faster serialization alternative, but not supported in all
638
- platforms. Please check that your target platform is supported by the symengine library
639
- before setting this option, as it will be required by qpy to deserialize the payload.
640
- version (int): The QPY format version to use for serializing this circuit block
641
- Raises:
642
- TypeError: If any of the instructions is invalid data format.
643
- """
644
- metadata = json.dumps(block.metadata, separators=(",", ":"), cls=metadata_serializer).encode(
645
- common.ENCODE
646
- )
647
- block_name = block.name.encode(common.ENCODE)
648
-
649
- # Write schedule block header
650
- header_raw = formats.SCHEDULE_BLOCK_HEADER(
651
- name_size=len(block_name),
652
- metadata_size=len(metadata),
653
- num_elements=len(block),
654
- )
655
- header = struct.pack(formats.SCHEDULE_BLOCK_HEADER_PACK, *header_raw)
656
- file_obj.write(header)
657
- file_obj.write(block_name)
658
- file_obj.write(metadata)
659
-
660
- _write_alignment_context(file_obj, block.alignment_context, version=version)
661
- for block_elm in block._blocks:
662
- # Do not call block.blocks. This implicitly assigns references to instruction.
663
- # This breaks original reference structure.
664
- _write_element(file_obj, block_elm, metadata_serializer, use_symengine, version=version)
665
-
666
- # Write references
667
- flat_key_refdict = {}
668
- for ref_keys, schedule in block._reference_manager.items():
669
- # Do not call block.reference. This returns the reference of most outer program by design.
670
- key_str = instructions.Reference.key_delimiter.join(ref_keys)
671
- flat_key_refdict[key_str] = schedule
672
- common.write_mapping(
673
- file_obj=file_obj,
674
- mapping=flat_key_refdict,
675
- serializer=_dumps_reference_item,
676
- metadata_serializer=metadata_serializer,
677
- version=version,
678
- )