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,367 +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
-
14
- """Assemble function for converting a list of circuits into a qobj."""
15
- import hashlib
16
- from collections import defaultdict
17
- from typing import Any, Dict, List, Tuple, Union
18
-
19
- from qiskit import qobj, pulse
20
- from qiskit.assembler.run_config import RunConfig
21
- from qiskit.exceptions import QiskitError
22
- from qiskit.pulse import instructions, transforms, library, schedule, channels
23
- from qiskit.qobj import utils as qobj_utils, converters
24
- from qiskit.qobj.converters.pulse_instruction import ParametricPulseShapes
25
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
26
-
27
-
28
- @deprecate_pulse_dependency
29
- def assemble_schedules(
30
- schedules: List[
31
- Union[
32
- schedule.ScheduleBlock,
33
- schedule.ScheduleComponent,
34
- Tuple[int, schedule.ScheduleComponent],
35
- ]
36
- ],
37
- qobj_id: int,
38
- qobj_header: qobj.QobjHeader,
39
- run_config: RunConfig,
40
- ) -> qobj.PulseQobj:
41
- """Assembles a list of schedules into a qobj that can be run on the backend.
42
-
43
- Args:
44
- schedules: Schedules to assemble.
45
- qobj_id: Identifier for the generated qobj.
46
- qobj_header: Header to pass to the results.
47
- run_config: Configuration of the runtime environment.
48
-
49
- Returns:
50
- The Qobj to be run on the backends.
51
-
52
- Raises:
53
- QiskitError: when frequency settings are not supplied.
54
-
55
- Examples:
56
-
57
- .. code-block:: python
58
-
59
- from qiskit import pulse
60
- from qiskit.assembler import assemble_schedules
61
- from qiskit.assembler.run_config import RunConfig
62
- # Construct a Qobj header for the output Qobj
63
- header = {"backend_name": "FakeOpenPulse2Q", "backend_version": "0.0.0"}
64
- # Build a configuration object for the output Qobj
65
- config = RunConfig(shots=1024,
66
- memory=False,
67
- meas_level=1,
68
- meas_return='avg',
69
- memory_slot_size=100,
70
- parametric_pulses=[],
71
- init_qubits=True,
72
- qubit_lo_freq=[4900000000.0, 5000000000.0],
73
- meas_lo_freq=[6500000000.0, 6600000000.0],
74
- schedule_los=[])
75
- # Build a Pulse schedule to assemble into a Qobj
76
- schedule = pulse.Schedule()
77
- schedule += pulse.Play(pulse.Waveform([0.1] * 16, name="test0"),
78
- pulse.DriveChannel(0),
79
- name="test1")
80
- schedule += pulse.Play(pulse.Waveform([0.1] * 16, name="test1"),
81
- pulse.DriveChannel(0),
82
- name="test2")
83
- schedule += pulse.Play(pulse.Waveform([0.5] * 16, name="test0"),
84
- pulse.DriveChannel(0),
85
- name="test1")
86
- # Assemble a Qobj from the schedule.
87
- pulseQobj = assemble_schedules(schedules=[schedule],
88
- qobj_id="custom-id",
89
- qobj_header=header,
90
- run_config=config)
91
- """
92
- if not hasattr(run_config, "qubit_lo_freq"):
93
- raise QiskitError("qubit_lo_freq must be supplied.")
94
- if not hasattr(run_config, "meas_lo_freq"):
95
- raise QiskitError("meas_lo_freq must be supplied.")
96
-
97
- lo_converter = converters.LoConfigConverter(
98
- qobj.PulseQobjExperimentConfig, **run_config.to_dict()
99
- )
100
- experiments, experiment_config = _assemble_experiments(schedules, lo_converter, run_config)
101
- qobj_config = _assemble_config(lo_converter, experiment_config, run_config)
102
-
103
- return qobj.PulseQobj(
104
- experiments=experiments, qobj_id=qobj_id, header=qobj_header, config=qobj_config
105
- )
106
-
107
-
108
- def _assemble_experiments(
109
- schedules: List[Union[schedule.ScheduleComponent, Tuple[int, schedule.ScheduleComponent]]],
110
- lo_converter: converters.LoConfigConverter,
111
- run_config: RunConfig,
112
- ) -> Tuple[List[qobj.PulseQobjExperiment], Dict[str, Any]]:
113
- """Assembles a list of schedules into PulseQobjExperiments, and returns related metadata that
114
- will be assembled into the Qobj configuration.
115
-
116
- Args:
117
- schedules: Schedules to assemble.
118
- lo_converter: The configured frequency converter and validator.
119
- run_config: Configuration of the runtime environment.
120
-
121
- Returns:
122
- The list of assembled experiments, and the dictionary of related experiment config.
123
-
124
- Raises:
125
- QiskitError: when frequency settings are not compatible with the experiments.
126
- """
127
- freq_configs = [lo_converter(lo_dict) for lo_dict in getattr(run_config, "schedule_los", [])]
128
-
129
- if len(schedules) > 1 and len(freq_configs) not in [0, 1, len(schedules)]:
130
- raise QiskitError(
131
- "Invalid 'schedule_los' setting specified. If specified, it should be "
132
- "either have a single entry to apply the same LOs for each schedule or "
133
- "have length equal to the number of schedules."
134
- )
135
-
136
- instruction_converter = getattr(
137
- run_config, "instruction_converter", converters.InstructionToQobjConverter
138
- )
139
- instruction_converter = instruction_converter(qobj.PulseQobjInstruction, **run_config.to_dict())
140
-
141
- formatted_schedules = [transforms.target_qobj_transform(sched) for sched in schedules]
142
- compressed_schedules = transforms.compress_pulses(formatted_schedules)
143
-
144
- user_pulselib = {}
145
- experiments = []
146
- for idx, sched in enumerate(compressed_schedules):
147
- qobj_instructions, max_memory_slot = _assemble_instructions(
148
- sched, instruction_converter, run_config, user_pulselib
149
- )
150
-
151
- metadata = sched.metadata
152
- if metadata is None:
153
- metadata = {}
154
- # TODO: add other experimental header items (see circuit assembler)
155
- qobj_experiment_header = qobj.QobjExperimentHeader(
156
- memory_slots=max_memory_slot + 1, # Memory slots are 0 indexed
157
- name=sched.name or f"Experiment-{idx}",
158
- metadata=metadata,
159
- )
160
-
161
- experiment = qobj.PulseQobjExperiment(
162
- header=qobj_experiment_header, instructions=qobj_instructions
163
- )
164
- if freq_configs:
165
- # This handles the cases where one frequency setting applies to all experiments and
166
- # where each experiment has a different frequency
167
- freq_idx = idx if len(freq_configs) != 1 else 0
168
- experiment.config = freq_configs[freq_idx]
169
-
170
- experiments.append(experiment)
171
-
172
- # Frequency sweep
173
- if freq_configs and len(experiments) == 1:
174
- experiment = experiments[0]
175
- experiments = []
176
- for freq_config in freq_configs:
177
- experiments.append(
178
- qobj.PulseQobjExperiment(
179
- header=experiment.header,
180
- instructions=experiment.instructions,
181
- config=freq_config,
182
- )
183
- )
184
-
185
- # Top level Qobj configuration
186
- experiment_config = {
187
- "pulse_library": [
188
- qobj.PulseLibraryItem(name=name, samples=samples)
189
- for name, samples in user_pulselib.items()
190
- ],
191
- "memory_slots": max(exp.header.memory_slots for exp in experiments),
192
- }
193
-
194
- return experiments, experiment_config
195
-
196
-
197
- def _assemble_instructions(
198
- sched: Union[pulse.Schedule, pulse.ScheduleBlock],
199
- instruction_converter: converters.InstructionToQobjConverter,
200
- run_config: RunConfig,
201
- user_pulselib: Dict[str, List[complex]],
202
- ) -> Tuple[List[qobj.PulseQobjInstruction], int]:
203
- """Assembles the instructions in a schedule into a list of PulseQobjInstructions and returns
204
- related metadata that will be assembled into the Qobj configuration. Lookup table for
205
- pulses defined in all experiments are registered in ``user_pulselib``. This object should be
206
- mutable python dictionary so that items are properly updated after each instruction assemble.
207
- The dictionary is not returned to avoid redundancy.
208
-
209
- Args:
210
- sched: Schedule to assemble.
211
- instruction_converter: A converter instance which can convert PulseInstructions to
212
- PulseQobjInstructions.
213
- run_config: Configuration of the runtime environment.
214
- user_pulselib: User pulse library from previous schedule.
215
-
216
- Returns:
217
- A list of converted instructions, the user pulse library dictionary (from pulse name to
218
- pulse samples), and the maximum number of readout memory slots used by this Schedule.
219
- """
220
- sched = transforms.target_qobj_transform(sched)
221
-
222
- max_memory_slot = 0
223
- qobj_instructions = []
224
-
225
- acquire_instruction_map = defaultdict(list)
226
- for time, instruction in sched.instructions:
227
-
228
- if isinstance(instruction, instructions.Play):
229
- if isinstance(instruction.pulse, library.SymbolicPulse):
230
- is_backend_supported = True
231
- try:
232
- pulse_shape = ParametricPulseShapes.from_instance(instruction.pulse).name
233
- if pulse_shape not in run_config.parametric_pulses:
234
- is_backend_supported = False
235
- except ValueError:
236
- # Custom pulse class, or bare SymbolicPulse object.
237
- is_backend_supported = False
238
-
239
- if not is_backend_supported:
240
- instruction = instructions.Play(
241
- instruction.pulse.get_waveform(), instruction.channel, name=instruction.name
242
- )
243
-
244
- if isinstance(instruction.pulse, library.Waveform):
245
- name = hashlib.sha256(instruction.pulse.samples).hexdigest()
246
- instruction = instructions.Play(
247
- library.Waveform(name=name, samples=instruction.pulse.samples),
248
- channel=instruction.channel,
249
- name=name,
250
- )
251
- user_pulselib[name] = instruction.pulse.samples
252
-
253
- # ignore explicit delay instrs on acq channels as they are invalid on IBMQ backends;
254
- # timing of other instrs will still be shifted appropriately
255
- if isinstance(instruction, instructions.Delay) and isinstance(
256
- instruction.channel, channels.AcquireChannel
257
- ):
258
- continue
259
-
260
- if isinstance(instruction, instructions.Acquire):
261
- if instruction.mem_slot:
262
- max_memory_slot = max(max_memory_slot, instruction.mem_slot.index)
263
- # Acquires have a single AcquireChannel per inst, but we have to bundle them
264
- # together into the Qobj as one instruction with many channels
265
- acquire_instruction_map[(time, instruction.duration)].append(instruction)
266
- continue
267
-
268
- qobj_instructions.append(instruction_converter(time, instruction))
269
-
270
- if acquire_instruction_map:
271
- if hasattr(run_config, "meas_map"):
272
- _validate_meas_map(acquire_instruction_map, run_config.meas_map)
273
- for (time, _), instruction_bundle in acquire_instruction_map.items():
274
- qobj_instructions.append(
275
- instruction_converter(time, instruction_bundle),
276
- )
277
-
278
- return qobj_instructions, max_memory_slot
279
-
280
-
281
- def _validate_meas_map(
282
- instruction_map: Dict[Tuple[int, instructions.Acquire], List[instructions.Acquire]],
283
- meas_map: List[List[int]],
284
- ) -> None:
285
- """Validate all qubits tied in ``meas_map`` are to be acquired.
286
-
287
- Args:
288
- instruction_map: A dictionary grouping Acquire instructions according to their start time
289
- and duration.
290
- meas_map: List of groups of qubits that must be acquired together.
291
-
292
- Raises:
293
- QiskitError: If the instructions do not satisfy the measurement map.
294
- """
295
- sorted_inst_map = sorted(instruction_map.items(), key=lambda item: item[0])
296
- meas_map_sets = [set(m) for m in meas_map]
297
-
298
- # error if there is time overlap between qubits in the same meas_map
299
- for idx, inst in enumerate(sorted_inst_map[:-1]):
300
- inst_end_time = inst[0][0] + inst[0][1]
301
- next_inst = sorted_inst_map[idx + 1]
302
- next_inst_time = next_inst[0][0]
303
- if next_inst_time < inst_end_time:
304
- inst_qubits = {inst.channel.index for inst in inst[1]}
305
- next_inst_qubits = {inst.channel.index for inst in next_inst[1]}
306
- for meas_set in meas_map_sets:
307
- common_instr_qubits = inst_qubits.intersection(meas_set)
308
- common_next = next_inst_qubits.intersection(meas_set)
309
- if common_instr_qubits and common_next:
310
- raise QiskitError(
311
- f"Qubits {common_instr_qubits} and {common_next} are in the same measurement "
312
- f"grouping: {meas_map}. "
313
- "They must either be acquired at the same time, or disjointly"
314
- f". Instead, they were acquired at times: {inst[0][0]}-{inst_end_time} and "
315
- f"{next_inst_time}-{next_inst_time + next_inst[0][1]}"
316
- )
317
-
318
-
319
- def _assemble_config(
320
- lo_converter: converters.LoConfigConverter,
321
- experiment_config: Dict[str, Any],
322
- run_config: RunConfig,
323
- ) -> qobj.PulseQobjConfig:
324
- """Assembles the QobjConfiguration from experimental config and runtime config.
325
-
326
- Args:
327
- lo_converter: The configured frequency converter and validator.
328
- experiment_config: Schedules to assemble.
329
- run_config: Configuration of the runtime environment.
330
-
331
- Returns:
332
- The assembled PulseQobjConfig.
333
- """
334
- qobj_config = run_config.to_dict()
335
- qobj_config.update(experiment_config)
336
-
337
- # Run config not needed in qobj config
338
- qobj_config.pop("meas_map", None)
339
- qobj_config.pop("qubit_lo_range", None)
340
- qobj_config.pop("meas_lo_range", None)
341
-
342
- # convert enums to serialized values
343
- meas_return = qobj_config.get("meas_return", "avg")
344
- if isinstance(meas_return, qobj_utils.MeasReturnType):
345
- qobj_config["meas_return"] = meas_return.value
346
-
347
- meas_level = qobj_config.get("meas_level", 2)
348
- if isinstance(meas_level, qobj_utils.MeasLevel):
349
- qobj_config["meas_level"] = meas_level.value
350
-
351
- # convert LO frequencies to GHz
352
- qobj_config["qubit_lo_freq"] = [freq / 1e9 for freq in qobj_config["qubit_lo_freq"]]
353
- qobj_config["meas_lo_freq"] = [freq / 1e9 for freq in qobj_config["meas_lo_freq"]]
354
-
355
- # override defaults if single entry for ``schedule_los``
356
- schedule_los = qobj_config.pop("schedule_los", [])
357
- if len(schedule_los) == 1:
358
- lo_dict = schedule_los[0]
359
- q_los = lo_converter.get_qubit_los(lo_dict)
360
- # Hz -> GHz
361
- if q_los:
362
- qobj_config["qubit_lo_freq"] = [freq / 1e9 for freq in q_los]
363
- m_los = lo_converter.get_meas_los(lo_dict)
364
- if m_los:
365
- qobj_config["meas_lo_freq"] = [freq / 1e9 for freq in m_los]
366
-
367
- return qobj.PulseQobjConfig(**qobj_config)
@@ -1,310 +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
- """Disassemble function for a qobj into a list of circuits and its config"""
14
- from typing import Any, Dict, List, NewType, Tuple, Union
15
- import collections
16
- import math
17
-
18
- from qiskit import pulse
19
- from qiskit.circuit.classicalregister import ClassicalRegister
20
- from qiskit.circuit.instruction import Instruction
21
- from qiskit.circuit.quantumcircuit import QuantumCircuit
22
- from qiskit.circuit.quantumregister import QuantumRegister
23
-
24
- from qiskit.qobj import PulseQobjInstruction
25
- from qiskit.qobj.converters import QobjToInstructionConverter
26
- from qiskit.utils import deprecate_func
27
-
28
- # A ``CircuitModule`` is a representation of a circuit execution on the backend.
29
- # It is currently a list of quantum circuits to execute, a run Qobj dictionary
30
- # and a header dictionary.
31
- CircuitModule = NewType(
32
- "CircuitModule", Tuple[List[QuantumCircuit], Dict[str, Any], Dict[str, Any]]
33
- )
34
-
35
- # A ``PulseModule`` is a representation of a pulse execution on the backend.
36
- # It is currently a list of pulse schedules to execute, a run Qobj dictionary
37
- # and a header dictionary.
38
- PulseModule = NewType("PulseModule", Tuple[List[pulse.Schedule], Dict[str, Any], Dict[str, Any]])
39
-
40
-
41
- @deprecate_func(
42
- since="1.2",
43
- removal_timeline="in the 2.0 release",
44
- additional_msg="The `Qobj` class and related functionality are part of the deprecated "
45
- "`BackendV1` workflow, and no longer necessary for `BackendV2`. If a user "
46
- "workflow requires `Qobj` it likely relies on deprecated functionality and "
47
- "should be updated to use `BackendV2`.",
48
- )
49
- def disassemble(qobj) -> Union[CircuitModule, PulseModule]:
50
- """Disassemble a qobj and return the circuits or pulse schedules, run_config, and user header.
51
-
52
- .. note::
53
-
54
- ``disassemble(assemble(qc))`` is not guaranteed to produce an exactly equal circuit to the
55
- input, due to limitations in the :obj:`.QasmQobj` format that need to be maintained for
56
- backend system compatibility. This is most likely to be the case when using newer features
57
- of :obj:`.QuantumCircuit`. In most cases, the output should be equivalent, if not quite
58
- equal.
59
-
60
- Args:
61
- qobj (Qobj): The input qobj object to disassemble
62
-
63
- Returns:
64
- Union[CircuitModule, PulseModule]: The disassembled program which consists of:
65
-
66
- * programs: A list of quantum circuits or pulse schedules
67
- * run_config: The dict of the run config
68
- * user_qobj_header: The dict of any user headers in the qobj
69
-
70
- Examples:
71
-
72
- .. code-block:: python
73
-
74
- from qiskit.circuit import QuantumRegister, ClassicalRegister, QuantumCircuit
75
- from qiskit.compiler.assembler import assemble
76
- from qiskit.assembler.disassemble import disassemble
77
- # Create a circuit to assemble into a qobj
78
- q = QuantumRegister(2)
79
- c = ClassicalRegister(2)
80
- qc = QuantumCircuit(q, c)
81
- qc.h(q[0])
82
- qc.cx(q[0], q[1])
83
- qc.measure(q, c)
84
- # Assemble the circuit into a Qobj
85
- qobj = assemble(qc, shots=2000, memory=True)
86
- # Disassemble the qobj back into a circuit
87
- circuits, run_config_out, headers = disassemble(qobj)
88
- """
89
- if qobj.type == "PULSE":
90
- return _disassemble_pulse_schedule(qobj)
91
- else:
92
- return _disassemble_circuit(qobj)
93
-
94
-
95
- def _disassemble_circuit(qobj) -> CircuitModule:
96
- run_config = qobj.config.to_dict()
97
-
98
- # convert lo freq back to Hz
99
- qubit_lo_freq = run_config.get("qubit_lo_freq", [])
100
- if qubit_lo_freq:
101
- run_config["qubit_lo_freq"] = [freq * 1e9 for freq in qubit_lo_freq]
102
-
103
- meas_lo_freq = run_config.get("meas_lo_freq", [])
104
- if meas_lo_freq:
105
- run_config["meas_lo_freq"] = [freq * 1e9 for freq in meas_lo_freq]
106
-
107
- user_qobj_header = qobj.header.to_dict()
108
- return CircuitModule((_experiments_to_circuits(qobj), run_config, user_qobj_header))
109
-
110
-
111
- def _qobj_to_circuit_cals(qobj, pulse_lib):
112
- """Return circuit calibrations dictionary from qobj/exp config calibrations."""
113
- qobj_cals = qobj.config.calibrations.to_dict()["gates"]
114
- converter = QobjToInstructionConverter(pulse_lib)
115
-
116
- qc_cals = {}
117
- for gate in qobj_cals:
118
- config = (tuple(gate["qubits"]), tuple(gate["params"]))
119
- cal = {
120
- config: pulse.Schedule(
121
- name=f"{gate['name']} {str(gate['params'])} {str(gate['qubits'])}"
122
- )
123
- }
124
- for instruction in gate["instructions"]:
125
- qobj_instruction = PulseQobjInstruction.from_dict(instruction)
126
- schedule = converter(qobj_instruction)
127
- cal[config] = cal[config].insert(schedule.ch_start_time(), schedule)
128
- if gate["name"] in qc_cals:
129
- qc_cals[gate["name"]].update(cal)
130
- else:
131
- qc_cals[gate["name"]] = cal
132
-
133
- return qc_cals
134
-
135
-
136
- def _experiments_to_circuits(qobj):
137
- """Return a list of QuantumCircuit object(s) from a qobj.
138
-
139
- Args:
140
- qobj (Qobj): The Qobj object to convert to QuantumCircuits
141
-
142
- Returns:
143
- list: A list of QuantumCircuit objects from the qobj
144
- """
145
- if not qobj.experiments:
146
- return None
147
-
148
- circuits = []
149
- for exp in qobj.experiments:
150
- quantum_registers = [QuantumRegister(i[1], name=i[0]) for i in exp.header.qreg_sizes]
151
- classical_registers = [ClassicalRegister(i[1], name=i[0]) for i in exp.header.creg_sizes]
152
- circuit = QuantumCircuit(*quantum_registers, *classical_registers, name=exp.header.name)
153
- qreg_dict = collections.OrderedDict()
154
- creg_dict = collections.OrderedDict()
155
- for reg in quantum_registers:
156
- qreg_dict[reg.name] = reg
157
- for reg in classical_registers:
158
- creg_dict[reg.name] = reg
159
- conditional = {}
160
- for i in exp.instructions:
161
- name = i.name
162
- qubits = []
163
- params = getattr(i, "params", [])
164
- try:
165
- for qubit in i.qubits:
166
- qubit_label = exp.header.qubit_labels[qubit]
167
- qubits.append(qreg_dict[qubit_label[0]][qubit_label[1]])
168
- except Exception: # pylint: disable=broad-except
169
- pass
170
- clbits = []
171
- try:
172
- for clbit in i.memory:
173
- clbit_label = exp.header.clbit_labels[clbit]
174
- clbits.append(creg_dict[clbit_label[0]][clbit_label[1]])
175
- except Exception: # pylint: disable=broad-except
176
- pass
177
- if hasattr(circuit, name):
178
- instr_method = getattr(circuit, name)
179
- if i.name == "initialize":
180
- _inst = instr_method(params, qubits)
181
- elif i.name in ["mcx", "mcu1", "mcp"]:
182
- _inst = instr_method(*params, qubits[:-1], qubits[-1], *clbits)
183
- else:
184
- _inst = instr_method(*params, *qubits, *clbits)
185
- elif name == "bfunc":
186
- conditional["value"] = int(i.val, 16)
187
- full_bit_size = sum(creg_dict[x].size for x in creg_dict)
188
- mask_map = {}
189
- raw_map = {}
190
- raw = []
191
-
192
- for creg in creg_dict:
193
- size = creg_dict[creg].size
194
- reg_raw = [1] * size
195
- if not raw:
196
- raw = reg_raw
197
- else:
198
- for pos, val in enumerate(raw):
199
- if val == 1:
200
- raw[pos] = 0
201
- raw = reg_raw + raw
202
- mask = [0] * (full_bit_size - len(raw)) + raw
203
- raw_map[creg] = mask
204
- mask_map[int("".join(str(x) for x in mask), 2)] = creg
205
- if bin(int(i.mask, 16)).count("1") == 1:
206
- # The condition is on a single bit. This might be a single-bit condition, or it
207
- # might be a register of length one. The case that it's a single-bit condition
208
- # in a register of length one is ambiguous, and we choose to return a condition
209
- # on the register. This may not match the input circuit exactly, but is at
210
- # least equivalent.
211
- cbit = int(math.log2(int(i.mask, 16)))
212
- for reg in creg_dict.values():
213
- size = reg.size
214
- if cbit >= size:
215
- cbit -= size
216
- else:
217
- conditional["register"] = reg if reg.size == 1 else reg[cbit]
218
- break
219
- mask_str = bin(int(i.mask, 16))[2:].zfill(full_bit_size)
220
- mask = [int(item) for item in list(mask_str)]
221
- else:
222
- creg = mask_map[int(i.mask, 16)]
223
- conditional["register"] = creg_dict[creg]
224
- mask = raw_map[creg]
225
- val = int(i.val, 16)
226
- for j in reversed(mask):
227
- if j == 0:
228
- val = val >> 1
229
- else:
230
- conditional["value"] = val
231
- break
232
- else:
233
- _inst = temp_opaque_instruction = Instruction(
234
- name=name, num_qubits=len(qubits), num_clbits=len(clbits), params=params
235
- )
236
- circuit.append(temp_opaque_instruction, qubits, clbits)
237
- if conditional and name != "bfunc":
238
- _inst.c_if(conditional["register"], conditional["value"])
239
- conditional = {}
240
- pulse_lib = qobj.config.pulse_library if hasattr(qobj.config, "pulse_library") else []
241
- # The dict update method did not work here; could investigate in the future
242
- if hasattr(qobj.config, "calibrations"):
243
- circuit.calibrations = {
244
- **circuit.calibrations,
245
- **_qobj_to_circuit_cals(qobj, pulse_lib),
246
- }
247
- if hasattr(exp.config, "calibrations"):
248
- circuit.calibrations = {**circuit.calibrations, **_qobj_to_circuit_cals(exp, pulse_lib)}
249
- circuits.append(circuit)
250
- return circuits
251
-
252
-
253
- def _disassemble_pulse_schedule(qobj) -> PulseModule:
254
- run_config = qobj.config.to_dict()
255
- run_config.pop("pulse_library")
256
-
257
- qubit_lo_freq = run_config.get("qubit_lo_freq")
258
- if qubit_lo_freq:
259
- run_config["qubit_lo_freq"] = [freq * 1e9 for freq in qubit_lo_freq]
260
-
261
- meas_lo_freq = run_config.get("meas_lo_freq")
262
- if meas_lo_freq:
263
- run_config["meas_lo_freq"] = [freq * 1e9 for freq in meas_lo_freq]
264
-
265
- user_qobj_header = qobj.header.to_dict()
266
-
267
- # extract schedule lo settings
268
- schedule_los = []
269
- for program in qobj.experiments:
270
- program_los = {}
271
- if hasattr(program, "config"):
272
- if hasattr(program.config, "qubit_lo_freq"):
273
- for i, lo in enumerate(program.config.qubit_lo_freq):
274
- program_los[pulse.DriveChannel(i)] = lo * 1e9
275
-
276
- if hasattr(program.config, "meas_lo_freq"):
277
- for i, lo in enumerate(program.config.meas_lo_freq):
278
- program_los[pulse.MeasureChannel(i)] = lo * 1e9
279
-
280
- schedule_los.append(program_los)
281
-
282
- if any(schedule_los):
283
- run_config["schedule_los"] = schedule_los
284
-
285
- return PulseModule((_experiments_to_schedules(qobj), run_config, user_qobj_header))
286
-
287
-
288
- def _experiments_to_schedules(qobj) -> List[pulse.Schedule]:
289
- """Return a list of :class:`qiskit.pulse.Schedule` object(s) from a qobj.
290
-
291
- Args:
292
- qobj (Qobj): The Qobj object to convert to pulse schedules.
293
-
294
- Returns:
295
- A list of :class:`qiskit.pulse.Schedule` objects from the qobj
296
-
297
- Raises:
298
- pulse.PulseError: If a parameterized instruction is supplied.
299
- """
300
- converter = QobjToInstructionConverter(qobj.config.pulse_library)
301
-
302
- schedules = []
303
- for program in qobj.experiments:
304
- insts = []
305
- for inst in program.instructions:
306
- insts.append(converter(inst))
307
-
308
- schedule = pulse.Schedule(*insts)
309
- schedules.append(schedule)
310
- return schedules