qiskit 1.4.2__cp39-abi3-win_amd64.whl → 2.0.0rc2__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 (455) 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 +3 -7
  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 +7 -1
  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 +93 -130
  156. qiskit/qpy/binary_io/schedules.py +69 -439
  157. qiskit/qpy/binary_io/value.py +154 -31
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +34 -81
  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/evolution/lie_trotter.py +10 -7
  193. qiskit/synthesis/evolution/product_formula.py +44 -35
  194. qiskit/synthesis/evolution/qdrift.py +17 -24
  195. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  196. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  197. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  198. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  199. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  200. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  201. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  202. qiskit/synthesis/two_qubit/__init__.py +1 -0
  203. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  204. qiskit/transpiler/__init__.py +32 -232
  205. qiskit/transpiler/basepasses.py +20 -51
  206. qiskit/transpiler/layout.py +1 -1
  207. qiskit/transpiler/passes/__init__.py +2 -40
  208. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  209. qiskit/transpiler/passes/basis/decompose.py +1 -15
  210. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  211. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  212. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  213. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  214. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
  215. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  216. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  217. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  218. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  219. qiskit/transpiler/passes/optimization/__init__.py +1 -3
  220. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  221. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  222. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  224. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  225. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  226. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  227. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  228. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  229. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  230. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  231. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  232. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  233. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  234. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  235. qiskit/transpiler/passes/routing/__init__.py +0 -1
  236. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  237. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  238. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  239. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  240. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  241. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  242. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  243. qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
  244. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  245. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  246. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  247. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  248. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  249. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
  250. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  251. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  252. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  253. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  254. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  255. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  256. qiskit/transpiler/passes/utils/__init__.py +0 -1
  257. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  258. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  259. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  260. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  261. qiskit/transpiler/passmanager.py +13 -0
  262. qiskit/transpiler/passmanager_config.py +5 -81
  263. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  264. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  265. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
  266. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  267. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  268. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  269. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  270. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  271. qiskit/transpiler/target.py +67 -524
  272. qiskit/user_config.py +8 -4
  273. qiskit/utils/__init__.py +13 -12
  274. qiskit/utils/deprecation.py +4 -112
  275. qiskit/utils/optionals.py +11 -4
  276. qiskit/utils/parallel.py +214 -87
  277. qiskit/utils/units.py +4 -1
  278. qiskit/visualization/__init__.py +3 -7
  279. qiskit/visualization/array.py +4 -1
  280. qiskit/visualization/bloch.py +1 -1
  281. qiskit/visualization/circuit/_utils.py +19 -19
  282. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  283. qiskit/visualization/circuit/matplotlib.py +13 -23
  284. qiskit/visualization/circuit/text.py +7 -3
  285. qiskit/visualization/dag_visualization.py +2 -1
  286. qiskit/visualization/gate_map.py +39 -154
  287. qiskit/visualization/pass_manager_visualization.py +6 -2
  288. qiskit/visualization/state_visualization.py +6 -0
  289. qiskit/visualization/timeline/core.py +18 -12
  290. qiskit/visualization/timeline/interface.py +19 -18
  291. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/METADATA +2 -2
  292. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/RECORD +296 -443
  293. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/entry_points.txt +8 -2
  294. qiskit/assembler/__init__.py +0 -42
  295. qiskit/assembler/assemble_circuits.py +0 -451
  296. qiskit/assembler/assemble_schedules.py +0 -367
  297. qiskit/assembler/disassemble.py +0 -310
  298. qiskit/assembler/run_config.py +0 -77
  299. qiskit/circuit/bit.py +0 -106
  300. qiskit/circuit/classicalfunction/__init__.py +0 -152
  301. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  302. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  303. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  304. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  305. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  306. qiskit/circuit/classicalfunction/types.py +0 -18
  307. qiskit/circuit/classicalfunction/utils.py +0 -91
  308. qiskit/circuit/classicalregister.py +0 -57
  309. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  310. qiskit/circuit/quantumregister.py +0 -75
  311. qiskit/circuit/register.py +0 -246
  312. qiskit/compiler/assembler.py +0 -689
  313. qiskit/compiler/scheduler.py +0 -109
  314. qiskit/compiler/sequencer.py +0 -71
  315. qiskit/primitives/backend_estimator.py +0 -486
  316. qiskit/primitives/backend_sampler.py +0 -222
  317. qiskit/primitives/estimator.py +0 -172
  318. qiskit/primitives/sampler.py +0 -162
  319. qiskit/providers/backend_compat.py +0 -507
  320. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  321. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  322. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  327. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  335. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  339. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/fake_1q.py +0 -91
  344. qiskit/providers/fake_provider/fake_backend.py +0 -165
  345. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  346. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  347. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  348. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  349. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  350. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  351. qiskit/providers/models/__init__.py +0 -89
  352. qiskit/providers/models/backendconfiguration.py +0 -1040
  353. qiskit/providers/models/backendproperties.py +0 -535
  354. qiskit/providers/models/backendstatus.py +0 -104
  355. qiskit/providers/models/jobstatus.py +0 -77
  356. qiskit/providers/models/pulsedefaults.py +0 -305
  357. qiskit/providers/provider.py +0 -95
  358. qiskit/pulse/__init__.py +0 -158
  359. qiskit/pulse/builder.py +0 -2262
  360. qiskit/pulse/calibration_entries.py +0 -381
  361. qiskit/pulse/channels.py +0 -227
  362. qiskit/pulse/configuration.py +0 -245
  363. qiskit/pulse/exceptions.py +0 -45
  364. qiskit/pulse/filters.py +0 -309
  365. qiskit/pulse/instruction_schedule_map.py +0 -424
  366. qiskit/pulse/instructions/__init__.py +0 -67
  367. qiskit/pulse/instructions/acquire.py +0 -150
  368. qiskit/pulse/instructions/delay.py +0 -71
  369. qiskit/pulse/instructions/directives.py +0 -154
  370. qiskit/pulse/instructions/frequency.py +0 -135
  371. qiskit/pulse/instructions/instruction.py +0 -270
  372. qiskit/pulse/instructions/phase.py +0 -152
  373. qiskit/pulse/instructions/play.py +0 -99
  374. qiskit/pulse/instructions/reference.py +0 -100
  375. qiskit/pulse/instructions/snapshot.py +0 -82
  376. qiskit/pulse/library/__init__.py +0 -97
  377. qiskit/pulse/library/continuous.py +0 -430
  378. qiskit/pulse/library/pulse.py +0 -148
  379. qiskit/pulse/library/samplers/__init__.py +0 -15
  380. qiskit/pulse/library/samplers/decorators.py +0 -295
  381. qiskit/pulse/library/samplers/strategies.py +0 -71
  382. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  383. qiskit/pulse/library/waveform.py +0 -136
  384. qiskit/pulse/macros.py +0 -262
  385. qiskit/pulse/parameter_manager.py +0 -445
  386. qiskit/pulse/parser.py +0 -314
  387. qiskit/pulse/reference_manager.py +0 -58
  388. qiskit/pulse/schedule.py +0 -1854
  389. qiskit/pulse/transforms/__init__.py +0 -106
  390. qiskit/pulse/transforms/alignments.py +0 -406
  391. qiskit/pulse/transforms/base_transforms.py +0 -71
  392. qiskit/pulse/transforms/canonicalization.py +0 -498
  393. qiskit/pulse/transforms/dag.py +0 -122
  394. qiskit/pulse/utils.py +0 -149
  395. qiskit/qobj/__init__.py +0 -75
  396. qiskit/qobj/common.py +0 -81
  397. qiskit/qobj/converters/__init__.py +0 -18
  398. qiskit/qobj/converters/lo_config.py +0 -177
  399. qiskit/qobj/converters/pulse_instruction.py +0 -897
  400. qiskit/qobj/pulse_qobj.py +0 -709
  401. qiskit/qobj/qasm_qobj.py +0 -708
  402. qiskit/qobj/utils.py +0 -46
  403. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  404. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  405. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  406. qiskit/result/mitigation/utils.py +0 -217
  407. qiskit/scheduler/__init__.py +0 -40
  408. qiskit/scheduler/config.py +0 -37
  409. qiskit/scheduler/lowering.py +0 -187
  410. qiskit/scheduler/methods/__init__.py +0 -15
  411. qiskit/scheduler/methods/basic.py +0 -140
  412. qiskit/scheduler/schedule_circuit.py +0 -69
  413. qiskit/scheduler/sequence.py +0 -104
  414. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  415. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  416. qiskit/transpiler/passes/calibration/builders.py +0 -20
  417. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  418. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  419. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  420. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  421. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  422. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  423. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  424. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  425. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  426. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  427. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  428. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  429. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  430. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  431. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  432. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  433. qiskit/utils/deprecate_pulse.py +0 -119
  434. qiskit/utils/multiprocessing.py +0 -56
  435. qiskit/visualization/pulse_v2/__init__.py +0 -21
  436. qiskit/visualization/pulse_v2/core.py +0 -901
  437. qiskit/visualization/pulse_v2/device_info.py +0 -173
  438. qiskit/visualization/pulse_v2/drawings.py +0 -253
  439. qiskit/visualization/pulse_v2/events.py +0 -254
  440. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  441. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  442. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  443. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  444. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  445. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  446. qiskit/visualization/pulse_v2/interface.py +0 -459
  447. qiskit/visualization/pulse_v2/layouts.py +0 -387
  448. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  449. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  450. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  451. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  452. qiskit/visualization/pulse_v2/types.py +0 -242
  453. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/LICENSE.txt +0 -0
  454. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/WHEEL +0 -0
  455. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/top_level.txt +0 -0
@@ -1,187 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2017, 2020.
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
- """Lower gates to schedules. The relative timing within gates is respected. This
14
- module handles the translation, but does not handle timing.
15
- """
16
- from collections import namedtuple
17
- from typing import Dict, List, Optional, Union
18
-
19
- from qiskit.circuit.barrier import Barrier
20
- from qiskit.circuit.delay import Delay
21
- from qiskit.circuit.duration import convert_durations_to_dt
22
- from qiskit.circuit.measure import Measure
23
- from qiskit.circuit.quantumcircuit import QuantumCircuit
24
- from qiskit.exceptions import QiskitError
25
- from qiskit.pulse import Schedule
26
- from qiskit.pulse import instructions as pulse_inst
27
- from qiskit.pulse.channels import AcquireChannel, MemorySlot, DriveChannel
28
- from qiskit.pulse.exceptions import PulseError
29
- from qiskit.pulse.macros import measure
30
- from qiskit.scheduler.config import ScheduleConfig
31
- from qiskit.providers import BackendV1, BackendV2
32
-
33
- CircuitPulseDef = namedtuple(
34
- "CircuitPulseDef",
35
- ["schedule", "qubits"], # The schedule which implements the quantum circuit command
36
- ) # The labels of the qubits involved in the command according to the circuit
37
-
38
-
39
- def lower_gates(
40
- circuit: QuantumCircuit,
41
- schedule_config: ScheduleConfig,
42
- backend: Optional[Union[BackendV1, BackendV2]] = None,
43
- ) -> List[CircuitPulseDef]:
44
- """
45
- Return a list of Schedules and the qubits they operate on, for each element encountered in the
46
- input circuit.
47
-
48
- Without concern for the final schedule, extract and return a list of Schedules and the qubits
49
- they operate on, for each element encountered in the input circuit. Measures are grouped when
50
- possible, so ``qc.measure(q0, c0)`` or ``qc.measure(q1, c1)`` will generate a synchronous
51
- measurement pulse.
52
-
53
- Args:
54
- circuit: The quantum circuit to translate.
55
- schedule_config: Backend specific parameters used for building the Schedule.
56
- backend: Pass in the backend used to build the Schedule, the backend could be BackendV1
57
- or BackendV2
58
-
59
- Returns:
60
- A list of CircuitPulseDefs: the pulse definition for each circuit element.
61
-
62
- Raises:
63
- QiskitError: If circuit uses a command that isn't defined in config.inst_map.
64
- """
65
- from qiskit.pulse.transforms.base_transforms import target_qobj_transform
66
-
67
- circ_pulse_defs = []
68
-
69
- inst_map = schedule_config.inst_map
70
- qubit_mem_slots = {} # Map measured qubit index to classical bit index
71
-
72
- # convert the unit of durations from SI to dt before lowering
73
- circuit = convert_durations_to_dt(circuit, dt_in_sec=schedule_config.dt, inplace=False)
74
-
75
- def get_measure_schedule(qubit_mem_slots: Dict[int, int]) -> CircuitPulseDef:
76
- """Create a schedule to measure the qubits queued for measuring."""
77
- sched = Schedule()
78
- # Exclude acquisition on these qubits, since they are handled by the user calibrations
79
- acquire_excludes = {}
80
- if Measure().name in circuit.calibrations.keys():
81
- qubits = tuple(sorted(qubit_mem_slots.keys()))
82
- params = ()
83
- for qubit in qubits:
84
- try:
85
- meas_q = circuit.calibrations[Measure().name][((qubit,), params)]
86
- meas_q = target_qobj_transform(meas_q)
87
- acquire_q = meas_q.filter(channels=[AcquireChannel(qubit)])
88
- mem_slot_index = [
89
- chan.index for chan in acquire_q.channels if isinstance(chan, MemorySlot)
90
- ][0]
91
- if mem_slot_index != qubit_mem_slots[qubit]:
92
- raise KeyError(
93
- "The measurement calibration is not defined on "
94
- "the requested classical bits"
95
- )
96
- sched |= meas_q
97
- del qubit_mem_slots[qubit]
98
- acquire_excludes[qubit] = mem_slot_index
99
- except KeyError:
100
- pass
101
-
102
- if qubit_mem_slots:
103
- qubits = list(qubit_mem_slots.keys())
104
- qubit_mem_slots.update(acquire_excludes)
105
- meas_sched = measure(
106
- qubits=qubits,
107
- backend=backend,
108
- inst_map=inst_map,
109
- meas_map=schedule_config.meas_map,
110
- qubit_mem_slots=qubit_mem_slots,
111
- )
112
- meas_sched = target_qobj_transform(meas_sched)
113
- meas_sched = meas_sched.exclude(
114
- channels=[AcquireChannel(qubit) for qubit in acquire_excludes]
115
- )
116
- sched |= meas_sched
117
- qubit_mem_slots.clear()
118
- return CircuitPulseDef(
119
- schedule=sched,
120
- qubits=[chan.index for chan in sched.channels if isinstance(chan, AcquireChannel)],
121
- )
122
-
123
- qubit_indices = {bit: idx for idx, bit in enumerate(circuit.qubits)}
124
- clbit_indices = {bit: idx for idx, bit in enumerate(circuit.clbits)}
125
-
126
- for instruction in circuit.data:
127
- inst_qubits = [qubit_indices[qubit] for qubit in instruction.qubits]
128
-
129
- if any(q in qubit_mem_slots for q in inst_qubits):
130
- # If we are operating on a qubit that was scheduled to be measured, process that first
131
- circ_pulse_defs.append(get_measure_schedule(qubit_mem_slots))
132
-
133
- if isinstance(instruction.operation, Barrier):
134
- circ_pulse_defs.append(
135
- CircuitPulseDef(schedule=instruction.operation, qubits=inst_qubits)
136
- )
137
- elif isinstance(instruction.operation, Delay):
138
- sched = Schedule(name=instruction.operation.name)
139
- for qubit in inst_qubits:
140
- for channel in [DriveChannel]:
141
- sched += pulse_inst.Delay(
142
- duration=instruction.operation.duration, channel=channel(qubit)
143
- )
144
- circ_pulse_defs.append(CircuitPulseDef(schedule=sched, qubits=inst_qubits))
145
- elif isinstance(instruction.operation, Measure):
146
- if len(inst_qubits) != 1 and len(instruction.clbits) != 1:
147
- raise QiskitError(
148
- f"Qubit '{inst_qubits}' or classical bit '{instruction.clbits}' errored because the "
149
- "circuit Measure instruction only takes one of "
150
- "each."
151
- )
152
- qubit_mem_slots[inst_qubits[0]] = clbit_indices[instruction.clbits[0]]
153
- else:
154
- try:
155
- gate_cals = circuit.calibrations[instruction.operation.name]
156
- schedule = gate_cals[
157
- (
158
- tuple(inst_qubits),
159
- tuple(
160
- p if getattr(p, "parameters", None) else float(p)
161
- for p in instruction.operation.params
162
- ),
163
- )
164
- ]
165
- schedule = target_qobj_transform(schedule)
166
- circ_pulse_defs.append(CircuitPulseDef(schedule=schedule, qubits=inst_qubits))
167
- continue
168
- except KeyError:
169
- pass # Calibration not defined for this operation
170
-
171
- try:
172
- schedule = inst_map.get(
173
- instruction.operation, inst_qubits, *instruction.operation.params
174
- )
175
- schedule = target_qobj_transform(schedule)
176
- circ_pulse_defs.append(CircuitPulseDef(schedule=schedule, qubits=inst_qubits))
177
- except PulseError as ex:
178
- raise QiskitError(
179
- f"Operation '{instruction.operation.name}' on qubit(s) {inst_qubits} "
180
- "not supported by the backend command definition. Did you remember to "
181
- "transpile your input circuit for the same backend?"
182
- ) from ex
183
-
184
- if qubit_mem_slots:
185
- circ_pulse_defs.append(get_measure_schedule(qubit_mem_slots))
186
-
187
- return circ_pulse_defs
@@ -1,15 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 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
- """Scheduling methods."""
14
-
15
- from qiskit.scheduler.methods.basic import as_soon_as_possible, as_late_as_possible
@@ -1,140 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 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
- The most straightforward scheduling methods: scheduling **as early** or **as late** as possible.
15
- """
16
- from collections import defaultdict
17
- from typing import List, Optional, Union
18
-
19
- from qiskit.circuit.quantumcircuit import QuantumCircuit
20
- from qiskit.circuit.barrier import Barrier
21
- from qiskit.pulse.schedule import Schedule
22
-
23
- from qiskit.scheduler.config import ScheduleConfig
24
- from qiskit.scheduler.lowering import lower_gates
25
- from qiskit.providers import BackendV1, BackendV2
26
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
27
-
28
-
29
- @deprecate_pulse_dependency(moving_to_dynamics=True)
30
- def as_soon_as_possible(
31
- circuit: QuantumCircuit,
32
- schedule_config: ScheduleConfig,
33
- backend: Optional[Union[BackendV1, BackendV2]] = None,
34
- ) -> Schedule:
35
- """
36
- Return the pulse Schedule which implements the input circuit using an "as soon as possible"
37
- (asap) scheduling policy.
38
-
39
- Circuit instructions are first each mapped to equivalent pulse
40
- Schedules according to the command definition given by the schedule_config. Then, this circuit
41
- instruction-equivalent Schedule is appended at the earliest time at which all qubits involved
42
- in the instruction are available.
43
-
44
- Args:
45
- circuit: The quantum circuit to translate.
46
- schedule_config: Backend specific parameters used for building the Schedule.
47
- backend: A backend used to build the Schedule, the backend could be BackendV1
48
- or BackendV2.
49
-
50
- Returns:
51
- A schedule corresponding to the input ``circuit`` with pulses occurring as early as
52
- possible.
53
- """
54
- qubit_time_available = defaultdict(int)
55
-
56
- def update_times(inst_qubits: List[int], time: int = 0) -> None:
57
- """Update the time tracker for all inst_qubits to the given time."""
58
- for q in inst_qubits:
59
- qubit_time_available[q] = time
60
-
61
- start_times = []
62
- circ_pulse_defs = lower_gates(circuit, schedule_config, backend)
63
- for circ_pulse_def in circ_pulse_defs:
64
- start_time = max(qubit_time_available[q] for q in circ_pulse_def.qubits)
65
- stop_time = start_time
66
- if not isinstance(circ_pulse_def.schedule, Barrier):
67
- stop_time += circ_pulse_def.schedule.duration
68
-
69
- start_times.append(start_time)
70
- update_times(circ_pulse_def.qubits, stop_time)
71
-
72
- timed_schedules = [
73
- (time, cpd.schedule)
74
- for time, cpd in zip(start_times, circ_pulse_defs)
75
- if not isinstance(cpd.schedule, Barrier)
76
- ]
77
- schedule = Schedule.initialize_from(circuit)
78
- for time, inst in timed_schedules:
79
- schedule.insert(time, inst, inplace=True)
80
- return schedule
81
-
82
-
83
- @deprecate_pulse_dependency(moving_to_dynamics=True)
84
- def as_late_as_possible(
85
- circuit: QuantumCircuit,
86
- schedule_config: ScheduleConfig,
87
- backend: Optional[Union[BackendV1, BackendV2]] = None,
88
- ) -> Schedule:
89
- """
90
- Return the pulse Schedule which implements the input circuit using an "as late as possible"
91
- (alap) scheduling policy.
92
-
93
- Circuit instructions are first each mapped to equivalent pulse
94
- Schedules according to the command definition given by the schedule_config. Then, this circuit
95
- instruction-equivalent Schedule is appended at the latest time that it can be without allowing
96
- unnecessary time between instructions or allowing instructions with common qubits to overlap.
97
-
98
- This method should improves the outcome fidelity over ASAP scheduling, because we may
99
- maximize the time that the qubit remains in the ground state.
100
-
101
- Args:
102
- circuit: The quantum circuit to translate.
103
- schedule_config: Backend specific parameters used for building the Schedule.
104
- backend: A backend used to build the Schedule, the backend could be BackendV1
105
- or BackendV2.
106
-
107
- Returns:
108
- A schedule corresponding to the input ``circuit`` with pulses occurring as late as
109
- possible.
110
- """
111
- qubit_time_available = defaultdict(int)
112
-
113
- def update_times(inst_qubits: List[int], time: int = 0) -> None:
114
- """Update the time tracker for all inst_qubits to the given time."""
115
- for q in inst_qubits:
116
- qubit_time_available[q] = time
117
-
118
- rev_stop_times = []
119
- circ_pulse_defs = lower_gates(circuit, schedule_config, backend)
120
- for circ_pulse_def in reversed(circ_pulse_defs):
121
- start_time = max(qubit_time_available[q] for q in circ_pulse_def.qubits)
122
- stop_time = start_time
123
- if not isinstance(circ_pulse_def.schedule, Barrier):
124
- stop_time += circ_pulse_def.schedule.duration
125
-
126
- rev_stop_times.append(stop_time)
127
- update_times(circ_pulse_def.qubits, stop_time)
128
-
129
- last_stop = max(t for t in qubit_time_available.values()) if qubit_time_available else 0
130
- start_times = [last_stop - t for t in reversed(rev_stop_times)]
131
-
132
- timed_schedules = [
133
- (time, cpd.schedule)
134
- for time, cpd in zip(start_times, circ_pulse_defs)
135
- if not isinstance(cpd.schedule, Barrier)
136
- ]
137
- schedule = Schedule.initialize_from(circuit)
138
- for time, inst in timed_schedules:
139
- schedule.insert(time, inst, inplace=True)
140
- return schedule
@@ -1,69 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 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
- """QuantumCircuit to Pulse scheduler."""
14
- from typing import Optional, Union
15
-
16
- from qiskit.circuit.quantumcircuit import QuantumCircuit
17
- from qiskit.exceptions import QiskitError
18
-
19
- from qiskit.pulse.schedule import Schedule
20
- from qiskit.scheduler.config import ScheduleConfig
21
- from qiskit.scheduler.methods import as_soon_as_possible, as_late_as_possible
22
- from qiskit.providers import BackendV1, BackendV2
23
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
24
-
25
-
26
- @deprecate_pulse_dependency(moving_to_dynamics=True)
27
- def schedule_circuit(
28
- circuit: QuantumCircuit,
29
- schedule_config: ScheduleConfig,
30
- method: Optional[str] = None,
31
- backend: Optional[Union[BackendV1, BackendV2]] = None,
32
- ) -> Schedule:
33
- """
34
- Basic scheduling pass from a circuit to a pulse Schedule, using the backend. If no method is
35
- specified, then a basic, as late as possible scheduling pass is performed, i.e. pulses are
36
- scheduled to occur as late as possible.
37
-
38
- Supported methods:
39
-
40
- * ``'as_soon_as_possible'``: Schedule pulses greedily, as early as possible on a
41
- qubit resource. (alias: ``'asap'``)
42
- * ``'as_late_as_possible'``: Schedule pulses late-- keep qubits in the ground state when
43
- possible. (alias: ``'alap'``)
44
-
45
- Args:
46
- circuit: The quantum circuit to translate.
47
- schedule_config: Backend specific parameters used for building the Schedule.
48
- method: The scheduling pass method to use.
49
- backend: A backend used to build the Schedule, the backend could be BackendV1
50
- or BackendV2.
51
-
52
- Returns:
53
- Schedule corresponding to the input circuit.
54
-
55
- Raises:
56
- QiskitError: If method isn't recognized.
57
- """
58
- methods = {
59
- "as_soon_as_possible": as_soon_as_possible,
60
- "asap": as_soon_as_possible,
61
- "as_late_as_possible": as_late_as_possible,
62
- "alap": as_late_as_possible,
63
- }
64
- if method is None:
65
- method = "as_late_as_possible"
66
- try:
67
- return methods[method](circuit, schedule_config, backend)
68
- except KeyError as ex:
69
- raise QiskitError(f"Scheduling method {method} isn't recognized.") from ex
@@ -1,104 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2020.
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
- Mapping a scheduled QuantumCircuit to a pulse Schedule.
15
- """
16
- from collections import defaultdict
17
-
18
- from typing import Optional, Union
19
- from qiskit.circuit.barrier import Barrier
20
- from qiskit.circuit.measure import Measure
21
- from qiskit.circuit.quantumcircuit import QuantumCircuit
22
- from qiskit.exceptions import QiskitError
23
- from qiskit.pulse.schedule import Schedule
24
- from qiskit.pulse.transforms import pad
25
- from qiskit.scheduler.config import ScheduleConfig
26
- from qiskit.scheduler.lowering import lower_gates
27
- from qiskit.providers import BackendV1, BackendV2
28
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
29
-
30
-
31
- @deprecate_pulse_dependency(moving_to_dynamics=True)
32
- def sequence(
33
- scheduled_circuit: QuantumCircuit,
34
- schedule_config: ScheduleConfig,
35
- backend: Optional[Union[BackendV1, BackendV2]] = None,
36
- ) -> Schedule:
37
- """
38
- Return the pulse Schedule which implements the input scheduled circuit.
39
-
40
- Assume all measurements are done at once at the last of the circuit.
41
- Schedules according to the command definition given by the schedule_config.
42
-
43
- Args:
44
- scheduled_circuit: The scheduled quantum circuit to translate.
45
- schedule_config: Backend specific parameters used for building the Schedule.
46
- backend: A backend used to build the Schedule, the backend could be BackendV1
47
- or BackendV2
48
-
49
- Returns:
50
- A schedule corresponding to the input ``circuit``.
51
-
52
- Raises:
53
- QiskitError: If invalid scheduled circuit is supplied.
54
- """
55
- circ_pulse_defs = lower_gates(scheduled_circuit, schedule_config, backend)
56
-
57
- # find the measurement start time (assume measurement once)
58
- def _meas_start_time():
59
- _qubit_time_available = defaultdict(int)
60
- for instruction in scheduled_circuit.data:
61
- if isinstance(instruction.operation, Measure):
62
- return _qubit_time_available[instruction.qubits[0]]
63
- for q in instruction.qubits:
64
- _qubit_time_available[q] += instruction.operation.duration
65
- return None
66
-
67
- meas_time = _meas_start_time()
68
-
69
- # restore start times
70
- qubit_time_available = {}
71
- start_times = []
72
- out_circ_pulse_defs = []
73
- for circ_pulse_def in circ_pulse_defs:
74
- active_qubits = [q for q in circ_pulse_def.qubits if q in qubit_time_available]
75
-
76
- start_time = max((qubit_time_available[q] for q in active_qubits), default=0)
77
-
78
- for q in active_qubits:
79
- if qubit_time_available[q] != start_time:
80
- # print(q, ":", qubit_time_available[q], "!=", start_time)
81
- raise QiskitError("Invalid scheduled circuit.")
82
-
83
- stop_time = start_time
84
- if not isinstance(circ_pulse_def.schedule, Barrier):
85
- stop_time += circ_pulse_def.schedule.duration
86
-
87
- delay_overlaps_meas = False
88
- for q in circ_pulse_def.qubits:
89
- qubit_time_available[q] = stop_time
90
- if (
91
- meas_time is not None
92
- and circ_pulse_def.schedule.name == "delay"
93
- and stop_time > meas_time
94
- ):
95
- qubit_time_available[q] = meas_time
96
- delay_overlaps_meas = True
97
- # skip to delays overlapping measures and barriers
98
- if not delay_overlaps_meas and not isinstance(circ_pulse_def.schedule, Barrier):
99
- start_times.append(start_time)
100
- out_circ_pulse_defs.append(circ_pulse_def)
101
-
102
- timed_schedules = [(time, cpd.schedule) for time, cpd in zip(start_times, out_circ_pulse_defs)]
103
- sched = Schedule(*timed_schedules, name=scheduled_circuit.name)
104
- return pad(sched)
@@ -1,17 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2021
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
- """Module containing transpiler calibration passes."""
14
-
15
- from .pulse_gate import PulseGates
16
- from .rzx_builder import RZXCalibrationBuilder, RZXCalibrationBuilderNoEcho
17
- from .rx_builder import RXCalibrationBuilder
@@ -1,79 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2022.
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
- """Calibration builder base class."""
14
-
15
- from abc import abstractmethod
16
- from typing import List, Union
17
-
18
- from qiskit.circuit import Instruction as CircuitInst
19
- from qiskit.dagcircuit import DAGCircuit
20
- from qiskit.pulse import Schedule, ScheduleBlock
21
- from qiskit.pulse.calibration_entries import CalibrationPublisher
22
- from qiskit.transpiler.basepasses import TransformationPass
23
-
24
- from .exceptions import CalibrationNotAvailable
25
-
26
-
27
- class CalibrationBuilder(TransformationPass):
28
- """Abstract base class to inject calibrations into circuits."""
29
-
30
- @abstractmethod
31
- def supported(self, node_op: CircuitInst, qubits: List) -> bool:
32
- """Determine if a given node supports the calibration.
33
-
34
- Args:
35
- node_op: Target instruction object.
36
- qubits: Integer qubit indices to check.
37
-
38
- Returns:
39
- Return ``True`` is calibration can be provided.
40
- """
41
-
42
- @abstractmethod
43
- def get_calibration(self, node_op: CircuitInst, qubits: List) -> Union[Schedule, ScheduleBlock]:
44
- """Gets the calibrated schedule for the given instruction and qubits.
45
-
46
- Args:
47
- node_op: Target instruction object.
48
- qubits: Integer qubit indices to check.
49
-
50
- Returns:
51
- Return Schedule of target gate instruction.
52
- """
53
-
54
- def run(self, dag: DAGCircuit) -> DAGCircuit:
55
- """Run the calibration adder pass on `dag`.
56
-
57
- Args:
58
- dag: DAG to schedule.
59
-
60
- Returns:
61
- A DAG with calibrations added to it.
62
- """
63
- for node in dag.gate_nodes():
64
- qubits = [dag.find_bit(q).index for q in node.qargs]
65
-
66
- if self.supported(node.op, qubits) and not dag.has_calibration_for(node):
67
- # calibration can be provided and no user-defined calibration is already provided
68
- try:
69
- schedule = self.get_calibration(node.op, qubits)
70
- except CalibrationNotAvailable:
71
- # Fail in schedule generation. Just ignore.
72
- continue
73
- publisher = schedule.metadata.get("publisher", CalibrationPublisher.QISKIT)
74
-
75
- # add calibration if it is not backend default
76
- if publisher != CalibrationPublisher.BACKEND_PROVIDER:
77
- dag.add_calibration(gate=node.op, qubits=qubits, schedule=schedule)
78
-
79
- return dag
@@ -1,20 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2021.
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
- """Calibration creators."""
14
-
15
- # TODO This import path will be deprecated.
16
-
17
- # pylint: disable=unused-import
18
- from .pulse_gate import PulseGates
19
- from .rzx_builder import RZXCalibrationBuilder, RZXCalibrationBuilderNoEcho
20
- from .rx_builder import RXCalibrationBuilder
@@ -1,22 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2022.
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
- """Exception for errors raised by the calibration pass module."""
14
- from qiskit.exceptions import QiskitError
15
-
16
-
17
- class CalibrationNotAvailable(QiskitError):
18
- """Raised when calibration generation fails.
19
-
20
- .. note::
21
- This error is meant to caught by CalibrationBuilder and ignored.
22
- """