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

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