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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +236 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +11 -0
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/circuit/tools/pi_check.py +3 -0
  104. qiskit/compiler/__init__.py +1 -7
  105. qiskit/compiler/transpiler.py +38 -196
  106. qiskit/converters/circuit_to_dag.py +6 -4
  107. qiskit/converters/circuit_to_dagdependency.py +0 -2
  108. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  109. qiskit/converters/circuit_to_gate.py +1 -1
  110. qiskit/converters/circuit_to_instruction.py +16 -29
  111. qiskit/converters/dag_to_circuit.py +7 -8
  112. qiskit/converters/dag_to_dagdependency.py +0 -1
  113. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  114. qiskit/converters/dagdependency_to_circuit.py +0 -6
  115. qiskit/converters/dagdependency_to_dag.py +0 -6
  116. qiskit/dagcircuit/collect_blocks.py +32 -20
  117. qiskit/dagcircuit/dagdependency.py +3 -37
  118. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  119. qiskit/dagcircuit/dagnode.py +14 -2
  120. qiskit/passmanager/__init__.py +24 -6
  121. qiskit/passmanager/passmanager.py +26 -24
  122. qiskit/primitives/__init__.py +44 -35
  123. qiskit/primitives/backend_estimator_v2.py +102 -23
  124. qiskit/primitives/backend_sampler_v2.py +5 -20
  125. qiskit/primitives/base/__init__.py +4 -4
  126. qiskit/primitives/base/base_estimator.py +77 -82
  127. qiskit/primitives/base/base_primitive_job.py +2 -2
  128. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  129. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  130. qiskit/primitives/base/base_sampler.py +52 -60
  131. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  132. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  133. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  134. qiskit/primitives/containers/bindings_array.py +3 -1
  135. qiskit/primitives/containers/bit_array.py +23 -0
  136. qiskit/primitives/containers/data_bin.py +3 -1
  137. qiskit/primitives/containers/observables_array.py +19 -2
  138. qiskit/primitives/statevector_sampler.py +6 -8
  139. qiskit/primitives/utils.py +14 -189
  140. qiskit/providers/__init__.py +4 -130
  141. qiskit/providers/backend.py +11 -314
  142. qiskit/providers/basic_provider/__init__.py +3 -1
  143. qiskit/providers/basic_provider/basic_provider.py +29 -9
  144. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  145. qiskit/providers/exceptions.py +0 -33
  146. qiskit/providers/fake_provider/__init__.py +0 -37
  147. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  148. qiskit/qasm2/__init__.py +21 -6
  149. qiskit/qasm2/export.py +2 -10
  150. qiskit/qasm2/parse.py +11 -25
  151. qiskit/qasm3/__init__.py +5 -1
  152. qiskit/qasm3/ast.py +44 -0
  153. qiskit/qasm3/exporter.py +65 -27
  154. qiskit/qasm3/printer.py +35 -4
  155. qiskit/qpy/__init__.py +162 -19
  156. qiskit/qpy/binary_io/__init__.py +0 -1
  157. qiskit/qpy/binary_io/circuits.py +96 -116
  158. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  159. qiskit/qpy/binary_io/schedules.py +61 -388
  160. qiskit/qpy/binary_io/value.py +159 -33
  161. qiskit/qpy/common.py +10 -7
  162. qiskit/qpy/formats.py +41 -0
  163. qiskit/qpy/interface.py +29 -62
  164. qiskit/qpy/type_keys.py +58 -221
  165. qiskit/quantum_info/analysis/distance.py +3 -1
  166. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  167. qiskit/quantum_info/operators/operator.py +6 -2
  168. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  169. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  170. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  171. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  172. qiskit/quantum_info/states/densitymatrix.py +16 -6
  173. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  174. qiskit/quantum_info/states/statevector.py +16 -6
  175. qiskit/result/__init__.py +5 -17
  176. qiskit/result/models.py +18 -11
  177. qiskit/result/result.py +38 -134
  178. qiskit/result/sampled_expval.py +1 -2
  179. qiskit/result/utils.py +3 -4
  180. qiskit/synthesis/__init__.py +21 -1
  181. qiskit/synthesis/arithmetic/__init__.py +3 -1
  182. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  183. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  184. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  185. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  186. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  187. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  188. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  189. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  190. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  191. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  192. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  193. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  194. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  195. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  196. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  197. qiskit/synthesis/evolution/product_formula.py +44 -35
  198. qiskit/synthesis/evolution/qdrift.py +17 -24
  199. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  200. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  201. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  202. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  203. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  204. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  205. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  206. qiskit/synthesis/two_qubit/__init__.py +1 -0
  207. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  208. qiskit/transpiler/__init__.py +32 -232
  209. qiskit/transpiler/basepasses.py +20 -51
  210. qiskit/transpiler/layout.py +1 -1
  211. qiskit/transpiler/passes/__init__.py +4 -40
  212. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  213. qiskit/transpiler/passes/basis/decompose.py +1 -15
  214. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  215. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  216. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  217. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  218. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  219. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  220. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  221. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  222. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  223. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  224. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  225. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  226. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  227. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  228. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  229. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  230. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  231. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  232. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  233. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  234. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  235. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  236. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  237. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  238. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
  239. qiskit/transpiler/passes/routing/__init__.py +0 -1
  240. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  241. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  242. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  243. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  244. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  245. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  246. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  247. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  248. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  249. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  250. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  251. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  252. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  253. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  254. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  255. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  256. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  257. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  258. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  259. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  260. qiskit/transpiler/passes/utils/__init__.py +0 -1
  261. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  262. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  263. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  264. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  265. qiskit/transpiler/passmanager.py +13 -0
  266. qiskit/transpiler/passmanager_config.py +5 -81
  267. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  268. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  269. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  270. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  272. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  273. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  274. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  275. qiskit/transpiler/target.py +78 -524
  276. qiskit/user_config.py +8 -4
  277. qiskit/utils/__init__.py +13 -12
  278. qiskit/utils/deprecation.py +4 -112
  279. qiskit/utils/optionals.py +11 -4
  280. qiskit/utils/parallel.py +214 -87
  281. qiskit/utils/units.py +4 -1
  282. qiskit/visualization/__init__.py +3 -7
  283. qiskit/visualization/array.py +4 -1
  284. qiskit/visualization/bloch.py +1 -1
  285. qiskit/visualization/circuit/_utils.py +19 -19
  286. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  287. qiskit/visualization/circuit/matplotlib.py +13 -23
  288. qiskit/visualization/circuit/text.py +7 -3
  289. qiskit/visualization/counts_visualization.py +4 -0
  290. qiskit/visualization/dag_visualization.py +2 -1
  291. qiskit/visualization/gate_map.py +39 -154
  292. qiskit/visualization/library.py +4 -1
  293. qiskit/visualization/pass_manager_visualization.py +6 -2
  294. qiskit/visualization/state_visualization.py +19 -2
  295. qiskit/visualization/timeline/core.py +19 -13
  296. qiskit/visualization/timeline/interface.py +19 -18
  297. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  298. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  299. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
  300. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +1 -1
  301. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  302. qiskit/assembler/__init__.py +0 -42
  303. qiskit/assembler/assemble_circuits.py +0 -451
  304. qiskit/assembler/assemble_schedules.py +0 -367
  305. qiskit/assembler/disassemble.py +0 -310
  306. qiskit/assembler/run_config.py +0 -77
  307. qiskit/circuit/bit.py +0 -106
  308. qiskit/circuit/classicalfunction/__init__.py +0 -152
  309. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  310. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  311. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  312. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  313. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  314. qiskit/circuit/classicalfunction/types.py +0 -18
  315. qiskit/circuit/classicalfunction/utils.py +0 -91
  316. qiskit/circuit/classicalregister.py +0 -57
  317. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  318. qiskit/circuit/quantumregister.py +0 -75
  319. qiskit/circuit/register.py +0 -246
  320. qiskit/compiler/assembler.py +0 -689
  321. qiskit/compiler/scheduler.py +0 -109
  322. qiskit/compiler/sequencer.py +0 -71
  323. qiskit/primitives/backend_estimator.py +0 -486
  324. qiskit/primitives/backend_sampler.py +0 -222
  325. qiskit/primitives/estimator.py +0 -172
  326. qiskit/primitives/sampler.py +0 -162
  327. qiskit/providers/backend_compat.py +0 -507
  328. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  333. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  351. qiskit/providers/fake_provider/fake_1q.py +0 -91
  352. qiskit/providers/fake_provider/fake_backend.py +0 -165
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  357. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  358. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  359. qiskit/providers/models/__init__.py +0 -89
  360. qiskit/providers/models/backendconfiguration.py +0 -1040
  361. qiskit/providers/models/backendproperties.py +0 -535
  362. qiskit/providers/models/backendstatus.py +0 -104
  363. qiskit/providers/models/jobstatus.py +0 -77
  364. qiskit/providers/models/pulsedefaults.py +0 -305
  365. qiskit/providers/provider.py +0 -95
  366. qiskit/pulse/__init__.py +0 -158
  367. qiskit/pulse/builder.py +0 -2262
  368. qiskit/pulse/calibration_entries.py +0 -381
  369. qiskit/pulse/channels.py +0 -227
  370. qiskit/pulse/configuration.py +0 -245
  371. qiskit/pulse/exceptions.py +0 -45
  372. qiskit/pulse/filters.py +0 -309
  373. qiskit/pulse/instruction_schedule_map.py +0 -424
  374. qiskit/pulse/instructions/__init__.py +0 -67
  375. qiskit/pulse/instructions/acquire.py +0 -150
  376. qiskit/pulse/instructions/delay.py +0 -71
  377. qiskit/pulse/instructions/directives.py +0 -154
  378. qiskit/pulse/instructions/frequency.py +0 -135
  379. qiskit/pulse/instructions/instruction.py +0 -270
  380. qiskit/pulse/instructions/phase.py +0 -152
  381. qiskit/pulse/instructions/play.py +0 -99
  382. qiskit/pulse/instructions/reference.py +0 -100
  383. qiskit/pulse/instructions/snapshot.py +0 -82
  384. qiskit/pulse/library/__init__.py +0 -97
  385. qiskit/pulse/library/continuous.py +0 -430
  386. qiskit/pulse/library/pulse.py +0 -148
  387. qiskit/pulse/library/samplers/__init__.py +0 -15
  388. qiskit/pulse/library/samplers/decorators.py +0 -295
  389. qiskit/pulse/library/samplers/strategies.py +0 -71
  390. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  391. qiskit/pulse/library/waveform.py +0 -136
  392. qiskit/pulse/macros.py +0 -262
  393. qiskit/pulse/parameter_manager.py +0 -445
  394. qiskit/pulse/parser.py +0 -314
  395. qiskit/pulse/reference_manager.py +0 -58
  396. qiskit/pulse/schedule.py +0 -1854
  397. qiskit/pulse/transforms/__init__.py +0 -106
  398. qiskit/pulse/transforms/alignments.py +0 -406
  399. qiskit/pulse/transforms/base_transforms.py +0 -71
  400. qiskit/pulse/transforms/canonicalization.py +0 -498
  401. qiskit/pulse/transforms/dag.py +0 -122
  402. qiskit/pulse/utils.py +0 -149
  403. qiskit/qobj/__init__.py +0 -75
  404. qiskit/qobj/common.py +0 -81
  405. qiskit/qobj/converters/__init__.py +0 -18
  406. qiskit/qobj/converters/lo_config.py +0 -177
  407. qiskit/qobj/converters/pulse_instruction.py +0 -897
  408. qiskit/qobj/pulse_qobj.py +0 -709
  409. qiskit/qobj/qasm_qobj.py +0 -708
  410. qiskit/qobj/utils.py +0 -46
  411. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  412. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  413. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  414. qiskit/result/mitigation/utils.py +0 -217
  415. qiskit/scheduler/__init__.py +0 -40
  416. qiskit/scheduler/config.py +0 -37
  417. qiskit/scheduler/lowering.py +0 -187
  418. qiskit/scheduler/methods/__init__.py +0 -15
  419. qiskit/scheduler/methods/basic.py +0 -140
  420. qiskit/scheduler/schedule_circuit.py +0 -69
  421. qiskit/scheduler/sequence.py +0 -104
  422. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  423. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  424. qiskit/transpiler/passes/calibration/builders.py +0 -20
  425. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  426. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  427. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  428. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  429. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  430. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  431. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  432. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  433. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  434. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  435. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  436. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  437. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  438. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  439. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  440. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  441. qiskit/utils/deprecate_pulse.py +0 -119
  442. qiskit/utils/multiprocessing.py +0 -56
  443. qiskit/visualization/pulse_v2/__init__.py +0 -21
  444. qiskit/visualization/pulse_v2/core.py +0 -901
  445. qiskit/visualization/pulse_v2/device_info.py +0 -173
  446. qiskit/visualization/pulse_v2/drawings.py +0 -253
  447. qiskit/visualization/pulse_v2/events.py +0 -254
  448. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  449. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  450. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  451. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  452. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  453. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  454. qiskit/visualization/pulse_v2/interface.py +0 -459
  455. qiskit/visualization/pulse_v2/layouts.py +0 -387
  456. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  457. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  458. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  459. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  460. qiskit/visualization/pulse_v2/types.py +0 -242
  461. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  462. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -19,7 +19,7 @@ from collections.abc import Sequence
19
19
  import typing
20
20
 
21
21
  from qiskit.circuit.quantumcircuit import QuantumCircuit
22
- from qiskit.circuit.quantumregister import QuantumRegister
22
+ from qiskit.circuit import QuantumRegister
23
23
  from qiskit.circuit.instruction import Instruction
24
24
  from qiskit.circuit.library.generalized_gates import Isometry
25
25
  from .state_preparation import StatePreparation
@@ -125,9 +125,9 @@ def pauli_feature_map(
125
125
  q_1: ┤ H ├────────────┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
126
126
  └───┘ └───┘└────────────────────────────────┘└───┘
127
127
 
128
- >>> from qiskit.circuit.library import EfficientSU2
128
+ >>> from qiskit.circuit.library import efficient_su2
129
129
  >>> prep = pauli_feature_map(3, reps=3, paulis=["Z", "YY", "ZXZ"])
130
- >>> wavefunction = EfficientSU2(3)
130
+ >>> wavefunction = efficient_su2(3)
131
131
  >>> classifier = prep.compose(wavefunction)
132
132
  >>> classifier.num_parameters
133
133
  27
@@ -286,8 +286,8 @@ def zz_feature_map(
286
286
  q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
287
287
  └───┘└─────────────┘└───┘└────────────────────────────────┘└───┘
288
288
 
289
- >>> from qiskit.circuit.library import EfficientSU2
290
- >>> classifier = zz_feature_map(3) + EfficientSU2(3)
289
+ >>> from qiskit.circuit.library import efficient_su2
290
+ >>> classifier = zz_feature_map(3).compose(efficient_su2(3))
291
291
  >>> classifier.num_parameters
292
292
  15
293
293
  >>> classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
@@ -18,7 +18,7 @@ import numpy as np
18
18
 
19
19
  from qiskit.exceptions import QiskitError
20
20
  from qiskit.circuit.quantumcircuit import QuantumCircuit
21
- from qiskit.circuit.quantumregister import QuantumRegister
21
+ from qiskit.circuit import QuantumRegister
22
22
  from qiskit.circuit.gate import Gate
23
23
  from qiskit.circuit.library.standard_gates.x import XGate
24
24
  from qiskit.circuit.library.standard_gates.h import HGate
@@ -20,7 +20,7 @@ from collections.abc import Sequence
20
20
 
21
21
  import numpy as np
22
22
  from qiskit.circuit.quantumcircuit import QuantumCircuit
23
- from qiskit.circuit.quantumregister import QuantumRegister
23
+ from qiskit.circuit import QuantumRegister
24
24
  from qiskit.circuit.parameterexpression import ParameterValueType
25
25
  from qiskit.circuit.library.standard_gates import RXXGate
26
26
  from qiskit.circuit.gate import Gate
@@ -26,7 +26,7 @@ import numpy as np
26
26
  from qiskit.circuit.exceptions import CircuitError
27
27
  from qiskit.circuit.instruction import Instruction
28
28
  from qiskit.circuit.quantumcircuit import QuantumCircuit
29
- from qiskit.circuit.quantumregister import QuantumRegister
29
+ from qiskit.circuit import QuantumRegister
30
30
  from qiskit.exceptions import QiskitError
31
31
  from qiskit.quantum_info.operators.predicates import is_isometry
32
32
  from qiskit._accelerate import isometry as isometry_rs
@@ -14,7 +14,6 @@
14
14
  Simulator command to perform multiple pauli gates in a single pass
15
15
  """
16
16
  from qiskit.circuit.quantumcircuitdata import CircuitInstruction
17
- from qiskit.circuit.quantumregister import QuantumRegister
18
17
  from qiskit.circuit.library.standard_gates.x import XGate
19
18
  from qiskit.circuit.library.standard_gates.y import YGate
20
19
  from qiskit.circuit.library.standard_gates.z import ZGate
@@ -46,7 +45,7 @@ class PauliGate(Gate):
46
45
  gate pauli (p1 a1,...,pn an) { p1 a1; ... ; pn an; }
47
46
  """
48
47
  # pylint: disable=cyclic-import
49
- from qiskit.circuit.quantumcircuit import QuantumCircuit
48
+ from qiskit.circuit import QuantumCircuit, QuantumRegister
50
49
 
51
50
  gates = {"X": XGate, "Y": YGate, "Z": ZGate}
52
51
  q = QuantumRegister(len(self.params[0]), "q")
@@ -28,13 +28,13 @@ import numpy as np
28
28
  from qiskit.circuit.gate import Gate
29
29
  from qiskit.circuit.library.standard_gates.h import HGate
30
30
  from qiskit.quantum_info.operators.predicates import is_unitary_matrix
31
- from qiskit.circuit.quantumregister import QuantumRegister
31
+ from qiskit.circuit import QuantumRegister
32
32
  from qiskit.circuit.quantumcircuit import QuantumCircuit
33
33
  from qiskit.circuit.exceptions import CircuitError
34
34
  from qiskit.exceptions import QiskitError
35
35
  from qiskit._accelerate import uc_gate
36
36
 
37
- from .diagonal import Diagonal
37
+ from .diagonal import DiagonalGate
38
38
 
39
39
  _EPS = 1e-10 # global variable used to chop very small numbers to zero
40
40
 
@@ -60,14 +60,21 @@ class UCGate(Gate):
60
60
 
61
61
  The decomposition is based on Ref. [1].
62
62
 
63
+ Unnecessary controls and repeated operators can be removed as described in Ref [2].
64
+
63
65
  **References:**
64
66
 
65
67
  [1] Bergholm et al., Quantum circuits with uniformly controlled one-qubit gates (2005).
66
68
  `Phys. Rev. A 71, 052330 <https://journals.aps.org/pra/abstract/10.1103/PhysRevA.71.052330>`__.
67
69
 
70
+ [2] de Carvalho et al., Quantum multiplexer simplification for state preparation (2024).
71
+ `arXiv:2409.05618 <https://arxiv.org/abs/2409.05618>`__.
72
+
68
73
  """
69
74
 
70
- def __init__(self, gate_list: list[np.ndarray], up_to_diagonal: bool = False):
75
+ def __init__(
76
+ self, gate_list: list[np.ndarray], up_to_diagonal: bool = False, mux_simp: bool = True
77
+ ):
71
78
  r"""
72
79
  Args:
73
80
  gate_list: List of two qubit unitaries :math:`[U_0, ..., U_{2^{k-1}}]`, where each
@@ -76,6 +83,9 @@ class UCGate(Gate):
76
83
  or if it is decomposed completely (default: False).
77
84
  If the ``UCGate`` :math:`U` is decomposed up to a diagonal :math:`D`, this means
78
85
  that the circuit implements a unitary :math:`U'` such that :math:`D U' = U`.
86
+ mux_simp: Determines whether the search for repetitions is conducted (default: True).
87
+ The intention is to perform a possible simplification in the number of controls
88
+ and operators.
79
89
 
80
90
  Raises:
81
91
  QiskitError: in case of bad input to the constructor
@@ -101,10 +111,67 @@ class UCGate(Gate):
101
111
  if not is_unitary_matrix(gate, _EPS):
102
112
  raise QiskitError("A controlled gate is not unitary.")
103
113
 
114
+ new_controls = set()
115
+ if mux_simp:
116
+ new_controls, gate_list = self._simplify(gate_list, num_contr)
117
+ self.simp_contr = (mux_simp, new_controls)
118
+
104
119
  # Create new gate.
105
120
  super().__init__("multiplexer", int(num_contr) + 1, gate_list)
106
121
  self.up_to_diagonal = up_to_diagonal
107
122
 
123
+ def _simplify(self, gate_list, num_contr):
124
+ """https://arxiv.org/abs/2409.05618"""
125
+
126
+ c = set()
127
+ nc = set()
128
+ mux_copy = gate_list.copy()
129
+
130
+ for i in range(int(num_contr)):
131
+ c.add(i + 1)
132
+
133
+ if len(gate_list) > 1:
134
+ nc, mux_copy = self._repetition_search(gate_list, num_contr, mux_copy)
135
+
136
+ new_controls = {x for x in c if x not in nc}
137
+ new_mux = [gate for gate in mux_copy if gate is not None]
138
+ return new_controls, new_mux
139
+
140
+ def _repetition_search(self, mux, level, mux_copy):
141
+ nc = set()
142
+ d = 1
143
+ while d <= len(mux) / 2:
144
+ disentanglement = False
145
+ if np.allclose(mux[d], mux[0]):
146
+ mux_org = mux_copy.copy()
147
+ repetitions = len(mux) / (2 * d)
148
+ p = 0
149
+ while repetitions > 0:
150
+ repetitions -= 1
151
+ valid, mux_copy = self._repetition_verify(p, d, mux, mux_copy)
152
+ p = p + 2 * d
153
+ if not valid:
154
+ mux_copy = mux_org
155
+ break
156
+ if repetitions == 0:
157
+ disentanglement = True
158
+
159
+ if disentanglement:
160
+ removed_contr = level - math.log2(d)
161
+ nc.add(removed_contr)
162
+ d = 2 * d
163
+ return nc, mux_copy
164
+
165
+ def _repetition_verify(self, base, d, mux, mux_copy):
166
+ i = 0
167
+ next_base = base + d
168
+ while i < d:
169
+ if not np.allclose(mux[base], mux[next_base]):
170
+ return False, mux_copy
171
+ mux_copy[next_base] = None
172
+ base, next_base, i = base + 1, next_base + 1, i + 1
173
+ return True, mux_copy
174
+
108
175
  def inverse(self, annotated: bool = False) -> Gate:
109
176
  """Return the inverse.
110
177
 
@@ -135,6 +202,19 @@ class UCGate(Gate):
135
202
  # q[k-1],...,q[0],q_target, decreasingly ordered with respect to the
136
203
  # significance of the qubit in the computational basis
137
204
  _, diag = self._dec_ucg()
205
+ if self.simp_contr[1]:
206
+ q_controls = [self.num_qubits - i for i in self.simp_contr[1]]
207
+ q_controls.reverse()
208
+ for i in range(self.num_qubits):
209
+ if i not in [0] + q_controls:
210
+ d = 2**i
211
+ new_diag = []
212
+ n = len(diag)
213
+ for j in range(n):
214
+ new_diag.append(diag[j])
215
+ if (j + 1) % d == 0:
216
+ new_diag.extend(diag[j + 1 - d : j + 1])
217
+ diag = np.array(new_diag)
138
218
  return diag
139
219
 
140
220
  def _define(self):
@@ -149,12 +229,19 @@ class UCGate(Gate):
149
229
  """
150
230
  diag = np.ones(2**self.num_qubits).tolist()
151
231
  q = QuantumRegister(self.num_qubits, "q")
152
- q_controls = q[1:]
153
232
  q_target = q[0]
233
+ mux_simplify = self.simp_contr[0]
234
+
235
+ if mux_simplify:
236
+ q_controls = [q[self.num_qubits - i] for i in self.simp_contr[1]]
237
+ q_controls.reverse()
238
+ else:
239
+ q_controls = q[1:]
240
+
154
241
  circuit = QuantumCircuit(q, name="uc")
155
242
  # If there is no control, we use the ZYZ decomposition
156
243
  if not q_controls:
157
- circuit.unitary(self.params[0], [q])
244
+ circuit.unitary(self.params[0], q[0])
158
245
  return circuit, diag
159
246
  # If there is at least one control, first,
160
247
  # we find the single qubit gates of the decomposition.
@@ -189,8 +276,9 @@ class UCGate(Gate):
189
276
  # Important: the diagonal gate is given in the computational basis of the qubits
190
277
  # q[k-1],...,q[0],q_target (ordered with decreasing significance),
191
278
  # where q[i] are the control qubits and t denotes the target qubit.
192
- diagonal = Diagonal(diag)
193
- circuit.append(diagonal, q)
279
+ diagonal = DiagonalGate(diag)
280
+
281
+ circuit.append(diagonal, [q_target] + q_controls)
194
282
  return circuit, diag
195
283
 
196
284
  def _dec_ucg_help(self):
@@ -199,6 +287,8 @@ class UCGate(Gate):
199
287
  https://arxiv.org/pdf/quant-ph/0410066.pdf.
200
288
  """
201
289
  single_qubit_gates = [gate.astype(complex) for gate in self.params]
290
+ if self.simp_contr[0]:
291
+ return uc_gate.dec_ucg_help(single_qubit_gates, len(self.simp_contr[1]) + 1)
202
292
  return uc_gate.dec_ucg_help(single_qubit_gates, self.num_qubits)
203
293
 
204
294
  @staticmethod
@@ -23,7 +23,7 @@ import numpy as np
23
23
 
24
24
  from qiskit.circuit.gate import Gate
25
25
  from qiskit.circuit.quantumcircuit import QuantumCircuit
26
- from qiskit.circuit.quantumregister import QuantumRegister
26
+ from qiskit.circuit import QuantumRegister
27
27
  from qiskit.exceptions import QiskitError
28
28
 
29
29
  _EPS = 1e-10 # global variable used to chop very small numbers to zero
@@ -23,7 +23,7 @@ from qiskit.circuit.gate import Gate
23
23
  from qiskit.circuit.controlledgate import ControlledGate
24
24
  from qiskit.circuit.annotated_operation import AnnotatedOperation, ControlModifier
25
25
  from qiskit.circuit.quantumcircuit import QuantumCircuit
26
- from qiskit.circuit.quantumregister import QuantumRegister
26
+ from qiskit.circuit import QuantumRegister
27
27
  from qiskit.circuit.exceptions import CircuitError
28
28
  from qiskit.circuit._utils import _compute_control_matrix
29
29
  from qiskit.circuit.library.standard_gates.u import UGate
@@ -45,7 +45,9 @@ class UnitaryGate(Gate):
45
45
  quantum circuit. The matrix can also be directly applied to the quantum
46
46
  circuit, see :meth:`.QuantumCircuit.unitary`.
47
47
 
48
- .. code-block:: python
48
+ .. plot::
49
+ :include-source:
50
+ :nofigs:
49
51
 
50
52
  from qiskit import QuantumCircuit
51
53
  from qiskit.circuit.library import UnitaryGate
@@ -48,6 +48,7 @@ class GraphState(QuantumCircuit):
48
48
  import rustworkx as rx
49
49
  G = rx.generators.cycle_graph(5)
50
50
  circuit = GraphState(rx.adjacency_matrix(G))
51
+ circuit.name = "Graph state"
51
52
  _generate_circuit_library_visualization(circuit)
52
53
 
53
54
  **References:**
@@ -24,7 +24,7 @@ import numpy as np
24
24
  from qiskit import _numpy_compat
25
25
  from qiskit.circuit.gate import Gate
26
26
  from qiskit.circuit.quantumcircuit import QuantumCircuit
27
- from qiskit.circuit.quantumregister import QuantumRegister
27
+ from qiskit.circuit import QuantumRegister
28
28
  from qiskit.circuit.parameterexpression import ParameterExpression
29
29
  from qiskit.circuit.exceptions import CircuitError
30
30
  from qiskit.quantum_info.operators.predicates import matrix_equal
@@ -23,7 +23,7 @@ import numpy as np
23
23
  from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
24
24
  from qiskit.circuit.parameter import Parameter
25
25
  from qiskit.circuit.parametervector import ParameterVector
26
- from qiskit.circuit.quantumregister import QuantumRegister
26
+ from qiskit.circuit import QuantumRegister
27
27
  from qiskit.circuit.quantumcircuit import QuantumCircuit
28
28
  from qiskit.quantum_info import Operator, Pauli, SparsePauliOp
29
29
  from qiskit.quantum_info.operators.base_operator import BaseOperator
@@ -23,7 +23,7 @@ import numpy
23
23
  from qiskit.circuit.gate import Gate
24
24
  from qiskit.circuit.quantumcircuit import QuantumCircuit, ParameterValueType
25
25
  from qiskit.circuit.parametervector import ParameterVector, ParameterVectorElement
26
- from qiskit.circuit.quantumregister import QuantumRegister
26
+ from qiskit.circuit import QuantumRegister
27
27
  from qiskit.circuit import (
28
28
  Instruction,
29
29
  Parameter,
@@ -19,7 +19,7 @@ import numpy as np
19
19
 
20
20
  from qiskit.circuit.parametervector import ParameterVector
21
21
  from qiskit.circuit.quantumcircuit import QuantumCircuit
22
- from qiskit.circuit.quantumregister import QuantumRegister
22
+ from qiskit.circuit import QuantumRegister
23
23
  from qiskit.quantum_info import SparsePauliOp
24
24
  from qiskit.quantum_info.operators.base_operator import BaseOperator
25
25
 
@@ -132,10 +132,10 @@ def unitary_overlap(
132
132
  :include-source:
133
133
 
134
134
  import numpy as np
135
- from qiskit.circuit.library import EfficientSU2, unitary_overlap
135
+ from qiskit.circuit.library import efficient_su2, unitary_overlap
136
136
 
137
137
  # get two circuit to prepare states of which we compute the overlap
138
- circuit = EfficientSU2(2, reps=1)
138
+ circuit = efficient_su2(2, reps=1)
139
139
  unitary1 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
140
140
  unitary2 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
141
141
 
@@ -20,7 +20,7 @@ import numpy as np
20
20
  from qiskit.circuit.gate import Gate
21
21
  from qiskit.circuit.quantumcircuit import ParameterValueType
22
22
  from qiskit.circuit.parameterexpression import ParameterExpression
23
- from qiskit.quantum_info import Pauli, SparsePauliOp
23
+ from qiskit.quantum_info import Pauli, SparsePauliOp, SparseObservable
24
24
 
25
25
  if TYPE_CHECKING:
26
26
  from qiskit.synthesis.evolution import EvolutionSynthesis
@@ -49,7 +49,9 @@ class PauliEvolutionGate(Gate):
49
49
 
50
50
  **Examples:**
51
51
 
52
- .. code-block:: python
52
+ .. plot::
53
+ :include-source:
54
+ :nofigs:
53
55
 
54
56
  from qiskit.circuit import QuantumCircuit
55
57
  from qiskit.circuit.library import PauliEvolutionGate
@@ -68,7 +70,9 @@ class PauliEvolutionGate(Gate):
68
70
  circuit.append(evo, range(2))
69
71
  print(circuit.draw())
70
72
 
71
- The above will print (note that the ``-0.1`` coefficient is not printed!)::
73
+ The above will print (note that the ``-0.1`` coefficient is not printed!):
74
+
75
+ .. code-block:: text
72
76
 
73
77
  ┌──────────────────────────┐
74
78
  q_0: ┤0 ├
@@ -86,15 +90,19 @@ class PauliEvolutionGate(Gate):
86
90
 
87
91
  def __init__(
88
92
  self,
89
- operator: Pauli | SparsePauliOp | list[Pauli | SparsePauliOp],
93
+ operator: (
94
+ Pauli
95
+ | SparsePauliOp
96
+ | SparseObservable
97
+ | list[Pauli | SparsePauliOp | SparseObservable]
98
+ ),
90
99
  time: ParameterValueType = 1.0,
91
100
  label: str | None = None,
92
101
  synthesis: EvolutionSynthesis | None = None,
93
102
  ) -> None:
94
103
  """
95
104
  Args:
96
- operator (Pauli | SparsePauliOp | list):
97
- The operator to evolve. Can also be provided as list of non-commuting
105
+ operator: The operator to evolve. Can also be provided as list of non-commuting
98
106
  operators where the elements are sums of commuting operators.
99
107
  For example: ``[XY + YX, ZZ + ZI + IZ, YY]``.
100
108
  time: The evolution time.
@@ -106,9 +114,9 @@ class PauliEvolutionGate(Gate):
106
114
  product formula with a single repetition.
107
115
  """
108
116
  if isinstance(operator, list):
109
- operator = [_to_sparse_pauli_op(op) for op in operator]
117
+ operator = [_to_sparse_op(op) for op in operator]
110
118
  else:
111
- operator = _to_sparse_pauli_op(operator)
119
+ operator = _to_sparse_op(operator)
112
120
 
113
121
  if label is None:
114
122
  label = _get_default_label(operator)
@@ -155,32 +163,39 @@ class PauliEvolutionGate(Gate):
155
163
  return super().validate_parameter(parameter)
156
164
 
157
165
 
158
- def _to_sparse_pauli_op(operator):
166
+ def _to_sparse_op(
167
+ operator: Pauli | SparsePauliOp | SparseObservable,
168
+ ) -> SparsePauliOp | SparseObservable:
159
169
  """Cast the operator to a SparsePauliOp."""
160
170
 
161
171
  if isinstance(operator, Pauli):
162
- sparse_pauli = SparsePauliOp(operator)
163
- elif isinstance(operator, SparsePauliOp):
164
- sparse_pauli = operator
172
+ sparse = SparsePauliOp(operator)
173
+ elif isinstance(operator, (SparseObservable, SparsePauliOp)):
174
+ sparse = operator
165
175
  else:
166
176
  raise ValueError(f"Unsupported operator type for evolution: {type(operator)}.")
167
177
 
168
- if any(np.iscomplex(sparse_pauli.coeffs)):
178
+ if any(np.iscomplex(sparse.coeffs)):
169
179
  raise ValueError("Operator contains complex coefficients, which are not supported.")
170
- if any(isinstance(coeff, ParameterExpression) for coeff in sparse_pauli.coeffs):
180
+ if any(isinstance(coeff, ParameterExpression) for coeff in sparse.coeffs):
171
181
  raise ValueError("Operator contains ParameterExpression, which are not supported.")
172
182
 
173
- return sparse_pauli
183
+ return sparse
184
+
185
+
186
+ def _operator_label(operator):
187
+ if isinstance(operator, SparseObservable):
188
+ if len(operator) == 1:
189
+ return operator[0].bit_labels()[::-1]
190
+ return "(" + " + ".join(term.bit_labels()[::-1] for term in operator) + ")"
191
+
192
+ # else: is a SparsePauliOp
193
+ if len(operator.paulis) == 1:
194
+ return operator.paulis.to_labels()[0]
195
+ return "(" + " + ".join(operator.paulis.to_labels()) + ")"
174
196
 
175
197
 
176
198
  def _get_default_label(operator):
177
199
  if isinstance(operator, list):
178
- label = f"exp(-it ({[' + '.join(op.paulis.to_labels()) for op in operator]}))"
179
- else:
180
- if len(operator.paulis) == 1:
181
- label = f"exp(-it {operator.paulis.to_labels()[0]})"
182
- # for just a single Pauli don't add brackets around the sum
183
- else:
184
- label = f"exp(-it ({' + '.join(operator.paulis.to_labels())}))"
185
-
186
- return label
200
+ return f"exp(-it ({[_operator_label(op) for op in operator]}))"
201
+ return f"exp(-it {_operator_label(operator)})"