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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.pyd +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 +1 -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,645 +0,0 @@
1
- # This code is part of Qiskit.
2
- #
3
- # (C) Copyright IBM 2020.
4
- #
5
- # This code is licensed under the Apache License, Version 2.0. You may
6
- # obtain a copy of this license in the LICENSE.txt file in the root directory
7
- # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
- #
9
- # Any modifications or derivative works of this code must retain this
10
- # copyright notice, and modified files need to carry a notice indicating
11
- # that they have been altered from the originals.
12
-
13
- # pylint: disable=unused-argument
14
-
15
- """Waveform generators.
16
-
17
- A collection of functions that generate drawings from formatted input data.
18
- See py:mod:`qiskit.visualization.pulse_v2.types` for more info on the required data.
19
-
20
- In this module the input data is `types.PulseInstruction`.
21
-
22
- An end-user can write arbitrary functions that generate custom drawings.
23
- Generators in this module are called with the `formatter` and `device` kwargs.
24
- These data provides stylesheet configuration and backend system configuration.
25
-
26
- The format of generator is restricted to:
27
-
28
- ```python
29
-
30
- def my_object_generator(data: PulseInstruction,
31
- formatter: Dict[str, Any],
32
- device: DrawerBackendInfo) -> List[ElementaryData]:
33
- pass
34
- ```
35
-
36
- Arbitrary generator function satisfying the above format can be accepted.
37
- Returned `ElementaryData` can be arbitrary subclasses that are implemented in
38
- the plotter API.
39
- """
40
-
41
- from __future__ import annotations
42
- import re
43
- from fractions import Fraction
44
- from typing import Any
45
-
46
- import numpy as np
47
-
48
- from qiskit import pulse, circuit
49
- from qiskit.pulse import instructions, library
50
- from qiskit.visualization.exceptions import VisualizationError
51
- from qiskit.visualization.pulse_v2 import drawings, types, device_info
52
-
53
-
54
- def gen_filled_waveform_stepwise(
55
- data: types.PulseInstruction, formatter: dict[str, Any], device: device_info.DrawerBackendInfo
56
- ) -> list[drawings.LineData | drawings.BoxData | drawings.TextData]:
57
- """Generate filled area objects of the real and the imaginary part of waveform envelope.
58
-
59
- The curve of envelope is not interpolated nor smoothed and presented
60
- as stepwise function at each data point.
61
-
62
- Stylesheets:
63
- - The `fill_waveform` style is applied.
64
-
65
- Args:
66
- data: Waveform instruction data to draw.
67
- formatter: Dictionary of stylesheet settings.
68
- device: Backend configuration.
69
-
70
- Returns:
71
- List of `LineData`, `BoxData`, or `TextData` drawings.
72
-
73
- Raises:
74
- VisualizationError: When the instruction parser returns invalid data format.
75
- """
76
- # generate waveform data
77
- waveform_data = _parse_waveform(data)
78
- channel = data.inst.channel
79
-
80
- # update metadata
81
- meta = waveform_data.meta
82
- qind = device.get_qubit_index(channel)
83
- meta.update({"qubit": qind if qind is not None else "N/A"})
84
-
85
- if isinstance(waveform_data, types.ParsedInstruction):
86
- # Draw waveform with fixed shape
87
-
88
- xdata = waveform_data.xvals
89
- ydata = waveform_data.yvals
90
-
91
- # phase modulation
92
- if formatter["control.apply_phase_modulation"]:
93
- ydata = np.asarray(ydata, dtype=complex) * np.exp(1j * data.frame.phase)
94
- else:
95
- ydata = np.asarray(ydata, dtype=complex)
96
-
97
- return _draw_shaped_waveform(
98
- xdata=xdata, ydata=ydata, meta=meta, channel=channel, formatter=formatter
99
- )
100
-
101
- elif isinstance(waveform_data, types.OpaqueShape):
102
- # Draw parametric pulse with unbound parameters
103
-
104
- # parameter name
105
- unbound_params = []
106
- for pname, pval in data.inst.pulse.parameters.items():
107
- if isinstance(pval, circuit.ParameterExpression):
108
- unbound_params.append(pname)
109
-
110
- pulse_data = data.inst.pulse
111
- if isinstance(pulse_data, library.SymbolicPulse):
112
- pulse_shape = pulse_data.pulse_type
113
- else:
114
- pulse_shape = "Waveform"
115
-
116
- return _draw_opaque_waveform(
117
- init_time=data.t0,
118
- duration=waveform_data.duration,
119
- pulse_shape=pulse_shape,
120
- pnames=unbound_params,
121
- meta=meta,
122
- channel=channel,
123
- formatter=formatter,
124
- )
125
-
126
- else:
127
- raise VisualizationError("Invalid data format is provided.")
128
-
129
-
130
- def gen_ibmq_latex_waveform_name(
131
- data: types.PulseInstruction, formatter: dict[str, Any], device: device_info.DrawerBackendInfo
132
- ) -> list[drawings.TextData]:
133
- r"""Generate the formatted instruction name associated with the waveform.
134
-
135
- Channel name and ID string are removed and the rotation angle is expressed in units of pi.
136
- The controlled rotation angle associated with the CR pulse name is divided by 2.
137
-
138
- Note that in many scientific articles the controlled rotation angle implies
139
- the actual rotation angle, but in IQX backend the rotation angle represents
140
- the difference between rotation angles with different control qubit states.
141
-
142
- For example:
143
- - 'X90p_d0_abcdefg' is converted into 'X(\frac{\pi}{2})'
144
- - 'CR90p_u0_abcdefg` is converted into 'CR(\frac{\pi}{4})'
145
-
146
- Stylesheets:
147
- - The `annotate` style is applied.
148
-
149
- Notes:
150
- This generator can convert pulse names used in the IQX backends.
151
- If pulses are provided by the third party providers or the user defined,
152
- the generator output may be the as-is pulse name.
153
-
154
- Args:
155
- data: Waveform instruction data to draw.
156
- formatter: Dictionary of stylesheet settings.
157
- device: Backend configuration.
158
-
159
- Returns:
160
- List of `TextData` drawings.
161
- """
162
- if data.is_opaque:
163
- return []
164
-
165
- style = {
166
- "zorder": formatter["layer.annotate"],
167
- "color": formatter["color.annotate"],
168
- "size": formatter["text_size.annotate"],
169
- "va": "center",
170
- "ha": "center",
171
- }
172
-
173
- if isinstance(data.inst, pulse.instructions.Acquire):
174
- systematic_name = "Acquire"
175
- latex_name = None
176
- elif isinstance(data.inst, instructions.Delay):
177
- systematic_name = data.inst.name or "Delay"
178
- latex_name = None
179
- else:
180
- pulse_data = data.inst.pulse
181
- if pulse_data.name:
182
- systematic_name = pulse_data.name
183
- else:
184
- if isinstance(pulse_data, library.SymbolicPulse):
185
- systematic_name = pulse_data.pulse_type
186
- else:
187
- systematic_name = "Waveform"
188
-
189
- template = r"(?P<op>[A-Z]+)(?P<angle>[0-9]+)?(?P<sign>[pm])_(?P<ch>[dum])[0-9]+"
190
- match_result = re.match(template, systematic_name)
191
- if match_result is not None:
192
- match_dict = match_result.groupdict()
193
- sign = "" if match_dict["sign"] == "p" else "-"
194
- if match_dict["op"] == "CR":
195
- # cross resonance
196
- if match_dict["ch"] == "u":
197
- op_name = r"{\rm CR}"
198
- else:
199
- op_name = r"\overline{\rm CR}"
200
- # IQX name def is not standard. Echo CR is annotated with pi/4 rather than pi/2
201
- angle_val = match_dict["angle"]
202
- frac = Fraction(int(int(angle_val) / 2), 180)
203
- if frac.numerator == 1:
204
- angle = rf"\pi/{frac.denominator:d}"
205
- else:
206
- angle = rf"{frac.numerator:d}/{frac.denominator:d} \pi"
207
- else:
208
- # single qubit pulse
209
- # pylint: disable-next=consider-using-f-string
210
- op_name = r"{{\rm {}}}".format(match_dict["op"])
211
- angle_val = match_dict["angle"]
212
- if angle_val is None:
213
- angle = r"\pi"
214
- else:
215
- frac = Fraction(int(angle_val), 180)
216
- if frac.numerator == 1:
217
- angle = rf"\pi/{frac.denominator:d}"
218
- else:
219
- angle = rf"{frac.numerator:d}/{frac.denominator:d} \pi"
220
- latex_name = rf"{op_name}({sign}{angle})"
221
- else:
222
- latex_name = None
223
-
224
- text = drawings.TextData(
225
- data_type=types.LabelType.PULSE_NAME,
226
- channels=data.inst.channel,
227
- xvals=[data.t0 + 0.5 * data.inst.duration],
228
- yvals=[-formatter["label_offset.pulse_name"]],
229
- text=systematic_name,
230
- latex=latex_name,
231
- ignore_scaling=True,
232
- styles=style,
233
- )
234
-
235
- return [text]
236
-
237
-
238
- def gen_waveform_max_value(
239
- data: types.PulseInstruction, formatter: dict[str, Any], device: device_info.DrawerBackendInfo
240
- ) -> list[drawings.TextData]:
241
- """Generate the annotation for the maximum waveform height for
242
- the real and the imaginary part of the waveform envelope.
243
-
244
- Maximum values smaller than the vertical resolution limit is ignored.
245
-
246
- Stylesheets:
247
- - The `annotate` style is applied.
248
-
249
- Args:
250
- data: Waveform instruction data to draw.
251
- formatter: Dictionary of stylesheet settings.
252
- device: Backend configuration.
253
-
254
- Returns:
255
- List of `TextData` drawings.
256
- """
257
- if data.is_opaque:
258
- return []
259
-
260
- style = {
261
- "zorder": formatter["layer.annotate"],
262
- "color": formatter["color.annotate"],
263
- "size": formatter["text_size.annotate"],
264
- "ha": "center",
265
- }
266
-
267
- # only pulses.
268
- if isinstance(data.inst, instructions.Play):
269
- # pulse
270
- operand = data.inst.pulse
271
- if isinstance(operand, pulse.SymbolicPulse):
272
- pulse_data = operand.get_waveform()
273
- else:
274
- pulse_data = operand
275
- xdata = np.arange(pulse_data.duration) + data.t0
276
- ydata = pulse_data.samples
277
- else:
278
- return []
279
-
280
- # phase modulation
281
- if formatter["control.apply_phase_modulation"]:
282
- ydata = np.asarray(ydata, dtype=complex) * np.exp(1j * data.frame.phase)
283
- else:
284
- ydata = np.asarray(ydata, dtype=complex)
285
-
286
- texts = []
287
-
288
- # max of real part
289
- re_maxind = np.argmax(np.abs(ydata.real))
290
- if np.abs(ydata.real[re_maxind]) > 0.01:
291
- # generator shows only 2 digits after the decimal point.
292
- if ydata.real[re_maxind] > 0:
293
- max_val = f"{ydata.real[re_maxind]:.2f}\n\u25BE"
294
- re_style = {"va": "bottom"}
295
- else:
296
- max_val = f"\u25B4\n{ydata.real[re_maxind]:.2f}"
297
- re_style = {"va": "top"}
298
- re_style.update(style)
299
- re_text = drawings.TextData(
300
- data_type=types.LabelType.PULSE_INFO,
301
- channels=data.inst.channel,
302
- xvals=[xdata[re_maxind]],
303
- yvals=[ydata.real[re_maxind]],
304
- text=max_val,
305
- styles=re_style,
306
- )
307
- texts.append(re_text)
308
-
309
- # max of imag part
310
- im_maxind = np.argmax(np.abs(ydata.imag))
311
- if np.abs(ydata.imag[im_maxind]) > 0.01:
312
- # generator shows only 2 digits after the decimal point.
313
- if ydata.imag[im_maxind] > 0:
314
- max_val = f"{ydata.imag[im_maxind]:.2f}\n\u25BE"
315
- im_style = {"va": "bottom"}
316
- else:
317
- max_val = f"\u25B4\n{ydata.imag[im_maxind]:.2f}"
318
- im_style = {"va": "top"}
319
- im_style.update(style)
320
- im_text = drawings.TextData(
321
- data_type=types.LabelType.PULSE_INFO,
322
- channels=data.inst.channel,
323
- xvals=[xdata[im_maxind]],
324
- yvals=[ydata.imag[im_maxind]],
325
- text=max_val,
326
- styles=im_style,
327
- )
328
- texts.append(im_text)
329
-
330
- return texts
331
-
332
-
333
- def _draw_shaped_waveform(
334
- xdata: np.ndarray,
335
- ydata: np.ndarray,
336
- meta: dict[str, Any],
337
- channel: pulse.channels.PulseChannel,
338
- formatter: dict[str, Any],
339
- ) -> list[drawings.LineData | drawings.BoxData | drawings.TextData]:
340
- """A private function that generates drawings of stepwise pulse lines.
341
-
342
- Args:
343
- xdata: Array of horizontal coordinate of waveform envelope.
344
- ydata: Array of vertical coordinate of waveform envelope.
345
- meta: Metadata dictionary of the waveform.
346
- channel: Channel associated with the waveform to draw.
347
- formatter: Dictionary of stylesheet settings.
348
-
349
- Returns:
350
- List of drawings.
351
-
352
- Raises:
353
- VisualizationError: When the waveform color for channel is not defined.
354
- """
355
- fill_objs: list[drawings.LineData | drawings.BoxData | drawings.TextData] = []
356
-
357
- resolution = formatter["general.vertical_resolution"]
358
-
359
- # stepwise interpolation
360
- xdata: np.ndarray = np.concatenate((xdata, [xdata[-1] + 1]))
361
- ydata = np.repeat(ydata, 2)
362
- re_y = np.real(ydata)
363
- im_y = np.imag(ydata)
364
- time: np.ndarray = np.concatenate(([xdata[0]], np.repeat(xdata[1:-1], 2), [xdata[-1]]))
365
-
366
- # setup style options
367
- style = {
368
- "alpha": formatter["alpha.fill_waveform"],
369
- "zorder": formatter["layer.fill_waveform"],
370
- "linewidth": formatter["line_width.fill_waveform"],
371
- "linestyle": formatter["line_style.fill_waveform"],
372
- }
373
-
374
- try:
375
- color_real, color_imag = formatter["color.waveforms"][channel.prefix.upper()]
376
- except KeyError as ex:
377
- raise VisualizationError(
378
- f"Waveform color for channel type {channel.prefix} is not defined"
379
- ) from ex
380
-
381
- # create real part
382
- if np.any(re_y):
383
- # data compression
384
- re_valid_inds = _find_consecutive_index(re_y, resolution)
385
- # stylesheet
386
- re_style = {"color": color_real}
387
- re_style.update(style)
388
- # metadata
389
- re_meta = {"data": "real"}
390
- re_meta.update(meta)
391
- # active xy data
392
- re_xvals = time[re_valid_inds]
393
- re_yvals = re_y[re_valid_inds]
394
-
395
- # object
396
- real = drawings.LineData(
397
- data_type=types.WaveformType.REAL,
398
- channels=channel,
399
- xvals=re_xvals,
400
- yvals=re_yvals,
401
- fill=formatter["control.fill_waveform"],
402
- meta=re_meta,
403
- styles=re_style,
404
- )
405
- fill_objs.append(real)
406
-
407
- # create imaginary part
408
- if np.any(im_y):
409
- # data compression
410
- im_valid_inds = _find_consecutive_index(im_y, resolution)
411
- # stylesheet
412
- im_style = {"color": color_imag}
413
- im_style.update(style)
414
- # metadata
415
- im_meta = {"data": "imag"}
416
- im_meta.update(meta)
417
- # active xy data
418
- im_xvals = time[im_valid_inds]
419
- im_yvals = im_y[im_valid_inds]
420
-
421
- # object
422
- imag = drawings.LineData(
423
- data_type=types.WaveformType.IMAG,
424
- channels=channel,
425
- xvals=im_xvals,
426
- yvals=im_yvals,
427
- fill=formatter["control.fill_waveform"],
428
- meta=im_meta,
429
- styles=im_style,
430
- )
431
- fill_objs.append(imag)
432
-
433
- return fill_objs
434
-
435
-
436
- def _draw_opaque_waveform(
437
- init_time: int,
438
- duration: int,
439
- pulse_shape: str,
440
- pnames: list[str],
441
- meta: dict[str, Any],
442
- channel: pulse.channels.PulseChannel,
443
- formatter: dict[str, Any],
444
- ) -> list[drawings.LineData | drawings.BoxData | drawings.TextData]:
445
- """A private function that generates drawings of stepwise pulse lines.
446
-
447
- Args:
448
- init_time: Time when the opaque waveform starts.
449
- duration: Duration of opaque waveform. This can be None or ParameterExpression.
450
- pulse_shape: String that represents pulse shape.
451
- pnames: List of parameter names.
452
- meta: Metadata dictionary of the waveform.
453
- channel: Channel associated with the waveform to draw.
454
- formatter: Dictionary of stylesheet settings.
455
-
456
- Returns:
457
- List of drawings.
458
- """
459
- fill_objs: list[drawings.LineData | drawings.BoxData | drawings.TextData] = []
460
-
461
- fc, ec = formatter["color.opaque_shape"]
462
- # setup style options
463
- box_style = {
464
- "zorder": formatter["layer.fill_waveform"],
465
- "alpha": formatter["alpha.opaque_shape"],
466
- "linewidth": formatter["line_width.opaque_shape"],
467
- "linestyle": formatter["line_style.opaque_shape"],
468
- "facecolor": fc,
469
- "edgecolor": ec,
470
- }
471
-
472
- if duration is None or isinstance(duration, circuit.ParameterExpression):
473
- duration = formatter["box_width.opaque_shape"]
474
-
475
- box_obj = drawings.BoxData(
476
- data_type=types.WaveformType.OPAQUE,
477
- channels=channel,
478
- xvals=[init_time, init_time + duration],
479
- yvals=[
480
- -0.5 * formatter["box_height.opaque_shape"],
481
- 0.5 * formatter["box_height.opaque_shape"],
482
- ],
483
- meta=meta,
484
- ignore_scaling=True,
485
- styles=box_style,
486
- )
487
- fill_objs.append(box_obj)
488
-
489
- # parameter name
490
- func_repr = f"{pulse_shape}({', '.join(pnames)})"
491
-
492
- text_style = {
493
- "zorder": formatter["layer.annotate"],
494
- "color": formatter["color.annotate"],
495
- "size": formatter["text_size.annotate"],
496
- "va": "bottom",
497
- "ha": "center",
498
- }
499
-
500
- text_obj = drawings.TextData(
501
- data_type=types.LabelType.OPAQUE_BOXTEXT,
502
- channels=channel,
503
- xvals=[init_time + 0.5 * duration],
504
- yvals=[0.5 * formatter["box_height.opaque_shape"]],
505
- text=func_repr,
506
- ignore_scaling=True,
507
- styles=text_style,
508
- )
509
-
510
- fill_objs.append(text_obj)
511
-
512
- return fill_objs
513
-
514
-
515
- def _find_consecutive_index(data_array: np.ndarray, resolution: float) -> np.ndarray:
516
- """A helper function to return non-consecutive index from the given list.
517
-
518
- This drastically reduces memory footprint to represent a drawing,
519
- especially for samples of very long flat-topped Gaussian pulses.
520
- Tiny value fluctuation smaller than `resolution` threshold is removed.
521
-
522
- Args:
523
- data_array: The array of numbers.
524
- resolution: Minimum resolution of sample values.
525
-
526
- Returns:
527
- The compressed data array.
528
- """
529
- try:
530
- vector = np.asarray(data_array, dtype=float)
531
- diff = np.diff(vector)
532
- diff[np.where(np.abs(diff) < resolution)] = 0
533
- # keep left and right edges
534
- consecutive_l = np.insert(diff.astype(bool), 0, True)
535
- consecutive_r = np.append(diff.astype(bool), True)
536
- return consecutive_l | consecutive_r
537
-
538
- except ValueError:
539
- return np.ones_like(data_array).astype(bool)
540
-
541
-
542
- def _parse_waveform(
543
- data: types.PulseInstruction,
544
- ) -> types.ParsedInstruction | types.OpaqueShape:
545
- """A helper function that generates an array for the waveform with
546
- instruction metadata.
547
-
548
- Args:
549
- data: Instruction data set
550
-
551
- Raises:
552
- VisualizationError: When invalid instruction type is loaded.
553
-
554
- Returns:
555
- A data source to generate a drawing.
556
- """
557
- inst = data.inst
558
-
559
- meta: dict[str, Any] = {}
560
- if isinstance(inst, instructions.Play):
561
- # pulse
562
- operand = inst.pulse
563
- if isinstance(operand, pulse.SymbolicPulse):
564
- # parametric pulse
565
- params = operand.parameters
566
- duration = params.pop("duration", None)
567
- if isinstance(duration, circuit.Parameter):
568
- duration = None
569
-
570
- if isinstance(operand, library.SymbolicPulse):
571
- pulse_shape = operand.pulse_type
572
- else:
573
- pulse_shape = "Waveform"
574
- meta["waveform shape"] = pulse_shape
575
-
576
- meta.update(
577
- {
578
- key: val.name if isinstance(val, circuit.Parameter) else val
579
- for key, val in params.items()
580
- }
581
- )
582
- if data.is_opaque:
583
- # parametric pulse with unbound parameter
584
- if duration:
585
- meta.update(
586
- {
587
- "duration (cycle time)": inst.duration,
588
- "duration (sec)": inst.duration * data.dt if data.dt else "N/A",
589
- }
590
- )
591
- else:
592
- meta.update({"duration (cycle time)": "N/A", "duration (sec)": "N/A"})
593
-
594
- meta.update(
595
- {
596
- "t0 (cycle time)": data.t0,
597
- "t0 (sec)": data.t0 * data.dt if data.dt else "N/A",
598
- "phase": data.frame.phase,
599
- "frequency": data.frame.freq,
600
- "name": inst.name,
601
- }
602
- )
603
-
604
- return types.OpaqueShape(duration=duration, meta=meta)
605
- else:
606
- # fixed shape parametric pulse
607
- pulse_data = operand.get_waveform()
608
- else:
609
- # waveform
610
- pulse_data = operand
611
- xdata = np.arange(pulse_data.duration) + data.t0
612
- ydata = pulse_data.samples
613
- elif isinstance(inst, instructions.Delay):
614
- # delay
615
- xdata = np.arange(inst.duration) + data.t0
616
- ydata = np.zeros(inst.duration)
617
- elif isinstance(inst, instructions.Acquire):
618
- # acquire
619
- xdata = np.arange(inst.duration) + data.t0
620
- ydata = np.ones(inst.duration)
621
- acq_data = {
622
- "memory slot": inst.mem_slot.name,
623
- "register slot": inst.reg_slot.name if inst.reg_slot else "N/A",
624
- "discriminator": inst.discriminator.name if inst.discriminator else "N/A",
625
- "kernel": inst.kernel.name if inst.kernel else "N/A",
626
- }
627
- meta.update(acq_data)
628
- else:
629
- raise VisualizationError(
630
- f"Unsupported instruction {inst.__class__.__name__} by " "filled envelope."
631
- )
632
-
633
- meta.update(
634
- {
635
- "duration (cycle time)": inst.duration,
636
- "duration (sec)": inst.duration * data.dt if data.dt else "N/A",
637
- "t0 (cycle time)": data.t0,
638
- "t0 (sec)": data.t0 * data.dt if data.dt else "N/A",
639
- "phase": data.frame.phase,
640
- "frequency": data.frame.freq,
641
- "name": inst.name,
642
- }
643
- )
644
-
645
- return types.ParsedInstruction(xvals=xdata, yvals=ydata, meta=meta)