qiskit 1.4.2__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 (459) 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 +7 -1
  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/compiler/__init__.py +1 -7
  104. qiskit/compiler/transpiler.py +38 -196
  105. qiskit/converters/circuit_to_dag.py +6 -4
  106. qiskit/converters/circuit_to_dagdependency.py +0 -2
  107. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  108. qiskit/converters/circuit_to_gate.py +1 -1
  109. qiskit/converters/circuit_to_instruction.py +16 -29
  110. qiskit/converters/dag_to_circuit.py +7 -8
  111. qiskit/converters/dag_to_dagdependency.py +0 -1
  112. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  113. qiskit/converters/dagdependency_to_circuit.py +0 -6
  114. qiskit/converters/dagdependency_to_dag.py +0 -6
  115. qiskit/dagcircuit/collect_blocks.py +32 -20
  116. qiskit/dagcircuit/dagdependency.py +3 -37
  117. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  118. qiskit/dagcircuit/dagnode.py +14 -2
  119. qiskit/passmanager/__init__.py +24 -6
  120. qiskit/passmanager/passmanager.py +26 -24
  121. qiskit/primitives/__init__.py +44 -35
  122. qiskit/primitives/backend_estimator_v2.py +102 -23
  123. qiskit/primitives/backend_sampler_v2.py +5 -20
  124. qiskit/primitives/base/__init__.py +4 -4
  125. qiskit/primitives/base/base_estimator.py +77 -82
  126. qiskit/primitives/base/base_primitive_job.py +2 -2
  127. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  128. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  129. qiskit/primitives/base/base_sampler.py +52 -60
  130. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  131. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  132. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  133. qiskit/primitives/containers/bindings_array.py +3 -1
  134. qiskit/primitives/containers/bit_array.py +23 -0
  135. qiskit/primitives/containers/data_bin.py +3 -1
  136. qiskit/primitives/containers/observables_array.py +19 -2
  137. qiskit/primitives/statevector_sampler.py +6 -8
  138. qiskit/primitives/utils.py +14 -189
  139. qiskit/providers/__init__.py +4 -130
  140. qiskit/providers/backend.py +11 -314
  141. qiskit/providers/basic_provider/__init__.py +3 -1
  142. qiskit/providers/basic_provider/basic_provider.py +29 -9
  143. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  144. qiskit/providers/exceptions.py +0 -33
  145. qiskit/providers/fake_provider/__init__.py +0 -37
  146. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  147. qiskit/qasm2/__init__.py +21 -6
  148. qiskit/qasm2/export.py +2 -10
  149. qiskit/qasm2/parse.py +11 -25
  150. qiskit/qasm3/__init__.py +5 -1
  151. qiskit/qasm3/ast.py +44 -0
  152. qiskit/qasm3/exporter.py +65 -27
  153. qiskit/qasm3/printer.py +35 -4
  154. qiskit/qpy/__init__.py +162 -19
  155. qiskit/qpy/binary_io/__init__.py +0 -1
  156. qiskit/qpy/binary_io/circuits.py +98 -130
  157. qiskit/qpy/binary_io/schedules.py +69 -439
  158. qiskit/qpy/binary_io/value.py +154 -31
  159. qiskit/qpy/common.py +10 -7
  160. qiskit/qpy/formats.py +41 -0
  161. qiskit/qpy/interface.py +34 -81
  162. qiskit/qpy/type_keys.py +58 -221
  163. qiskit/quantum_info/analysis/distance.py +3 -1
  164. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  165. qiskit/quantum_info/operators/operator.py +6 -2
  166. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  167. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  168. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  169. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  170. qiskit/quantum_info/states/densitymatrix.py +16 -6
  171. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  172. qiskit/quantum_info/states/statevector.py +16 -6
  173. qiskit/result/__init__.py +5 -17
  174. qiskit/result/models.py +18 -11
  175. qiskit/result/result.py +38 -134
  176. qiskit/result/sampled_expval.py +1 -2
  177. qiskit/result/utils.py +3 -4
  178. qiskit/synthesis/__init__.py +21 -1
  179. qiskit/synthesis/arithmetic/__init__.py +3 -1
  180. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  182. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  183. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  184. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  185. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  186. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  188. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  189. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  190. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  191. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  192. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -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 +4 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  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 +3 -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 +2 -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 +32 -4
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  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 +134 -62
  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 +107 -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 +78 -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/counts_visualization.py +4 -0
  287. qiskit/visualization/dag_visualization.py +2 -1
  288. qiskit/visualization/gate_map.py +39 -154
  289. qiskit/visualization/library.py +4 -1
  290. qiskit/visualization/pass_manager_visualization.py +6 -2
  291. qiskit/visualization/state_visualization.py +19 -2
  292. qiskit/visualization/timeline/core.py +19 -13
  293. qiskit/visualization/timeline/interface.py +19 -18
  294. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  295. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  296. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
  297. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  298. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  299. qiskit/assembler/__init__.py +0 -42
  300. qiskit/assembler/assemble_circuits.py +0 -451
  301. qiskit/assembler/assemble_schedules.py +0 -367
  302. qiskit/assembler/disassemble.py +0 -310
  303. qiskit/assembler/run_config.py +0 -77
  304. qiskit/circuit/bit.py +0 -106
  305. qiskit/circuit/classicalfunction/__init__.py +0 -152
  306. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  307. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  308. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  309. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  310. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  311. qiskit/circuit/classicalfunction/types.py +0 -18
  312. qiskit/circuit/classicalfunction/utils.py +0 -91
  313. qiskit/circuit/classicalregister.py +0 -57
  314. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  315. qiskit/circuit/quantumregister.py +0 -75
  316. qiskit/circuit/register.py +0 -246
  317. qiskit/compiler/assembler.py +0 -689
  318. qiskit/compiler/scheduler.py +0 -109
  319. qiskit/compiler/sequencer.py +0 -71
  320. qiskit/primitives/backend_estimator.py +0 -486
  321. qiskit/primitives/backend_sampler.py +0 -222
  322. qiskit/primitives/estimator.py +0 -172
  323. qiskit/primitives/sampler.py +0 -162
  324. qiskit/providers/backend_compat.py +0 -507
  325. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  340. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/fake_1q.py +0 -91
  349. qiskit/providers/fake_provider/fake_backend.py +0 -165
  350. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  351. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  352. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  353. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  354. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  355. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  356. qiskit/providers/models/__init__.py +0 -89
  357. qiskit/providers/models/backendconfiguration.py +0 -1040
  358. qiskit/providers/models/backendproperties.py +0 -535
  359. qiskit/providers/models/backendstatus.py +0 -104
  360. qiskit/providers/models/jobstatus.py +0 -77
  361. qiskit/providers/models/pulsedefaults.py +0 -305
  362. qiskit/providers/provider.py +0 -95
  363. qiskit/pulse/__init__.py +0 -158
  364. qiskit/pulse/builder.py +0 -2262
  365. qiskit/pulse/calibration_entries.py +0 -381
  366. qiskit/pulse/channels.py +0 -227
  367. qiskit/pulse/configuration.py +0 -245
  368. qiskit/pulse/exceptions.py +0 -45
  369. qiskit/pulse/filters.py +0 -309
  370. qiskit/pulse/instruction_schedule_map.py +0 -424
  371. qiskit/pulse/instructions/__init__.py +0 -67
  372. qiskit/pulse/instructions/acquire.py +0 -150
  373. qiskit/pulse/instructions/delay.py +0 -71
  374. qiskit/pulse/instructions/directives.py +0 -154
  375. qiskit/pulse/instructions/frequency.py +0 -135
  376. qiskit/pulse/instructions/instruction.py +0 -270
  377. qiskit/pulse/instructions/phase.py +0 -152
  378. qiskit/pulse/instructions/play.py +0 -99
  379. qiskit/pulse/instructions/reference.py +0 -100
  380. qiskit/pulse/instructions/snapshot.py +0 -82
  381. qiskit/pulse/library/__init__.py +0 -97
  382. qiskit/pulse/library/continuous.py +0 -430
  383. qiskit/pulse/library/pulse.py +0 -148
  384. qiskit/pulse/library/samplers/__init__.py +0 -15
  385. qiskit/pulse/library/samplers/decorators.py +0 -295
  386. qiskit/pulse/library/samplers/strategies.py +0 -71
  387. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  388. qiskit/pulse/library/waveform.py +0 -136
  389. qiskit/pulse/macros.py +0 -262
  390. qiskit/pulse/parameter_manager.py +0 -445
  391. qiskit/pulse/parser.py +0 -314
  392. qiskit/pulse/reference_manager.py +0 -58
  393. qiskit/pulse/schedule.py +0 -1854
  394. qiskit/pulse/transforms/__init__.py +0 -106
  395. qiskit/pulse/transforms/alignments.py +0 -406
  396. qiskit/pulse/transforms/base_transforms.py +0 -71
  397. qiskit/pulse/transforms/canonicalization.py +0 -498
  398. qiskit/pulse/transforms/dag.py +0 -122
  399. qiskit/pulse/utils.py +0 -149
  400. qiskit/qobj/__init__.py +0 -75
  401. qiskit/qobj/common.py +0 -81
  402. qiskit/qobj/converters/__init__.py +0 -18
  403. qiskit/qobj/converters/lo_config.py +0 -177
  404. qiskit/qobj/converters/pulse_instruction.py +0 -897
  405. qiskit/qobj/pulse_qobj.py +0 -709
  406. qiskit/qobj/qasm_qobj.py +0 -708
  407. qiskit/qobj/utils.py +0 -46
  408. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  409. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  410. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  411. qiskit/result/mitigation/utils.py +0 -217
  412. qiskit/scheduler/__init__.py +0 -40
  413. qiskit/scheduler/config.py +0 -37
  414. qiskit/scheduler/lowering.py +0 -187
  415. qiskit/scheduler/methods/__init__.py +0 -15
  416. qiskit/scheduler/methods/basic.py +0 -140
  417. qiskit/scheduler/schedule_circuit.py +0 -69
  418. qiskit/scheduler/sequence.py +0 -104
  419. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  420. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  421. qiskit/transpiler/passes/calibration/builders.py +0 -20
  422. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  423. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  424. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  425. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  426. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  427. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  428. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  429. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  430. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  431. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  432. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  433. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  434. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  435. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  436. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  437. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  438. qiskit/utils/deprecate_pulse.py +0 -119
  439. qiskit/utils/multiprocessing.py +0 -56
  440. qiskit/visualization/pulse_v2/__init__.py +0 -21
  441. qiskit/visualization/pulse_v2/core.py +0 -901
  442. qiskit/visualization/pulse_v2/device_info.py +0 -173
  443. qiskit/visualization/pulse_v2/drawings.py +0 -253
  444. qiskit/visualization/pulse_v2/events.py +0 -254
  445. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  446. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  447. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  448. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  449. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  450. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  451. qiskit/visualization/pulse_v2/interface.py +0 -459
  452. qiskit/visualization/pulse_v2/layouts.py +0 -387
  453. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  454. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  455. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  456. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  457. qiskit/visualization/pulse_v2/types.py +0 -242
  458. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  459. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -1,445 +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
- # pylint: disable=invalid-name
14
-
15
- """"Management of pulse program parameters.
16
-
17
- Background
18
- ==========
19
-
20
- In contrast to ``QuantumCircuit``, in pulse programs, parameter objects can be stored in
21
- multiple places at different layers, for example
22
-
23
- - program variables: ``ScheduleBlock.alignment_context._context_params``
24
-
25
- - instruction operands: ``ShiftPhase.phase``, ...
26
-
27
- - operand parameters: ``pulse.parameters``, ``channel.index`` ...
28
-
29
- This complexity is due to the tight coupling of the program to an underlying device Hamiltonian,
30
- i.e. the variance of physical parameters between qubits and their couplings.
31
- If we want to define a program that can be used with arbitrary qubits,
32
- we should be able to parametrize every control parameter in the program.
33
-
34
- Implementation
35
- ==============
36
-
37
- Managing parameters in each object within a program, i.e. the ``ParameterTable`` model,
38
- makes the framework quite complicated. With the ``ParameterManager`` class within this module,
39
- the parameter assignment operation is performed by a visitor instance.
40
-
41
- The visitor pattern is a way of separating data processing from the object on which it operates.
42
- This removes the overhead of parameter management from each piece of the program.
43
- The computational complexity of the parameter assignment operation may be increased
44
- from the parameter table model of ~O(1), however, usually, this calculation occurs
45
- only once before the program is executed. Thus this doesn't hurt user experience during
46
- pulse programming. On the contrary, it removes parameter table object and associated logic
47
- from each object, yielding smaller object creation cost and higher performance
48
- as the data amount scales.
49
-
50
- Note that we don't need to write any parameter management logic for each object,
51
- and thus this parameter framework gives greater scalability to the pulse module.
52
- """
53
- from __future__ import annotations
54
- from copy import copy
55
- from typing import Any, Mapping, Sequence
56
-
57
- from qiskit.circuit.parametervector import ParameterVector, ParameterVectorElement
58
- from qiskit.circuit.parameter import Parameter
59
- from qiskit.circuit.parameterexpression import ParameterExpression, ParameterValueType
60
- from qiskit.pulse import instructions, channels
61
- from qiskit.pulse.exceptions import PulseError
62
- from qiskit.pulse.library import SymbolicPulse, Waveform
63
- from qiskit.pulse.schedule import Schedule, ScheduleBlock
64
- from qiskit.pulse.transforms.alignments import AlignmentKind
65
- from qiskit.pulse.utils import (
66
- format_parameter_value,
67
- _validate_parameter_vector,
68
- _validate_parameter_value,
69
- )
70
-
71
-
72
- class NodeVisitor:
73
- """A node visitor base class that walks instruction data in a pulse program and calls
74
- visitor functions for every node.
75
-
76
- Though this class implementation is based on Python AST, each node doesn't have
77
- a dedicated node class due to the lack of an abstract syntax tree for pulse programs in
78
- Qiskit. Instead of parsing pulse programs, this visitor class finds the associated visitor
79
- function based on class name of the instruction node, i.e. ``Play``, ``Call``, etc...
80
- The `.visit` method recursively checks superclass of given node since some parametrized
81
- components such as ``DriveChannel`` may share a common superclass with other subclasses.
82
- In this example, we can just define ``visit_Channel`` method instead of defining
83
- the same visitor function for every subclasses.
84
-
85
- Some instructions may have special logic or data structure to store parameter objects,
86
- and visitor functions for these nodes should be individually defined.
87
-
88
- Because pulse programs can be nested into another pulse program,
89
- the visitor function should be able to recursively call proper visitor functions.
90
- If visitor function is not defined for a given node, ``generic_visit``
91
- method is called. Usually, this method is provided for operating on object defined
92
- outside of the Qiskit Pulse module.
93
- """
94
-
95
- def visit(self, node: Any):
96
- """Visit a node."""
97
- visitor = self._get_visitor(type(node))
98
- return visitor(node)
99
-
100
- def _get_visitor(self, node_class):
101
- """A helper function to recursively investigate superclass visitor method."""
102
- if node_class == object:
103
- return self.generic_visit
104
-
105
- try:
106
- return getattr(self, f"visit_{node_class.__name__}")
107
- except AttributeError:
108
- # check super class
109
- return self._get_visitor(node_class.__base__)
110
-
111
- def visit_ScheduleBlock(self, node: ScheduleBlock):
112
- """Visit ``ScheduleBlock``. Recursively visit context blocks and overwrite.
113
-
114
- .. note:: ``ScheduleBlock`` can have parameters in blocks and its alignment.
115
- """
116
- raise NotImplementedError
117
-
118
- def visit_Schedule(self, node: Schedule):
119
- """Visit ``Schedule``. Recursively visit schedule children and overwrite."""
120
- raise NotImplementedError
121
-
122
- def generic_visit(self, node: Any):
123
- """Called if no explicit visitor function exists for a node."""
124
- raise NotImplementedError
125
-
126
-
127
- class ParameterSetter(NodeVisitor):
128
- """Node visitor for parameter binding.
129
-
130
- This visitor is initialized with a dictionary of parameters to be assigned,
131
- and assign values to operands of nodes found.
132
- """
133
-
134
- def __init__(self, param_map: dict[ParameterExpression, ParameterValueType]):
135
- self._param_map = param_map
136
-
137
- # Top layer: Assign parameters to programs
138
-
139
- def visit_ScheduleBlock(self, node: ScheduleBlock):
140
- """Visit ``ScheduleBlock``. Recursively visit context blocks and overwrite.
141
-
142
- .. note:: ``ScheduleBlock`` can have parameters in blocks and its alignment.
143
- """
144
- node._alignment_context = self.visit_AlignmentKind(node.alignment_context)
145
- for elm in node._blocks:
146
- self.visit(elm)
147
-
148
- self._update_parameter_manager(node)
149
- return node
150
-
151
- def visit_Schedule(self, node: Schedule):
152
- """Visit ``Schedule``. Recursively visit schedule children and overwrite."""
153
- # accessing to private member
154
- # TODO: consider updating Schedule to handle this more gracefully
155
- node._Schedule__children = [(t0, self.visit(sched)) for t0, sched in node.instructions]
156
- node._renew_timeslots()
157
-
158
- self._update_parameter_manager(node)
159
- return node
160
-
161
- def visit_AlignmentKind(self, node: AlignmentKind):
162
- """Assign parameters to block's ``AlignmentKind`` specification."""
163
- new_parameters = tuple(self.visit(param) for param in node._context_params)
164
- node._context_params = new_parameters
165
-
166
- return node
167
-
168
- # Mid layer: Assign parameters to instructions
169
-
170
- def visit_Instruction(self, node: instructions.Instruction):
171
- """Assign parameters to general pulse instruction.
172
-
173
- .. note:: All parametrized object should be stored in the operands.
174
- Otherwise parameter cannot be detected.
175
- """
176
- if node.is_parameterized():
177
- node._operands = tuple(self.visit(op) for op in node.operands)
178
-
179
- return node
180
-
181
- # Lower layer: Assign parameters to operands
182
-
183
- def visit_Channel(self, node: channels.Channel):
184
- """Assign parameters to ``Channel`` object."""
185
- if node.is_parameterized():
186
- new_index = self._assign_parameter_expression(node.index)
187
-
188
- # validate
189
- if not isinstance(new_index, ParameterExpression):
190
- if not isinstance(new_index, int) or new_index < 0:
191
- raise PulseError("Channel index must be a nonnegative integer")
192
-
193
- # return new instance to prevent accidentally override timeslots without evaluation
194
- return node.__class__(index=new_index)
195
-
196
- return node
197
-
198
- def visit_SymbolicPulse(self, node: SymbolicPulse):
199
- """Assign parameters to ``SymbolicPulse`` object."""
200
- if node.is_parameterized():
201
- # Assign duration
202
- if isinstance(node.duration, ParameterExpression):
203
- node.duration = self._assign_parameter_expression(node.duration)
204
- # Assign other parameters
205
- for name in node._params:
206
- pval = node._params[name]
207
- if isinstance(pval, ParameterExpression):
208
- new_val = self._assign_parameter_expression(pval)
209
- node._params[name] = new_val
210
- if not node.disable_validation:
211
- node.validate_parameters()
212
-
213
- return node
214
-
215
- def visit_Waveform(self, node: Waveform):
216
- """Assign parameters to ``Waveform`` object.
217
-
218
- .. node:: No parameter can be assigned to ``Waveform`` object.
219
- """
220
- return node
221
-
222
- def generic_visit(self, node: Any):
223
- """Assign parameters to object that doesn't belong to Qiskit Pulse module."""
224
- if isinstance(node, ParameterExpression):
225
- return self._assign_parameter_expression(node)
226
- else:
227
- return node
228
-
229
- def _assign_parameter_expression(self, param_expr: ParameterExpression):
230
- """A helper function to assign parameter value to parameter expression."""
231
- new_value = copy(param_expr)
232
- updated = param_expr.parameters & self._param_map.keys()
233
- for param in updated:
234
- new_value = new_value.assign(param, self._param_map[param])
235
- new_value = format_parameter_value(new_value)
236
- return new_value
237
-
238
- def _update_parameter_manager(self, node: Schedule | ScheduleBlock):
239
- """A helper function to update parameter manager of pulse program."""
240
- if not hasattr(node, "_parameter_manager"):
241
- raise PulseError(f"Node type {node.__class__.__name__} has no parameter manager.")
242
-
243
- param_manager = node._parameter_manager
244
- updated = param_manager.parameters & self._param_map.keys()
245
-
246
- new_parameters = set()
247
- for param in param_manager.parameters:
248
- if param not in updated:
249
- new_parameters.add(param)
250
- continue
251
- new_value = self._param_map[param]
252
- if isinstance(new_value, ParameterExpression):
253
- new_parameters |= new_value.parameters
254
- param_manager._parameters = new_parameters
255
-
256
-
257
- class ParameterGetter(NodeVisitor):
258
- """Node visitor for parameter finding.
259
-
260
- This visitor initializes empty parameter array, and recursively visits nodes
261
- and add parameters found to the array.
262
- """
263
-
264
- def __init__(self):
265
- self.parameters = set()
266
-
267
- # Top layer: Get parameters from programs
268
-
269
- def visit_ScheduleBlock(self, node: ScheduleBlock):
270
- """Visit ``ScheduleBlock``. Recursively visit context blocks and search parameters.
271
-
272
- .. note:: ``ScheduleBlock`` can have parameters in blocks and its alignment.
273
- """
274
- # Note that node.parameters returns parameters of main program with subroutines.
275
- # The manager of main program is not aware of parameters in subroutines.
276
- self.parameters |= node._parameter_manager.parameters
277
-
278
- def visit_Schedule(self, node: Schedule):
279
- """Visit ``Schedule``. Recursively visit schedule children and search parameters."""
280
- self.parameters |= node.parameters
281
-
282
- def visit_AlignmentKind(self, node: AlignmentKind):
283
- """Get parameters from block's ``AlignmentKind`` specification."""
284
- for param in node._context_params:
285
- if isinstance(param, ParameterExpression):
286
- self.parameters |= param.parameters
287
-
288
- # Mid layer: Get parameters from instructions
289
-
290
- def visit_Instruction(self, node: instructions.Instruction):
291
- """Get parameters from general pulse instruction.
292
-
293
- .. note:: All parametrized object should be stored in the operands.
294
- Otherwise, parameter cannot be detected.
295
- """
296
- for op in node.operands:
297
- self.visit(op)
298
-
299
- # Lower layer: Get parameters from operands
300
-
301
- def visit_Channel(self, node: channels.Channel):
302
- """Get parameters from ``Channel`` object."""
303
- self.parameters |= node.parameters
304
-
305
- def visit_SymbolicPulse(self, node: SymbolicPulse):
306
- """Get parameters from ``SymbolicPulse`` object."""
307
- for op_value in node.parameters.values():
308
- if isinstance(op_value, ParameterExpression):
309
- self.parameters |= op_value.parameters
310
-
311
- def visit_Waveform(self, node: Waveform):
312
- """Get parameters from ``Waveform`` object.
313
-
314
- .. node:: No parameter can be assigned to ``Waveform`` object.
315
- """
316
- pass
317
-
318
- def generic_visit(self, node: Any):
319
- """Get parameters from object that doesn't belong to Qiskit Pulse module."""
320
- if isinstance(node, ParameterExpression):
321
- self.parameters |= node.parameters
322
-
323
-
324
- class ParameterManager:
325
- """Helper class to manage parameter objects associated with arbitrary pulse programs.
326
-
327
- This object is implicitly initialized with the parameter object storage
328
- that stores parameter objects added to the parent pulse program.
329
-
330
- Parameter assignment logic is implemented based on the visitor pattern.
331
- Instruction data and its location are not directly associated with this object.
332
- """
333
-
334
- def __init__(self):
335
- """Create new parameter table for pulse programs."""
336
- self._parameters = set()
337
-
338
- @property
339
- def parameters(self) -> set[Parameter]:
340
- """Parameters which determine the schedule behavior."""
341
- return self._parameters
342
-
343
- def clear(self):
344
- """Remove the parameters linked to this manager."""
345
- self._parameters.clear()
346
-
347
- def is_parameterized(self) -> bool:
348
- """Return True iff the instruction is parameterized."""
349
- return bool(self.parameters)
350
-
351
- def get_parameters(self, parameter_name: str) -> list[Parameter]:
352
- """Get parameter object bound to this schedule by string name.
353
-
354
- Because different ``Parameter`` objects can have the same name,
355
- this method returns a list of ``Parameter`` s for the provided name.
356
-
357
- Args:
358
- parameter_name: Name of parameter.
359
-
360
- Returns:
361
- Parameter objects that have corresponding name.
362
- """
363
- return [param for param in self.parameters if param.name == parameter_name]
364
-
365
- def assign_parameters(
366
- self,
367
- pulse_program: Any,
368
- value_dict: dict[
369
- ParameterExpression | ParameterVector | str,
370
- ParameterValueType | Sequence[ParameterValueType],
371
- ],
372
- ) -> Any:
373
- """Modify and return program data with parameters assigned according to the input.
374
-
375
- Args:
376
- pulse_program: Arbitrary pulse program associated with this manager instance.
377
- value_dict: A mapping from Parameters to either numeric values or another
378
- Parameter expression.
379
-
380
- Returns:
381
- Updated program data.
382
- """
383
- unrolled_value_dict = self._unroll_param_dict(value_dict)
384
- valid_map = {
385
- k: unrolled_value_dict[k] for k in unrolled_value_dict.keys() & self._parameters
386
- }
387
- if valid_map:
388
- visitor = ParameterSetter(param_map=valid_map)
389
- return visitor.visit(pulse_program)
390
- return pulse_program
391
-
392
- def update_parameter_table(self, new_node: Any):
393
- """A helper function to update parameter table with given data node.
394
-
395
- Args:
396
- new_node: A new data node to be added.
397
- """
398
- visitor = ParameterGetter()
399
- visitor.visit(new_node)
400
- self._parameters |= visitor.parameters
401
-
402
- def _unroll_param_dict(
403
- self,
404
- parameter_binds: Mapping[
405
- Parameter | ParameterVector | str, ParameterValueType | Sequence[ParameterValueType]
406
- ],
407
- ) -> Mapping[Parameter, ParameterValueType]:
408
- """
409
- Unroll parameter dictionary to a map from parameter to value.
410
-
411
- Args:
412
- parameter_binds: A dictionary from parameter to value or a list of values.
413
-
414
- Returns:
415
- A dictionary from parameter to value.
416
- """
417
- out = {}
418
- param_name_dict = {param.name: [] for param in self.parameters}
419
- for param in self.parameters:
420
- param_name_dict[param.name].append(param)
421
- param_vec_dict = {
422
- param.vector.name: param.vector
423
- for param in self.parameters
424
- if isinstance(param, ParameterVectorElement)
425
- }
426
- for name in param_vec_dict.keys():
427
- if name in param_name_dict:
428
- param_name_dict[name].append(param_vec_dict[name])
429
- else:
430
- param_name_dict[name] = [param_vec_dict[name]]
431
-
432
- for parameter, value in parameter_binds.items():
433
- if isinstance(parameter, ParameterVector):
434
- _validate_parameter_vector(parameter, value)
435
- out.update(zip(parameter, value))
436
- elif isinstance(parameter, str):
437
- for param in param_name_dict[parameter]:
438
- is_vec = _validate_parameter_value(param, value)
439
- if is_vec:
440
- out.update(zip(param, value))
441
- else:
442
- out[param] = value
443
- else:
444
- out[parameter] = value
445
- return out