qiskit 1.4.1__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__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 (456) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +24 -5
  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 +248 -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 +34 -5
  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/hamiltonian_gate.py +1 -1
  60. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  61. qiskit/circuit/library/n_local/n_local.py +1 -1
  62. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  63. qiskit/circuit/library/overlap.py +2 -2
  64. qiskit/circuit/library/pauli_evolution.py +39 -24
  65. qiskit/circuit/library/phase_oracle.py +130 -51
  66. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  67. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  68. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  69. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  70. qiskit/circuit/library/standard_gates/h.py +4 -9
  71. qiskit/circuit/library/standard_gates/i.py +2 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  73. qiskit/circuit/library/standard_gates/p.py +15 -34
  74. qiskit/circuit/library/standard_gates/r.py +2 -6
  75. qiskit/circuit/library/standard_gates/rx.py +5 -15
  76. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  77. qiskit/circuit/library/standard_gates/ry.py +5 -17
  78. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  79. qiskit/circuit/library/standard_gates/rz.py +5 -17
  80. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  82. qiskit/circuit/library/standard_gates/s.py +6 -15
  83. qiskit/circuit/library/standard_gates/swap.py +4 -11
  84. qiskit/circuit/library/standard_gates/sx.py +7 -12
  85. qiskit/circuit/library/standard_gates/t.py +6 -7
  86. qiskit/circuit/library/standard_gates/u.py +2 -10
  87. qiskit/circuit/library/standard_gates/u1.py +5 -16
  88. qiskit/circuit/library/standard_gates/u2.py +2 -6
  89. qiskit/circuit/library/standard_gates/u3.py +3 -11
  90. qiskit/circuit/library/standard_gates/x.py +13 -60
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/y.py +4 -9
  94. qiskit/circuit/library/standard_gates/z.py +5 -15
  95. qiskit/circuit/measure.py +11 -2
  96. qiskit/circuit/parameterexpression.py +4 -0
  97. qiskit/circuit/quantumcircuit.py +881 -555
  98. qiskit/circuit/random/utils.py +12 -6
  99. qiskit/circuit/reset.py +5 -2
  100. qiskit/circuit/singleton.py +5 -11
  101. qiskit/circuit/store.py +0 -8
  102. qiskit/compiler/__init__.py +1 -7
  103. qiskit/compiler/transpiler.py +38 -196
  104. qiskit/converters/circuit_to_dag.py +4 -2
  105. qiskit/converters/circuit_to_dagdependency.py +0 -2
  106. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  107. qiskit/converters/circuit_to_gate.py +1 -1
  108. qiskit/converters/circuit_to_instruction.py +16 -29
  109. qiskit/converters/dag_to_circuit.py +5 -5
  110. qiskit/converters/dag_to_dagdependency.py +0 -1
  111. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  112. qiskit/converters/dagdependency_to_circuit.py +0 -6
  113. qiskit/converters/dagdependency_to_dag.py +0 -6
  114. qiskit/dagcircuit/collect_blocks.py +32 -20
  115. qiskit/dagcircuit/dagdependency.py +3 -37
  116. qiskit/dagcircuit/dagdependency_v2.py +2 -80
  117. qiskit/dagcircuit/dagnode.py +14 -2
  118. qiskit/passmanager/__init__.py +24 -6
  119. qiskit/passmanager/passmanager.py +26 -24
  120. qiskit/primitives/__init__.py +44 -35
  121. qiskit/primitives/backend_estimator_v2.py +102 -23
  122. qiskit/primitives/backend_sampler_v2.py +5 -20
  123. qiskit/primitives/base/__init__.py +4 -4
  124. qiskit/primitives/base/base_estimator.py +77 -82
  125. qiskit/primitives/base/base_primitive_job.py +2 -2
  126. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  127. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  128. qiskit/primitives/base/base_sampler.py +52 -60
  129. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  130. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  131. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  132. qiskit/primitives/containers/bindings_array.py +3 -1
  133. qiskit/primitives/containers/bit_array.py +23 -0
  134. qiskit/primitives/containers/data_bin.py +3 -1
  135. qiskit/primitives/containers/observables_array.py +19 -2
  136. qiskit/primitives/statevector_sampler.py +6 -8
  137. qiskit/primitives/utils.py +14 -189
  138. qiskit/providers/__init__.py +4 -130
  139. qiskit/providers/backend.py +11 -314
  140. qiskit/providers/basic_provider/__init__.py +3 -1
  141. qiskit/providers/basic_provider/basic_provider.py +29 -9
  142. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  143. qiskit/providers/exceptions.py +0 -33
  144. qiskit/providers/fake_provider/__init__.py +0 -37
  145. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  146. qiskit/qasm2/__init__.py +21 -6
  147. qiskit/qasm2/export.py +2 -10
  148. qiskit/qasm2/parse.py +11 -25
  149. qiskit/qasm3/__init__.py +5 -1
  150. qiskit/qasm3/ast.py +44 -0
  151. qiskit/qasm3/exporter.py +65 -27
  152. qiskit/qasm3/printer.py +35 -4
  153. qiskit/qpy/__init__.py +141 -19
  154. qiskit/qpy/binary_io/__init__.py +0 -1
  155. qiskit/qpy/binary_io/circuits.py +91 -116
  156. qiskit/qpy/binary_io/schedules.py +61 -388
  157. qiskit/qpy/binary_io/value.py +154 -28
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +29 -62
  161. qiskit/qpy/type_keys.py +58 -221
  162. qiskit/quantum_info/analysis/distance.py +3 -1
  163. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  164. qiskit/quantum_info/operators/operator.py +6 -2
  165. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  166. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  167. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  169. qiskit/quantum_info/states/densitymatrix.py +16 -6
  170. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  171. qiskit/quantum_info/states/statevector.py +16 -6
  172. qiskit/result/__init__.py +5 -17
  173. qiskit/result/models.py +18 -10
  174. qiskit/result/result.py +28 -126
  175. qiskit/result/sampled_expval.py +1 -2
  176. qiskit/result/utils.py +3 -4
  177. qiskit/synthesis/__init__.py +21 -1
  178. qiskit/synthesis/arithmetic/__init__.py +3 -1
  179. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  180. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  182. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  183. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  184. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  185. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  186. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  188. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  189. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  190. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  191. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  192. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -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 +2 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  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 +4 -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 +1 -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 +30 -2
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  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 +127 -59
  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 +101 -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 +67 -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/dag_visualization.py +2 -1
  287. qiskit/visualization/gate_map.py +39 -154
  288. qiskit/visualization/pass_manager_visualization.py +6 -2
  289. qiskit/visualization/state_visualization.py +6 -0
  290. qiskit/visualization/timeline/core.py +18 -12
  291. qiskit/visualization/timeline/interface.py +19 -18
  292. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
  295. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
  296. qiskit/assembler/__init__.py +0 -42
  297. qiskit/assembler/assemble_circuits.py +0 -451
  298. qiskit/assembler/assemble_schedules.py +0 -367
  299. qiskit/assembler/disassemble.py +0 -310
  300. qiskit/assembler/run_config.py +0 -77
  301. qiskit/circuit/bit.py +0 -106
  302. qiskit/circuit/classicalfunction/__init__.py +0 -152
  303. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  304. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  305. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  306. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  307. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  308. qiskit/circuit/classicalfunction/types.py +0 -18
  309. qiskit/circuit/classicalfunction/utils.py +0 -91
  310. qiskit/circuit/classicalregister.py +0 -57
  311. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  312. qiskit/circuit/quantumregister.py +0 -75
  313. qiskit/circuit/register.py +0 -246
  314. qiskit/compiler/assembler.py +0 -689
  315. qiskit/compiler/scheduler.py +0 -109
  316. qiskit/compiler/sequencer.py +0 -71
  317. qiskit/primitives/backend_estimator.py +0 -486
  318. qiskit/primitives/backend_sampler.py +0 -222
  319. qiskit/primitives/estimator.py +0 -172
  320. qiskit/primitives/sampler.py +0 -162
  321. qiskit/providers/backend_compat.py +0 -507
  322. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  330. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/fake_1q.py +0 -91
  346. qiskit/providers/fake_provider/fake_backend.py +0 -165
  347. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  348. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  349. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  350. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  351. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  352. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  353. qiskit/providers/models/__init__.py +0 -89
  354. qiskit/providers/models/backendconfiguration.py +0 -1040
  355. qiskit/providers/models/backendproperties.py +0 -535
  356. qiskit/providers/models/backendstatus.py +0 -104
  357. qiskit/providers/models/jobstatus.py +0 -77
  358. qiskit/providers/models/pulsedefaults.py +0 -305
  359. qiskit/providers/provider.py +0 -95
  360. qiskit/pulse/__init__.py +0 -158
  361. qiskit/pulse/builder.py +0 -2262
  362. qiskit/pulse/calibration_entries.py +0 -381
  363. qiskit/pulse/channels.py +0 -227
  364. qiskit/pulse/configuration.py +0 -245
  365. qiskit/pulse/exceptions.py +0 -45
  366. qiskit/pulse/filters.py +0 -309
  367. qiskit/pulse/instruction_schedule_map.py +0 -424
  368. qiskit/pulse/instructions/__init__.py +0 -67
  369. qiskit/pulse/instructions/acquire.py +0 -150
  370. qiskit/pulse/instructions/delay.py +0 -71
  371. qiskit/pulse/instructions/directives.py +0 -154
  372. qiskit/pulse/instructions/frequency.py +0 -135
  373. qiskit/pulse/instructions/instruction.py +0 -270
  374. qiskit/pulse/instructions/phase.py +0 -152
  375. qiskit/pulse/instructions/play.py +0 -99
  376. qiskit/pulse/instructions/reference.py +0 -100
  377. qiskit/pulse/instructions/snapshot.py +0 -82
  378. qiskit/pulse/library/__init__.py +0 -97
  379. qiskit/pulse/library/continuous.py +0 -430
  380. qiskit/pulse/library/pulse.py +0 -148
  381. qiskit/pulse/library/samplers/__init__.py +0 -15
  382. qiskit/pulse/library/samplers/decorators.py +0 -295
  383. qiskit/pulse/library/samplers/strategies.py +0 -71
  384. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  385. qiskit/pulse/library/waveform.py +0 -136
  386. qiskit/pulse/macros.py +0 -262
  387. qiskit/pulse/parameter_manager.py +0 -445
  388. qiskit/pulse/parser.py +0 -314
  389. qiskit/pulse/reference_manager.py +0 -58
  390. qiskit/pulse/schedule.py +0 -1854
  391. qiskit/pulse/transforms/__init__.py +0 -106
  392. qiskit/pulse/transforms/alignments.py +0 -406
  393. qiskit/pulse/transforms/base_transforms.py +0 -71
  394. qiskit/pulse/transforms/canonicalization.py +0 -498
  395. qiskit/pulse/transforms/dag.py +0 -122
  396. qiskit/pulse/utils.py +0 -149
  397. qiskit/qobj/__init__.py +0 -75
  398. qiskit/qobj/common.py +0 -81
  399. qiskit/qobj/converters/__init__.py +0 -18
  400. qiskit/qobj/converters/lo_config.py +0 -177
  401. qiskit/qobj/converters/pulse_instruction.py +0 -897
  402. qiskit/qobj/pulse_qobj.py +0 -709
  403. qiskit/qobj/qasm_qobj.py +0 -708
  404. qiskit/qobj/utils.py +0 -46
  405. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  406. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  407. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  408. qiskit/result/mitigation/utils.py +0 -217
  409. qiskit/scheduler/__init__.py +0 -40
  410. qiskit/scheduler/config.py +0 -37
  411. qiskit/scheduler/lowering.py +0 -187
  412. qiskit/scheduler/methods/__init__.py +0 -15
  413. qiskit/scheduler/methods/basic.py +0 -140
  414. qiskit/scheduler/schedule_circuit.py +0 -69
  415. qiskit/scheduler/sequence.py +0 -104
  416. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  417. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  418. qiskit/transpiler/passes/calibration/builders.py +0 -20
  419. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  420. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  421. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  422. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  423. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  424. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  425. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  426. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  427. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  428. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  429. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  430. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  431. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  432. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  433. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  434. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  435. qiskit/utils/deprecate_pulse.py +0 -119
  436. qiskit/utils/multiprocessing.py +0 -56
  437. qiskit/visualization/pulse_v2/__init__.py +0 -21
  438. qiskit/visualization/pulse_v2/core.py +0 -901
  439. qiskit/visualization/pulse_v2/device_info.py +0 -173
  440. qiskit/visualization/pulse_v2/drawings.py +0 -253
  441. qiskit/visualization/pulse_v2/events.py +0 -254
  442. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  443. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  444. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  445. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  446. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  447. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  448. qiskit/visualization/pulse_v2/interface.py +0 -459
  449. qiskit/visualization/pulse_v2/layouts.py +0 -387
  450. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  451. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  452. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  453. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  454. qiskit/visualization/pulse_v2/types.py +0 -242
  455. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.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