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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +236 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +11 -0
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/circuit/tools/pi_check.py +3 -0
  104. qiskit/compiler/__init__.py +1 -7
  105. qiskit/compiler/transpiler.py +38 -196
  106. qiskit/converters/circuit_to_dag.py +6 -4
  107. qiskit/converters/circuit_to_dagdependency.py +0 -2
  108. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  109. qiskit/converters/circuit_to_gate.py +1 -1
  110. qiskit/converters/circuit_to_instruction.py +16 -29
  111. qiskit/converters/dag_to_circuit.py +7 -8
  112. qiskit/converters/dag_to_dagdependency.py +0 -1
  113. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  114. qiskit/converters/dagdependency_to_circuit.py +0 -6
  115. qiskit/converters/dagdependency_to_dag.py +0 -6
  116. qiskit/dagcircuit/collect_blocks.py +32 -20
  117. qiskit/dagcircuit/dagdependency.py +3 -37
  118. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  119. qiskit/dagcircuit/dagnode.py +14 -2
  120. qiskit/passmanager/__init__.py +24 -6
  121. qiskit/passmanager/passmanager.py +26 -24
  122. qiskit/primitives/__init__.py +44 -35
  123. qiskit/primitives/backend_estimator_v2.py +102 -23
  124. qiskit/primitives/backend_sampler_v2.py +5 -20
  125. qiskit/primitives/base/__init__.py +4 -4
  126. qiskit/primitives/base/base_estimator.py +77 -82
  127. qiskit/primitives/base/base_primitive_job.py +2 -2
  128. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  129. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  130. qiskit/primitives/base/base_sampler.py +52 -60
  131. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  132. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  133. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  134. qiskit/primitives/containers/bindings_array.py +3 -1
  135. qiskit/primitives/containers/bit_array.py +23 -0
  136. qiskit/primitives/containers/data_bin.py +3 -1
  137. qiskit/primitives/containers/observables_array.py +19 -2
  138. qiskit/primitives/statevector_sampler.py +6 -8
  139. qiskit/primitives/utils.py +14 -189
  140. qiskit/providers/__init__.py +4 -130
  141. qiskit/providers/backend.py +11 -314
  142. qiskit/providers/basic_provider/__init__.py +3 -1
  143. qiskit/providers/basic_provider/basic_provider.py +29 -9
  144. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  145. qiskit/providers/exceptions.py +0 -33
  146. qiskit/providers/fake_provider/__init__.py +0 -37
  147. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  148. qiskit/qasm2/__init__.py +21 -6
  149. qiskit/qasm2/export.py +2 -10
  150. qiskit/qasm2/parse.py +11 -25
  151. qiskit/qasm3/__init__.py +5 -1
  152. qiskit/qasm3/ast.py +44 -0
  153. qiskit/qasm3/exporter.py +65 -27
  154. qiskit/qasm3/printer.py +35 -4
  155. qiskit/qpy/__init__.py +162 -19
  156. qiskit/qpy/binary_io/__init__.py +0 -1
  157. qiskit/qpy/binary_io/circuits.py +96 -116
  158. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  159. qiskit/qpy/binary_io/schedules.py +61 -388
  160. qiskit/qpy/binary_io/value.py +159 -33
  161. qiskit/qpy/common.py +10 -7
  162. qiskit/qpy/formats.py +41 -0
  163. qiskit/qpy/interface.py +29 -62
  164. qiskit/qpy/type_keys.py +58 -221
  165. qiskit/quantum_info/analysis/distance.py +3 -1
  166. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  167. qiskit/quantum_info/operators/operator.py +6 -2
  168. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  169. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  170. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  171. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  172. qiskit/quantum_info/states/densitymatrix.py +16 -6
  173. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  174. qiskit/quantum_info/states/statevector.py +16 -6
  175. qiskit/result/__init__.py +5 -17
  176. qiskit/result/models.py +18 -11
  177. qiskit/result/result.py +38 -134
  178. qiskit/result/sampled_expval.py +1 -2
  179. qiskit/result/utils.py +3 -4
  180. qiskit/synthesis/__init__.py +21 -1
  181. qiskit/synthesis/arithmetic/__init__.py +3 -1
  182. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  183. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  184. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  185. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  186. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  187. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  188. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  189. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  190. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  191. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  192. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  193. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  194. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  195. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  196. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  197. qiskit/synthesis/evolution/product_formula.py +44 -35
  198. qiskit/synthesis/evolution/qdrift.py +17 -24
  199. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  200. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  201. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  202. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  203. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  204. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  205. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  206. qiskit/synthesis/two_qubit/__init__.py +1 -0
  207. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  208. qiskit/transpiler/__init__.py +32 -232
  209. qiskit/transpiler/basepasses.py +20 -51
  210. qiskit/transpiler/layout.py +1 -1
  211. qiskit/transpiler/passes/__init__.py +4 -40
  212. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  213. qiskit/transpiler/passes/basis/decompose.py +1 -15
  214. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  215. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  216. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  217. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  218. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  219. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  220. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  221. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  222. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  223. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  224. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  225. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  226. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  227. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  228. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  229. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  230. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  231. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  232. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  233. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  234. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  235. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  236. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  237. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  238. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
  239. qiskit/transpiler/passes/routing/__init__.py +0 -1
  240. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  241. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  242. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  243. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  244. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  245. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  246. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  247. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  248. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  249. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  250. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  251. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  252. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  253. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  254. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  255. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  256. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  257. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  258. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  259. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  260. qiskit/transpiler/passes/utils/__init__.py +0 -1
  261. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  262. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  263. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  264. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  265. qiskit/transpiler/passmanager.py +13 -0
  266. qiskit/transpiler/passmanager_config.py +5 -81
  267. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  268. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  269. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  270. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  272. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  273. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  274. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  275. qiskit/transpiler/target.py +78 -524
  276. qiskit/user_config.py +8 -4
  277. qiskit/utils/__init__.py +13 -12
  278. qiskit/utils/deprecation.py +4 -112
  279. qiskit/utils/optionals.py +11 -4
  280. qiskit/utils/parallel.py +214 -87
  281. qiskit/utils/units.py +4 -1
  282. qiskit/visualization/__init__.py +3 -7
  283. qiskit/visualization/array.py +4 -1
  284. qiskit/visualization/bloch.py +1 -1
  285. qiskit/visualization/circuit/_utils.py +19 -19
  286. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  287. qiskit/visualization/circuit/matplotlib.py +13 -23
  288. qiskit/visualization/circuit/text.py +7 -3
  289. qiskit/visualization/counts_visualization.py +4 -0
  290. qiskit/visualization/dag_visualization.py +2 -1
  291. qiskit/visualization/gate_map.py +39 -154
  292. qiskit/visualization/library.py +4 -1
  293. qiskit/visualization/pass_manager_visualization.py +6 -2
  294. qiskit/visualization/state_visualization.py +19 -2
  295. qiskit/visualization/timeline/core.py +19 -13
  296. qiskit/visualization/timeline/interface.py +19 -18
  297. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  298. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  299. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
  300. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  301. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  302. qiskit/assembler/__init__.py +0 -42
  303. qiskit/assembler/assemble_circuits.py +0 -451
  304. qiskit/assembler/assemble_schedules.py +0 -367
  305. qiskit/assembler/disassemble.py +0 -310
  306. qiskit/assembler/run_config.py +0 -77
  307. qiskit/circuit/bit.py +0 -106
  308. qiskit/circuit/classicalfunction/__init__.py +0 -152
  309. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  310. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  311. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  312. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  313. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  314. qiskit/circuit/classicalfunction/types.py +0 -18
  315. qiskit/circuit/classicalfunction/utils.py +0 -91
  316. qiskit/circuit/classicalregister.py +0 -57
  317. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  318. qiskit/circuit/quantumregister.py +0 -75
  319. qiskit/circuit/register.py +0 -246
  320. qiskit/compiler/assembler.py +0 -689
  321. qiskit/compiler/scheduler.py +0 -109
  322. qiskit/compiler/sequencer.py +0 -71
  323. qiskit/primitives/backend_estimator.py +0 -486
  324. qiskit/primitives/backend_sampler.py +0 -222
  325. qiskit/primitives/estimator.py +0 -172
  326. qiskit/primitives/sampler.py +0 -162
  327. qiskit/providers/backend_compat.py +0 -507
  328. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  333. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  351. qiskit/providers/fake_provider/fake_1q.py +0 -91
  352. qiskit/providers/fake_provider/fake_backend.py +0 -165
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  357. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  358. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  359. qiskit/providers/models/__init__.py +0 -89
  360. qiskit/providers/models/backendconfiguration.py +0 -1040
  361. qiskit/providers/models/backendproperties.py +0 -535
  362. qiskit/providers/models/backendstatus.py +0 -104
  363. qiskit/providers/models/jobstatus.py +0 -77
  364. qiskit/providers/models/pulsedefaults.py +0 -305
  365. qiskit/providers/provider.py +0 -95
  366. qiskit/pulse/__init__.py +0 -158
  367. qiskit/pulse/builder.py +0 -2262
  368. qiskit/pulse/calibration_entries.py +0 -381
  369. qiskit/pulse/channels.py +0 -227
  370. qiskit/pulse/configuration.py +0 -245
  371. qiskit/pulse/exceptions.py +0 -45
  372. qiskit/pulse/filters.py +0 -309
  373. qiskit/pulse/instruction_schedule_map.py +0 -424
  374. qiskit/pulse/instructions/__init__.py +0 -67
  375. qiskit/pulse/instructions/acquire.py +0 -150
  376. qiskit/pulse/instructions/delay.py +0 -71
  377. qiskit/pulse/instructions/directives.py +0 -154
  378. qiskit/pulse/instructions/frequency.py +0 -135
  379. qiskit/pulse/instructions/instruction.py +0 -270
  380. qiskit/pulse/instructions/phase.py +0 -152
  381. qiskit/pulse/instructions/play.py +0 -99
  382. qiskit/pulse/instructions/reference.py +0 -100
  383. qiskit/pulse/instructions/snapshot.py +0 -82
  384. qiskit/pulse/library/__init__.py +0 -97
  385. qiskit/pulse/library/continuous.py +0 -430
  386. qiskit/pulse/library/pulse.py +0 -148
  387. qiskit/pulse/library/samplers/__init__.py +0 -15
  388. qiskit/pulse/library/samplers/decorators.py +0 -295
  389. qiskit/pulse/library/samplers/strategies.py +0 -71
  390. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  391. qiskit/pulse/library/waveform.py +0 -136
  392. qiskit/pulse/macros.py +0 -262
  393. qiskit/pulse/parameter_manager.py +0 -445
  394. qiskit/pulse/parser.py +0 -314
  395. qiskit/pulse/reference_manager.py +0 -58
  396. qiskit/pulse/schedule.py +0 -1854
  397. qiskit/pulse/transforms/__init__.py +0 -106
  398. qiskit/pulse/transforms/alignments.py +0 -406
  399. qiskit/pulse/transforms/base_transforms.py +0 -71
  400. qiskit/pulse/transforms/canonicalization.py +0 -498
  401. qiskit/pulse/transforms/dag.py +0 -122
  402. qiskit/pulse/utils.py +0 -149
  403. qiskit/qobj/__init__.py +0 -75
  404. qiskit/qobj/common.py +0 -81
  405. qiskit/qobj/converters/__init__.py +0 -18
  406. qiskit/qobj/converters/lo_config.py +0 -177
  407. qiskit/qobj/converters/pulse_instruction.py +0 -897
  408. qiskit/qobj/pulse_qobj.py +0 -709
  409. qiskit/qobj/qasm_qobj.py +0 -708
  410. qiskit/qobj/utils.py +0 -46
  411. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  412. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  413. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  414. qiskit/result/mitigation/utils.py +0 -217
  415. qiskit/scheduler/__init__.py +0 -40
  416. qiskit/scheduler/config.py +0 -37
  417. qiskit/scheduler/lowering.py +0 -187
  418. qiskit/scheduler/methods/__init__.py +0 -15
  419. qiskit/scheduler/methods/basic.py +0 -140
  420. qiskit/scheduler/schedule_circuit.py +0 -69
  421. qiskit/scheduler/sequence.py +0 -104
  422. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  423. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  424. qiskit/transpiler/passes/calibration/builders.py +0 -20
  425. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  426. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  427. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  428. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  429. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  430. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  431. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  432. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  433. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  434. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  435. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  436. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  437. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  438. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  439. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  440. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  441. qiskit/utils/deprecate_pulse.py +0 -119
  442. qiskit/utils/multiprocessing.py +0 -56
  443. qiskit/visualization/pulse_v2/__init__.py +0 -21
  444. qiskit/visualization/pulse_v2/core.py +0 -901
  445. qiskit/visualization/pulse_v2/device_info.py +0 -173
  446. qiskit/visualization/pulse_v2/drawings.py +0 -253
  447. qiskit/visualization/pulse_v2/events.py +0 -254
  448. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  449. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  450. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  451. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  452. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  453. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  454. qiskit/visualization/pulse_v2/interface.py +0 -459
  455. qiskit/visualization/pulse_v2/layouts.py +0 -387
  456. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  457. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  458. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  459. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  460. qiskit/visualization/pulse_v2/types.py +0 -242
  461. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  462. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -1,387 +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
- """
16
- A collection of functions that decide the layout of an output image.
17
- See :py:mod:`~qiskit.visualization.pulse_v2.types` for more info on the required data.
18
-
19
- There are 3 types of layout functions in this module.
20
-
21
- 1. layout.chart_channel_map
22
-
23
- An end-user can write arbitrary functions that output the custom channel ordering
24
- associated with group name. Layout function in this module are called with the
25
- `formatter` and `device` kwargs. These data provides stylesheet configuration
26
- and backend system configuration.
27
-
28
- The layout function is restricted to:
29
-
30
-
31
- ```python
32
- def my_channel_layout(channels: List[pulse.channels.Channel],
33
- formatter: Dict[str, Any],
34
- device: DrawerBackendInfo
35
- ) -> Iterator[Tuple[str, List[pulse.channels.Channel]]]:
36
- ordered_channels = []
37
- # arrange order of channels
38
-
39
- for key, channels in my_ordering_dict.items():
40
- yield key, channels
41
- ```
42
-
43
- 2. layout.time_axis_map
44
-
45
- An end-user can write arbitrary functions that output the `HorizontalAxis` data set that
46
- will be later consumed by the plotter API to update the horizontal axis appearance.
47
- Layout function in this module are called with the `time_window`, `axis_breaks`, and `dt` kwargs.
48
- These data provides horizontal axis limit, axis break position, and time resolution, respectively.
49
-
50
- See py:mod:`qiskit.visualization.pulse_v2.types` for more info on the required
51
- data.
52
-
53
- ```python
54
- def my_horizontal_axis(time_window: Tuple[int, int],
55
- axis_breaks: List[Tuple[int, int]],
56
- dt: Optional[float] = None) -> HorizontalAxis:
57
- # write horizontal axis configuration
58
-
59
- return horizontal_axis
60
- ```
61
-
62
- 3. layout.figure_title
63
-
64
- An end-user can write arbitrary functions that output the string data that
65
- will be later consumed by the plotter API to output the figure title.
66
- Layout functions in this module are called with the `program` and `device` kwargs.
67
- This data provides input program and backend system configurations.
68
-
69
- ```python
70
- def my_figure_title(program: Union[pulse.Waveform, pulse.Schedule],
71
- device: DrawerBackendInfo) -> str:
72
-
73
- return 'title'
74
- ```
75
-
76
- An arbitrary layout function satisfying the above format can be accepted.
77
- """
78
-
79
- from collections import defaultdict
80
- from typing import List, Dict, Any, Tuple, Iterator, Optional, Union
81
-
82
- import numpy as np
83
- from qiskit import pulse
84
- from qiskit.visualization.pulse_v2 import types
85
- from qiskit.visualization.pulse_v2.device_info import DrawerBackendInfo
86
-
87
-
88
- def channel_type_grouped_sort(
89
- channels: List[pulse.channels.Channel], formatter: Dict[str, Any], device: DrawerBackendInfo
90
- ) -> Iterator[Tuple[str, List[pulse.channels.Channel]]]:
91
- """Layout function for the channel assignment to the chart instance.
92
-
93
- Assign single channel per chart. Channels are grouped by type and
94
- sorted by index in ascending order.
95
-
96
- Stylesheet key:
97
- `chart_channel_map`
98
-
99
- For example:
100
- [D0, D2, C0, C2, M0, M2, A0, A2] -> [D0, D2, C0, C2, M0, M2, A0, A2]
101
-
102
- Args:
103
- channels: Channels to show.
104
- formatter: Dictionary of stylesheet settings.
105
- device: Backend configuration.
106
-
107
- Yields:
108
- Tuple of chart name and associated channels.
109
- """
110
- chan_type_dict = defaultdict(list)
111
-
112
- for chan in channels:
113
- chan_type_dict[type(chan)].append(chan)
114
-
115
- ordered_channels = []
116
-
117
- # drive channels
118
- d_chans = chan_type_dict.get(pulse.DriveChannel, [])
119
- ordered_channels.extend(sorted(d_chans, key=lambda x: x.index))
120
-
121
- # control channels
122
- c_chans = chan_type_dict.get(pulse.ControlChannel, [])
123
- ordered_channels.extend(sorted(c_chans, key=lambda x: x.index))
124
-
125
- # measure channels
126
- m_chans = chan_type_dict.get(pulse.MeasureChannel, [])
127
- ordered_channels.extend(sorted(m_chans, key=lambda x: x.index))
128
-
129
- # acquire channels
130
- if formatter["control.show_acquire_channel"]:
131
- a_chans = chan_type_dict.get(pulse.AcquireChannel, [])
132
- ordered_channels.extend(sorted(a_chans, key=lambda x: x.index))
133
-
134
- for chan in ordered_channels:
135
- yield chan.name.upper(), [chan]
136
-
137
-
138
- def channel_index_grouped_sort(
139
- channels: List[pulse.channels.Channel], formatter: Dict[str, Any], device: DrawerBackendInfo
140
- ) -> Iterator[Tuple[str, List[pulse.channels.Channel]]]:
141
- """Layout function for the channel assignment to the chart instance.
142
-
143
- Assign single channel per chart. Channels are grouped by the same index and
144
- sorted by type.
145
-
146
- Stylesheet key:
147
- `chart_channel_map`
148
-
149
- For example:
150
- [D0, D2, C0, C2, M0, M2, A0, A2] -> [D0, D2, C0, C2, M0, M2, A0, A2]
151
-
152
- Args:
153
- channels: Channels to show.
154
- formatter: Dictionary of stylesheet settings.
155
- device: Backend configuration.
156
-
157
- Yields:
158
- Tuple of chart name and associated channels.
159
- """
160
- chan_type_dict = defaultdict(list)
161
- inds = set()
162
-
163
- for chan in channels:
164
- chan_type_dict[type(chan)].append(chan)
165
- inds.add(chan.index)
166
-
167
- d_chans = chan_type_dict.get(pulse.DriveChannel, [])
168
- d_chans = sorted(d_chans, key=lambda x: x.index, reverse=True)
169
-
170
- u_chans = chan_type_dict.get(pulse.ControlChannel, [])
171
- u_chans = sorted(u_chans, key=lambda x: x.index, reverse=True)
172
-
173
- m_chans = chan_type_dict.get(pulse.MeasureChannel, [])
174
- m_chans = sorted(m_chans, key=lambda x: x.index, reverse=True)
175
-
176
- a_chans = chan_type_dict.get(pulse.AcquireChannel, [])
177
- a_chans = sorted(a_chans, key=lambda x: x.index, reverse=True)
178
-
179
- ordered_channels = []
180
-
181
- for ind in sorted(inds):
182
- # drive channel
183
- if len(d_chans) > 0 and d_chans[-1].index == ind:
184
- ordered_channels.append(d_chans.pop())
185
- # control channel
186
- if len(u_chans) > 0 and u_chans[-1].index == ind:
187
- ordered_channels.append(u_chans.pop())
188
- # measure channel
189
- if len(m_chans) > 0 and m_chans[-1].index == ind:
190
- ordered_channels.append(m_chans.pop())
191
- # acquire channel
192
- if formatter["control.show_acquire_channel"]:
193
- if len(a_chans) > 0 and a_chans[-1].index == ind:
194
- ordered_channels.append(a_chans.pop())
195
-
196
- for chan in ordered_channels:
197
- yield chan.name.upper(), [chan]
198
-
199
-
200
- def channel_index_grouped_sort_u(
201
- channels: List[pulse.channels.Channel], formatter: Dict[str, Any], device: DrawerBackendInfo
202
- ) -> Iterator[Tuple[str, List[pulse.channels.Channel]]]:
203
- """Layout function for the channel assignment to the chart instance.
204
-
205
- Assign single channel per chart. Channels are grouped by the same index and
206
- sorted by type except for control channels. Control channels are added to the
207
- end of other channels.
208
-
209
- Stylesheet key:
210
- `chart_channel_map`
211
-
212
- For example:
213
- [D0, D2, C0, C2, M0, M2, A0, A2] -> [D0, D2, C0, C2, M0, M2, A0, A2]
214
-
215
- Args:
216
- channels: Channels to show.
217
- formatter: Dictionary of stylesheet settings.
218
- device: Backend configuration.
219
-
220
- Yields:
221
- Tuple of chart name and associated channels.
222
- """
223
- chan_type_dict = defaultdict(list)
224
- inds = set()
225
-
226
- for chan in channels:
227
- chan_type_dict[type(chan)].append(chan)
228
- inds.add(chan.index)
229
-
230
- d_chans = chan_type_dict.get(pulse.DriveChannel, [])
231
- d_chans = sorted(d_chans, key=lambda x: x.index, reverse=True)
232
-
233
- m_chans = chan_type_dict.get(pulse.MeasureChannel, [])
234
- m_chans = sorted(m_chans, key=lambda x: x.index, reverse=True)
235
-
236
- a_chans = chan_type_dict.get(pulse.AcquireChannel, [])
237
- a_chans = sorted(a_chans, key=lambda x: x.index, reverse=True)
238
-
239
- u_chans = chan_type_dict.get(pulse.ControlChannel, [])
240
- u_chans = sorted(u_chans, key=lambda x: x.index)
241
-
242
- ordered_channels = []
243
-
244
- for ind in sorted(inds):
245
- # drive channel
246
- if len(d_chans) > 0 and d_chans[-1].index == ind:
247
- ordered_channels.append(d_chans.pop())
248
- # measure channel
249
- if len(m_chans) > 0 and m_chans[-1].index == ind:
250
- ordered_channels.append(m_chans.pop())
251
- # acquire channel
252
- if formatter["control.show_acquire_channel"]:
253
- if len(a_chans) > 0 and a_chans[-1].index == ind:
254
- ordered_channels.append(a_chans.pop())
255
-
256
- # control channels
257
- ordered_channels.extend(u_chans)
258
-
259
- for chan in ordered_channels:
260
- yield chan.name.upper(), [chan]
261
-
262
-
263
- def qubit_index_sort(
264
- channels: List[pulse.channels.Channel], formatter: Dict[str, Any], device: DrawerBackendInfo
265
- ) -> Iterator[Tuple[str, List[pulse.channels.Channel]]]:
266
- """Layout function for the channel assignment to the chart instance.
267
-
268
- Assign multiple channels per chart. Channels associated with the same qubit
269
- are grouped in the same chart and sorted by qubit index in ascending order.
270
-
271
- Acquire channels are not shown.
272
-
273
- Stylesheet key:
274
- `chart_channel_map`
275
-
276
- For example:
277
- [D0, D2, C0, C2, M0, M2, A0, A2] -> [Q0, Q1, Q2]
278
-
279
- Args:
280
- channels: Channels to show.
281
- formatter: Dictionary of stylesheet settings.
282
- device: Backend configuration.
283
-
284
- Yields:
285
- Tuple of chart name and associated channels.
286
- """
287
- _removed = (
288
- pulse.channels.AcquireChannel,
289
- pulse.channels.MemorySlot,
290
- pulse.channels.RegisterSlot,
291
- )
292
-
293
- qubit_channel_map = defaultdict(list)
294
-
295
- for chan in channels:
296
- if isinstance(chan, _removed):
297
- continue
298
- qubit_channel_map[device.get_qubit_index(chan)].append(chan)
299
-
300
- sorted_map = sorted(qubit_channel_map.items(), key=lambda x: x[0])
301
-
302
- for qind, chans in sorted_map:
303
- yield f"Q{qind:d}", chans
304
-
305
-
306
- def time_map_in_ns(
307
- time_window: Tuple[int, int], axis_breaks: List[Tuple[int, int]], dt: Optional[float] = None
308
- ) -> types.HorizontalAxis:
309
- """Layout function for the horizontal axis formatting.
310
-
311
- Calculate axis break and map true time to axis labels. Generate equispaced
312
- 6 horizontal axis ticks. Convert into seconds if ``dt`` is provided.
313
-
314
- Args:
315
- time_window: Left and right edge of this graph.
316
- axis_breaks: List of axis break period.
317
- dt: Time resolution of system.
318
-
319
- Returns:
320
- Axis formatter object.
321
- """
322
- # shift time axis
323
- t0, t1 = time_window
324
- t0_shift = t0
325
- t1_shift = t1
326
-
327
- axis_break_pos = []
328
- offset_accumulation = 0
329
- for t0b, t1b in axis_breaks:
330
- if t1b < t0 or t0b > t1:
331
- continue
332
- if t0 > t1b:
333
- t0_shift -= t1b - t0b
334
- if t1 > t1b:
335
- t1_shift -= t1b - t0b
336
- axis_break_pos.append(t0b - offset_accumulation)
337
- offset_accumulation += t1b - t0b
338
-
339
- # axis label
340
- axis_loc = np.linspace(max(t0_shift, 0), t1_shift, 6)
341
- axis_label = axis_loc.copy()
342
-
343
- for t0b, t1b in axis_breaks:
344
- offset = t1b - t0b
345
- axis_label = np.where(axis_label > t0b, axis_label + offset, axis_label)
346
-
347
- # consider time resolution
348
- if dt:
349
- label = "Time (ns)"
350
- axis_label *= dt * 1e9
351
- else:
352
- label = "System cycle time (dt)"
353
-
354
- formatted_label = [f"{val:.0f}" for val in axis_label]
355
-
356
- return types.HorizontalAxis(
357
- window=(t0_shift, t1_shift),
358
- axis_map=dict(zip(axis_loc, formatted_label)),
359
- axis_break_pos=axis_break_pos,
360
- label=label,
361
- )
362
-
363
-
364
- def detail_title(program: Union[pulse.Waveform, pulse.Schedule], device: DrawerBackendInfo) -> str:
365
- """Layout function for generating figure title.
366
-
367
- This layout writes program name, program duration, and backend name in the title.
368
- """
369
- title_str = []
370
-
371
- # add program name
372
- title_str.append(f"Name: {program.name}")
373
-
374
- # add program duration
375
- dt = device.dt * 1e9 if device.dt else 1.0
376
- title_str.append(f"Duration: {program.duration * dt:.1f} {'ns' if device.dt else 'dt'}")
377
-
378
- # add device name
379
- if device.backend_name != "no-backend":
380
- title_str.append(f"Backend: {device.backend_name}")
381
-
382
- return ", ".join(title_str)
383
-
384
-
385
- def empty_title(program: Union[pulse.Waveform, pulse.Schedule], device: DrawerBackendInfo) -> str:
386
- """Layout function for generating an empty figure title."""
387
- return ""
@@ -1,17 +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
- """
14
- Plotter API for pulse drawer.
15
- """
16
-
17
- from qiskit.visualization.pulse_v2.plotters.matplotlib import Mpl2DPlotter
@@ -1,53 +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
- """Base plotter API."""
14
-
15
- from abc import ABC, abstractmethod
16
- from typing import Any
17
-
18
- from qiskit.visualization.pulse_v2 import core
19
-
20
-
21
- class BasePlotter(ABC):
22
- """Base class of Qiskit plotter."""
23
-
24
- def __init__(self, canvas: core.DrawerCanvas):
25
- """Create new plotter.
26
-
27
- Args:
28
- canvas: Configured drawer canvas object.
29
- """
30
- self.canvas = canvas
31
-
32
- @abstractmethod
33
- def initialize_canvas(self):
34
- """Format appearance of the canvas."""
35
- raise NotImplementedError
36
-
37
- @abstractmethod
38
- def draw(self):
39
- """Output drawing objects stored in canvas object."""
40
- raise NotImplementedError
41
-
42
- @abstractmethod
43
- def get_image(self, interactive: bool = False) -> Any:
44
- """Get image data to return.
45
-
46
- Args:
47
- interactive: When set `True` show the circuit in a new window.
48
- This depends on the matplotlib backend being used supporting this.
49
-
50
- Returns:
51
- Image data. This depends on the plotter API.
52
- """
53
- raise NotImplementedError
@@ -1,201 +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
- """Matplotlib plotter API."""
14
-
15
- from typing import Optional
16
-
17
- import matplotlib
18
- import matplotlib.pyplot as plt
19
- import numpy as np
20
- from matplotlib.patches import Rectangle
21
-
22
- from qiskit.visualization.exceptions import VisualizationError
23
- from qiskit.visualization.pulse_v2 import core, drawings, types
24
- from qiskit.visualization.pulse_v2.plotters.base_plotter import BasePlotter
25
- from qiskit.visualization.utils import matplotlib_close_if_inline
26
-
27
-
28
- class Mpl2DPlotter(BasePlotter):
29
- """Matplotlib API for pulse drawer.
30
-
31
- This plotter places canvas charts along y axis of 2D canvas with vertical offset.
32
- Each chart is map to X-Y axis of the canvas.
33
- """
34
-
35
- def __init__(self, canvas: core.DrawerCanvas, axis: Optional[plt.Axes] = None):
36
- """Create new plotter.
37
-
38
- Args:
39
- canvas: Configured drawer canvas object. Canvas object should be updated
40
- with `.update` method before set to the plotter API.
41
- axis: Matplotlib axis object. When `axis` is provided, the plotter updates
42
- given axis instead of creating and returning new matplotlib figure.
43
- """
44
- super().__init__(canvas=canvas)
45
-
46
- # calculate height of all charts
47
- canvas_height = 0
48
- for chart in self.canvas.charts:
49
- if not chart.is_active and not self.canvas.formatter["control.show_empty_channel"]:
50
- continue
51
- canvas_height += chart.vmax - chart.vmin
52
- # set min canvas_height size
53
- canvas_height = max(canvas_height, 0.1)
54
-
55
- if axis is None:
56
- fig_h = canvas_height * self.canvas.formatter["general.fig_chart_height"]
57
- fig_w = self.canvas.formatter["general.fig_width"]
58
-
59
- self.figure = plt.figure(figsize=(fig_w, fig_h))
60
- self.ax = self.figure.add_subplot(1, 1, 1)
61
- else:
62
- self.figure = axis.figure
63
- self.ax = axis
64
-
65
- self.initialize_canvas()
66
-
67
- def initialize_canvas(self):
68
- """Format appearance of matplotlib canvas."""
69
- self.ax.set_facecolor(self.canvas.formatter["color.background"])
70
-
71
- # axis labels
72
- self.ax.set_yticklabels([])
73
- self.ax.yaxis.set_tick_params(left=False)
74
-
75
- def draw(self):
76
- """Output drawings stored in canvas object."""
77
- # axis configuration
78
- axis_config = self.canvas.layout["time_axis_map"](
79
- time_window=self.canvas.time_range,
80
- axis_breaks=self.canvas.time_breaks,
81
- dt=self.canvas.device.dt,
82
- )
83
-
84
- current_y = 0
85
- margin_y = self.canvas.formatter["margin.between_channel"]
86
- for chart in self.canvas.charts:
87
- if not chart.is_active and not self.canvas.formatter["control.show_empty_channel"]:
88
- continue
89
- current_y -= chart.vmax
90
- for _, data in chart.collections:
91
- # calculate scaling factor
92
- if not data.ignore_scaling:
93
- # product of channel-wise scaling and chart level scaling
94
- scale = max(self.canvas.chan_scales.get(chan, 1.0) for chan in data.channels)
95
- scale *= chart.scale
96
- else:
97
- scale = 1.0
98
-
99
- x = data.xvals
100
- y = scale * data.yvals + current_y
101
-
102
- if isinstance(data, drawings.LineData):
103
- # line object
104
- if data.fill:
105
- self.ax.fill_between(x, y1=y, y2=current_y * np.ones_like(y), **data.styles)
106
- else:
107
- self.ax.plot(x, y, **data.styles)
108
- elif isinstance(data, drawings.TextData):
109
- # text object
110
- text = rf"${data.latex}$" if data.latex else data.text
111
- # replace dynamic text
112
- text = text.replace(types.DynamicString.SCALE, f"{chart.scale:.1f}")
113
- self.ax.text(x=x[0], y=y[0], s=text, **data.styles)
114
- elif isinstance(data, drawings.BoxData):
115
- xy = x[0], y[0]
116
- box = Rectangle(
117
- xy, width=x[1] - x[0], height=y[1] - y[0], fill=True, **data.styles
118
- )
119
- self.ax.add_patch(box)
120
- else:
121
- raise VisualizationError(
122
- f"Data {data} is not supported " f"by {self.__class__.__name__}"
123
- )
124
- # axis break
125
- for pos in axis_config.axis_break_pos:
126
- self.ax.text(
127
- x=pos,
128
- y=current_y,
129
- s="//",
130
- ha="center",
131
- va="center",
132
- zorder=self.canvas.formatter["layer.axis_label"],
133
- fontsize=self.canvas.formatter["text_size.axis_break_symbol"],
134
- rotation=180,
135
- )
136
-
137
- # shift chart position
138
- current_y += chart.vmin - margin_y
139
-
140
- # remove the last margin
141
- current_y += margin_y
142
-
143
- y_max = self.canvas.formatter["margin.top"]
144
- y_min = current_y - self.canvas.formatter["margin.bottom"]
145
-
146
- # plot axis break line
147
- for pos in axis_config.axis_break_pos:
148
- self.ax.plot(
149
- [pos, pos],
150
- [y_min, y_max],
151
- zorder=self.canvas.formatter["layer.fill_waveform"] + 1,
152
- linewidth=self.canvas.formatter["line_width.axis_break"],
153
- color=self.canvas.formatter["color.background"],
154
- )
155
-
156
- # label
157
- self.ax.set_xticks(list(axis_config.axis_map.keys()))
158
- self.ax.set_xticklabels(
159
- list(axis_config.axis_map.values()),
160
- fontsize=self.canvas.formatter["text_size.axis_label"],
161
- )
162
- self.ax.set_xlabel(
163
- axis_config.label, fontsize=self.canvas.formatter["text_size.axis_label"]
164
- )
165
-
166
- # boundary
167
- if axis_config.window == (0, 0):
168
- self.ax.set_xlim(0, 1)
169
- else:
170
- self.ax.set_xlim(*axis_config.window)
171
- self.ax.set_ylim(y_min, y_max)
172
-
173
- # title
174
- if self.canvas.fig_title:
175
- self.ax.text(
176
- x=axis_config.window[0],
177
- y=y_max,
178
- s=self.canvas.fig_title,
179
- ha="left",
180
- va="bottom",
181
- zorder=self.canvas.formatter["layer.fig_title"],
182
- color=self.canvas.formatter["color.fig_title"],
183
- size=self.canvas.formatter["text_size.fig_title"],
184
- )
185
-
186
- def get_image(self, interactive: bool = False) -> matplotlib.pyplot.Figure:
187
- """Get image data to return.
188
-
189
- Args:
190
- interactive: When set `True` show the circuit in a new window.
191
- This depends on the matplotlib backend being used supporting this.
192
-
193
- Returns:
194
- Matplotlib figure data.
195
- """
196
- matplotlib_close_if_inline(self.figure)
197
-
198
- if self.figure and interactive:
199
- self.figure.show()
200
-
201
- return self.figure