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
@@ -1,897 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2017, 2019.
4
- #
5
- # This code is licensed under the Apache License, Version 2.0. You may
6
- # obtain a copy of this license in the LICENSE.txt file in the root directory
7
- # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
- #
9
- # Any modifications or derivative works of this code must retain this
10
- # copyright notice, and modified files need to carry a notice indicating
11
- # that they have been altered from the originals.
12
-
13
- # pylint: disable=invalid-name, missing-function-docstring
14
-
15
- """Helper class used to convert a pulse instruction into PulseQobjInstruction."""
16
-
17
- import hashlib
18
- import re
19
- import warnings
20
- from enum import Enum
21
- from functools import singledispatchmethod
22
- from typing import Union, List, Iterator, Optional
23
- import numpy as np
24
-
25
- from qiskit.circuit import Parameter, ParameterExpression
26
- from qiskit.pulse import channels, instructions, library
27
- from qiskit.pulse.configuration import Kernel, Discriminator
28
- from qiskit.pulse.exceptions import QiskitError
29
- from qiskit.pulse.parser import parse_string_expr
30
- from qiskit.pulse.schedule import Schedule
31
- from qiskit.qobj import QobjMeasurementOption, PulseLibraryItem, PulseQobjInstruction
32
- from qiskit.qobj.utils import MeasLevel
33
- from qiskit.utils import deprecate_func
34
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
35
-
36
-
37
- class ParametricPulseShapes(Enum):
38
- """Map the assembled pulse names to the pulse module waveforms.
39
-
40
- The enum name is the transport layer name for pulse shapes, the
41
- value is its mapping to the OpenPulse Command in Qiskit.
42
- """
43
-
44
- gaussian = "Gaussian"
45
- gaussian_square = "GaussianSquare"
46
- gaussian_square_drag = "GaussianSquareDrag"
47
- gaussian_square_echo = "gaussian_square_echo"
48
- drag = "Drag"
49
- constant = "Constant"
50
-
51
- @classmethod
52
- def from_instance(
53
- cls,
54
- instance: library.SymbolicPulse,
55
- ) -> "ParametricPulseShapes":
56
- """Get Qobj name from the pulse class instance.
57
-
58
- Args:
59
- instance: SymbolicPulse class.
60
-
61
- Returns:
62
- Qobj name.
63
-
64
- Raises:
65
- QiskitError: When pulse instance is not recognizable type.
66
- """
67
- if isinstance(instance, library.SymbolicPulse):
68
- return cls(instance.pulse_type)
69
-
70
- raise QiskitError(f"'{instance}' is not valid pulse type.")
71
-
72
- @classmethod
73
- def to_type(cls, name: str) -> library.SymbolicPulse:
74
- """Get symbolic pulse class from the name.
75
-
76
- Args:
77
- name: Qobj name of the pulse.
78
-
79
- Returns:
80
- Corresponding class.
81
- """
82
- return getattr(library, cls[name].value)
83
-
84
-
85
- class InstructionToQobjConverter:
86
- """Converts Qiskit Pulse in-memory representation into Qobj data.
87
-
88
- This converter converts the Qiskit Pulse in-memory representation into
89
- the transfer layer format to submit the data from client to the server.
90
-
91
- The transfer layer format must be the text representation that conforms to
92
- the `OpenPulse specification<https://arxiv.org/abs/1809.03452>`__.
93
- Extension to the OpenPulse can be achieved by subclassing this this with
94
- extra methods corresponding to each augmented instruction. For example,
95
-
96
- .. code-block:: python
97
-
98
- class MyConverter(InstructionToQobjConverter):
99
-
100
- def _convert_NewInstruction(self, instruction, time_offset):
101
- command_dict = {
102
- 'name': 'new_inst',
103
- 't0': time_offset + instruction.start_time,
104
- 'param1': instruction.param1,
105
- 'param2': instruction.param2
106
- }
107
- return self._qobj_model(**command_dict)
108
-
109
- where ``NewInstruction`` must be a class name of Qiskit Pulse instruction.
110
- """
111
-
112
- @deprecate_func(
113
- since="1.2",
114
- removal_timeline="in the 2.0 release",
115
- additional_msg="The `Qobj` class and related functionality are part of the deprecated "
116
- "`BackendV1` workflow, and no longer necessary for `BackendV2`. If a user "
117
- "workflow requires `Qobj` it likely relies on deprecated functionality and "
118
- "should be updated to use `BackendV2`.",
119
- )
120
- def __init__(
121
- self,
122
- qobj_model: PulseQobjInstruction,
123
- **run_config,
124
- ):
125
- """Create new converter.
126
-
127
- Args:
128
- qobj_model: Transfer layer data schema.
129
- run_config: Run configuration.
130
- """
131
- self._qobj_model = qobj_model
132
- self._run_config = run_config
133
-
134
- def __call__(
135
- self,
136
- shift: int,
137
- instruction: Union[instructions.Instruction, List[instructions.Acquire]],
138
- ) -> PulseQobjInstruction:
139
- """Convert Qiskit in-memory representation to Qobj instruction.
140
-
141
- Args:
142
- instruction: Instruction data in Qiskit Pulse.
143
-
144
- Returns:
145
- Qobj instruction data.
146
-
147
- Raises:
148
- QiskitError: When list of instruction is provided except for Acquire.
149
- """
150
- if isinstance(instruction, list):
151
- if all(isinstance(inst, instructions.Acquire) for inst in instruction):
152
- return self._convert_bundled_acquire(
153
- instruction_bundle=instruction,
154
- time_offset=shift,
155
- )
156
- raise QiskitError("Bundle of instruction is not supported except for Acquire.")
157
-
158
- return self._convert_instruction(instruction, shift)
159
-
160
- @singledispatchmethod
161
- def _convert_instruction(
162
- self,
163
- instruction,
164
- time_offset: int,
165
- ) -> PulseQobjInstruction:
166
- raise QiskitError(
167
- f"Pulse Qobj doesn't support {instruction.__class__.__name__}. "
168
- "This instruction cannot be submitted with Qobj."
169
- )
170
-
171
- @_convert_instruction.register(instructions.Acquire)
172
- def _convert_acquire(
173
- self,
174
- instruction,
175
- time_offset: int,
176
- ) -> PulseQobjInstruction:
177
- """Return converted `Acquire`.
178
-
179
- Args:
180
- instruction: Qiskit Pulse acquire instruction.
181
- time_offset: Offset time.
182
-
183
- Returns:
184
- Qobj instruction data.
185
- """
186
- meas_level = self._run_config.get("meas_level", 2)
187
- mem_slot = []
188
- if instruction.mem_slot:
189
- mem_slot = [instruction.mem_slot.index]
190
-
191
- command_dict = {
192
- "name": "acquire",
193
- "t0": time_offset + instruction.start_time,
194
- "duration": instruction.duration,
195
- "qubits": [instruction.channel.index],
196
- "memory_slot": mem_slot,
197
- }
198
- if meas_level == MeasLevel.CLASSIFIED:
199
- # setup discriminators
200
- if instruction.discriminator:
201
- command_dict.update(
202
- {
203
- "discriminators": [
204
- QobjMeasurementOption(
205
- name=instruction.discriminator.name,
206
- params=instruction.discriminator.params,
207
- )
208
- ]
209
- }
210
- )
211
- # setup register_slots
212
- if instruction.reg_slot:
213
- command_dict.update({"register_slot": [instruction.reg_slot.index]})
214
- if meas_level in [MeasLevel.KERNELED, MeasLevel.CLASSIFIED]:
215
- # setup kernels
216
- if instruction.kernel:
217
- command_dict.update(
218
- {
219
- "kernels": [
220
- QobjMeasurementOption(
221
- name=instruction.kernel.name, params=instruction.kernel.params
222
- )
223
- ]
224
- }
225
- )
226
- return self._qobj_model(**command_dict)
227
-
228
- @_convert_instruction.register(instructions.SetFrequency)
229
- def _convert_set_frequency(
230
- self,
231
- instruction,
232
- time_offset: int,
233
- ) -> PulseQobjInstruction:
234
- """Return converted `SetFrequency`.
235
-
236
- Args:
237
- instruction: Qiskit Pulse set frequency instruction.
238
- time_offset: Offset time.
239
-
240
- Returns:
241
- Qobj instruction data.
242
- """
243
- command_dict = {
244
- "name": "setf",
245
- "t0": time_offset + instruction.start_time,
246
- "ch": instruction.channel.name,
247
- "frequency": instruction.frequency / 10**9,
248
- }
249
- return self._qobj_model(**command_dict)
250
-
251
- @_convert_instruction.register(instructions.ShiftFrequency)
252
- def _convert_shift_frequency(
253
- self,
254
- instruction,
255
- time_offset: int,
256
- ) -> PulseQobjInstruction:
257
- """Return converted `ShiftFrequency`.
258
-
259
- Args:
260
- instruction: Qiskit Pulse shift frequency instruction.
261
- time_offset: Offset time.
262
-
263
- Returns:
264
- Qobj instruction data.
265
- """
266
- command_dict = {
267
- "name": "shiftf",
268
- "t0": time_offset + instruction.start_time,
269
- "ch": instruction.channel.name,
270
- "frequency": instruction.frequency / 10**9,
271
- }
272
- return self._qobj_model(**command_dict)
273
-
274
- @_convert_instruction.register(instructions.SetPhase)
275
- def _convert_set_phase(
276
- self,
277
- instruction,
278
- time_offset: int,
279
- ) -> PulseQobjInstruction:
280
- """Return converted `SetPhase`.
281
-
282
- Args:
283
- instruction: Qiskit Pulse set phase instruction.
284
- time_offset: Offset time.
285
-
286
- Returns:
287
- Qobj instruction data.
288
- """
289
- command_dict = {
290
- "name": "setp",
291
- "t0": time_offset + instruction.start_time,
292
- "ch": instruction.channel.name,
293
- "phase": instruction.phase,
294
- }
295
- return self._qobj_model(**command_dict)
296
-
297
- @_convert_instruction.register(instructions.ShiftPhase)
298
- def _convert_shift_phase(
299
- self,
300
- instruction,
301
- time_offset: int,
302
- ) -> PulseQobjInstruction:
303
- """Return converted `ShiftPhase`.
304
-
305
- Args:
306
- instruction: Qiskit Pulse shift phase instruction.
307
- time_offset: Offset time.
308
-
309
- Returns:
310
- Qobj instruction data.
311
- """
312
- command_dict = {
313
- "name": "fc",
314
- "t0": time_offset + instruction.start_time,
315
- "ch": instruction.channel.name,
316
- "phase": instruction.phase,
317
- }
318
- return self._qobj_model(**command_dict)
319
-
320
- @_convert_instruction.register(instructions.Delay)
321
- def _convert_delay(
322
- self,
323
- instruction,
324
- time_offset: int,
325
- ) -> PulseQobjInstruction:
326
- """Return converted `Delay`.
327
-
328
- Args:
329
- instruction: Qiskit Pulse delay instruction.
330
- time_offset: Offset time.
331
-
332
- Returns:
333
- Qobj instruction data.
334
- """
335
- command_dict = {
336
- "name": "delay",
337
- "t0": time_offset + instruction.start_time,
338
- "ch": instruction.channel.name,
339
- "duration": instruction.duration,
340
- }
341
- return self._qobj_model(**command_dict)
342
-
343
- @_convert_instruction.register(instructions.Play)
344
- def _convert_play(
345
- self,
346
- instruction,
347
- time_offset: int,
348
- ) -> PulseQobjInstruction:
349
- """Return converted `Play`.
350
-
351
- Args:
352
- instruction: Qiskit Pulse play instruction.
353
- time_offset: Offset time.
354
-
355
- Returns:
356
- Qobj instruction data.
357
- """
358
- if isinstance(instruction.pulse, library.SymbolicPulse):
359
- params = dict(instruction.pulse.parameters)
360
- # IBM backends expect "amp" to be the complex amplitude
361
- if "amp" in params and "angle" in params:
362
- params["amp"] = complex(params["amp"] * np.exp(1j * params["angle"]))
363
- del params["angle"]
364
-
365
- command_dict = {
366
- "name": "parametric_pulse",
367
- "pulse_shape": ParametricPulseShapes.from_instance(instruction.pulse).name,
368
- "t0": time_offset + instruction.start_time,
369
- "ch": instruction.channel.name,
370
- "parameters": params,
371
- }
372
- else:
373
- command_dict = {
374
- "name": instruction.name,
375
- "t0": time_offset + instruction.start_time,
376
- "ch": instruction.channel.name,
377
- }
378
-
379
- return self._qobj_model(**command_dict)
380
-
381
- @_convert_instruction.register(instructions.Snapshot)
382
- def _convert_snapshot(
383
- self,
384
- instruction,
385
- time_offset: int,
386
- ) -> PulseQobjInstruction:
387
- """Return converted `Snapshot`.
388
-
389
- Args:
390
- time_offset: Offset time.
391
- instruction: Qiskit Pulse snapshot instruction.
392
-
393
- Returns:
394
- Qobj instruction data.
395
- """
396
- command_dict = {
397
- "name": "snapshot",
398
- "t0": time_offset + instruction.start_time,
399
- "label": instruction.label,
400
- "type": instruction.type,
401
- }
402
- return self._qobj_model(**command_dict)
403
-
404
- def _convert_bundled_acquire(
405
- self,
406
- instruction_bundle: List[instructions.Acquire],
407
- time_offset: int,
408
- ) -> PulseQobjInstruction:
409
- """Return converted list of parallel `Acquire` instructions.
410
-
411
- Args:
412
- instruction_bundle: List of Qiskit Pulse acquire instruction.
413
- time_offset: Offset time.
414
-
415
- Returns:
416
- Qobj instruction data.
417
-
418
- Raises:
419
- QiskitError: When instructions are not aligned.
420
- QiskitError: When instructions have different duration.
421
- QiskitError: When discriminator or kernel is missing in a part of instructions.
422
- """
423
- meas_level = self._run_config.get("meas_level", 2)
424
-
425
- t0 = instruction_bundle[0].start_time
426
- duration = instruction_bundle[0].duration
427
- memory_slots = []
428
- register_slots = []
429
- qubits = []
430
- discriminators = []
431
- kernels = []
432
-
433
- for instruction in instruction_bundle:
434
- qubits.append(instruction.channel.index)
435
-
436
- if instruction.start_time != t0:
437
- raise QiskitError(
438
- "The supplied acquire instructions have different starting times. "
439
- "Something has gone wrong calling this code. Please report this "
440
- "issue."
441
- )
442
-
443
- if instruction.duration != duration:
444
- raise QiskitError(
445
- "Acquire instructions beginning at the same time must have same duration."
446
- )
447
-
448
- if instruction.mem_slot:
449
- memory_slots.append(instruction.mem_slot.index)
450
-
451
- if meas_level == MeasLevel.CLASSIFIED:
452
- # setup discriminators
453
- if instruction.discriminator:
454
- discriminators.append(
455
- QobjMeasurementOption(
456
- name=instruction.discriminator.name,
457
- params=instruction.discriminator.params,
458
- )
459
- )
460
- # setup register_slots
461
- if instruction.reg_slot:
462
- register_slots.append(instruction.reg_slot.index)
463
-
464
- if meas_level in [MeasLevel.KERNELED, MeasLevel.CLASSIFIED]:
465
- # setup kernels
466
- if instruction.kernel:
467
- kernels.append(
468
- QobjMeasurementOption(
469
- name=instruction.kernel.name, params=instruction.kernel.params
470
- )
471
- )
472
- command_dict = {
473
- "name": "acquire",
474
- "t0": time_offset + t0,
475
- "duration": duration,
476
- "qubits": qubits,
477
- }
478
- if memory_slots:
479
- command_dict["memory_slot"] = memory_slots
480
-
481
- if register_slots:
482
- command_dict["register_slot"] = register_slots
483
-
484
- if discriminators:
485
- num_discriminators = len(discriminators)
486
- if num_discriminators == len(qubits) or num_discriminators == 1:
487
- command_dict["discriminators"] = discriminators
488
- else:
489
- raise QiskitError(
490
- "A discriminator must be supplied for every acquisition or a single "
491
- "discriminator for all acquisitions."
492
- )
493
-
494
- if kernels:
495
- num_kernels = len(kernels)
496
- if num_kernels == len(qubits) or num_kernels == 1:
497
- command_dict["kernels"] = kernels
498
- else:
499
- raise QiskitError(
500
- "A kernel must be supplied for every acquisition or a single "
501
- "kernel for all acquisitions."
502
- )
503
-
504
- return self._qobj_model(**command_dict)
505
-
506
-
507
- class QobjToInstructionConverter:
508
- """Converts Qobj data into Qiskit Pulse in-memory representation.
509
-
510
- This converter converts data from transfer layer into the in-memory representation of
511
- the front-end of Qiskit Pulse.
512
-
513
- The transfer layer format must be the text representation that conforms to
514
- the `OpenPulse specification<https://arxiv.org/abs/1809.03452>`__.
515
- Extension to the OpenPulse can be achieved by subclassing this this with
516
- extra methods corresponding to each augmented instruction. For example,
517
-
518
- .. code-block:: python
519
-
520
- class MyConverter(QobjToInstructionConverter):
521
-
522
- def get_supported_instructions(self):
523
- instructions = super().get_supported_instructions()
524
- instructions += ["new_inst"]
525
-
526
- return instructions
527
-
528
- def _convert_new_inst(self, instruction):
529
- return NewInstruction(...)
530
-
531
- where ``NewInstruction`` must be a subclass of :class:`~qiskit.pulse.instructions.Instruction`.
532
- """
533
-
534
- __chan_regex__ = re.compile(r"([a-zA-Z]+)(\d+)")
535
-
536
- @deprecate_pulse_dependency
537
- def __init__(
538
- self,
539
- pulse_library: Optional[List[PulseLibraryItem]] = None,
540
- **run_config,
541
- ):
542
- """Create new converter.
543
-
544
- Args:
545
- pulse_library: Pulse library in Qobj format.
546
- run_config: Run configuration.
547
- """
548
- pulse_library_dict = {}
549
- for lib_item in pulse_library:
550
- pulse_library_dict[lib_item.name] = lib_item.samples
551
-
552
- self._pulse_library = pulse_library_dict
553
- self._run_config = run_config
554
-
555
- def __call__(self, instruction: PulseQobjInstruction) -> Schedule:
556
- """Convert Qobj instruction to Qiskit in-memory representation.
557
-
558
- Args:
559
- instruction: Instruction data in Qobj format.
560
-
561
- Returns:
562
- Scheduled Qiskit Pulse instruction in Schedule format.
563
- """
564
- schedule = Schedule()
565
- for inst in self._get_sequences(instruction):
566
- schedule.insert(instruction.t0, inst, inplace=True)
567
- return schedule
568
-
569
- def _get_sequences(
570
- self,
571
- instruction: PulseQobjInstruction,
572
- ) -> Iterator[instructions.Instruction]:
573
- """A method to iterate over pulse instructions without creating Schedule.
574
-
575
- .. note::
576
-
577
- This is internal fast-path function, and callers other than this converter class
578
- might directly use this method to generate schedule from multiple
579
- Qobj instructions. Because __call__ always returns a schedule with the time offset
580
- parsed instruction, composing multiple Qobj instructions to create
581
- a gate schedule is somewhat inefficient due to composing overhead of schedules.
582
- Directly combining instructions with this method is much performant.
583
-
584
- Args:
585
- instruction: Instruction data in Qobj format.
586
-
587
- Yields:
588
- Qiskit Pulse instructions.
589
-
590
- :meta public:
591
- """
592
- try:
593
- method = getattr(self, f"_convert_{instruction.name}")
594
- except AttributeError:
595
- method = self._convert_generic
596
-
597
- yield from method(instruction)
598
-
599
- def get_supported_instructions(self) -> List[str]:
600
- """Retrun a list of supported instructions."""
601
- return [
602
- "acquire",
603
- "setp",
604
- "fc",
605
- "setf",
606
- "shiftf",
607
- "delay",
608
- "parametric_pulse",
609
- "snapshot",
610
- ]
611
-
612
- def get_channel(self, channel: str) -> channels.PulseChannel:
613
- """Parse and retrieve channel from ch string.
614
-
615
- Args:
616
- channel: String identifier of pulse instruction channel.
617
-
618
- Returns:
619
- Matched channel object.
620
-
621
- Raises:
622
- QiskitError: Is raised if valid channel is not matched
623
- """
624
- match = self.__chan_regex__.match(channel)
625
- if match:
626
- prefix, index = match.group(1), int(match.group(2))
627
-
628
- if prefix == channels.DriveChannel.prefix:
629
- return channels.DriveChannel(index)
630
- elif prefix == channels.MeasureChannel.prefix:
631
- return channels.MeasureChannel(index)
632
- elif prefix == channels.ControlChannel.prefix:
633
- return channels.ControlChannel(index)
634
-
635
- raise QiskitError(f"Channel {channel} is not valid")
636
-
637
- @staticmethod
638
- def disassemble_value(value_expr: Union[float, str]) -> Union[float, ParameterExpression]:
639
- """A helper function to format instruction operand.
640
-
641
- If parameter in string representation is specified, this method parses the
642
- input string and generates Qiskit ParameterExpression object.
643
-
644
- Args:
645
- value_expr: Operand value in Qobj.
646
-
647
- Returns:
648
- Parsed operand value. ParameterExpression object is returned if value is not number.
649
- """
650
- if isinstance(value_expr, str):
651
- str_expr = parse_string_expr(value_expr, partial_binding=False)
652
- value_expr = str_expr(**{pname: Parameter(pname) for pname in str_expr.params})
653
-
654
- return value_expr
655
-
656
- def _convert_acquire(
657
- self,
658
- instruction: PulseQobjInstruction,
659
- ) -> Iterator[instructions.Instruction]:
660
- """Return converted `Acquire` instruction.
661
-
662
- Args:
663
- instruction: Acquire qobj
664
-
665
- Yields:
666
- Qiskit Pulse acquire instructions
667
- """
668
- duration = instruction.duration
669
- qubits = instruction.qubits
670
- acquire_channels = [channels.AcquireChannel(qubit) for qubit in qubits]
671
-
672
- mem_slots = [channels.MemorySlot(instruction.memory_slot[i]) for i in range(len(qubits))]
673
-
674
- if hasattr(instruction, "register_slot"):
675
- register_slots = [
676
- channels.RegisterSlot(instruction.register_slot[i]) for i in range(len(qubits))
677
- ]
678
- else:
679
- register_slots = [None] * len(qubits)
680
-
681
- discriminators = (
682
- instruction.discriminators if hasattr(instruction, "discriminators") else None
683
- )
684
- if not isinstance(discriminators, list):
685
- discriminators = [discriminators]
686
- if any(discriminators[i] != discriminators[0] for i in range(len(discriminators))):
687
- warnings.warn(
688
- "Can currently only support one discriminator per acquire. Defaulting "
689
- "to first discriminator entry."
690
- )
691
- discriminator = discriminators[0]
692
- if discriminator:
693
- discriminator = Discriminator(name=discriminators[0].name, **discriminators[0].params)
694
-
695
- kernels = instruction.kernels if hasattr(instruction, "kernels") else None
696
- if not isinstance(kernels, list):
697
- kernels = [kernels]
698
- if any(kernels[0] != kernels[i] for i in range(len(kernels))):
699
- warnings.warn(
700
- "Can currently only support one kernel per acquire. Defaulting to first "
701
- "kernel entry."
702
- )
703
- kernel = kernels[0]
704
- if kernel:
705
- kernel = Kernel(name=kernels[0].name, **kernels[0].params)
706
-
707
- for acquire_channel, mem_slot, reg_slot in zip(acquire_channels, mem_slots, register_slots):
708
- yield instructions.Acquire(
709
- duration,
710
- acquire_channel,
711
- mem_slot=mem_slot,
712
- reg_slot=reg_slot,
713
- kernel=kernel,
714
- discriminator=discriminator,
715
- )
716
-
717
- def _convert_setp(
718
- self,
719
- instruction: PulseQobjInstruction,
720
- ) -> Iterator[instructions.Instruction]:
721
- """Return converted `SetPhase` instruction.
722
-
723
- Args:
724
- instruction: SetPhase qobj instruction
725
-
726
- Yields:
727
- Qiskit Pulse set phase instructions
728
- """
729
- channel = self.get_channel(instruction.ch)
730
- phase = self.disassemble_value(instruction.phase)
731
-
732
- yield instructions.SetPhase(phase, channel)
733
-
734
- def _convert_fc(
735
- self,
736
- instruction: PulseQobjInstruction,
737
- ) -> Iterator[instructions.Instruction]:
738
- """Return converted `ShiftPhase` instruction.
739
-
740
- Args:
741
- instruction: ShiftPhase qobj instruction
742
-
743
- Yields:
744
- Qiskit Pulse shift phase schedule instructions
745
- """
746
- channel = self.get_channel(instruction.ch)
747
- phase = self.disassemble_value(instruction.phase)
748
-
749
- yield instructions.ShiftPhase(phase, channel)
750
-
751
- def _convert_setf(
752
- self,
753
- instruction: PulseQobjInstruction,
754
- ) -> Iterator[instructions.Instruction]:
755
- """Return converted `SetFrequencyInstruction` instruction.
756
-
757
- .. note::
758
-
759
- We assume frequency value is expressed in string with "GHz".
760
- Operand value is thus scaled by a factor of 10^9.
761
-
762
- Args:
763
- instruction: SetFrequency qobj instruction
764
-
765
- Yields:
766
- Qiskit Pulse set frequency instructions
767
- """
768
- channel = self.get_channel(instruction.ch)
769
- frequency = self.disassemble_value(instruction.frequency) * 10**9
770
-
771
- yield instructions.SetFrequency(frequency, channel)
772
-
773
- def _convert_shiftf(
774
- self,
775
- instruction: PulseQobjInstruction,
776
- ) -> Iterator[instructions.Instruction]:
777
- """Return converted `ShiftFrequency` instruction.
778
-
779
- .. note::
780
-
781
- We assume frequency value is expressed in string with "GHz".
782
- Operand value is thus scaled by a factor of 10^9.
783
-
784
- Args:
785
- instruction: ShiftFrequency qobj instruction
786
-
787
- Yields:
788
- Qiskit Pulse shift frequency schedule instructions
789
- """
790
- channel = self.get_channel(instruction.ch)
791
- frequency = self.disassemble_value(instruction.frequency) * 10**9
792
-
793
- yield instructions.ShiftFrequency(frequency, channel)
794
-
795
- def _convert_delay(
796
- self,
797
- instruction: PulseQobjInstruction,
798
- ) -> Iterator[instructions.Instruction]:
799
- """Return converted `Delay` instruction.
800
-
801
- Args:
802
- instruction: Delay qobj instruction
803
-
804
- Yields:
805
- Qiskit Pulse delay instructions
806
- """
807
- channel = self.get_channel(instruction.ch)
808
- duration = instruction.duration
809
-
810
- yield instructions.Delay(duration, channel)
811
-
812
- def _convert_parametric_pulse(
813
- self,
814
- instruction: PulseQobjInstruction,
815
- ) -> Iterator[instructions.Instruction]:
816
- """Return converted `Play` instruction with parametric pulse operand.
817
-
818
- .. note::
819
-
820
- If parametric pulse label is not provided by the backend, this method naively generates
821
- a pulse name based on the pulse shape and bound parameters. This pulse name is formatted
822
- to, for example, `gaussian_a4e3`, here the last four digits are a part of
823
- the hash string generated based on the pulse shape and the parameters.
824
- Because we are using a truncated hash for readability,
825
- there may be a small risk of pulse name collision with other pulses.
826
- Basically the parametric pulse name is used just for visualization purpose and
827
- the pulse module should not have dependency on the parametric pulse names.
828
-
829
- Args:
830
- instruction: Play qobj instruction with parametric pulse
831
-
832
- Yields:
833
- Qiskit Pulse play schedule instructions
834
- """
835
- channel = self.get_channel(instruction.ch)
836
-
837
- try:
838
- pulse_name = instruction.label
839
- except AttributeError:
840
- sorted_params = sorted(instruction.parameters.items(), key=lambda x: x[0])
841
- base_str = f"{instruction.pulse_shape}_{str(sorted_params)}"
842
- short_pulse_id = hashlib.md5(base_str.encode("utf-8")).hexdigest()[:4]
843
- pulse_name = f"{instruction.pulse_shape}_{short_pulse_id}"
844
- params = dict(instruction.parameters)
845
- if "amp" in params and isinstance(params["amp"], complex):
846
- params["angle"] = np.angle(params["amp"])
847
- params["amp"] = np.abs(params["amp"])
848
- pulse = ParametricPulseShapes.to_type(instruction.pulse_shape)(**params, name=pulse_name)
849
-
850
- yield instructions.Play(pulse, channel)
851
-
852
- def _convert_snapshot(
853
- self,
854
- instruction: PulseQobjInstruction,
855
- ) -> Iterator[instructions.Instruction]:
856
- """Return converted `Snapshot` instruction.
857
-
858
- Args:
859
- instruction: Snapshot qobj instruction
860
-
861
- Yields:
862
- Qiskit Pulse snapshot instructions
863
- """
864
- yield instructions.Snapshot(instruction.label, instruction.type)
865
-
866
- def _convert_generic(
867
- self,
868
- instruction: PulseQobjInstruction,
869
- ) -> Iterator[instructions.Instruction]:
870
- """Convert generic pulse instruction.
871
-
872
- Args:
873
- instruction: Generic qobj instruction
874
-
875
- Yields:
876
- Qiskit Pulse generic instructions
877
-
878
- Raises:
879
- QiskitError: When instruction name not found.
880
- """
881
- if instruction.name in self._pulse_library:
882
- waveform = library.Waveform(
883
- samples=self._pulse_library[instruction.name],
884
- name=instruction.name,
885
- )
886
- channel = self.get_channel(instruction.ch)
887
-
888
- yield instructions.Play(waveform, channel)
889
- else:
890
- if qubits := getattr(instruction, "qubits", None):
891
- msg = f"qubits {qubits}"
892
- else:
893
- msg = f"channel {instruction.ch}"
894
- raise QiskitError(
895
- f"Instruction {instruction.name} on {msg} is not found "
896
- "in Qiskit namespace. This instruction cannot be deserialized."
897
- )