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

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