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