qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0__cp39-abi3-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.pyd +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 +11 -0
  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/circuit/tools/pi_check.py +3 -0
  104. qiskit/compiler/__init__.py +1 -7
  105. qiskit/compiler/transpiler.py +38 -196
  106. qiskit/converters/circuit_to_dag.py +6 -4
  107. qiskit/converters/circuit_to_dagdependency.py +0 -2
  108. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  109. qiskit/converters/circuit_to_gate.py +1 -1
  110. qiskit/converters/circuit_to_instruction.py +16 -29
  111. qiskit/converters/dag_to_circuit.py +7 -8
  112. qiskit/converters/dag_to_dagdependency.py +0 -1
  113. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  114. qiskit/converters/dagdependency_to_circuit.py +0 -6
  115. qiskit/converters/dagdependency_to_dag.py +0 -6
  116. qiskit/dagcircuit/collect_blocks.py +32 -20
  117. qiskit/dagcircuit/dagdependency.py +3 -37
  118. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  119. qiskit/dagcircuit/dagnode.py +14 -2
  120. qiskit/passmanager/__init__.py +24 -6
  121. qiskit/passmanager/passmanager.py +26 -24
  122. qiskit/primitives/__init__.py +44 -35
  123. qiskit/primitives/backend_estimator_v2.py +102 -23
  124. qiskit/primitives/backend_sampler_v2.py +5 -20
  125. qiskit/primitives/base/__init__.py +4 -4
  126. qiskit/primitives/base/base_estimator.py +77 -82
  127. qiskit/primitives/base/base_primitive_job.py +2 -2
  128. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  129. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  130. qiskit/primitives/base/base_sampler.py +52 -60
  131. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  132. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  133. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  134. qiskit/primitives/containers/bindings_array.py +3 -1
  135. qiskit/primitives/containers/bit_array.py +23 -0
  136. qiskit/primitives/containers/data_bin.py +3 -1
  137. qiskit/primitives/containers/observables_array.py +19 -2
  138. qiskit/primitives/statevector_sampler.py +6 -8
  139. qiskit/primitives/utils.py +14 -189
  140. qiskit/providers/__init__.py +4 -130
  141. qiskit/providers/backend.py +11 -314
  142. qiskit/providers/basic_provider/__init__.py +3 -1
  143. qiskit/providers/basic_provider/basic_provider.py +29 -9
  144. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  145. qiskit/providers/exceptions.py +0 -33
  146. qiskit/providers/fake_provider/__init__.py +0 -37
  147. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  148. qiskit/qasm2/__init__.py +21 -6
  149. qiskit/qasm2/export.py +2 -10
  150. qiskit/qasm2/parse.py +11 -25
  151. qiskit/qasm3/__init__.py +5 -1
  152. qiskit/qasm3/ast.py +44 -0
  153. qiskit/qasm3/exporter.py +65 -27
  154. qiskit/qasm3/printer.py +35 -4
  155. qiskit/qpy/__init__.py +162 -19
  156. qiskit/qpy/binary_io/__init__.py +0 -1
  157. qiskit/qpy/binary_io/circuits.py +96 -116
  158. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  159. qiskit/qpy/binary_io/schedules.py +61 -388
  160. qiskit/qpy/binary_io/value.py +159 -33
  161. qiskit/qpy/common.py +10 -7
  162. qiskit/qpy/formats.py +41 -0
  163. qiskit/qpy/interface.py +29 -62
  164. qiskit/qpy/type_keys.py +58 -221
  165. qiskit/quantum_info/analysis/distance.py +3 -1
  166. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  167. qiskit/quantum_info/operators/operator.py +6 -2
  168. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  169. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  170. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  171. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  172. qiskit/quantum_info/states/densitymatrix.py +16 -6
  173. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  174. qiskit/quantum_info/states/statevector.py +16 -6
  175. qiskit/result/__init__.py +5 -17
  176. qiskit/result/models.py +18 -11
  177. qiskit/result/result.py +38 -134
  178. qiskit/result/sampled_expval.py +1 -2
  179. qiskit/result/utils.py +3 -4
  180. qiskit/synthesis/__init__.py +21 -1
  181. qiskit/synthesis/arithmetic/__init__.py +3 -1
  182. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  183. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  184. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  185. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  186. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  187. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  188. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  189. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  190. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  191. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  192. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  193. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  194. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  195. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  196. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  197. qiskit/synthesis/evolution/product_formula.py +44 -35
  198. qiskit/synthesis/evolution/qdrift.py +17 -24
  199. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  200. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  201. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  202. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  203. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  204. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  205. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  206. qiskit/synthesis/two_qubit/__init__.py +1 -0
  207. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  208. qiskit/transpiler/__init__.py +32 -232
  209. qiskit/transpiler/basepasses.py +20 -51
  210. qiskit/transpiler/layout.py +1 -1
  211. qiskit/transpiler/passes/__init__.py +4 -40
  212. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  213. qiskit/transpiler/passes/basis/decompose.py +1 -15
  214. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  215. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  216. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  217. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  218. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  219. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  220. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  221. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  222. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  223. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  224. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  225. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  226. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  227. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  228. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  229. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  230. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  231. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  232. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  233. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  234. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  235. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  236. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  237. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  238. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
  239. qiskit/transpiler/passes/routing/__init__.py +0 -1
  240. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  241. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  242. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  243. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  244. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  245. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  246. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  247. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  248. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  249. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  250. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  251. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  252. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  253. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  254. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  255. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  256. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  257. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  258. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  259. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  260. qiskit/transpiler/passes/utils/__init__.py +0 -1
  261. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  262. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  263. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  264. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  265. qiskit/transpiler/passmanager.py +13 -0
  266. qiskit/transpiler/passmanager_config.py +5 -81
  267. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  268. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  269. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  270. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  272. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  273. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  274. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  275. qiskit/transpiler/target.py +78 -524
  276. qiskit/user_config.py +8 -4
  277. qiskit/utils/__init__.py +13 -12
  278. qiskit/utils/deprecation.py +4 -112
  279. qiskit/utils/optionals.py +11 -4
  280. qiskit/utils/parallel.py +214 -87
  281. qiskit/utils/units.py +4 -1
  282. qiskit/visualization/__init__.py +3 -7
  283. qiskit/visualization/array.py +4 -1
  284. qiskit/visualization/bloch.py +1 -1
  285. qiskit/visualization/circuit/_utils.py +19 -19
  286. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  287. qiskit/visualization/circuit/matplotlib.py +13 -23
  288. qiskit/visualization/circuit/text.py +7 -3
  289. qiskit/visualization/counts_visualization.py +4 -0
  290. qiskit/visualization/dag_visualization.py +2 -1
  291. qiskit/visualization/gate_map.py +39 -154
  292. qiskit/visualization/library.py +4 -1
  293. qiskit/visualization/pass_manager_visualization.py +6 -2
  294. qiskit/visualization/state_visualization.py +19 -2
  295. qiskit/visualization/timeline/core.py +19 -13
  296. qiskit/visualization/timeline/interface.py +19 -18
  297. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  298. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  299. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
  300. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +1 -1
  301. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  302. qiskit/assembler/__init__.py +0 -42
  303. qiskit/assembler/assemble_circuits.py +0 -451
  304. qiskit/assembler/assemble_schedules.py +0 -367
  305. qiskit/assembler/disassemble.py +0 -310
  306. qiskit/assembler/run_config.py +0 -77
  307. qiskit/circuit/bit.py +0 -106
  308. qiskit/circuit/classicalfunction/__init__.py +0 -152
  309. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  310. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  311. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  312. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  313. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  314. qiskit/circuit/classicalfunction/types.py +0 -18
  315. qiskit/circuit/classicalfunction/utils.py +0 -91
  316. qiskit/circuit/classicalregister.py +0 -57
  317. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  318. qiskit/circuit/quantumregister.py +0 -75
  319. qiskit/circuit/register.py +0 -246
  320. qiskit/compiler/assembler.py +0 -689
  321. qiskit/compiler/scheduler.py +0 -109
  322. qiskit/compiler/sequencer.py +0 -71
  323. qiskit/primitives/backend_estimator.py +0 -486
  324. qiskit/primitives/backend_sampler.py +0 -222
  325. qiskit/primitives/estimator.py +0 -172
  326. qiskit/primitives/sampler.py +0 -162
  327. qiskit/providers/backend_compat.py +0 -507
  328. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  333. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  351. qiskit/providers/fake_provider/fake_1q.py +0 -91
  352. qiskit/providers/fake_provider/fake_backend.py +0 -165
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  357. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  358. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  359. qiskit/providers/models/__init__.py +0 -89
  360. qiskit/providers/models/backendconfiguration.py +0 -1040
  361. qiskit/providers/models/backendproperties.py +0 -535
  362. qiskit/providers/models/backendstatus.py +0 -104
  363. qiskit/providers/models/jobstatus.py +0 -77
  364. qiskit/providers/models/pulsedefaults.py +0 -305
  365. qiskit/providers/provider.py +0 -95
  366. qiskit/pulse/__init__.py +0 -158
  367. qiskit/pulse/builder.py +0 -2262
  368. qiskit/pulse/calibration_entries.py +0 -381
  369. qiskit/pulse/channels.py +0 -227
  370. qiskit/pulse/configuration.py +0 -245
  371. qiskit/pulse/exceptions.py +0 -45
  372. qiskit/pulse/filters.py +0 -309
  373. qiskit/pulse/instruction_schedule_map.py +0 -424
  374. qiskit/pulse/instructions/__init__.py +0 -67
  375. qiskit/pulse/instructions/acquire.py +0 -150
  376. qiskit/pulse/instructions/delay.py +0 -71
  377. qiskit/pulse/instructions/directives.py +0 -154
  378. qiskit/pulse/instructions/frequency.py +0 -135
  379. qiskit/pulse/instructions/instruction.py +0 -270
  380. qiskit/pulse/instructions/phase.py +0 -152
  381. qiskit/pulse/instructions/play.py +0 -99
  382. qiskit/pulse/instructions/reference.py +0 -100
  383. qiskit/pulse/instructions/snapshot.py +0 -82
  384. qiskit/pulse/library/__init__.py +0 -97
  385. qiskit/pulse/library/continuous.py +0 -430
  386. qiskit/pulse/library/pulse.py +0 -148
  387. qiskit/pulse/library/samplers/__init__.py +0 -15
  388. qiskit/pulse/library/samplers/decorators.py +0 -295
  389. qiskit/pulse/library/samplers/strategies.py +0 -71
  390. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  391. qiskit/pulse/library/waveform.py +0 -136
  392. qiskit/pulse/macros.py +0 -262
  393. qiskit/pulse/parameter_manager.py +0 -445
  394. qiskit/pulse/parser.py +0 -314
  395. qiskit/pulse/reference_manager.py +0 -58
  396. qiskit/pulse/schedule.py +0 -1854
  397. qiskit/pulse/transforms/__init__.py +0 -106
  398. qiskit/pulse/transforms/alignments.py +0 -406
  399. qiskit/pulse/transforms/base_transforms.py +0 -71
  400. qiskit/pulse/transforms/canonicalization.py +0 -498
  401. qiskit/pulse/transforms/dag.py +0 -122
  402. qiskit/pulse/utils.py +0 -149
  403. qiskit/qobj/__init__.py +0 -75
  404. qiskit/qobj/common.py +0 -81
  405. qiskit/qobj/converters/__init__.py +0 -18
  406. qiskit/qobj/converters/lo_config.py +0 -177
  407. qiskit/qobj/converters/pulse_instruction.py +0 -897
  408. qiskit/qobj/pulse_qobj.py +0 -709
  409. qiskit/qobj/qasm_qobj.py +0 -708
  410. qiskit/qobj/utils.py +0 -46
  411. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  412. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  413. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  414. qiskit/result/mitigation/utils.py +0 -217
  415. qiskit/scheduler/__init__.py +0 -40
  416. qiskit/scheduler/config.py +0 -37
  417. qiskit/scheduler/lowering.py +0 -187
  418. qiskit/scheduler/methods/__init__.py +0 -15
  419. qiskit/scheduler/methods/basic.py +0 -140
  420. qiskit/scheduler/schedule_circuit.py +0 -69
  421. qiskit/scheduler/sequence.py +0 -104
  422. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  423. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  424. qiskit/transpiler/passes/calibration/builders.py +0 -20
  425. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  426. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  427. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  428. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  429. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  430. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  431. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  432. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  433. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  434. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  435. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  436. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  437. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  438. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  439. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  440. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  441. qiskit/utils/deprecate_pulse.py +0 -119
  442. qiskit/utils/multiprocessing.py +0 -56
  443. qiskit/visualization/pulse_v2/__init__.py +0 -21
  444. qiskit/visualization/pulse_v2/core.py +0 -901
  445. qiskit/visualization/pulse_v2/device_info.py +0 -173
  446. qiskit/visualization/pulse_v2/drawings.py +0 -253
  447. qiskit/visualization/pulse_v2/events.py +0 -254
  448. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  449. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  450. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  451. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  452. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  453. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  454. qiskit/visualization/pulse_v2/interface.py +0 -459
  455. qiskit/visualization/pulse_v2/layouts.py +0 -387
  456. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  457. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  458. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  459. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  460. qiskit/visualization/pulse_v2/types.py +0 -242
  461. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  462. {qiskit-1.4.1.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,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
- )