qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__cp39-abi3-macosx_11_0_arm64.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.abi3.so +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 +2 -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,100 +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
- """Instruction schedule map reference pass."""
14
-
15
- from typing import List, Union
16
-
17
- from qiskit.circuit import Instruction as CircuitInst
18
- from qiskit.pulse import Schedule, ScheduleBlock
19
- from qiskit.pulse.instruction_schedule_map import InstructionScheduleMap
20
- from qiskit.transpiler.target import Target
21
- from qiskit.transpiler.exceptions import TranspilerError
22
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
23
-
24
- from .base_builder import CalibrationBuilder
25
-
26
-
27
- class PulseGates(CalibrationBuilder):
28
- """Pulse gate adding pass.
29
-
30
- This pass adds gate calibrations from the supplied ``InstructionScheduleMap``
31
- to a quantum circuit.
32
-
33
- This pass checks each DAG circuit node and acquires a corresponding schedule from
34
- the instruction schedule map object that may be provided by the target backend.
35
- Because this map is a mutable object, the end-user can provide a configured backend to
36
- execute the circuit with customized gate implementations.
37
-
38
- This mapping object returns a schedule with "publisher" metadata which is an integer Enum
39
- value representing who created the gate schedule.
40
- If the gate schedule is provided by end-users, this pass attaches the schedule to
41
- the DAG circuit as a calibration.
42
-
43
- This pass allows users to easily override quantum circuit with custom gate definitions
44
- without directly dealing with those schedules.
45
-
46
- References
47
- * [1] OpenQASM 3: A broader and deeper quantum assembly language
48
- https://arxiv.org/abs/2104.14722
49
- """
50
-
51
- @deprecate_pulse_dependency
52
- def __init__(
53
- self,
54
- inst_map: InstructionScheduleMap = None,
55
- target: Target = None,
56
- ):
57
- """Create new pass.
58
-
59
- Args:
60
- inst_map: Instruction schedule map that user may override.
61
- target: The :class:`~.Target` representing the target backend, if both
62
- ``inst_map`` and ``target`` are specified then it updates instructions
63
- in the ``target`` with ``inst_map``.
64
- """
65
- super().__init__()
66
-
67
- if inst_map is None and target is None:
68
- raise TranspilerError("inst_map and target cannot be None simulataneously.")
69
-
70
- if target is None:
71
- target = Target()
72
- target.update_from_instruction_schedule_map(inst_map)
73
- self.target = target
74
-
75
- def supported(self, node_op: CircuitInst, qubits: List) -> bool:
76
- """Determine if a given node supports the calibration.
77
-
78
- Args:
79
- node_op: Target instruction object.
80
- qubits: Integer qubit indices to check.
81
-
82
- Returns:
83
- Return ``True`` is calibration can be provided.
84
- """
85
- return self.target._has_calibration(node_op.name, tuple(qubits))
86
-
87
- def get_calibration(self, node_op: CircuitInst, qubits: List) -> Union[Schedule, ScheduleBlock]:
88
- """Gets the calibrated schedule for the given instruction and qubits.
89
-
90
- Args:
91
- node_op: Target instruction object.
92
- qubits: Integer qubit indices to check.
93
-
94
- Returns:
95
- Return Schedule of target gate instruction.
96
-
97
- Raises:
98
- TranspilerError: When node is parameterized and calibration is raw schedule object.
99
- """
100
- return self.target._get_calibration(node_op.name, tuple(qubits), *node_op.params)
@@ -1,164 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2023.
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
- """Add single-pulse RX calibrations that are bootstrapped from the SX calibration."""
14
-
15
- from typing import Union
16
- from functools import lru_cache
17
- import numpy as np
18
-
19
- from qiskit.circuit import Instruction
20
- from qiskit.circuit.library.standard_gates import RXGate
21
- from qiskit.exceptions import QiskitError
22
- from qiskit.pulse import Schedule, ScheduleBlock, builder, ScalableSymbolicPulse
23
- from qiskit.pulse.channels import Channel
24
- from qiskit.pulse.library.symbolic_pulses import Drag
25
- from qiskit.transpiler.passes.calibration.base_builder import CalibrationBuilder
26
- from qiskit.transpiler.target import Target
27
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
28
-
29
-
30
- class RXCalibrationBuilder(CalibrationBuilder):
31
- """Add single-pulse RX calibrations that are bootstrapped from the SX calibration.
32
-
33
- .. note::
34
-
35
- Requirement: NormalizeRXAngles pass (one of the optimization passes).
36
-
37
- It is recommended to place this pass in the post-optimization stage of a passmanager.
38
- A simple demo:
39
-
40
- .. code-block:: python
41
-
42
- from qiskit.providers.fake_provider import GenericBackendV2
43
- from qiskit.transpiler import PassManager, PassManagerConfig
44
- from qiskit.transpiler.preset_passmanagers import level_1_pass_manager
45
- from qiskit.circuit import Parameter
46
- from qiskit.circuit.library import QuantumVolume
47
- from qiskit.circuit.library.standard_gates import RXGate
48
-
49
- from qiskit.transpiler.passes import RXCalibrationBuilder
50
-
51
- qv = QuantumVolume(4, 4, seed=1004)
52
-
53
- # Transpiling with single pulse RX gates enabled
54
- backend_with_single_pulse_rx = GenericBackendV2(5)
55
- rx_inst_props = {}
56
- for i in range(backend_with_single_pulse_rx.num_qubits):
57
- rx_inst_props[(i,)] = None
58
- backend_with_single_pulse_rx.target.add_instruction(RXGate(Parameter("theta")), rx_inst_props)
59
- config_with_rx = PassManagerConfig.from_backend(backend=backend_with_single_pulse_rx)
60
- pm_with_rx = level_1_pass_manager(pass_manager_config=config_with_rx)
61
- rx_builder = RXCalibrationBuilder(target=backend_with_single_pulse_rx.target)
62
- pm_with_rx.post_optimization = PassManager([rx_builder])
63
- transpiled_circ_with_single_pulse_rx = pm_with_rx.run(qv)
64
- transpiled_circ_with_single_pulse_rx.count_ops()
65
-
66
- # Conventional transpilation: each RX gate is decomposed into a sequence with two SX gates
67
- original_backend = GenericBackendV2(5)
68
- original_config = PassManagerConfig.from_backend(backend=original_backend)
69
- original_pm = level_1_pass_manager(pass_manager_config=original_config)
70
- original_transpiled_circ = original_pm.run(qv)
71
- original_transpiled_circ.count_ops()
72
-
73
- References
74
- * [1]: Gokhale et al. (2020), Optimized Quantum Compilation for
75
- Near-Term Algorithms with OpenPulse.
76
- `arXiv:2004.11205 <https://arxiv.org/abs/2004.11205>`
77
- """
78
-
79
- @deprecate_pulse_dependency
80
- def __init__(
81
- self,
82
- target: Target = None,
83
- ):
84
- """Bootstrap single-pulse RX gate calibrations from the
85
- (hardware-calibrated) SX gate calibration.
86
-
87
- Args:
88
- target (Target): Should contain a SX calibration that will be
89
- used for bootstrapping RX calibrations.
90
- """
91
- from qiskit.transpiler.passes.optimization import NormalizeRXAngle
92
-
93
- super().__init__()
94
- self.target = target
95
- self.already_generated = {}
96
- self.requires = [NormalizeRXAngle(self.target)]
97
-
98
- def supported(self, node_op: Instruction, qubits: list) -> bool:
99
- """
100
- Check if the calibration for SX gate exists and it's a single DRAG pulse.
101
- """
102
- return (
103
- isinstance(node_op, RXGate)
104
- and self.target._has_calibration("sx", tuple(qubits))
105
- and (len(self.target._get_calibration("sx", tuple(qubits)).instructions) == 1)
106
- and isinstance(
107
- self.target._get_calibration("sx", tuple(qubits)).instructions[0][1].pulse,
108
- ScalableSymbolicPulse,
109
- )
110
- and self.target._get_calibration("sx", tuple(qubits))
111
- .instructions[0][1]
112
- .pulse.pulse_type
113
- == "Drag"
114
- )
115
-
116
- def get_calibration(self, node_op: Instruction, qubits: list) -> Union[Schedule, ScheduleBlock]:
117
- """
118
- Generate RX calibration for the rotation angle specified in node_op.
119
- """
120
- # already within [0, pi] by NormalizeRXAngles pass
121
- angle = node_op.params[0]
122
-
123
- try:
124
- angle = float(angle)
125
- except TypeError as ex:
126
- raise QiskitError("Target rotation angle is not assigned.") from ex
127
-
128
- params = (
129
- self.target._get_calibration("sx", tuple(qubits))
130
- .instructions[0][1]
131
- .pulse.parameters.copy()
132
- )
133
- new_rx_sched = _create_rx_sched(
134
- rx_angle=angle,
135
- channel=self.target._get_calibration("sx", tuple(qubits)).channels[0],
136
- duration=params["duration"],
137
- amp=params["amp"],
138
- sigma=params["sigma"],
139
- beta=params["beta"],
140
- )
141
-
142
- return new_rx_sched
143
-
144
-
145
- @lru_cache
146
- def _create_rx_sched(
147
- rx_angle: float,
148
- duration: int,
149
- amp: float,
150
- sigma: float,
151
- beta: float,
152
- channel: Channel,
153
- ):
154
- """Generates (and caches) pulse calibrations for RX gates.
155
- Assumes that the rotation angle is in [0, pi].
156
- """
157
- new_amp = rx_angle / (np.pi / 2) * amp
158
- with builder.build() as new_rx_sched:
159
- builder.play(
160
- Drag(duration=duration, amp=new_amp, sigma=sigma, beta=beta, angle=0),
161
- channel=channel,
162
- )
163
-
164
- return new_rx_sched
@@ -1,411 +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
- """RZX calibration builders."""
14
- from __future__ import annotations
15
-
16
- import enum
17
- import math
18
- import warnings
19
- from collections.abc import Sequence
20
- from math import pi, erf
21
-
22
- import numpy as np
23
- from qiskit.circuit import Instruction as CircuitInst
24
- from qiskit.circuit.library.standard_gates import RZXGate
25
- from qiskit.exceptions import QiskitError
26
- from qiskit.pulse import (
27
- Play,
28
- Schedule,
29
- ScheduleBlock,
30
- ControlChannel,
31
- DriveChannel,
32
- GaussianSquare,
33
- Waveform,
34
- )
35
- from qiskit.pulse import builder
36
- from qiskit.pulse.filters import filter_instructions
37
- from qiskit.pulse.instruction_schedule_map import InstructionScheduleMap
38
- from qiskit.transpiler.target import Target
39
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
40
-
41
- from .base_builder import CalibrationBuilder
42
- from .exceptions import CalibrationNotAvailable
43
-
44
-
45
- class CRCalType(enum.Enum):
46
- """Estimated calibration type of backend cross resonance operations."""
47
-
48
- ECR_FORWARD = "Echoed Cross Resonance corresponding to native operation"
49
- ECR_REVERSE = "Echoed Cross Resonance reverse of native operation"
50
- ECR_CX_FORWARD = "Echoed Cross Resonance CX corresponding to native operation"
51
- ECR_CX_REVERSE = "Echoed Cross Resonance CX reverse of native operation"
52
- DIRECT_CX_FORWARD = "Direct CX corresponding to native operation"
53
- DIRECT_CX_REVERSE = "Direct CX reverse of native operation"
54
-
55
-
56
- class RZXCalibrationBuilder(CalibrationBuilder):
57
- """
58
- Creates calibrations for RZXGate(theta) by stretching and compressing
59
- Gaussian square pulses in the CX gate. This is done by retrieving (for a given pair of
60
- qubits) the CX schedule in the instruction schedule map of the backend defaults.
61
- The CX schedule must be an echoed cross-resonance gate optionally with rotary tones.
62
- The cross-resonance drive tones and rotary pulses must be Gaussian square pulses.
63
- The width of the Gaussian square pulse is adjusted so as to match the desired rotation angle.
64
- If the rotation angle is small such that the width disappears then the amplitude of the
65
- zero width Gaussian square pulse (i.e. a Gaussian) is reduced to reach the target rotation
66
- angle. Additional details can be found in https://arxiv.org/abs/2012.11660.
67
- """
68
-
69
- @deprecate_pulse_dependency
70
- def __init__(
71
- self,
72
- instruction_schedule_map: InstructionScheduleMap = None,
73
- verbose: bool = True,
74
- target: Target = None,
75
- ):
76
- """
77
- Initializes a RZXGate calibration builder.
78
-
79
- Args:
80
- instruction_schedule_map: The :obj:`InstructionScheduleMap` object representing the
81
- default pulse calibrations for the target backend
82
- verbose: Set True to raise a user warning when RZX schedule cannot be built.
83
- target: The :class:`~.Target` representing the target backend, if both
84
- ``instruction_schedule_map`` and this are specified then this argument will take
85
- precedence and ``instruction_schedule_map`` will be ignored.
86
-
87
- Raises:
88
- QiskitError: Instruction schedule map is not provided.
89
- """
90
- super().__init__()
91
- self._inst_map = instruction_schedule_map
92
- self._verbose = verbose
93
- if target:
94
- self._inst_map = target._instruction_schedule_map()
95
- if self._inst_map is None:
96
- raise QiskitError("Calibrations can only be added to Pulse-enabled backends")
97
-
98
- def supported(self, node_op: CircuitInst, qubits: list) -> bool:
99
- """Determine if a given node supports the calibration.
100
-
101
- Args:
102
- node_op: Target instruction object.
103
- qubits: Integer qubit indices to check.
104
-
105
- Returns:
106
- Return ``True`` is calibration can be provided.
107
- """
108
- return isinstance(node_op, RZXGate) and (
109
- "cx" in self._inst_map.instructions or "ecr" in self._inst_map.instructions
110
- )
111
-
112
- @staticmethod
113
- @builder.macro
114
- def rescale_cr_inst(instruction: Play, theta: float, sample_mult: int = 16) -> int:
115
- """A builder macro to play stretched pulse.
116
-
117
- Args:
118
- instruction: The instruction from which to create a new shortened or lengthened pulse.
119
- theta: desired angle, pi/2 is assumed to be the angle that the pulse in the given
120
- play instruction implements.
121
- sample_mult: All pulses must be a multiple of sample_mult.
122
-
123
- Returns:
124
- Duration of stretched pulse.
125
-
126
- Raises:
127
- QiskitError: if rotation angle is not assigned.
128
- """
129
- try:
130
- theta = float(theta)
131
- except TypeError as ex:
132
- raise QiskitError("Target rotation angle is not assigned.") from ex
133
-
134
- # This method is called for instructions which are guaranteed to play GaussianSquare pulse
135
- params = instruction.pulse.parameters.copy()
136
- risefall_sigma_ratio = (params["duration"] - params["width"]) / params["sigma"]
137
-
138
- # The error function is used because the Gaussian may have chopped tails.
139
- # Area is normalized by amplitude.
140
- # This makes widths robust to the rounding error.
141
- risefall_area = params["sigma"] * math.sqrt(2 * pi) * erf(risefall_sigma_ratio)
142
- full_area = params["width"] + risefall_area
143
-
144
- # Get estimate of target area. Assume this is pi/2 controlled rotation.
145
- cal_angle = pi / 2
146
- target_area = abs(theta) / cal_angle * full_area
147
- new_width = target_area - risefall_area
148
-
149
- if new_width >= 0:
150
- width = new_width
151
- params["amp"] *= np.sign(theta)
152
- else:
153
- width = 0
154
- params["amp"] *= np.sign(theta) * target_area / risefall_area
155
-
156
- round_duration = (
157
- round((width + risefall_sigma_ratio * params["sigma"]) / sample_mult) * sample_mult
158
- )
159
- params["duration"] = round_duration
160
- params["width"] = width
161
-
162
- stretched_pulse = GaussianSquare(**params)
163
- builder.play(stretched_pulse, instruction.channel)
164
-
165
- return round_duration
166
-
167
- def get_calibration(self, node_op: CircuitInst, qubits: list) -> Schedule | ScheduleBlock:
168
- """Builds the calibration schedule for the RZXGate(theta) with echos.
169
-
170
- Args:
171
- node_op: Instruction of the RZXGate(theta). I.e. params[0] is theta.
172
- qubits: List of qubits for which to get the schedules. The first qubit is
173
- the control and the second is the target.
174
-
175
- Returns:
176
- schedule: The calibration schedule for the RZXGate(theta).
177
-
178
- Raises:
179
- QiskitError: if rotation angle is not assigned.
180
- QiskitError: If the control and target qubits cannot be identified.
181
- CalibrationNotAvailable: RZX schedule cannot be built for input node.
182
- """
183
- theta = node_op.params[0]
184
-
185
- try:
186
- theta = float(theta)
187
- except TypeError as ex:
188
- raise QiskitError("Target rotation angle is not assigned.") from ex
189
-
190
- if np.isclose(theta, 0.0):
191
- return ScheduleBlock(name="rzx(0.000)")
192
-
193
- cal_type, cr_tones, comp_tones = _check_calibration_type(self._inst_map, qubits)
194
-
195
- if cal_type in [CRCalType.DIRECT_CX_FORWARD, CRCalType.DIRECT_CX_REVERSE]:
196
- if self._verbose:
197
- warnings.warn(
198
- f"CR instruction for qubits {qubits} is likely {cal_type.value} sequence. "
199
- "Pulse stretch for this calibration is not currently implemented. "
200
- "RZX schedule is not generated for this qubit pair.",
201
- UserWarning,
202
- )
203
- raise CalibrationNotAvailable
204
-
205
- # The CR instruction is in the forward (native) direction
206
- if cal_type in [CRCalType.ECR_CX_FORWARD, CRCalType.ECR_FORWARD]:
207
- with warnings.catch_warnings():
208
- warnings.simplefilter(action="ignore", category=DeprecationWarning)
209
- # `InstructionScheduleMap.get` and the pulse builder emit deprecation warnings
210
- # as they use classes and methods which are deprecated in Qiskit 1.3 as part of the
211
- # Qiskit Pulse deprecation
212
- xgate = self._inst_map.get("x", qubits[0])
213
- with builder.build(
214
- default_alignment="sequential", name=f"rzx({theta:.3f})"
215
- ) as rzx_theta_native:
216
- for cr_tone, comp_tone in zip(cr_tones, comp_tones):
217
- with builder.align_left():
218
- self.rescale_cr_inst(cr_tone, theta)
219
- self.rescale_cr_inst(comp_tone, theta)
220
- builder.call(xgate)
221
- return rzx_theta_native
222
-
223
- # The direction is not native. Add Hadamard gates to flip the direction.
224
- xgate = self._inst_map.get("x", qubits[1])
225
- szc = self._inst_map.get("rz", qubits[1], pi / 2)
226
- sxc = self._inst_map.get("sx", qubits[1])
227
- szt = self._inst_map.get("rz", qubits[0], pi / 2)
228
- sxt = self._inst_map.get("sx", qubits[0])
229
- with builder.build(name="hadamard") as hadamard:
230
- # Control qubit
231
- builder.call(szc, name="szc")
232
- builder.call(sxc, name="sxc")
233
- builder.call(szc, name="szc")
234
- # Target qubit
235
- builder.call(szt, name="szt")
236
- builder.call(sxt, name="sxt")
237
- builder.call(szt, name="szt")
238
-
239
- with builder.build(
240
- default_alignment="sequential", name=f"rzx({theta:.3f})"
241
- ) as rzx_theta_flip:
242
- builder.call(hadamard, name="hadamard")
243
- for cr_tone, comp_tone in zip(cr_tones, comp_tones):
244
- with builder.align_left():
245
- self.rescale_cr_inst(cr_tone, theta)
246
- self.rescale_cr_inst(comp_tone, theta)
247
- builder.call(xgate)
248
- builder.call(hadamard, name="hadamard")
249
- return rzx_theta_flip
250
-
251
-
252
- class RZXCalibrationBuilderNoEcho(RZXCalibrationBuilder):
253
- """
254
- Creates calibrations for RZXGate(theta) by stretching and compressing
255
- Gaussian square pulses in the CX gate.
256
-
257
- The ``RZXCalibrationBuilderNoEcho`` is a variation of the
258
- :class:`~qiskit.transpiler.passes.RZXCalibrationBuilder` pass
259
- that creates calibrations for the cross-resonance pulses without inserting
260
- the echo pulses in the pulse schedule. This enables exposing the echo in
261
- the cross-resonance sequence as gates so that the transpiler can simplify them.
262
- The ``RZXCalibrationBuilderNoEcho`` only supports the hardware-native direction
263
- of the CX gate.
264
- """
265
-
266
- def get_calibration(self, node_op: CircuitInst, qubits: list) -> Schedule | ScheduleBlock:
267
- """Builds the calibration schedule for the RZXGate(theta) without echos.
268
-
269
- Args:
270
- node_op: Instruction of the RZXGate(theta). I.e. params[0] is theta.
271
- qubits: List of qubits for which to get the schedules. The first qubit is
272
- the control and the second is the target.
273
-
274
- Returns:
275
- schedule: The calibration schedule for the RZXGate(theta).
276
-
277
- Raises:
278
- QiskitError: if rotation angle is not assigned.
279
- QiskitError: If the control and target qubits cannot be identified,
280
- or the backend does not natively support the specified direction of the cx.
281
- CalibrationNotAvailable: RZX schedule cannot be built for input node.
282
- """
283
- theta = node_op.params[0]
284
-
285
- try:
286
- theta = float(theta)
287
- except TypeError as ex:
288
- raise QiskitError("Target rotation angle is not assigned.") from ex
289
-
290
- if np.isclose(theta, 0.0):
291
- return ScheduleBlock(name="rzx(0.000)")
292
-
293
- cal_type, cr_tones, comp_tones = _check_calibration_type(self._inst_map, qubits)
294
-
295
- if cal_type in [CRCalType.DIRECT_CX_FORWARD, CRCalType.DIRECT_CX_REVERSE]:
296
- if self._verbose:
297
- warnings.warn(
298
- f"CR instruction for qubits {qubits} is likely {cal_type.value} sequence. "
299
- "Pulse stretch for this calibration is not currently implemented. "
300
- "RZX schedule is not generated for this qubit pair.",
301
- UserWarning,
302
- )
303
- raise CalibrationNotAvailable
304
-
305
- # RZXCalibrationNoEcho only good for forward CR direction
306
- if cal_type in [CRCalType.ECR_CX_FORWARD, CRCalType.ECR_FORWARD]:
307
- with warnings.catch_warnings():
308
- warnings.simplefilter(action="ignore", category=DeprecationWarning)
309
- # Pulse builder emits deprecation warnings as part of the
310
- # Qiskit Pulse deprecation
311
- with builder.build(default_alignment="left", name=f"rzx({theta:.3f})") as rzx_theta:
312
- stretched_dur = self.rescale_cr_inst(cr_tones[0], 2 * theta)
313
- self.rescale_cr_inst(comp_tones[0], 2 * theta)
314
- # Placeholder to make pulse gate work
315
- builder.delay(stretched_dur, DriveChannel(qubits[0]))
316
- return rzx_theta
317
-
318
- raise QiskitError("RZXCalibrationBuilderNoEcho only supports hardware-native RZX gates.")
319
-
320
-
321
- def _filter_cr_tone(time_inst_tup):
322
- """A helper function to filter pulses on control channels."""
323
- valid_types = ["GaussianSquare"]
324
-
325
- _, inst = time_inst_tup
326
- if isinstance(inst, Play) and isinstance(inst.channel, ControlChannel):
327
- pulse = inst.pulse
328
- if isinstance(pulse, Waveform) or pulse.pulse_type in valid_types:
329
- return True
330
- return False
331
-
332
-
333
- def _filter_comp_tone(time_inst_tup):
334
- """A helper function to filter pulses on drive channels."""
335
- valid_types = ["GaussianSquare"]
336
-
337
- _, inst = time_inst_tup
338
- if isinstance(inst, Play) and isinstance(inst.channel, DriveChannel):
339
- pulse = inst.pulse
340
- if isinstance(pulse, Waveform) or pulse.pulse_type in valid_types:
341
- return True
342
- return False
343
-
344
-
345
- def _check_calibration_type(
346
- inst_sched_map: InstructionScheduleMap, qubits: Sequence[int]
347
- ) -> tuple[CRCalType, list[Play], list[Play]]:
348
- """A helper function to check type of CR calibration.
349
-
350
- Args:
351
- inst_sched_map: instruction schedule map of the backends
352
- qubits: ordered tuple of qubits for cross resonance (q_control, q_target)
353
-
354
- Returns:
355
- Filtered instructions and most-likely type of calibration.
356
-
357
- Raises:
358
- QiskitError: Unknown calibration type is detected.
359
- """
360
- cal_type = None
361
- with warnings.catch_warnings():
362
- warnings.simplefilter(action="ignore", category=DeprecationWarning)
363
- # `InstructionScheduleMap.get` and `filter_instructions` emit deprecation warnings
364
- # as they use classes and methods which are deprecated in Qiskit 1.3 as part of the
365
- # Qiskit Pulse deprecation
366
- if inst_sched_map.has("cx", qubits):
367
- cr_sched = inst_sched_map.get("cx", qubits=qubits)
368
- elif inst_sched_map.has("ecr", qubits):
369
- cr_sched = inst_sched_map.get("ecr", qubits=qubits)
370
- cal_type = CRCalType.ECR_FORWARD
371
- elif inst_sched_map.has("ecr", tuple(reversed(qubits))):
372
- cr_sched = inst_sched_map.get("ecr", tuple(reversed(qubits)))
373
- cal_type = CRCalType.ECR_REVERSE
374
- else:
375
- raise QiskitError(
376
- f"Native direction cannot be determined: operation on qubits {qubits} "
377
- f"for the following instruction schedule map:\n{inst_sched_map}"
378
- )
379
-
380
- cr_tones = [t[1] for t in filter_instructions(cr_sched, [_filter_cr_tone]).instructions]
381
- comp_tones = [t[1] for t in filter_instructions(cr_sched, [_filter_comp_tone]).instructions]
382
-
383
- if cal_type is None:
384
- if len(comp_tones) == 0:
385
- raise QiskitError(
386
- f"{repr(cr_sched)} has no target compensation tones. "
387
- "Native ECR direction cannot be determined."
388
- )
389
- # Determine native direction, assuming only single drive channel per qubit.
390
- # This guarantees channel and qubit index equality.
391
- if comp_tones[0].channel.index == qubits[1]:
392
- cal_type = CRCalType.ECR_CX_FORWARD
393
- else:
394
- cal_type = CRCalType.ECR_CX_REVERSE
395
-
396
- if len(cr_tones) == 2 and len(comp_tones) in (0, 2):
397
- # ECR can be implemented without compensation tone at price of lower fidelity.
398
- # Remarkable noisy terms are usually eliminated by echo.
399
- return cal_type, cr_tones, comp_tones
400
-
401
- if len(cr_tones) == 1 and len(comp_tones) == 1:
402
- # Direct CX must have compensation tone on target qubit.
403
- # Otherwise, it cannot eliminate IX interaction.
404
- if comp_tones[0].channel.index == qubits[1]:
405
- return CRCalType.DIRECT_CX_FORWARD, cr_tones, comp_tones
406
- else:
407
- return CRCalType.DIRECT_CX_REVERSE, cr_tones, comp_tones
408
- raise QiskitError(
409
- f"{repr(cr_sched)} is undefined pulse sequence. "
410
- "Check if this is a calibration for cross resonance operation."
411
- )