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