qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__cp39-abi3-win32.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 (360) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +20 -1
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/assembler/assemble_schedules.py +2 -0
  5. qiskit/circuit/__init__.py +44 -1
  6. qiskit/circuit/_standard_gates_commutations.py +585 -0
  7. qiskit/circuit/barrier.py +2 -0
  8. qiskit/circuit/controlflow/builder.py +3 -3
  9. qiskit/circuit/controlflow/if_else.py +13 -5
  10. qiskit/circuit/controlflow/while_loop.py +10 -2
  11. qiskit/circuit/delay.py +20 -3
  12. qiskit/circuit/equivalence.py +13 -214
  13. qiskit/circuit/gate.py +3 -1
  14. qiskit/circuit/instruction.py +32 -11
  15. qiskit/circuit/instructionset.py +2 -0
  16. qiskit/circuit/library/__init__.py +110 -14
  17. qiskit/circuit/library/arithmetic/__init__.py +9 -2
  18. qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
  19. qiskit/circuit/library/arithmetic/adders/adder.py +154 -2
  20. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
  21. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
  22. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
  23. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  24. qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
  25. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
  26. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
  27. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
  28. qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
  29. qiskit/circuit/library/basis_change/qft.py +20 -38
  30. qiskit/circuit/library/blueprintcircuit.py +64 -0
  31. qiskit/circuit/library/boolean_logic/__init__.py +4 -4
  32. qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
  33. qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
  34. qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
  35. qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
  36. qiskit/circuit/library/data_preparation/__init__.py +6 -3
  37. qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
  38. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  39. qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
  40. qiskit/circuit/library/fourier_checking.py +72 -11
  41. qiskit/circuit/library/generalized_gates/__init__.py +1 -1
  42. qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
  43. qiskit/circuit/library/generalized_gates/gms.py +67 -14
  44. qiskit/circuit/library/generalized_gates/gr.py +4 -4
  45. qiskit/circuit/library/generalized_gates/isometry.py +2 -2
  46. qiskit/circuit/library/generalized_gates/linear_function.py +12 -6
  47. qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
  48. qiskit/circuit/library/generalized_gates/permutation.py +8 -6
  49. qiskit/circuit/library/generalized_gates/rv.py +8 -9
  50. qiskit/circuit/library/graph_state.py +93 -10
  51. qiskit/circuit/library/grover_operator.py +270 -2
  52. qiskit/circuit/library/hidden_linear_function.py +83 -20
  53. qiskit/circuit/library/iqp.py +99 -20
  54. qiskit/circuit/library/n_local/__init__.py +19 -7
  55. qiskit/circuit/library/n_local/efficient_su2.py +118 -5
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
  57. qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
  58. qiskit/circuit/library/n_local/n_local.py +406 -5
  59. qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
  60. qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
  61. qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
  62. qiskit/circuit/library/n_local/two_local.py +14 -7
  63. qiskit/circuit/library/overlap.py +91 -26
  64. qiskit/circuit/library/pauli_evolution.py +17 -15
  65. qiskit/circuit/library/phase_estimation.py +80 -4
  66. qiskit/circuit/library/quantum_volume.py +72 -20
  67. qiskit/circuit/library/standard_gates/__init__.py +20 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +2 -1
  69. qiskit/circuit/library/standard_gates/ecr.py +2 -2
  70. qiskit/circuit/library/standard_gates/h.py +4 -3
  71. qiskit/circuit/library/standard_gates/i.py +2 -1
  72. qiskit/circuit/library/standard_gates/iswap.py +2 -2
  73. qiskit/circuit/library/standard_gates/p.py +20 -12
  74. qiskit/circuit/library/standard_gates/r.py +1 -1
  75. qiskit/circuit/library/standard_gates/rx.py +4 -3
  76. qiskit/circuit/library/standard_gates/rxx.py +2 -2
  77. qiskit/circuit/library/standard_gates/ry.py +4 -3
  78. qiskit/circuit/library/standard_gates/ryy.py +2 -2
  79. qiskit/circuit/library/standard_gates/rz.py +13 -12
  80. qiskit/circuit/library/standard_gates/rzx.py +6 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +1 -1
  82. qiskit/circuit/library/standard_gates/s.py +4 -4
  83. qiskit/circuit/library/standard_gates/swap.py +3 -3
  84. qiskit/circuit/library/standard_gates/sx.py +4 -3
  85. qiskit/circuit/library/standard_gates/t.py +2 -2
  86. qiskit/circuit/library/standard_gates/u.py +11 -3
  87. qiskit/circuit/library/standard_gates/u1.py +65 -15
  88. qiskit/circuit/library/standard_gates/u2.py +4 -1
  89. qiskit/circuit/library/standard_gates/u3.py +31 -3
  90. qiskit/circuit/library/standard_gates/x.py +7 -5
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
  93. qiskit/circuit/library/standard_gates/y.py +4 -3
  94. qiskit/circuit/library/standard_gates/z.py +3 -3
  95. qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
  96. qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
  97. qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
  98. qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
  99. qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
  100. qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
  101. qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
  102. qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
  103. qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
  104. qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
  105. qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
  106. qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
  107. qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
  108. qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
  109. qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
  110. qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
  111. qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
  112. qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
  113. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
  114. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
  115. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
  116. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
  117. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
  118. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
  119. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
  120. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
  121. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
  122. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
  123. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
  124. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
  125. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
  126. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
  127. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
  128. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
  129. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
  130. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
  131. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
  132. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
  133. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
  134. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
  135. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
  136. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
  137. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
  138. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
  139. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
  140. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
  141. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
  142. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
  143. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
  144. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
  145. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
  146. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
  147. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
  148. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
  149. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
  150. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
  151. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
  152. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
  153. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
  154. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
  155. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
  156. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
  157. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
  158. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
  159. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
  160. qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
  161. qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
  162. qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
  163. qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
  164. qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
  165. qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
  166. qiskit/circuit/parameter.py +4 -0
  167. qiskit/circuit/parameterexpression.py +167 -34
  168. qiskit/circuit/quantumcircuit.py +162 -126
  169. qiskit/circuit/singleton.py +2 -0
  170. qiskit/circuit/store.py +2 -0
  171. qiskit/circuit/twirling.py +145 -0
  172. qiskit/compiler/assembler.py +17 -4
  173. qiskit/compiler/scheduler.py +2 -0
  174. qiskit/compiler/sequencer.py +2 -0
  175. qiskit/compiler/transpiler.py +81 -26
  176. qiskit/converters/circuit_to_dag.py +2 -2
  177. qiskit/converters/circuit_to_dagdependency.py +1 -1
  178. qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
  179. qiskit/converters/circuit_to_instruction.py +1 -1
  180. qiskit/converters/dag_to_circuit.py +7 -5
  181. qiskit/converters/dag_to_dagdependency.py +1 -1
  182. qiskit/converters/dag_to_dagdependency_v2.py +1 -1
  183. qiskit/converters/dagdependency_to_circuit.py +5 -1
  184. qiskit/converters/dagdependency_to_dag.py +6 -1
  185. qiskit/dagcircuit/collect_blocks.py +3 -3
  186. qiskit/dagcircuit/dagdependency.py +18 -5
  187. qiskit/dagcircuit/dagdependency_v2.py +1 -1
  188. qiskit/dagcircuit/dagnode.py +2 -2
  189. qiskit/passmanager/__init__.py +2 -2
  190. qiskit/primitives/backend_estimator.py +5 -2
  191. qiskit/primitives/backend_sampler_v2.py +61 -18
  192. qiskit/primitives/base/base_estimator.py +2 -2
  193. qiskit/primitives/containers/data_bin.py +9 -1
  194. qiskit/primitives/statevector_sampler.py +1 -1
  195. qiskit/primitives/utils.py +1 -1
  196. qiskit/providers/__init__.py +3 -3
  197. qiskit/providers/backend.py +12 -1
  198. qiskit/providers/backend_compat.py +23 -3
  199. qiskit/providers/basic_provider/basic_simulator.py +12 -2
  200. qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
  201. qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
  202. qiskit/providers/models/pulsedefaults.py +2 -0
  203. qiskit/pulse/builder.py +59 -18
  204. qiskit/pulse/calibration_entries.py +4 -1
  205. qiskit/pulse/channels.py +2 -0
  206. qiskit/pulse/exceptions.py +2 -0
  207. qiskit/pulse/instruction_schedule_map.py +21 -6
  208. qiskit/pulse/instructions/acquire.py +2 -0
  209. qiskit/pulse/instructions/delay.py +2 -0
  210. qiskit/pulse/instructions/directives.py +8 -0
  211. qiskit/pulse/instructions/frequency.py +3 -0
  212. qiskit/pulse/instructions/instruction.py +2 -0
  213. qiskit/pulse/instructions/phase.py +3 -0
  214. qiskit/pulse/instructions/play.py +2 -0
  215. qiskit/pulse/instructions/reference.py +2 -0
  216. qiskit/pulse/instructions/snapshot.py +2 -0
  217. qiskit/pulse/library/pulse.py +2 -0
  218. qiskit/pulse/library/symbolic_pulses.py +28 -0
  219. qiskit/pulse/library/waveform.py +2 -0
  220. qiskit/pulse/macros.py +1 -1
  221. qiskit/pulse/schedule.py +12 -13
  222. qiskit/pulse/transforms/alignments.py +5 -3
  223. qiskit/pulse/transforms/dag.py +7 -0
  224. qiskit/qasm2/export.py +5 -3
  225. qiskit/qasm2/parse.py +46 -2
  226. qiskit/qasm3/__init__.py +1 -0
  227. qiskit/qasm3/ast.py +123 -15
  228. qiskit/qasm3/exporter.py +103 -77
  229. qiskit/qobj/converters/pulse_instruction.py +6 -4
  230. qiskit/qpy/__init__.py +181 -0
  231. qiskit/qpy/binary_io/circuits.py +20 -5
  232. qiskit/qpy/binary_io/schedules.py +3 -4
  233. qiskit/qpy/binary_io/value.py +310 -13
  234. qiskit/qpy/common.py +46 -2
  235. qiskit/qpy/formats.py +7 -0
  236. qiskit/qpy/interface.py +40 -4
  237. qiskit/quantum_info/__init__.py +4 -0
  238. qiskit/quantum_info/operators/channel/transformations.py +28 -21
  239. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  240. qiskit/quantum_info/operators/operator.py +54 -8
  241. qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
  242. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  243. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
  244. qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
  245. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  246. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
  247. qiskit/quantum_info/states/densitymatrix.py +5 -5
  248. qiskit/quantum_info/states/stabilizerstate.py +1 -1
  249. qiskit/quantum_info/states/statevector.py +6 -6
  250. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  251. qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
  252. qiskit/result/mitigation/local_readout_mitigator.py +9 -1
  253. qiskit/result/mitigation/utils.py +57 -0
  254. qiskit/scheduler/config.py +2 -0
  255. qiskit/scheduler/methods/basic.py +3 -0
  256. qiskit/scheduler/schedule_circuit.py +2 -0
  257. qiskit/scheduler/sequence.py +2 -0
  258. qiskit/synthesis/__init__.py +25 -0
  259. qiskit/synthesis/arithmetic/__init__.py +16 -0
  260. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  261. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  262. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  263. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  264. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  265. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  266. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  267. qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
  268. qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
  269. qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
  270. qiskit/synthesis/evolution/__init__.py +1 -0
  271. qiskit/synthesis/evolution/lie_trotter.py +16 -42
  272. qiskit/synthesis/evolution/pauli_network.py +80 -0
  273. qiskit/synthesis/evolution/product_formula.py +165 -238
  274. qiskit/synthesis/evolution/qdrift.py +36 -29
  275. qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
  276. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  277. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  278. qiskit/synthesis/qft/qft_decompose_full.py +19 -1
  279. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
  280. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
  281. qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
  282. qiskit/synthesis/unitary/qsd.py +5 -5
  283. qiskit/transpiler/__init__.py +21 -14
  284. qiskit/transpiler/basepasses.py +1 -1
  285. qiskit/transpiler/passes/__init__.py +2 -0
  286. qiskit/transpiler/passes/basis/basis_translator.py +9 -565
  287. qiskit/transpiler/passes/basis/decompose.py +45 -12
  288. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  289. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  290. qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
  291. qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
  292. qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
  293. qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
  294. qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
  295. qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
  296. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  297. qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
  298. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  299. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  300. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  301. qiskit/transpiler/passes/optimization/consolidate_blocks.py +48 -131
  302. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
  303. qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
  304. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
  305. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  306. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  307. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  308. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  309. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  310. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  311. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  312. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  313. qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
  314. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  315. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  316. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  317. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  318. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
  319. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  320. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  321. qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
  322. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
  323. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  324. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
  325. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
  326. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
  327. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
  328. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +262 -99
  329. qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
  330. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  331. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
  332. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
  333. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
  334. qiskit/transpiler/passes/utils/gate_direction.py +12 -275
  335. qiskit/transpiler/passes/utils/gates_basis.py +7 -30
  336. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
  337. qiskit/transpiler/passmanager_config.py +22 -4
  338. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
  339. qiskit/transpiler/preset_passmanagers/common.py +5 -3
  340. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +125 -42
  341. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  342. qiskit/transpiler/target.py +74 -16
  343. qiskit/utils/deprecate_pulse.py +119 -0
  344. qiskit/visualization/circuit/_utils.py +2 -2
  345. qiskit/visualization/circuit/circuit_visualization.py +3 -2
  346. qiskit/visualization/circuit/matplotlib.py +1 -1
  347. qiskit/visualization/dag_visualization.py +1 -1
  348. qiskit/visualization/pass_manager_visualization.py +3 -14
  349. qiskit/visualization/pulse_v2/interface.py +3 -1
  350. qiskit/visualization/timeline/core.py +25 -2
  351. qiskit/visualization/timeline/interface.py +12 -0
  352. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/METADATA +9 -8
  353. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
  354. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
  355. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/entry_points.txt +19 -0
  356. qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
  357. qiskit/synthesis/two_qubit/weyl.py +0 -97
  358. qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
  359. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/LICENSE.txt +0 -0
  360. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/top_level.txt +0 -0
@@ -13,15 +13,123 @@
13
13
  """The real-amplitudes 2-local circuit."""
14
14
 
15
15
  from __future__ import annotations
16
- from collections.abc import Callable
16
+ from collections.abc import Callable, Iterable
17
17
 
18
18
  import numpy as np
19
19
 
20
20
  from qiskit.circuit import QuantumCircuit
21
21
  from qiskit.circuit.library.standard_gates import RYGate, CXGate
22
+ from qiskit.utils.deprecation import deprecate_func
23
+ from .n_local import n_local, BlockEntanglement
22
24
  from .two_local import TwoLocal
23
25
 
24
26
 
27
+ def real_amplitudes(
28
+ num_qubits: int,
29
+ entanglement: (
30
+ BlockEntanglement
31
+ | Iterable[BlockEntanglement]
32
+ | Callable[[int], BlockEntanglement | Iterable[BlockEntanglement]]
33
+ ) = "reverse_linear",
34
+ reps: int = 3,
35
+ skip_unentangled_qubits: bool = False,
36
+ skip_final_rotation_layer: bool = False,
37
+ parameter_prefix: str = "θ",
38
+ insert_barriers: bool = False,
39
+ name: str = "RealAmplitudes",
40
+ ) -> QuantumCircuit:
41
+ r"""Construct a real-amplitudes 2-local circuit.
42
+
43
+ This circuit is a heuristic trial wave function used, e.g., as ansatz in chemistry, optimization
44
+ or machine learning applications. The circuit consists of alternating layers of :math:`Y`
45
+ rotations and :math:`CX` entanglements. The entanglement pattern can be user-defined or selected
46
+ from a predefined set. This circuit is "real amplitudes" since the prepared quantum states will
47
+ only have real amplitudes.
48
+
49
+ For example a ``real_amplitudes`` circuit with 2 repetitions on 3 qubits with ``"reverse_linear"``
50
+ entanglement is
51
+
52
+ .. parsed-literal::
53
+
54
+ ┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
55
+ ┤ Ry(θ[0]) ├─░────────■───░─┤ Ry(θ[3]) ├─░────────■───░─┤ Ry(θ[6]) ├
56
+ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
57
+ ┤ Ry(θ[1]) ├─░───■──┤ X ├─░─┤ Ry(θ[4]) ├─░───■──┤ X ├─░─┤ Ry(θ[7]) ├
58
+ ├──────────┤ ░ ┌─┴─┐└───┘ ░ ├──────────┤ ░ ┌─┴─┐└───┘ ░ ├──────────┤
59
+ ┤ Ry(θ[2]) ├─░─┤ X ├──────░─┤ Ry(θ[5]) ├─░─┤ X ├──────░─┤ Ry(θ[8]) ├
60
+ └──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘
61
+
62
+ The entanglement can be set using the ``entanglement`` keyword as string or a list of
63
+ index-pairs. See the documentation of :func:`.n_local`. Additional options that can be set include
64
+ the number of repetitions, skipping rotation gates on qubits that are not entangled, leaving out
65
+ the final rotation layer and inserting barriers in between the rotation and entanglement
66
+ layers.
67
+
68
+ Examples:
69
+
70
+ .. plot::
71
+ :include-source:
72
+ :context:
73
+
74
+ from qiskit.circuit.library import real_amplitudes
75
+
76
+ ansatz = real_amplitudes(3, reps=2) # create the circuit on 3 qubits
77
+ ansatz.draw("mpl")
78
+
79
+ .. plot::
80
+ :include-source:
81
+ :context:
82
+
83
+ ansatz = real_amplitudes(3, entanglement="full", reps=2) # it is the same unitary as above
84
+ ansatz.draw("mpl")
85
+
86
+ .. plot::
87
+ :include-source:
88
+ :context:
89
+
90
+ ansatz = real_amplitudes(3, entanglement="linear", reps=2, insert_barriers=True)
91
+ ansatz.draw("mpl")
92
+
93
+ .. plot::
94
+ :include-source:
95
+ :context:
96
+
97
+ ansatz = real_amplitudes(4, reps=2, entanglement=[[0,3], [0,2]], skip_unentangled_qubits=True)
98
+ ansatz.draw("mpl")
99
+
100
+ Args:
101
+ num_qubits: The number of qubits of the RealAmplitudes circuit.
102
+ reps: Specifies how often the structure of a rotation layer followed by an entanglement
103
+ layer is repeated.
104
+ entanglement: The indices specifying on which qubits the input blocks act.
105
+ See :func:`.n_local` for detailed information.
106
+ skip_final_rotation_layer: Whether a final rotation layer is added to the circuit.
107
+ skip_unentangled_qubits: If ``True``, the rotation gates act only on qubits that
108
+ are entangled. If ``False``, the rotation gates act on all qubits.
109
+ parameter_prefix: The name of the free parameters.
110
+ insert_barriers: If True, barriers are inserted in between each layer. If False,
111
+ no barriers are inserted.
112
+ name: The name of the circuit.
113
+
114
+ Returns:
115
+ A real-amplitudes circuit.
116
+ """
117
+
118
+ return n_local(
119
+ num_qubits,
120
+ ["ry"],
121
+ ["cx"],
122
+ entanglement,
123
+ reps,
124
+ insert_barriers,
125
+ parameter_prefix,
126
+ True,
127
+ skip_final_rotation_layer,
128
+ skip_unentangled_qubits,
129
+ name,
130
+ )
131
+
132
+
25
133
  class RealAmplitudes(TwoLocal):
26
134
  r"""The real-amplitudes 2-local circuit.
27
135
 
@@ -35,7 +143,8 @@ class RealAmplitudes(TwoLocal):
35
143
  For example a ``RealAmplitudes`` circuit with 2 repetitions on 3 qubits with ``'reverse_linear'``
36
144
  entanglement is
37
145
 
38
- .. parsed-literal::
146
+ .. code-block:: text
147
+
39
148
  ┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
40
149
  ┤ Ry(θ[0]) ├─░────────■───░─┤ Ry(θ[3]) ├─░────────■───░─┤ Ry(θ[6]) ├
41
150
  ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
@@ -58,7 +167,7 @@ class RealAmplitudes(TwoLocal):
58
167
  Examples:
59
168
 
60
169
  >>> ansatz = RealAmplitudes(3, reps=2) # create the circuit on 3 qubits
61
- >>> print(ansatz)
170
+ >>> print(ansatz.decompose())
62
171
  ┌──────────┐ ┌──────────┐ ┌──────────┐
63
172
  q_0: ┤ Ry(θ[0]) ├──────────■──────┤ Ry(θ[3]) ├──────────■──────┤ Ry(θ[6]) ├
64
173
  ├──────────┤ ┌─┴─┐ ├──────────┤ ┌─┴─┐ ├──────────┤
@@ -67,7 +176,7 @@ class RealAmplitudes(TwoLocal):
67
176
  q_2: ┤ Ry(θ[2]) ├┤ X ├┤ Ry(θ[5]) ├────────────┤ X ├┤ Ry(θ[8]) ├────────────
68
177
  └──────────┘└───┘└──────────┘ └───┘└──────────┘
69
178
 
70
- >>> ansatz = RealAmplitudes(3, entanglement='full', reps=2) # it is the same unitary as above
179
+ >>> ansatz = RealAmplitudes(3, entanglement='full', reps=2, flatten=True)
71
180
  >>> print(ansatz)
72
181
  ┌──────────┐ ┌──────────┐ ┌──────────┐
73
182
  q_0: ┤ RY(θ[0]) ├──■────■──┤ RY(θ[3]) ├──────────────■────■──┤ RY(θ[6]) ├────────────
@@ -77,7 +186,8 @@ class RealAmplitudes(TwoLocal):
77
186
  q_2: ┤ RY(θ[2]) ├─────┤ X ├───┤ X ├────┤ RY(θ[5]) ├─────┤ X ├───┤ X ├────┤ RY(θ[8]) ├
78
187
  └──────────┘ └───┘ └───┘ └──────────┘ └───┘ └───┘ └──────────┘
79
188
 
80
- >>> ansatz = RealAmplitudes(3, entanglement='linear', reps=2, insert_barriers=True)
189
+ >>> ansatz = RealAmplitudes(3, entanglement='linear', reps=2, insert_barriers=True,
190
+ ... flatten=True)
81
191
  >>> qc = QuantumCircuit(3) # create a circuit and append the RY variational form
82
192
  >>> qc.compose(ansatz, inplace=True)
83
193
  >>> qc.draw()
@@ -89,7 +199,8 @@ class RealAmplitudes(TwoLocal):
89
199
  q_2: ┤ RY(θ[2]) ├─░──────┤ X ├─░─┤ RY(θ[5]) ├─░──────┤ X ├─░─┤ RY(θ[8]) ├
90
200
  └──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘
91
201
 
92
- >>> ansatz = RealAmplitudes(4, reps=1, entanglement='circular', insert_barriers=True)
202
+ >>> ansatz = RealAmplitudes(4, reps=1, entanglement='circular', insert_barriers=True,
203
+ ... flatten=True)
93
204
  >>> print(ansatz)
94
205
  ┌──────────┐ ░ ┌───┐ ░ ┌──────────┐
95
206
  q_0: ┤ RY(θ[0]) ├─░─┤ X ├──■─────────────░─┤ RY(θ[4]) ├
@@ -102,7 +213,7 @@ class RealAmplitudes(TwoLocal):
102
213
  └──────────┘ ░ └───┘ ░ └──────────┘
103
214
 
104
215
  >>> ansatz = RealAmplitudes(4, reps=2, entanglement=[[0,3], [0,2]],
105
- ... skip_unentangled_qubits=True)
216
+ ... skip_unentangled_qubits=True, flatten=True)
106
217
  >>> print(ansatz)
107
218
  ┌──────────┐ ┌──────────┐ ┌──────────┐
108
219
  q_0: ┤ RY(θ[0]) ├──■───────■──────┤ RY(θ[3]) ├──■───────■──────┤ RY(θ[6]) ├
@@ -114,8 +225,17 @@ class RealAmplitudes(TwoLocal):
114
225
  q_3: ┤ RY(θ[2]) ├┤ X ├┤ RY(θ[5]) ├────────────┤ X ├┤ RY(θ[8]) ├────────────
115
226
  └──────────┘└───┘└──────────┘ └───┘└──────────┘
116
227
 
228
+ .. seealso::
229
+
230
+ The :func:`.real_amplitudes` function constructs a functionally equivalent circuit, but faster.
231
+
117
232
  """
118
233
 
234
+ @deprecate_func(
235
+ since="1.3",
236
+ additional_msg="Use the function qiskit.circuit.library.real_amplitudes instead.",
237
+ pending=True,
238
+ )
119
239
  def __init__(
120
240
  self,
121
241
  num_qubits: int | None = None,
@@ -18,6 +18,7 @@ from collections.abc import Callable, Sequence
18
18
 
19
19
  from qiskit.circuit.quantumcircuit import QuantumCircuit
20
20
  from qiskit.circuit import Gate, Instruction
21
+ from qiskit.utils.deprecation import deprecate_func
21
22
 
22
23
  from .n_local import NLocal
23
24
  from ..standard_gates import get_standard_gate_name_mapping
@@ -76,7 +77,7 @@ class TwoLocal(NLocal):
76
77
  Examples:
77
78
 
78
79
  >>> two = TwoLocal(3, 'ry', 'cx', 'linear', reps=2, insert_barriers=True)
79
- >>> print(two) # decompose the layers into standard gates
80
+ >>> print(two.decompose()) # decompose the layers into standard gates
80
81
  ┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
81
82
  q_0: ┤ Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6]) ├
82
83
  ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
@@ -85,10 +86,10 @@ class TwoLocal(NLocal):
85
86
  q_2: ┤ Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8]) ├
86
87
  └──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘
87
88
 
88
- >>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True)
89
+ >>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True, flatten=True)
89
90
  >>> qc = QuantumCircuit(3)
90
91
  >>> qc &= two
91
- >>> print(qc.decompose().draw())
92
+ >>> print(qc.draw())
92
93
  ┌──────────┐┌──────────┐ ░ ░ ┌──────────┐ ┌──────────┐
93
94
  q_0: ┤ Ry(θ[0]) ├┤ Rz(θ[3]) ├─░──■──■─────░─┤ Ry(θ[6]) ├─┤ Rz(θ[9]) ├
94
95
  ├──────────┤├──────────┤ ░ │ │ ░ ├──────────┤┌┴──────────┤
@@ -98,7 +99,7 @@ class TwoLocal(NLocal):
98
99
  └──────────┘└──────────┘ ░ ░ └──────────┘└───────────┘
99
100
 
100
101
  >>> entangler_map = [[0, 1], [1, 2], [2, 0]] # circular entanglement for 3 qubits
101
- >>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1)
102
+ >>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1, flatten=True)
102
103
  >>> print(two) # note: no barriers inserted this time!
103
104
  ┌───┐ ┌──────────┐┌───┐
104
105
  q_0: |0>┤ X ├─────■───────────────────────┤ Rx(θ[2]) ├┤ X ├
@@ -109,9 +110,9 @@ class TwoLocal(NLocal):
109
110
  └───┘ └──────────┘ └───┘
110
111
 
111
112
  >>> entangler_map = [[0, 3], [0, 2]] # entangle the first and last two-way
112
- >>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1)
113
+ >>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1, flatten=True)
113
114
  >>> circuit = two.compose(two)
114
- >>> print(circuit.decompose().draw()) # note, that the parameters are the same!
115
+ >>> print(circuit.draw()) # note, that the parameters are the same!
115
116
  q_0: ─────■───────────■───────────■───────────■──────
116
117
  │ │ │ │
117
118
  q_1: ─────┼───────────┼───────────┼───────────┼──────
@@ -123,7 +124,8 @@ class TwoLocal(NLocal):
123
124
 
124
125
  >>> layer_1 = [(0, 1), (0, 2)]
125
126
  >>> layer_2 = [(1, 2)]
126
- >>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True)
127
+ >>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True,
128
+ ... flatten=True)
127
129
  >>> print(two)
128
130
  ┌───┐ ░ ░ ┌───┐ ░ ░ ┌───┐
129
131
  q_0: ┤ X ├─░───■────■───░─┤ X ├─░───────░─┤ X ├
@@ -135,6 +137,11 @@ class TwoLocal(NLocal):
135
137
 
136
138
  """
137
139
 
140
+ @deprecate_func(
141
+ since="1.3",
142
+ additional_msg="Use the function qiskit.circuit.library.n_local instead.",
143
+ pending=True,
144
+ )
138
145
  def __init__(
139
146
  self,
140
147
  num_qubits: int | None = None,
@@ -16,6 +16,7 @@ from qiskit.circuit import QuantumCircuit, Gate
16
16
  from qiskit.circuit.parametervector import ParameterVector
17
17
  from qiskit.circuit.exceptions import CircuitError
18
18
  from qiskit.circuit import Barrier
19
+ from qiskit.utils.deprecation import deprecate_func
19
20
 
20
21
 
21
22
  class UnitaryOverlap(QuantumCircuit):
@@ -41,13 +42,13 @@ class UnitaryOverlap(QuantumCircuit):
41
42
  from qiskit.circuit.library import EfficientSU2, UnitaryOverlap
42
43
  from qiskit.primitives import Sampler
43
44
 
44
- # get two circuit to prepare states of which we comput the overlap
45
+ # get two circuit to prepare states of which we compute the overlap
45
46
  circuit = EfficientSU2(2, reps=1)
46
47
  unitary1 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
47
48
  unitary2 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
48
49
 
49
50
  # create the overlap circuit
50
- overlap = UnitaryOverap(unitary1, unitary2)
51
+ overlap = UnitaryOverlap(unitary1, unitary2)
51
52
 
52
53
  # sample from the overlap
53
54
  sampler = Sampler(options={"shots": 100})
@@ -58,6 +59,11 @@ class UnitaryOverlap(QuantumCircuit):
58
59
 
59
60
  """
60
61
 
62
+ @deprecate_func(
63
+ since="1.3",
64
+ additional_msg="Use qiskit.circuit.library.unitary_overlap instead.",
65
+ pending=True,
66
+ )
61
67
  def __init__(
62
68
  self,
63
69
  unitary1: QuantumCircuit,
@@ -80,30 +86,9 @@ class UnitaryOverlap(QuantumCircuit):
80
86
  CircuitError: Number of qubits in ``unitary1`` and ``unitary2`` does not match.
81
87
  CircuitError: Inputs contain measurements and/or resets.
82
88
  """
83
- # check inputs are valid
84
- if unitary1.num_qubits != unitary2.num_qubits:
85
- raise CircuitError(
86
- f"Number of qubits in unitaries does "
87
- f"not match: {unitary1.num_qubits} != {unitary2.num_qubits}."
88
- )
89
-
90
- unitaries = [unitary1, unitary2]
91
- for unitary in unitaries:
92
- _check_unitary(unitary)
93
-
94
- # Vectors of new parameters, if any. Need the unitaries in a list here to ensure
95
- # we can overwrite them.
96
- for i, prefix in enumerate([prefix1, prefix2]):
97
- if unitaries[i].num_parameters > 0:
98
- new_params = ParameterVector(prefix, unitaries[i].num_parameters)
99
- unitaries[i] = unitaries[i].assign_parameters(new_params)
100
-
101
- # Generate the actual overlap circuit
102
- super().__init__(unitaries[0].num_qubits, name="UnitaryOverlap")
103
- self.compose(unitaries[0], inplace=True)
104
- if insert_barrier:
105
- self.barrier()
106
- self.compose(unitaries[1].inverse(), inplace=True)
89
+ circuit = unitary_overlap(unitary1, unitary2, prefix1, prefix2, insert_barrier)
90
+ super().__init__(*circuit.qregs, name=circuit.name)
91
+ self.compose(circuit, qubits=self.qubits, inplace=True)
107
92
 
108
93
 
109
94
  def _check_unitary(circuit):
@@ -115,3 +100,83 @@ def _check_unitary(circuit):
115
100
  "One or more instructions cannot be converted to"
116
101
  f' a gate. "{instruction.operation.name}" is not a gate instruction'
117
102
  )
103
+
104
+
105
+ def unitary_overlap(
106
+ unitary1: QuantumCircuit,
107
+ unitary2: QuantumCircuit,
108
+ prefix1: str = "p1",
109
+ prefix2: str = "p2",
110
+ insert_barrier: bool = False,
111
+ ) -> QuantumCircuit:
112
+ r"""Circuit that returns the overlap between two unitaries :math:`U_2^{\dag} U_1`.
113
+
114
+ The input quantum circuits must represent unitary operations, since they must be invertible.
115
+ If the inputs will have parameters, they are replaced by :class:`.ParameterVector`\s with
116
+ names `"p1"` (for circuit ``unitary1``) and `"p2"` (for circuit ``unitary_2``) in the output
117
+ circuit.
118
+
119
+ This circuit is usually employed in computing the fidelity:
120
+
121
+ .. math::
122
+
123
+ \left|\langle 0| U_2^{\dag} U_1|0\rangle\right|^{2}
124
+
125
+ by computing the probability of being in the all-zeros bit-string, or equivalently,
126
+ the expectation value of projector :math:`|0\rangle\langle 0|`.
127
+
128
+ **Reference Circuit:**
129
+
130
+ .. plot::
131
+ :include-source:
132
+
133
+ import numpy as np
134
+ from qiskit.circuit.library import EfficientSU2, unitary_overlap
135
+
136
+ # get two circuit to prepare states of which we compute the overlap
137
+ circuit = EfficientSU2(2, reps=1)
138
+ unitary1 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
139
+ unitary2 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
140
+
141
+ # create the overlap circuit
142
+ overlap = unitary_overlap(unitary1, unitary2)
143
+ overlap.draw('mpl')
144
+
145
+ Args:
146
+ unitary1: Unitary acting on the ket vector.
147
+ unitary2: Unitary whose inverse operates on the bra vector.
148
+ prefix1: The name of the parameter vector associated to ``unitary1``,
149
+ if it is parameterized. Defaults to ``"p1"``.
150
+ prefix2: The name of the parameter vector associated to ``unitary2``,
151
+ if it is parameterized. Defaults to ``"p2"``.
152
+ insert_barrier: Whether to insert a barrier between the two unitaries.
153
+
154
+ Raises:
155
+ CircuitError: Number of qubits in ``unitary1`` and ``unitary2`` does not match.
156
+ CircuitError: Inputs contain measurements and/or resets.
157
+ """
158
+ # check inputs are valid
159
+ if unitary1.num_qubits != unitary2.num_qubits:
160
+ raise CircuitError(
161
+ f"Number of qubits in unitaries does "
162
+ f"not match: {unitary1.num_qubits} != {unitary2.num_qubits}."
163
+ )
164
+
165
+ unitaries = [unitary1, unitary2]
166
+ for unitary in unitaries:
167
+ _check_unitary(unitary)
168
+
169
+ # Vectors of new parameters, if any. Need the unitaries in a list here to ensure
170
+ # we can overwrite them.
171
+ for i, prefix in enumerate([prefix1, prefix2]):
172
+ if unitaries[i].num_parameters > 0:
173
+ new_params = ParameterVector(prefix, unitaries[i].num_parameters)
174
+ unitaries[i] = unitaries[i].assign_parameters(new_params)
175
+
176
+ # Generate the actual overlap circuit
177
+ circuit = QuantumCircuit(unitaries[0].num_qubits, name="UnitaryOverlap")
178
+ circuit.compose(unitaries[0], inplace=True)
179
+ if insert_barrier:
180
+ circuit.barrier()
181
+ circuit.compose(unitaries[1].inverse(), inplace=True)
182
+ return circuit
@@ -14,10 +14,11 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import Union, Optional, TYPE_CHECKING
17
+ from typing import TYPE_CHECKING
18
18
  import numpy as np
19
19
 
20
20
  from qiskit.circuit.gate import Gate
21
+ from qiskit.circuit.quantumcircuit import ParameterValueType
21
22
  from qiskit.circuit.parameterexpression import ParameterExpression
22
23
  from qiskit.quantum_info import Pauli, SparsePauliOp
23
24
 
@@ -56,6 +57,7 @@ class PauliEvolutionGate(Gate):
56
57
 
57
58
  X = SparsePauliOp("X")
58
59
  Z = SparsePauliOp("Z")
60
+ I = SparsePauliOp("I")
59
61
 
60
62
  # build the evolution gate
61
63
  operator = (Z ^ Z) - 0.1 * (X ^ I)
@@ -84,10 +86,10 @@ class PauliEvolutionGate(Gate):
84
86
 
85
87
  def __init__(
86
88
  self,
87
- operator,
88
- time: Union[int, float, ParameterExpression] = 1.0,
89
- label: Optional[str] = None,
90
- synthesis: Optional[EvolutionSynthesis] = None,
89
+ operator: Pauli | SparsePauliOp | list[Pauli | SparsePauliOp],
90
+ time: ParameterValueType = 1.0,
91
+ label: str | None = None,
92
+ synthesis: EvolutionSynthesis | None = None,
91
93
  ) -> None:
92
94
  """
93
95
  Args:
@@ -108,21 +110,23 @@ class PauliEvolutionGate(Gate):
108
110
  else:
109
111
  operator = _to_sparse_pauli_op(operator)
110
112
 
111
- if synthesis is None:
112
- from qiskit.synthesis.evolution import LieTrotter
113
-
114
- synthesis = LieTrotter()
115
-
116
113
  if label is None:
117
114
  label = _get_default_label(operator)
118
115
 
119
116
  num_qubits = operator[0].num_qubits if isinstance(operator, list) else operator.num_qubits
120
117
  super().__init__(name="PauliEvolution", num_qubits=num_qubits, params=[time], label=label)
121
118
  self.operator = operator
119
+
120
+ if synthesis is None:
121
+ # pylint: disable=cyclic-import
122
+ from qiskit.synthesis.evolution import LieTrotter
123
+
124
+ synthesis = LieTrotter()
125
+
122
126
  self.synthesis = synthesis
123
127
 
124
128
  @property
125
- def time(self) -> Union[float, ParameterExpression]:
129
+ def time(self) -> ParameterValueType:
126
130
  """Return the evolution time as stored in the gate parameters.
127
131
 
128
132
  Returns:
@@ -131,7 +135,7 @@ class PauliEvolutionGate(Gate):
131
135
  return self.params[0]
132
136
 
133
137
  @time.setter
134
- def time(self, time: Union[float, ParameterExpression]) -> None:
138
+ def time(self, time: ParameterValueType) -> None:
135
139
  """Set the evolution time.
136
140
 
137
141
  Args:
@@ -143,9 +147,7 @@ class PauliEvolutionGate(Gate):
143
147
  """Unroll, where the default synthesis is matrix based."""
144
148
  self.definition = self.synthesis.synthesize(self)
145
149
 
146
- def validate_parameter(
147
- self, parameter: Union[int, float, ParameterExpression]
148
- ) -> Union[float, ParameterExpression]:
150
+ def validate_parameter(self, parameter: ParameterValueType) -> ParameterValueType:
149
151
  """Gate parameters should be int, float, or ParameterExpression"""
150
152
  if isinstance(parameter, int):
151
153
  parameter = float(parameter)
@@ -12,11 +12,11 @@
12
12
 
13
13
  """Phase estimation circuit."""
14
14
 
15
- from typing import Optional
15
+ from __future__ import annotations
16
16
 
17
17
  from qiskit.circuit import QuantumCircuit, QuantumRegister
18
-
19
- from .basis_change import QFT
18
+ from qiskit.utils.deprecation import deprecate_func
19
+ from qiskit.circuit.library import QFT
20
20
 
21
21
 
22
22
  class PhaseEstimation(QuantumCircuit):
@@ -49,11 +49,16 @@ class PhaseEstimation(QuantumCircuit):
49
49
 
50
50
  """
51
51
 
52
+ @deprecate_func(
53
+ since="1.3",
54
+ additional_msg="Use qiskit.circuit.library.phase_estimation instead.",
55
+ pending=True,
56
+ )
52
57
  def __init__(
53
58
  self,
54
59
  num_evaluation_qubits: int,
55
60
  unitary: QuantumCircuit,
56
- iqft: Optional[QuantumCircuit] = None,
61
+ iqft: QuantumCircuit | None = None,
57
62
  name: str = "QPE",
58
63
  ) -> None:
59
64
  """
@@ -97,3 +102,74 @@ class PhaseEstimation(QuantumCircuit):
97
102
 
98
103
  super().__init__(*circuit.qregs, name=circuit.name)
99
104
  self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
105
+
106
+
107
+ def phase_estimation(
108
+ num_evaluation_qubits: int,
109
+ unitary: QuantumCircuit,
110
+ name: str = "QPE",
111
+ ) -> QuantumCircuit:
112
+ r"""Phase Estimation circuit.
113
+
114
+ In the Quantum Phase Estimation (QPE) algorithm [1, 2, 3], the Phase Estimation circuit is used
115
+ to estimate the phase :math:`\phi` of an eigenvalue :math:`e^{2\pi i\phi}` of a unitary operator
116
+ :math:`U`, provided with the corresponding eigenstate :math:`|\psi\rangle`.
117
+ That is
118
+
119
+ .. math::
120
+
121
+ U|\psi\rangle = e^{2\pi i\phi} |\psi\rangle
122
+
123
+ This estimation (and thereby this circuit) is a central routine to several well-known
124
+ algorithms, such as Shor's algorithm or Quantum Amplitude Estimation.
125
+
126
+ Args:
127
+ num_evaluation_qubits: The number of evaluation qubits.
128
+ unitary: The unitary operation :math:`U` which will be repeated and controlled.
129
+ name: The name of the circuit.
130
+
131
+ **Reference Circuit:**
132
+
133
+ .. plot::
134
+ :include-source:
135
+
136
+ from qiskit.circuit import QuantumCircuit
137
+ from qiskit.circuit.library import phase_estimation
138
+ unitary = QuantumCircuit(2)
139
+ unitary.x(0)
140
+ unitary.y(1)
141
+ circuit = phase_estimation(3, unitary)
142
+ circuit.draw('mpl')
143
+
144
+ **References:**
145
+
146
+ [1]: Kitaev, A. Y. (1995). Quantum measurements and the Abelian Stabilizer Problem. 1–22.
147
+ `quant-ph/9511026 <http://arxiv.org/abs/quant-ph/9511026>`_
148
+
149
+ [2]: Michael A. Nielsen and Isaac L. Chuang. 2011.
150
+ Quantum Computation and Quantum Information: 10th Anniversary Edition (10th ed.).
151
+ Cambridge University Press, New York, NY, USA.
152
+
153
+ [3]: Qiskit
154
+ `textbook <https://github.com/Qiskit/textbook/blob/main/notebooks/ch-algorithms/
155
+ quantum-phase-estimation.ipynb>`_
156
+
157
+ """
158
+ # pylint: disable=cyclic-import
159
+ from qiskit.circuit.library import PermutationGate, QFTGate
160
+
161
+ qr_eval = QuantumRegister(num_evaluation_qubits, "eval")
162
+ qr_state = QuantumRegister(unitary.num_qubits, "q")
163
+ circuit = QuantumCircuit(qr_eval, qr_state, name=name)
164
+
165
+ circuit.h(qr_eval) # hadamards on evaluation qubits
166
+
167
+ for j in range(num_evaluation_qubits): # controlled powers
168
+ circuit.compose(unitary.power(2**j).control(), qubits=[j] + qr_state[:], inplace=True)
169
+
170
+ circuit.append(QFTGate(num_evaluation_qubits).inverse(), qr_eval[:])
171
+
172
+ reversal_pattern = list(reversed(range(num_evaluation_qubits)))
173
+ circuit.append(PermutationGate(reversal_pattern), qr_eval[:])
174
+
175
+ return circuit