qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0rc1__cp39-abi3-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/circuit/__init__.py +24 -5
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +248 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +34 -5
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  60. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  61. qiskit/circuit/library/n_local/n_local.py +1 -1
  62. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  63. qiskit/circuit/library/overlap.py +2 -2
  64. qiskit/circuit/library/pauli_evolution.py +39 -24
  65. qiskit/circuit/library/phase_oracle.py +130 -51
  66. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  67. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  68. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  69. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  70. qiskit/circuit/library/standard_gates/h.py +4 -9
  71. qiskit/circuit/library/standard_gates/i.py +2 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  73. qiskit/circuit/library/standard_gates/p.py +15 -34
  74. qiskit/circuit/library/standard_gates/r.py +2 -6
  75. qiskit/circuit/library/standard_gates/rx.py +5 -15
  76. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  77. qiskit/circuit/library/standard_gates/ry.py +5 -17
  78. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  79. qiskit/circuit/library/standard_gates/rz.py +5 -17
  80. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  82. qiskit/circuit/library/standard_gates/s.py +6 -15
  83. qiskit/circuit/library/standard_gates/swap.py +4 -11
  84. qiskit/circuit/library/standard_gates/sx.py +7 -12
  85. qiskit/circuit/library/standard_gates/t.py +6 -7
  86. qiskit/circuit/library/standard_gates/u.py +2 -10
  87. qiskit/circuit/library/standard_gates/u1.py +5 -16
  88. qiskit/circuit/library/standard_gates/u2.py +2 -6
  89. qiskit/circuit/library/standard_gates/u3.py +3 -11
  90. qiskit/circuit/library/standard_gates/x.py +13 -60
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/y.py +4 -9
  94. qiskit/circuit/library/standard_gates/z.py +5 -15
  95. qiskit/circuit/measure.py +11 -2
  96. qiskit/circuit/parameterexpression.py +4 -0
  97. qiskit/circuit/quantumcircuit.py +881 -555
  98. qiskit/circuit/random/utils.py +12 -6
  99. qiskit/circuit/reset.py +5 -2
  100. qiskit/circuit/singleton.py +5 -11
  101. qiskit/circuit/store.py +0 -8
  102. qiskit/compiler/__init__.py +1 -7
  103. qiskit/compiler/transpiler.py +38 -196
  104. qiskit/converters/circuit_to_dag.py +4 -2
  105. qiskit/converters/circuit_to_dagdependency.py +0 -2
  106. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  107. qiskit/converters/circuit_to_gate.py +1 -1
  108. qiskit/converters/circuit_to_instruction.py +16 -29
  109. qiskit/converters/dag_to_circuit.py +5 -5
  110. qiskit/converters/dag_to_dagdependency.py +0 -1
  111. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  112. qiskit/converters/dagdependency_to_circuit.py +0 -6
  113. qiskit/converters/dagdependency_to_dag.py +0 -6
  114. qiskit/dagcircuit/collect_blocks.py +32 -20
  115. qiskit/dagcircuit/dagdependency.py +3 -37
  116. qiskit/dagcircuit/dagdependency_v2.py +2 -80
  117. qiskit/dagcircuit/dagnode.py +14 -2
  118. qiskit/passmanager/__init__.py +24 -6
  119. qiskit/passmanager/passmanager.py +26 -24
  120. qiskit/primitives/__init__.py +44 -35
  121. qiskit/primitives/backend_estimator_v2.py +102 -23
  122. qiskit/primitives/backend_sampler_v2.py +5 -20
  123. qiskit/primitives/base/__init__.py +4 -4
  124. qiskit/primitives/base/base_estimator.py +77 -82
  125. qiskit/primitives/base/base_primitive_job.py +2 -2
  126. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  127. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  128. qiskit/primitives/base/base_sampler.py +52 -60
  129. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  130. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  131. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  132. qiskit/primitives/containers/bindings_array.py +3 -1
  133. qiskit/primitives/containers/bit_array.py +23 -0
  134. qiskit/primitives/containers/data_bin.py +3 -1
  135. qiskit/primitives/containers/observables_array.py +19 -2
  136. qiskit/primitives/statevector_sampler.py +6 -8
  137. qiskit/primitives/utils.py +14 -189
  138. qiskit/providers/__init__.py +4 -130
  139. qiskit/providers/backend.py +11 -314
  140. qiskit/providers/basic_provider/__init__.py +3 -1
  141. qiskit/providers/basic_provider/basic_provider.py +29 -9
  142. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  143. qiskit/providers/exceptions.py +0 -33
  144. qiskit/providers/fake_provider/__init__.py +0 -37
  145. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  146. qiskit/qasm2/__init__.py +21 -6
  147. qiskit/qasm2/export.py +2 -10
  148. qiskit/qasm2/parse.py +11 -25
  149. qiskit/qasm3/__init__.py +5 -1
  150. qiskit/qasm3/ast.py +44 -0
  151. qiskit/qasm3/exporter.py +65 -27
  152. qiskit/qasm3/printer.py +35 -4
  153. qiskit/qpy/__init__.py +141 -19
  154. qiskit/qpy/binary_io/__init__.py +0 -1
  155. qiskit/qpy/binary_io/circuits.py +91 -116
  156. qiskit/qpy/binary_io/schedules.py +61 -388
  157. qiskit/qpy/binary_io/value.py +154 -28
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +29 -62
  161. qiskit/qpy/type_keys.py +58 -221
  162. qiskit/quantum_info/analysis/distance.py +3 -1
  163. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  164. qiskit/quantum_info/operators/operator.py +6 -2
  165. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  166. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  167. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  169. qiskit/quantum_info/states/densitymatrix.py +16 -6
  170. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  171. qiskit/quantum_info/states/statevector.py +16 -6
  172. qiskit/result/__init__.py +5 -17
  173. qiskit/result/models.py +18 -10
  174. qiskit/result/result.py +28 -126
  175. qiskit/result/sampled_expval.py +1 -2
  176. qiskit/result/utils.py +3 -4
  177. qiskit/synthesis/__init__.py +21 -1
  178. qiskit/synthesis/arithmetic/__init__.py +3 -1
  179. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  180. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  182. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  183. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  184. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  185. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  186. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  188. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  189. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  190. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  191. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  192. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +2 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +1 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +67 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/dag_visualization.py +2 -1
  287. qiskit/visualization/gate_map.py +39 -154
  288. qiskit/visualization/pass_manager_visualization.py +6 -2
  289. qiskit/visualization/state_visualization.py +6 -0
  290. qiskit/visualization/timeline/core.py +18 -12
  291. qiskit/visualization/timeline/interface.py +19 -18
  292. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +1 -1
  295. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
  296. qiskit/assembler/__init__.py +0 -42
  297. qiskit/assembler/assemble_circuits.py +0 -451
  298. qiskit/assembler/assemble_schedules.py +0 -367
  299. qiskit/assembler/disassemble.py +0 -310
  300. qiskit/assembler/run_config.py +0 -77
  301. qiskit/circuit/bit.py +0 -106
  302. qiskit/circuit/classicalfunction/__init__.py +0 -152
  303. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  304. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  305. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  306. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  307. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  308. qiskit/circuit/classicalfunction/types.py +0 -18
  309. qiskit/circuit/classicalfunction/utils.py +0 -91
  310. qiskit/circuit/classicalregister.py +0 -57
  311. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  312. qiskit/circuit/quantumregister.py +0 -75
  313. qiskit/circuit/register.py +0 -246
  314. qiskit/compiler/assembler.py +0 -689
  315. qiskit/compiler/scheduler.py +0 -109
  316. qiskit/compiler/sequencer.py +0 -71
  317. qiskit/primitives/backend_estimator.py +0 -486
  318. qiskit/primitives/backend_sampler.py +0 -222
  319. qiskit/primitives/estimator.py +0 -172
  320. qiskit/primitives/sampler.py +0 -162
  321. qiskit/providers/backend_compat.py +0 -507
  322. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  330. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/fake_1q.py +0 -91
  346. qiskit/providers/fake_provider/fake_backend.py +0 -165
  347. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  348. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  349. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  350. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  351. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  352. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  353. qiskit/providers/models/__init__.py +0 -89
  354. qiskit/providers/models/backendconfiguration.py +0 -1040
  355. qiskit/providers/models/backendproperties.py +0 -535
  356. qiskit/providers/models/backendstatus.py +0 -104
  357. qiskit/providers/models/jobstatus.py +0 -77
  358. qiskit/providers/models/pulsedefaults.py +0 -305
  359. qiskit/providers/provider.py +0 -95
  360. qiskit/pulse/__init__.py +0 -158
  361. qiskit/pulse/builder.py +0 -2262
  362. qiskit/pulse/calibration_entries.py +0 -381
  363. qiskit/pulse/channels.py +0 -227
  364. qiskit/pulse/configuration.py +0 -245
  365. qiskit/pulse/exceptions.py +0 -45
  366. qiskit/pulse/filters.py +0 -309
  367. qiskit/pulse/instruction_schedule_map.py +0 -424
  368. qiskit/pulse/instructions/__init__.py +0 -67
  369. qiskit/pulse/instructions/acquire.py +0 -150
  370. qiskit/pulse/instructions/delay.py +0 -71
  371. qiskit/pulse/instructions/directives.py +0 -154
  372. qiskit/pulse/instructions/frequency.py +0 -135
  373. qiskit/pulse/instructions/instruction.py +0 -270
  374. qiskit/pulse/instructions/phase.py +0 -152
  375. qiskit/pulse/instructions/play.py +0 -99
  376. qiskit/pulse/instructions/reference.py +0 -100
  377. qiskit/pulse/instructions/snapshot.py +0 -82
  378. qiskit/pulse/library/__init__.py +0 -97
  379. qiskit/pulse/library/continuous.py +0 -430
  380. qiskit/pulse/library/pulse.py +0 -148
  381. qiskit/pulse/library/samplers/__init__.py +0 -15
  382. qiskit/pulse/library/samplers/decorators.py +0 -295
  383. qiskit/pulse/library/samplers/strategies.py +0 -71
  384. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  385. qiskit/pulse/library/waveform.py +0 -136
  386. qiskit/pulse/macros.py +0 -262
  387. qiskit/pulse/parameter_manager.py +0 -445
  388. qiskit/pulse/parser.py +0 -314
  389. qiskit/pulse/reference_manager.py +0 -58
  390. qiskit/pulse/schedule.py +0 -1854
  391. qiskit/pulse/transforms/__init__.py +0 -106
  392. qiskit/pulse/transforms/alignments.py +0 -406
  393. qiskit/pulse/transforms/base_transforms.py +0 -71
  394. qiskit/pulse/transforms/canonicalization.py +0 -498
  395. qiskit/pulse/transforms/dag.py +0 -122
  396. qiskit/pulse/utils.py +0 -149
  397. qiskit/qobj/__init__.py +0 -75
  398. qiskit/qobj/common.py +0 -81
  399. qiskit/qobj/converters/__init__.py +0 -18
  400. qiskit/qobj/converters/lo_config.py +0 -177
  401. qiskit/qobj/converters/pulse_instruction.py +0 -897
  402. qiskit/qobj/pulse_qobj.py +0 -709
  403. qiskit/qobj/qasm_qobj.py +0 -708
  404. qiskit/qobj/utils.py +0 -46
  405. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  406. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  407. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  408. qiskit/result/mitigation/utils.py +0 -217
  409. qiskit/scheduler/__init__.py +0 -40
  410. qiskit/scheduler/config.py +0 -37
  411. qiskit/scheduler/lowering.py +0 -187
  412. qiskit/scheduler/methods/__init__.py +0 -15
  413. qiskit/scheduler/methods/basic.py +0 -140
  414. qiskit/scheduler/schedule_circuit.py +0 -69
  415. qiskit/scheduler/sequence.py +0 -104
  416. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  417. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  418. qiskit/transpiler/passes/calibration/builders.py +0 -20
  419. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  420. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  421. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  422. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  423. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  424. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  425. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  426. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  427. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  428. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  429. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  430. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  431. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  432. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  433. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  434. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  435. qiskit/utils/deprecate_pulse.py +0 -119
  436. qiskit/utils/multiprocessing.py +0 -56
  437. qiskit/visualization/pulse_v2/__init__.py +0 -21
  438. qiskit/visualization/pulse_v2/core.py +0 -901
  439. qiskit/visualization/pulse_v2/device_info.py +0 -173
  440. qiskit/visualization/pulse_v2/drawings.py +0 -253
  441. qiskit/visualization/pulse_v2/events.py +0 -254
  442. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  443. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  444. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  445. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  446. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  447. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  448. qiskit/visualization/pulse_v2/interface.py +0 -459
  449. qiskit/visualization/pulse_v2/layouts.py +0 -387
  450. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  451. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  452. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  453. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  454. qiskit/visualization/pulse_v2/types.py +0 -242
  455. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -1,245 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2017, 2019.
4
- #
5
- # This code is licensed under the Apache License, Version 2.0. You may
6
- # obtain a copy of this license in the LICENSE.txt file in the root directory
7
- # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
- #
9
- # Any modifications or derivative works of this code must retain this
10
- # copyright notice, and modified files need to carry a notice indicating
11
- # that they have been altered from the originals.
12
-
13
- """
14
- Configurations for pulse experiments.
15
- """
16
- from __future__ import annotations
17
- import numpy as np
18
-
19
- from .channels import DriveChannel, MeasureChannel
20
- from .exceptions import PulseError
21
-
22
-
23
- def _assert_nested_dict_equal(a: dict, b: dict):
24
- if len(a) != len(b):
25
- return False
26
- for key in a:
27
- if key in b:
28
- if isinstance(a[key], dict):
29
- if not _assert_nested_dict_equal(a[key], b[key]):
30
- return False
31
- elif isinstance(a[key], np.ndarray):
32
- if not np.all(a[key] == b[key]):
33
- return False
34
- else:
35
- if a[key] != b[key]:
36
- return False
37
- else:
38
- return False
39
- return True
40
-
41
-
42
- class Kernel:
43
- """Settings for this Kernel, which is responsible for integrating time series (raw) data
44
- into IQ points.
45
- """
46
-
47
- def __init__(self, name: str | None = None, **params):
48
- """Create new kernel.
49
-
50
- Args:
51
- name: Name of kernel to be used
52
- params: Any settings for kerneling.
53
- """
54
- self.name = name
55
- self.params = params
56
-
57
- def __repr__(self):
58
- name_repr = "'" + self.name + "', "
59
- params_repr = ", ".join(f"{str(k)}={str(v)}" for k, v in self.params.items())
60
- return f"{self.__class__.__name__}({name_repr}{params_repr})"
61
-
62
- def __eq__(self, other):
63
- if isinstance(other, Kernel):
64
- return _assert_nested_dict_equal(self.__dict__, other.__dict__)
65
- return False
66
-
67
-
68
- class Discriminator:
69
- """Setting for this Discriminator, which is responsible for classifying kerneled IQ points
70
- into 0/1 state results.
71
- """
72
-
73
- def __init__(self, name: str | None = None, **params):
74
- """Create new discriminator.
75
-
76
- Args:
77
- name: Name of discriminator to be used
78
- params: Any settings for discrimination.
79
- """
80
- self.name = name
81
- self.params = params
82
-
83
- def __repr__(self):
84
- name_repr = "'" + self.name + "', " or ""
85
- params_repr = ", ".join(f"{str(k)}={str(v)}" for k, v in self.params.items())
86
- return f"{self.__class__.__name__}({name_repr}{params_repr})"
87
-
88
- def __eq__(self, other):
89
- if isinstance(other, Discriminator):
90
- return _assert_nested_dict_equal(self.__dict__, other.__dict__)
91
- return False
92
-
93
-
94
- class LoRange:
95
- """Range of LO frequency."""
96
-
97
- def __init__(self, lower_bound: float, upper_bound: float):
98
- self._lb = lower_bound
99
- self._ub = upper_bound
100
-
101
- def includes(self, lo_freq: complex) -> bool:
102
- """Whether `lo_freq` is within the `LoRange`.
103
-
104
- Args:
105
- lo_freq: LO frequency to be validated
106
-
107
- Returns:
108
- bool: True if lo_freq is included in this range, otherwise False
109
- """
110
- if self._lb <= abs(lo_freq) <= self._ub:
111
- return True
112
- return False
113
-
114
- @property
115
- def lower_bound(self) -> float:
116
- """Lower bound of the LO range"""
117
- return self._lb
118
-
119
- @property
120
- def upper_bound(self) -> float:
121
- """Upper bound of the LO range"""
122
- return self._ub
123
-
124
- def __repr__(self):
125
- return f"{self.__class__.__name__}({self._lb:f}, {self._ub:f})"
126
-
127
- def __eq__(self, other):
128
- """Two LO ranges are the same if they are of the same type, and
129
- have the same frequency range
130
-
131
- Args:
132
- other (LoRange): other LoRange
133
-
134
- Returns:
135
- bool: are self and other equal.
136
- """
137
- if type(self) is type(other) and self._ub == other._ub and self._lb == other._lb:
138
- return True
139
- return False
140
-
141
-
142
- class LoConfig:
143
- """Pulse channel LO frequency container."""
144
-
145
- def __init__(
146
- self,
147
- channel_los: dict[DriveChannel | MeasureChannel, float] | None = None,
148
- lo_ranges: dict[DriveChannel | MeasureChannel, LoRange | tuple[int, int]] | None = None,
149
- ):
150
- """Lo channel configuration data structure.
151
-
152
- Args:
153
- channel_los: Dictionary of mappings from configurable channel to lo
154
- lo_ranges: Dictionary of mappings to be enforced from configurable channel to `LoRange`
155
-
156
- Raises:
157
- PulseError: If channel is not configurable or set lo is out of range.
158
-
159
- """
160
- self._q_lo_freq: dict[DriveChannel, float] = {}
161
- self._m_lo_freq: dict[MeasureChannel, float] = {}
162
- self._lo_ranges: dict[DriveChannel | MeasureChannel, LoRange] = {}
163
-
164
- lo_ranges = lo_ranges if lo_ranges else {}
165
- for channel, freq in lo_ranges.items():
166
- self.add_lo_range(channel, freq)
167
-
168
- channel_los = channel_los if channel_los else {}
169
- for channel, freq in channel_los.items():
170
- self.add_lo(channel, freq)
171
-
172
- def add_lo(self, channel: DriveChannel | MeasureChannel, freq: float):
173
- """Add a lo mapping for a channel."""
174
- if isinstance(channel, DriveChannel):
175
- # add qubit_lo_freq
176
- self.check_lo(channel, freq)
177
- self._q_lo_freq[channel] = freq
178
- elif isinstance(channel, MeasureChannel):
179
- # add meas_lo_freq
180
- self.check_lo(channel, freq)
181
- self._m_lo_freq[channel] = freq
182
- else:
183
- raise PulseError(f"Specified channel {channel.name} cannot be configured.")
184
-
185
- def add_lo_range(
186
- self, channel: DriveChannel | MeasureChannel, lo_range: LoRange | tuple[int, int]
187
- ):
188
- """Add lo range to configuration.
189
-
190
- Args:
191
- channel: Channel to add lo range for
192
- lo_range: Lo range to add
193
-
194
- """
195
- if isinstance(lo_range, (list, tuple)):
196
- lo_range = LoRange(*lo_range)
197
- self._lo_ranges[channel] = lo_range
198
-
199
- def check_lo(self, channel: DriveChannel | MeasureChannel, freq: float) -> bool:
200
- """Check that lo is valid for channel.
201
-
202
- Args:
203
- channel: Channel to validate lo for
204
- freq: lo frequency
205
- Raises:
206
- PulseError: If freq is outside of channels range
207
- Returns:
208
- True if lo is valid for channel
209
- """
210
- lo_ranges = self._lo_ranges
211
- if channel in lo_ranges:
212
- lo_range = lo_ranges[channel]
213
- if not lo_range.includes(freq):
214
- raise PulseError(f"Specified LO freq {freq:f} is out of range {lo_range}")
215
- return True
216
-
217
- def channel_lo(self, channel: DriveChannel | MeasureChannel) -> float:
218
- """Return channel lo.
219
-
220
- Args:
221
- channel: Channel to get lo for
222
- Raises:
223
- PulseError: If channel is not configured
224
- Returns:
225
- Lo of supplied channel if present
226
- """
227
- if isinstance(channel, DriveChannel):
228
- if channel in self.qubit_los:
229
- return self.qubit_los[channel]
230
-
231
- if isinstance(channel, MeasureChannel):
232
- if channel in self.meas_los:
233
- return self.meas_los[channel]
234
-
235
- raise PulseError(f"Channel {channel} is not configured")
236
-
237
- @property
238
- def qubit_los(self) -> dict[DriveChannel, float]:
239
- """Returns dictionary mapping qubit channels (DriveChannel) to los."""
240
- return self._q_lo_freq
241
-
242
- @property
243
- def meas_los(self) -> dict[MeasureChannel, float]:
244
- """Returns dictionary mapping measure channels (MeasureChannel) to los."""
245
- return self._m_lo_freq
@@ -1,45 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2017, 2019.
4
- #
5
- # This code is licensed under the Apache License, Version 2.0. You may
6
- # obtain a copy of this license in the LICENSE.txt file in the root directory
7
- # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
- #
9
- # Any modifications or derivative works of this code must retain this
10
- # copyright notice, and modified files need to carry a notice indicating
11
- # that they have been altered from the originals.
12
-
13
- """Exception for errors raised by the pulse module."""
14
- from qiskit.exceptions import QiskitError
15
- from qiskit.utils.deprecate_pulse import deprecate_pulse_func
16
-
17
-
18
- class PulseError(QiskitError):
19
- """Errors raised by the pulse module."""
20
-
21
- @deprecate_pulse_func
22
- def __init__(self, *message):
23
- """Set the error message."""
24
- super().__init__(*message)
25
- self.message = " ".join(message)
26
-
27
- def __str__(self):
28
- """Return the message."""
29
- return repr(self.message)
30
-
31
-
32
- class BackendNotSet(PulseError):
33
- """Raised if the builder context does not have a backend."""
34
-
35
-
36
- class NoActiveBuilder(PulseError):
37
- """Raised if no builder context is active."""
38
-
39
-
40
- class UnassignedDurationError(PulseError):
41
- """Raised if instruction duration is unassigned."""
42
-
43
-
44
- class UnassignedReferenceError(PulseError):
45
- """Raised if subroutine is unassigned."""
qiskit/pulse/filters.py DELETED
@@ -1,309 +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
- """A collection of functions that filter instructions in a pulse program."""
14
- from __future__ import annotations
15
- import abc
16
- from functools import singledispatch
17
- from collections.abc import Iterable
18
- from typing import Callable, Any, List
19
-
20
- import numpy as np
21
-
22
- from qiskit.pulse import Schedule, ScheduleBlock, Instruction
23
- from qiskit.pulse.channels import Channel
24
- from qiskit.pulse.schedule import Interval
25
- from qiskit.pulse.exceptions import PulseError
26
-
27
-
28
- @singledispatch
29
- def filter_instructions(
30
- sched,
31
- filters: List[Callable[..., bool]],
32
- negate: bool = False,
33
- recurse_subroutines: bool = True,
34
- ):
35
- """A catch-TypeError function which will only get called if none of the other decorated
36
- functions, namely handle_schedule() and handle_scheduleblock(), handle the type passed.
37
- """
38
- raise TypeError(
39
- f"Type '{type(sched)}' is not valid data format as an input to filter_instructions."
40
- )
41
-
42
-
43
- @filter_instructions.register
44
- def handle_schedule(
45
- sched: Schedule,
46
- filters: List[Callable[..., bool]],
47
- negate: bool = False,
48
- recurse_subroutines: bool = True,
49
- ) -> Schedule:
50
- """A filtering function that takes a schedule and returns a schedule consisting of
51
- filtered instructions.
52
-
53
- Args:
54
- sched: A pulse schedule to be filtered.
55
- filters: List of callback functions that take an instruction and return boolean.
56
- negate: Set `True` to accept an instruction if a filter function returns `False`.
57
- Otherwise the instruction is accepted when the filter function returns `False`.
58
- recurse_subroutines: Set `True` to individually filter instructions inside of a subroutine
59
- defined by the :py:class:`~qiskit.pulse.instructions.Call` instruction.
60
-
61
- Returns:
62
- Filtered pulse schedule.
63
- """
64
- from qiskit.pulse.transforms import flatten, inline_subroutines
65
-
66
- target_sched = flatten(sched)
67
- if recurse_subroutines:
68
- target_sched = inline_subroutines(target_sched)
69
-
70
- time_inst_tuples = np.array(target_sched.instructions)
71
-
72
- valid_insts = np.ones(len(time_inst_tuples), dtype=bool)
73
- for filt in filters:
74
- valid_insts = np.logical_and(valid_insts, np.array(list(map(filt, time_inst_tuples))))
75
-
76
- if negate and len(filters) > 0:
77
- valid_insts = ~valid_insts
78
-
79
- filter_schedule = Schedule.initialize_from(sched)
80
- for time, inst in time_inst_tuples[valid_insts]:
81
- filter_schedule.insert(time, inst, inplace=True)
82
-
83
- return filter_schedule
84
-
85
-
86
- @filter_instructions.register
87
- def handle_scheduleblock(
88
- sched_blk: ScheduleBlock,
89
- filters: List[Callable[..., bool]],
90
- negate: bool = False,
91
- recurse_subroutines: bool = True,
92
- ) -> ScheduleBlock:
93
- """A filtering function that takes a schedule_block and returns a schedule_block consisting of
94
- filtered instructions.
95
-
96
- Args:
97
- sched_blk: A pulse schedule_block to be filtered.
98
- filters: List of callback functions that take an instruction and return boolean.
99
- negate: Set `True` to accept an instruction if a filter function returns `False`.
100
- Otherwise the instruction is accepted when the filter function returns `False`.
101
- recurse_subroutines: Set `True` to individually filter instructions inside of a subroutine
102
- defined by the :py:class:`~qiskit.pulse.instructions.Call` instruction.
103
-
104
- Returns:
105
- Filtered pulse schedule_block.
106
- """
107
- from qiskit.pulse.transforms import inline_subroutines
108
-
109
- target_sched_blk = sched_blk
110
- if recurse_subroutines:
111
- target_sched_blk = inline_subroutines(target_sched_blk)
112
-
113
- def apply_filters_to_insts_in_scheblk(blk: ScheduleBlock) -> ScheduleBlock:
114
- blk_new = ScheduleBlock.initialize_from(blk)
115
- for element in blk.blocks:
116
- if isinstance(element, ScheduleBlock):
117
- inner_blk = apply_filters_to_insts_in_scheblk(element)
118
- if len(inner_blk) > 0:
119
- blk_new.append(inner_blk)
120
-
121
- elif isinstance(element, Instruction):
122
- valid_inst = all(filt(element) for filt in filters)
123
- if negate:
124
- valid_inst ^= True
125
- if valid_inst:
126
- blk_new.append(element)
127
-
128
- else:
129
- raise PulseError(
130
- f"An unexpected element '{element}' is included in ScheduleBlock.blocks."
131
- )
132
- return blk_new
133
-
134
- filter_sched_blk = apply_filters_to_insts_in_scheblk(target_sched_blk)
135
- return filter_sched_blk
136
-
137
-
138
- def composite_filter(
139
- channels: Iterable[Channel] | Channel | None = None,
140
- instruction_types: Iterable[abc.ABCMeta] | abc.ABCMeta | None = None,
141
- time_ranges: Iterable[tuple[int, int]] | None = None,
142
- intervals: Iterable[Interval] | None = None,
143
- ) -> list[Callable]:
144
- """A helper function to generate a list of filter functions based on
145
- typical elements to be filtered.
146
-
147
- Args:
148
- channels: For example, ``[DriveChannel(0), AcquireChannel(0)]``.
149
- instruction_types (Optional[Iterable[Type[qiskit.pulse.Instruction]]]): For example,
150
- ``[PulseInstruction, AcquireInstruction]``.
151
- time_ranges: For example, ``[(0, 5), (6, 10)]``.
152
- intervals: For example, ``[(0, 5), (6, 10)]``.
153
-
154
- Returns:
155
- List of filtering functions.
156
- """
157
- filters = []
158
-
159
- # An empty list is also valid input for filter generators.
160
- # See unittest `test.python.pulse.test_schedule.TestScheduleFilter.test_empty_filters`.
161
- if channels is not None:
162
- filters.append(with_channels(channels))
163
- if instruction_types is not None:
164
- filters.append(with_instruction_types(instruction_types))
165
- if time_ranges is not None:
166
- filters.append(with_intervals(time_ranges))
167
- if intervals is not None:
168
- filters.append(with_intervals(intervals))
169
-
170
- return filters
171
-
172
-
173
- def with_channels(channels: Iterable[Channel] | Channel) -> Callable:
174
- """Channel filter generator.
175
-
176
- Args:
177
- channels: List of channels to filter.
178
-
179
- Returns:
180
- A callback function to filter channels.
181
- """
182
- channels = _if_scalar_cast_to_list(channels)
183
-
184
- @singledispatch
185
- def channel_filter(time_inst):
186
- """A catch-TypeError function which will only get called if none of the other decorated
187
- functions, namely handle_numpyndarray() and handle_instruction(), handle the type passed.
188
- """
189
- raise TypeError(
190
- f"Type '{type(time_inst)}' is not valid data format as an input to channel_filter."
191
- )
192
-
193
- @channel_filter.register
194
- def handle_numpyndarray(time_inst: np.ndarray) -> bool:
195
- """Filter channel.
196
-
197
- Args:
198
- time_inst (numpy.ndarray([int, Instruction])): Time
199
-
200
- Returns:
201
- If instruction matches with condition.
202
- """
203
- return any(chan in channels for chan in time_inst[1].channels)
204
-
205
- @channel_filter.register
206
- def handle_instruction(inst: Instruction) -> bool:
207
- """Filter channel.
208
-
209
- Args:
210
- inst: Instruction
211
-
212
- Returns:
213
- If instruction matches with condition.
214
- """
215
- return any(chan in channels for chan in inst.channels)
216
-
217
- return channel_filter
218
-
219
-
220
- def with_instruction_types(types: Iterable[abc.ABCMeta] | abc.ABCMeta) -> Callable:
221
- """Instruction type filter generator.
222
-
223
- Args:
224
- types: List of instruction types to filter.
225
-
226
- Returns:
227
- A callback function to filter instructions.
228
- """
229
- types = _if_scalar_cast_to_list(types)
230
-
231
- @singledispatch
232
- def instruction_filter(time_inst) -> bool:
233
- """A catch-TypeError function which will only get called if none of the other decorated
234
- functions, namely handle_numpyndarray() and handle_instruction(), handle the type passed.
235
- """
236
- raise TypeError(
237
- f"Type '{type(time_inst)}' is not valid data format as an input to instruction_filter."
238
- )
239
-
240
- @instruction_filter.register
241
- def handle_numpyndarray(time_inst: np.ndarray) -> bool:
242
- """Filter instruction.
243
-
244
- Args:
245
- time_inst (numpy.ndarray([int, Instruction])): Time
246
-
247
- Returns:
248
- If instruction matches with condition.
249
- """
250
- return isinstance(time_inst[1], tuple(types))
251
-
252
- @instruction_filter.register
253
- def handle_instruction(inst: Instruction) -> bool:
254
- """Filter instruction.
255
-
256
- Args:
257
- inst: Instruction
258
-
259
- Returns:
260
- If instruction matches with condition.
261
- """
262
- return isinstance(inst, tuple(types))
263
-
264
- return instruction_filter
265
-
266
-
267
- def with_intervals(ranges: Iterable[Interval] | Interval) -> Callable:
268
- """Interval filter generator.
269
-
270
- Args:
271
- ranges: List of intervals ``[t0, t1]`` to filter.
272
-
273
- Returns:
274
- A callback function to filter intervals.
275
- """
276
- ranges = _if_scalar_cast_to_list(ranges)
277
-
278
- def interval_filter(time_inst) -> bool:
279
- """Filter interval.
280
- Args:
281
- time_inst (Tuple[int, Instruction]): Time
282
-
283
- Returns:
284
- If instruction matches with condition.
285
- """
286
- for t0, t1 in ranges:
287
- inst_start = time_inst[0]
288
- inst_stop = inst_start + time_inst[1].duration
289
- if t0 <= inst_start and inst_stop <= t1:
290
- return True
291
- return False
292
-
293
- return interval_filter
294
-
295
-
296
- def _if_scalar_cast_to_list(to_list: Any) -> list[Any]:
297
- """A helper function to create python list of input arguments.
298
-
299
- Args:
300
- to_list: Arbitrary object can be converted into a python list.
301
-
302
- Returns:
303
- Python list of input object.
304
- """
305
- try:
306
- iter(to_list)
307
- except TypeError:
308
- to_list = [to_list]
309
- return to_list