qiskit 1.3.0__cp39-abi3-win32.whl → 1.3.0b1__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 (361) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +1 -20
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/assembler/assemble_schedules.py +0 -2
  5. qiskit/circuit/__init__.py +1 -44
  6. qiskit/circuit/_standard_gates_commutations.py +0 -585
  7. qiskit/circuit/barrier.py +0 -2
  8. qiskit/circuit/controlflow/builder.py +3 -3
  9. qiskit/circuit/controlflow/if_else.py +5 -13
  10. qiskit/circuit/controlflow/while_loop.py +2 -10
  11. qiskit/circuit/delay.py +3 -20
  12. qiskit/circuit/equivalence.py +214 -13
  13. qiskit/circuit/gate.py +1 -3
  14. qiskit/circuit/instruction.py +11 -32
  15. qiskit/circuit/instructionset.py +0 -2
  16. qiskit/circuit/library/__init__.py +14 -110
  17. qiskit/circuit/library/arithmetic/__init__.py +2 -9
  18. qiskit/circuit/library/arithmetic/adders/__init__.py +0 -1
  19. qiskit/circuit/library/arithmetic/adders/adder.py +2 -154
  20. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +56 -20
  21. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +1 -14
  22. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +91 -21
  23. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  24. qiskit/circuit/library/arithmetic/multipliers/__init__.py +0 -1
  25. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -8
  26. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +3 -94
  27. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +1 -8
  28. qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
  29. qiskit/circuit/library/basis_change/qft.py +38 -20
  30. qiskit/circuit/library/blueprintcircuit.py +0 -64
  31. qiskit/circuit/library/boolean_logic/__init__.py +4 -4
  32. qiskit/circuit/library/boolean_logic/inner_product.py +4 -81
  33. qiskit/circuit/library/boolean_logic/quantum_and.py +4 -107
  34. qiskit/circuit/library/boolean_logic/quantum_or.py +3 -107
  35. qiskit/circuit/library/boolean_logic/quantum_xor.py +3 -97
  36. qiskit/circuit/library/data_preparation/__init__.py +3 -6
  37. qiskit/circuit/library/data_preparation/pauli_feature_map.py +29 -342
  38. qiskit/circuit/library/data_preparation/{_z_feature_map.py → z_feature_map.py} +34 -45
  39. qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
  40. qiskit/circuit/library/fourier_checking.py +11 -72
  41. qiskit/circuit/library/generalized_gates/__init__.py +1 -1
  42. qiskit/circuit/library/generalized_gates/diagonal.py +51 -45
  43. qiskit/circuit/library/generalized_gates/gms.py +14 -67
  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 +6 -12
  47. qiskit/circuit/library/generalized_gates/mcmt.py +107 -167
  48. qiskit/circuit/library/generalized_gates/permutation.py +6 -8
  49. qiskit/circuit/library/generalized_gates/rv.py +9 -8
  50. qiskit/circuit/library/graph_state.py +10 -93
  51. qiskit/circuit/library/grover_operator.py +2 -270
  52. qiskit/circuit/library/hidden_linear_function.py +20 -83
  53. qiskit/circuit/library/iqp.py +20 -99
  54. qiskit/circuit/library/n_local/__init__.py +7 -19
  55. qiskit/circuit/library/n_local/efficient_su2.py +5 -118
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +0 -259
  57. qiskit/circuit/library/n_local/excitation_preserving.py +6 -130
  58. qiskit/circuit/library/n_local/n_local.py +5 -406
  59. qiskit/circuit/library/n_local/pauli_two_design.py +4 -106
  60. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -80
  61. qiskit/circuit/library/n_local/real_amplitudes.py +7 -127
  62. qiskit/circuit/library/n_local/two_local.py +7 -14
  63. qiskit/circuit/library/overlap.py +26 -91
  64. qiskit/circuit/library/pauli_evolution.py +15 -17
  65. qiskit/circuit/library/phase_estimation.py +4 -80
  66. qiskit/circuit/library/quantum_volume.py +20 -72
  67. qiskit/circuit/library/standard_gates/__init__.py +1 -20
  68. qiskit/circuit/library/standard_gates/dcx.py +1 -2
  69. qiskit/circuit/library/standard_gates/ecr.py +2 -2
  70. qiskit/circuit/library/standard_gates/h.py +3 -4
  71. qiskit/circuit/library/standard_gates/i.py +1 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +2 -2
  73. qiskit/circuit/library/standard_gates/p.py +12 -20
  74. qiskit/circuit/library/standard_gates/r.py +1 -1
  75. qiskit/circuit/library/standard_gates/rx.py +3 -4
  76. qiskit/circuit/library/standard_gates/rxx.py +2 -2
  77. qiskit/circuit/library/standard_gates/ry.py +3 -4
  78. qiskit/circuit/library/standard_gates/ryy.py +2 -2
  79. qiskit/circuit/library/standard_gates/rz.py +12 -13
  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 +3 -4
  85. qiskit/circuit/library/standard_gates/t.py +2 -2
  86. qiskit/circuit/library/standard_gates/u.py +3 -11
  87. qiskit/circuit/library/standard_gates/u1.py +15 -65
  88. qiskit/circuit/library/standard_gates/u2.py +1 -4
  89. qiskit/circuit/library/standard_gates/u3.py +3 -31
  90. qiskit/circuit/library/standard_gates/x.py +5 -7
  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 +3 -4
  94. qiskit/circuit/library/standard_gates/z.py +3 -3
  95. qiskit/circuit/library/templates/clifford/clifford_2_1.py +8 -9
  96. qiskit/circuit/library/templates/clifford/clifford_2_2.py +9 -10
  97. qiskit/circuit/library/templates/clifford/clifford_2_3.py +7 -9
  98. qiskit/circuit/library/templates/clifford/clifford_2_4.py +8 -9
  99. qiskit/circuit/library/templates/clifford/clifford_3_1.py +8 -9
  100. qiskit/circuit/library/templates/clifford/clifford_4_1.py +9 -10
  101. qiskit/circuit/library/templates/clifford/clifford_4_2.py +9 -10
  102. qiskit/circuit/library/templates/clifford/clifford_4_3.py +9 -10
  103. qiskit/circuit/library/templates/clifford/clifford_4_4.py +9 -10
  104. qiskit/circuit/library/templates/clifford/clifford_5_1.py +9 -10
  105. qiskit/circuit/library/templates/clifford/clifford_6_1.py +9 -10
  106. qiskit/circuit/library/templates/clifford/clifford_6_2.py +9 -10
  107. qiskit/circuit/library/templates/clifford/clifford_6_3.py +9 -10
  108. qiskit/circuit/library/templates/clifford/clifford_6_4.py +8 -9
  109. qiskit/circuit/library/templates/clifford/clifford_6_5.py +9 -10
  110. qiskit/circuit/library/templates/clifford/clifford_8_1.py +9 -10
  111. qiskit/circuit/library/templates/clifford/clifford_8_2.py +9 -10
  112. qiskit/circuit/library/templates/clifford/clifford_8_3.py +9 -10
  113. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +7 -9
  114. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +8 -10
  115. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +10 -12
  116. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +14 -16
  117. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +12 -14
  118. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +10 -12
  119. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +12 -14
  120. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +10 -12
  121. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +10 -12
  122. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +10 -12
  123. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +10 -12
  124. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +9 -11
  125. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +9 -11
  126. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +10 -12
  127. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +10 -12
  128. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +10 -12
  129. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +10 -12
  130. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +10 -12
  131. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +10 -12
  132. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +11 -13
  133. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +11 -13
  134. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +11 -13
  135. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +11 -13
  136. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +11 -13
  137. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +11 -13
  138. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +9 -11
  139. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +10 -12
  140. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +10 -12
  141. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +10 -12
  142. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +10 -12
  143. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +10 -12
  144. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +10 -12
  145. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +10 -12
  146. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +10 -12
  147. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +10 -12
  148. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +10 -12
  149. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +10 -12
  150. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +9 -11
  151. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +10 -12
  152. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +10 -12
  153. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +10 -12
  154. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +10 -12
  155. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +10 -12
  156. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +10 -12
  157. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +10 -12
  158. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +10 -12
  159. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +10 -12
  160. qiskit/circuit/library/templates/rzx/rzx_cy.py +10 -11
  161. qiskit/circuit/library/templates/rzx/rzx_xz.py +15 -16
  162. qiskit/circuit/library/templates/rzx/rzx_yz.py +10 -12
  163. qiskit/circuit/library/templates/rzx/rzx_zz1.py +20 -22
  164. qiskit/circuit/library/templates/rzx/rzx_zz2.py +15 -16
  165. qiskit/circuit/library/templates/rzx/rzx_zz3.py +15 -17
  166. qiskit/circuit/parameter.py +0 -4
  167. qiskit/circuit/parameterexpression.py +34 -167
  168. qiskit/circuit/quantumcircuit.py +126 -162
  169. qiskit/circuit/singleton.py +0 -2
  170. qiskit/circuit/store.py +0 -2
  171. qiskit/compiler/assembler.py +4 -17
  172. qiskit/compiler/scheduler.py +0 -2
  173. qiskit/compiler/sequencer.py +0 -2
  174. qiskit/compiler/transpiler.py +26 -81
  175. qiskit/converters/circuit_to_dag.py +2 -2
  176. qiskit/converters/circuit_to_dagdependency.py +1 -1
  177. qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
  178. qiskit/converters/circuit_to_instruction.py +1 -1
  179. qiskit/converters/dag_to_circuit.py +5 -7
  180. qiskit/converters/dag_to_dagdependency.py +1 -1
  181. qiskit/converters/dag_to_dagdependency_v2.py +1 -1
  182. qiskit/converters/dagdependency_to_circuit.py +1 -5
  183. qiskit/converters/dagdependency_to_dag.py +1 -6
  184. qiskit/dagcircuit/collect_blocks.py +3 -3
  185. qiskit/dagcircuit/dagdependency.py +5 -18
  186. qiskit/dagcircuit/dagdependency_v2.py +1 -1
  187. qiskit/dagcircuit/dagnode.py +2 -2
  188. qiskit/passmanager/__init__.py +2 -2
  189. qiskit/primitives/backend_estimator.py +2 -5
  190. qiskit/primitives/backend_sampler_v2.py +18 -61
  191. qiskit/primitives/base/base_estimator.py +2 -2
  192. qiskit/primitives/containers/data_bin.py +1 -9
  193. qiskit/primitives/statevector_sampler.py +1 -1
  194. qiskit/primitives/utils.py +1 -1
  195. qiskit/providers/__init__.py +3 -3
  196. qiskit/providers/backend.py +1 -12
  197. qiskit/providers/backend_compat.py +3 -23
  198. qiskit/providers/basic_provider/basic_simulator.py +2 -12
  199. qiskit/providers/fake_provider/fake_pulse_backend.py +1 -6
  200. qiskit/providers/fake_provider/generic_backend_v2.py +30 -46
  201. qiskit/providers/models/pulsedefaults.py +0 -2
  202. qiskit/pulse/builder.py +18 -59
  203. qiskit/pulse/calibration_entries.py +1 -4
  204. qiskit/pulse/channels.py +0 -2
  205. qiskit/pulse/exceptions.py +0 -2
  206. qiskit/pulse/instruction_schedule_map.py +6 -21
  207. qiskit/pulse/instructions/acquire.py +0 -2
  208. qiskit/pulse/instructions/delay.py +0 -2
  209. qiskit/pulse/instructions/directives.py +0 -8
  210. qiskit/pulse/instructions/frequency.py +0 -3
  211. qiskit/pulse/instructions/instruction.py +0 -2
  212. qiskit/pulse/instructions/phase.py +0 -3
  213. qiskit/pulse/instructions/play.py +0 -2
  214. qiskit/pulse/instructions/reference.py +0 -2
  215. qiskit/pulse/instructions/snapshot.py +0 -2
  216. qiskit/pulse/library/pulse.py +0 -2
  217. qiskit/pulse/library/symbolic_pulses.py +0 -28
  218. qiskit/pulse/library/waveform.py +0 -2
  219. qiskit/pulse/macros.py +1 -1
  220. qiskit/pulse/schedule.py +13 -12
  221. qiskit/pulse/transforms/alignments.py +3 -5
  222. qiskit/pulse/transforms/dag.py +0 -7
  223. qiskit/qasm2/export.py +3 -5
  224. qiskit/qasm2/parse.py +2 -46
  225. qiskit/qasm3/__init__.py +0 -1
  226. qiskit/qasm3/ast.py +15 -123
  227. qiskit/qasm3/exporter.py +77 -103
  228. qiskit/qobj/converters/pulse_instruction.py +4 -6
  229. qiskit/qpy/__init__.py +0 -181
  230. qiskit/qpy/binary_io/circuits.py +5 -20
  231. qiskit/qpy/binary_io/schedules.py +4 -3
  232. qiskit/qpy/binary_io/value.py +13 -310
  233. qiskit/qpy/common.py +2 -46
  234. qiskit/qpy/formats.py +0 -7
  235. qiskit/qpy/interface.py +4 -40
  236. qiskit/quantum_info/__init__.py +0 -4
  237. qiskit/quantum_info/operators/channel/transformations.py +21 -28
  238. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  239. qiskit/quantum_info/operators/operator.py +8 -54
  240. qiskit/quantum_info/operators/symplectic/base_pauli.py +19 -11
  241. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  242. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
  243. qiskit/quantum_info/operators/symplectic/pauli.py +0 -2
  244. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  245. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +2 -23
  246. qiskit/quantum_info/states/densitymatrix.py +5 -5
  247. qiskit/quantum_info/states/stabilizerstate.py +1 -1
  248. qiskit/quantum_info/states/statevector.py +6 -6
  249. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  250. qiskit/result/mitigation/correlated_readout_mitigator.py +1 -9
  251. qiskit/result/mitigation/local_readout_mitigator.py +1 -9
  252. qiskit/result/mitigation/utils.py +0 -57
  253. qiskit/scheduler/config.py +0 -2
  254. qiskit/scheduler/methods/basic.py +0 -3
  255. qiskit/scheduler/schedule_circuit.py +0 -2
  256. qiskit/scheduler/sequence.py +0 -2
  257. qiskit/synthesis/__init__.py +0 -25
  258. qiskit/synthesis/clifford/clifford_decompose_bm.py +2 -1
  259. qiskit/synthesis/clifford/clifford_decompose_greedy.py +2 -3
  260. qiskit/synthesis/clifford/clifford_decompose_layers.py +1 -2
  261. qiskit/synthesis/evolution/__init__.py +0 -1
  262. qiskit/synthesis/evolution/lie_trotter.py +42 -16
  263. qiskit/synthesis/evolution/product_formula.py +238 -165
  264. qiskit/synthesis/evolution/qdrift.py +29 -36
  265. qiskit/synthesis/evolution/suzuki_trotter.py +27 -87
  266. qiskit/synthesis/multi_controlled/__init__.py +0 -1
  267. qiskit/synthesis/qft/qft_decompose_full.py +1 -19
  268. qiskit/synthesis/qft/qft_decompose_lnn.py +1 -2
  269. qiskit/synthesis/stabilizer/stabilizer_decompose.py +1 -2
  270. qiskit/synthesis/two_qubit/two_qubit_decompose.py +63 -4
  271. qiskit/synthesis/two_qubit/weyl.py +97 -0
  272. qiskit/synthesis/unitary/qsd.py +5 -5
  273. qiskit/transpiler/__init__.py +14 -21
  274. qiskit/transpiler/basepasses.py +1 -1
  275. qiskit/transpiler/passes/__init__.py +0 -2
  276. qiskit/transpiler/passes/basis/basis_translator.py +565 -9
  277. qiskit/transpiler/passes/basis/decompose.py +12 -45
  278. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  279. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  280. qiskit/transpiler/passes/calibration/pulse_gate.py +2 -4
  281. qiskit/transpiler/passes/calibration/rx_builder.py +7 -11
  282. qiskit/transpiler/passes/calibration/rzx_builder.py +30 -46
  283. qiskit/transpiler/passes/layout/disjoint_utils.py +13 -15
  284. qiskit/transpiler/passes/layout/sabre_layout.py +2 -7
  285. qiskit/transpiler/passes/layout/sabre_pre_layout.py +0 -5
  286. qiskit/transpiler/passes/optimization/__init__.py +0 -1
  287. qiskit/transpiler/passes/optimization/collect_cliffords.py +3 -19
  288. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  289. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  290. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  291. qiskit/transpiler/passes/optimization/consolidate_blocks.py +131 -48
  292. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +2 -4
  293. qiskit/transpiler/passes/optimization/elide_permutations.py +32 -9
  294. qiskit/transpiler/passes/optimization/inverse_cancellation.py +0 -2
  295. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +11 -5
  296. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  297. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  298. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  299. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  300. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  301. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  302. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  303. qiskit/transpiler/passes/routing/sabre_swap.py +3 -7
  304. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  305. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  306. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  307. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  308. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -2
  309. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  310. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  311. qiskit/transpiler/passes/scheduling/base_scheduler.py +12 -14
  312. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +4 -9
  313. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  314. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +5 -16
  315. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +1 -4
  316. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +2 -6
  317. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -9
  318. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +99 -262
  319. qiskit/transpiler/passes/synthesis/hls_plugins.py +7 -638
  320. qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
  321. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  322. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -55
  323. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +56 -2
  324. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -5
  325. qiskit/transpiler/passes/utils/gate_direction.py +275 -12
  326. qiskit/transpiler/passes/utils/gates_basis.py +30 -7
  327. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +1 -2
  328. qiskit/transpiler/passmanager_config.py +4 -22
  329. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +14 -40
  330. qiskit/transpiler/preset_passmanagers/common.py +3 -5
  331. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +42 -125
  332. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  333. qiskit/transpiler/target.py +16 -74
  334. qiskit/visualization/circuit/_utils.py +2 -2
  335. qiskit/visualization/circuit/circuit_visualization.py +2 -3
  336. qiskit/visualization/circuit/matplotlib.py +1 -1
  337. qiskit/visualization/dag_visualization.py +1 -1
  338. qiskit/visualization/pass_manager_visualization.py +14 -3
  339. qiskit/visualization/pulse_v2/interface.py +1 -3
  340. qiskit/visualization/timeline/core.py +2 -25
  341. qiskit/visualization/timeline/interface.py +0 -12
  342. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/METADATA +19 -20
  343. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/RECORD +347 -358
  344. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/WHEEL +1 -1
  345. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/entry_points.txt +0 -19
  346. qiskit/circuit/library/data_preparation/_zz_feature_map.py +0 -150
  347. qiskit/circuit/twirling.py +0 -145
  348. qiskit/synthesis/arithmetic/__init__.py +0 -16
  349. qiskit/synthesis/arithmetic/adders/__init__.py +0 -17
  350. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +0 -154
  351. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +0 -103
  352. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +0 -161
  353. qiskit/synthesis/arithmetic/multipliers/__init__.py +0 -16
  354. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +0 -102
  355. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +0 -99
  356. qiskit/synthesis/evolution/pauli_network.py +0 -80
  357. qiskit/synthesis/multi_controlled/mcmt_vchain.py +0 -52
  358. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +0 -69
  359. qiskit/utils/deprecate_pulse.py +0 -119
  360. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/LICENSE.txt +0 -0
  361. {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/top_level.txt +0 -0
@@ -13,123 +13,15 @@
13
13
  """The real-amplitudes 2-local circuit."""
14
14
 
15
15
  from __future__ import annotations
16
- from collections.abc import Callable, Iterable
16
+ from collections.abc import Callable
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
24
22
  from .two_local import TwoLocal
25
23
 
26
24
 
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
-
133
25
  class RealAmplitudes(TwoLocal):
134
26
  r"""The real-amplitudes 2-local circuit.
135
27
 
@@ -143,8 +35,7 @@ class RealAmplitudes(TwoLocal):
143
35
  For example a ``RealAmplitudes`` circuit with 2 repetitions on 3 qubits with ``'reverse_linear'``
144
36
  entanglement is
145
37
 
146
- .. code-block:: text
147
-
38
+ .. parsed-literal::
148
39
  ┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
149
40
  ┤ Ry(θ[0]) ├─░────────■───░─┤ Ry(θ[3]) ├─░────────■───░─┤ Ry(θ[6]) ├
150
41
  ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
@@ -167,7 +58,7 @@ class RealAmplitudes(TwoLocal):
167
58
  Examples:
168
59
 
169
60
  >>> ansatz = RealAmplitudes(3, reps=2) # create the circuit on 3 qubits
170
- >>> print(ansatz.decompose())
61
+ >>> print(ansatz)
171
62
  ┌──────────┐ ┌──────────┐ ┌──────────┐
172
63
  q_0: ┤ Ry(θ[0]) ├──────────■──────┤ Ry(θ[3]) ├──────────■──────┤ Ry(θ[6]) ├
173
64
  ├──────────┤ ┌─┴─┐ ├──────────┤ ┌─┴─┐ ├──────────┤
@@ -176,7 +67,7 @@ class RealAmplitudes(TwoLocal):
176
67
  q_2: ┤ Ry(θ[2]) ├┤ X ├┤ Ry(θ[5]) ├────────────┤ X ├┤ Ry(θ[8]) ├────────────
177
68
  └──────────┘└───┘└──────────┘ └───┘└──────────┘
178
69
 
179
- >>> ansatz = RealAmplitudes(3, entanglement='full', reps=2, flatten=True)
70
+ >>> ansatz = RealAmplitudes(3, entanglement='full', reps=2) # it is the same unitary as above
180
71
  >>> print(ansatz)
181
72
  ┌──────────┐ ┌──────────┐ ┌──────────┐
182
73
  q_0: ┤ RY(θ[0]) ├──■────■──┤ RY(θ[3]) ├──────────────■────■──┤ RY(θ[6]) ├────────────
@@ -186,8 +77,7 @@ class RealAmplitudes(TwoLocal):
186
77
  q_2: ┤ RY(θ[2]) ├─────┤ X ├───┤ X ├────┤ RY(θ[5]) ├─────┤ X ├───┤ X ├────┤ RY(θ[8]) ├
187
78
  └──────────┘ └───┘ └───┘ └──────────┘ └───┘ └───┘ └──────────┘
188
79
 
189
- >>> ansatz = RealAmplitudes(3, entanglement='linear', reps=2, insert_barriers=True,
190
- ... flatten=True)
80
+ >>> ansatz = RealAmplitudes(3, entanglement='linear', reps=2, insert_barriers=True)
191
81
  >>> qc = QuantumCircuit(3) # create a circuit and append the RY variational form
192
82
  >>> qc.compose(ansatz, inplace=True)
193
83
  >>> qc.draw()
@@ -199,8 +89,7 @@ class RealAmplitudes(TwoLocal):
199
89
  q_2: ┤ RY(θ[2]) ├─░──────┤ X ├─░─┤ RY(θ[5]) ├─░──────┤ X ├─░─┤ RY(θ[8]) ├
200
90
  └──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘
201
91
 
202
- >>> ansatz = RealAmplitudes(4, reps=1, entanglement='circular', insert_barriers=True,
203
- ... flatten=True)
92
+ >>> ansatz = RealAmplitudes(4, reps=1, entanglement='circular', insert_barriers=True)
204
93
  >>> print(ansatz)
205
94
  ┌──────────┐ ░ ┌───┐ ░ ┌──────────┐
206
95
  q_0: ┤ RY(θ[0]) ├─░─┤ X ├──■─────────────░─┤ RY(θ[4]) ├
@@ -213,7 +102,7 @@ class RealAmplitudes(TwoLocal):
213
102
  └──────────┘ ░ └───┘ ░ └──────────┘
214
103
 
215
104
  >>> ansatz = RealAmplitudes(4, reps=2, entanglement=[[0,3], [0,2]],
216
- ... skip_unentangled_qubits=True, flatten=True)
105
+ ... skip_unentangled_qubits=True)
217
106
  >>> print(ansatz)
218
107
  ┌──────────┐ ┌──────────┐ ┌──────────┐
219
108
  q_0: ┤ RY(θ[0]) ├──■───────■──────┤ RY(θ[3]) ├──■───────■──────┤ RY(θ[6]) ├
@@ -225,17 +114,8 @@ class RealAmplitudes(TwoLocal):
225
114
  q_3: ┤ RY(θ[2]) ├┤ X ├┤ RY(θ[5]) ├────────────┤ X ├┤ RY(θ[8]) ├────────────
226
115
  └──────────┘└───┘└──────────┘ └───┘└──────────┘
227
116
 
228
- .. seealso::
229
-
230
- The :func:`.real_amplitudes` function constructs a functionally equivalent circuit, but faster.
231
-
232
117
  """
233
118
 
234
- @deprecate_func(
235
- since="1.3",
236
- additional_msg="Use the function qiskit.circuit.library.real_amplitudes instead.",
237
- pending=True,
238
- )
239
119
  def __init__(
240
120
  self,
241
121
  num_qubits: int | None = None,
@@ -18,7 +18,6 @@ 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
22
21
 
23
22
  from .n_local import NLocal
24
23
  from ..standard_gates import get_standard_gate_name_mapping
@@ -77,7 +76,7 @@ class TwoLocal(NLocal):
77
76
  Examples:
78
77
 
79
78
  >>> two = TwoLocal(3, 'ry', 'cx', 'linear', reps=2, insert_barriers=True)
80
- >>> print(two.decompose()) # decompose the layers into standard gates
79
+ >>> print(two) # decompose the layers into standard gates
81
80
  ┌──────────┐ ░ ░ ┌──────────┐ ░ ░ ┌──────────┐
82
81
  q_0: ┤ Ry(θ[0]) ├─░───■────────░─┤ Ry(θ[3]) ├─░───■────────░─┤ Ry(θ[6]) ├
83
82
  ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤ ░ ┌─┴─┐ ░ ├──────────┤
@@ -86,10 +85,10 @@ class TwoLocal(NLocal):
86
85
  q_2: ┤ Ry(θ[2]) ├─░──────┤ X ├─░─┤ Ry(θ[5]) ├─░──────┤ X ├─░─┤ Ry(θ[8]) ├
87
86
  └──────────┘ ░ └───┘ ░ └──────────┘ ░ └───┘ ░ └──────────┘
88
87
 
89
- >>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True, flatten=True)
88
+ >>> two = TwoLocal(3, ['ry','rz'], 'cz', 'full', reps=1, insert_barriers=True)
90
89
  >>> qc = QuantumCircuit(3)
91
90
  >>> qc &= two
92
- >>> print(qc.draw())
91
+ >>> print(qc.decompose().draw())
93
92
  ┌──────────┐┌──────────┐ ░ ░ ┌──────────┐ ┌──────────┐
94
93
  q_0: ┤ Ry(θ[0]) ├┤ Rz(θ[3]) ├─░──■──■─────░─┤ Ry(θ[6]) ├─┤ Rz(θ[9]) ├
95
94
  ├──────────┤├──────────┤ ░ │ │ ░ ├──────────┤┌┴──────────┤
@@ -99,7 +98,7 @@ class TwoLocal(NLocal):
99
98
  └──────────┘└──────────┘ ░ ░ └──────────┘└───────────┘
100
99
 
101
100
  >>> entangler_map = [[0, 1], [1, 2], [2, 0]] # circular entanglement for 3 qubits
102
- >>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1, flatten=True)
101
+ >>> two = TwoLocal(3, 'x', 'crx', entangler_map, reps=1)
103
102
  >>> print(two) # note: no barriers inserted this time!
104
103
  ┌───┐ ┌──────────┐┌───┐
105
104
  q_0: |0>┤ X ├─────■───────────────────────┤ Rx(θ[2]) ├┤ X ├
@@ -110,9 +109,9 @@ class TwoLocal(NLocal):
110
109
  └───┘ └──────────┘ └───┘
111
110
 
112
111
  >>> entangler_map = [[0, 3], [0, 2]] # entangle the first and last two-way
113
- >>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1, flatten=True)
112
+ >>> two = TwoLocal(4, [], 'cry', entangler_map, reps=1)
114
113
  >>> circuit = two.compose(two)
115
- >>> print(circuit.draw()) # note, that the parameters are the same!
114
+ >>> print(circuit.decompose().draw()) # note, that the parameters are the same!
116
115
  q_0: ─────■───────────■───────────■───────────■──────
117
116
  │ │ │ │
118
117
  q_1: ─────┼───────────┼───────────┼───────────┼──────
@@ -124,8 +123,7 @@ class TwoLocal(NLocal):
124
123
 
125
124
  >>> layer_1 = [(0, 1), (0, 2)]
126
125
  >>> layer_2 = [(1, 2)]
127
- >>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True,
128
- ... flatten=True)
126
+ >>> two = TwoLocal(3, 'x', 'cx', [layer_1, layer_2], reps=2, insert_barriers=True)
129
127
  >>> print(two)
130
128
  ┌───┐ ░ ░ ┌───┐ ░ ░ ┌───┐
131
129
  q_0: ┤ X ├─░───■────■───░─┤ X ├─░───────░─┤ X ├
@@ -137,11 +135,6 @@ class TwoLocal(NLocal):
137
135
 
138
136
  """
139
137
 
140
- @deprecate_func(
141
- since="1.3",
142
- additional_msg="Use the function qiskit.circuit.library.n_local instead.",
143
- pending=True,
144
- )
145
138
  def __init__(
146
139
  self,
147
140
  num_qubits: int | None = None,
@@ -16,7 +16,6 @@ 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
20
19
 
21
20
 
22
21
  class UnitaryOverlap(QuantumCircuit):
@@ -42,13 +41,13 @@ class UnitaryOverlap(QuantumCircuit):
42
41
  from qiskit.circuit.library import EfficientSU2, UnitaryOverlap
43
42
  from qiskit.primitives import Sampler
44
43
 
45
- # get two circuit to prepare states of which we compute the overlap
44
+ # get two circuit to prepare states of which we comput the overlap
46
45
  circuit = EfficientSU2(2, reps=1)
47
46
  unitary1 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
48
47
  unitary2 = circuit.assign_parameters(np.random.random(circuit.num_parameters))
49
48
 
50
49
  # create the overlap circuit
51
- overlap = UnitaryOverlap(unitary1, unitary2)
50
+ overlap = UnitaryOverap(unitary1, unitary2)
52
51
 
53
52
  # sample from the overlap
54
53
  sampler = Sampler(options={"shots": 100})
@@ -59,11 +58,6 @@ class UnitaryOverlap(QuantumCircuit):
59
58
 
60
59
  """
61
60
 
62
- @deprecate_func(
63
- since="1.3",
64
- additional_msg="Use qiskit.circuit.library.unitary_overlap instead.",
65
- pending=True,
66
- )
67
61
  def __init__(
68
62
  self,
69
63
  unitary1: QuantumCircuit,
@@ -86,9 +80,30 @@ class UnitaryOverlap(QuantumCircuit):
86
80
  CircuitError: Number of qubits in ``unitary1`` and ``unitary2`` does not match.
87
81
  CircuitError: Inputs contain measurements and/or resets.
88
82
  """
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)
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)
92
107
 
93
108
 
94
109
  def _check_unitary(circuit):
@@ -100,83 +115,3 @@ def _check_unitary(circuit):
100
115
  "One or more instructions cannot be converted to"
101
116
  f' a gate. "{instruction.operation.name}" is not a gate instruction'
102
117
  )
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,11 +14,10 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import TYPE_CHECKING
17
+ from typing import Union, Optional, 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
22
21
  from qiskit.circuit.parameterexpression import ParameterExpression
23
22
  from qiskit.quantum_info import Pauli, SparsePauliOp
24
23
 
@@ -57,7 +56,6 @@ class PauliEvolutionGate(Gate):
57
56
 
58
57
  X = SparsePauliOp("X")
59
58
  Z = SparsePauliOp("Z")
60
- I = SparsePauliOp("I")
61
59
 
62
60
  # build the evolution gate
63
61
  operator = (Z ^ Z) - 0.1 * (X ^ I)
@@ -86,10 +84,10 @@ class PauliEvolutionGate(Gate):
86
84
 
87
85
  def __init__(
88
86
  self,
89
- operator: Pauli | SparsePauliOp | list[Pauli | SparsePauliOp],
90
- time: ParameterValueType = 1.0,
91
- label: str | None = None,
92
- synthesis: EvolutionSynthesis | None = None,
87
+ operator,
88
+ time: Union[int, float, ParameterExpression] = 1.0,
89
+ label: Optional[str] = None,
90
+ synthesis: Optional[EvolutionSynthesis] = None,
93
91
  ) -> None:
94
92
  """
95
93
  Args:
@@ -110,23 +108,21 @@ class PauliEvolutionGate(Gate):
110
108
  else:
111
109
  operator = _to_sparse_pauli_op(operator)
112
110
 
111
+ if synthesis is None:
112
+ from qiskit.synthesis.evolution import LieTrotter
113
+
114
+ synthesis = LieTrotter()
115
+
113
116
  if label is None:
114
117
  label = _get_default_label(operator)
115
118
 
116
119
  num_qubits = operator[0].num_qubits if isinstance(operator, list) else operator.num_qubits
117
120
  super().__init__(name="PauliEvolution", num_qubits=num_qubits, params=[time], label=label)
118
121
  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
-
126
122
  self.synthesis = synthesis
127
123
 
128
124
  @property
129
- def time(self) -> ParameterValueType:
125
+ def time(self) -> Union[float, ParameterExpression]:
130
126
  """Return the evolution time as stored in the gate parameters.
131
127
 
132
128
  Returns:
@@ -135,7 +131,7 @@ class PauliEvolutionGate(Gate):
135
131
  return self.params[0]
136
132
 
137
133
  @time.setter
138
- def time(self, time: ParameterValueType) -> None:
134
+ def time(self, time: Union[float, ParameterExpression]) -> None:
139
135
  """Set the evolution time.
140
136
 
141
137
  Args:
@@ -147,7 +143,9 @@ class PauliEvolutionGate(Gate):
147
143
  """Unroll, where the default synthesis is matrix based."""
148
144
  self.definition = self.synthesis.synthesize(self)
149
145
 
150
- def validate_parameter(self, parameter: ParameterValueType) -> ParameterValueType:
146
+ def validate_parameter(
147
+ self, parameter: Union[int, float, ParameterExpression]
148
+ ) -> Union[float, ParameterExpression]:
151
149
  """Gate parameters should be int, float, or ParameterExpression"""
152
150
  if isinstance(parameter, int):
153
151
  parameter = float(parameter)
@@ -12,11 +12,11 @@
12
12
 
13
13
  """Phase estimation circuit."""
14
14
 
15
- from __future__ import annotations
15
+ from typing import Optional
16
16
 
17
17
  from qiskit.circuit import QuantumCircuit, QuantumRegister
18
- from qiskit.utils.deprecation import deprecate_func
19
- from qiskit.circuit.library import QFT
18
+
19
+ from .basis_change import QFT
20
20
 
21
21
 
22
22
  class PhaseEstimation(QuantumCircuit):
@@ -49,16 +49,11 @@ 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
- )
57
52
  def __init__(
58
53
  self,
59
54
  num_evaluation_qubits: int,
60
55
  unitary: QuantumCircuit,
61
- iqft: QuantumCircuit | None = None,
56
+ iqft: Optional[QuantumCircuit] = None,
62
57
  name: str = "QPE",
63
58
  ) -> None:
64
59
  """
@@ -102,74 +97,3 @@ class PhaseEstimation(QuantumCircuit):
102
97
 
103
98
  super().__init__(*circuit.qregs, name=circuit.name)
104
99
  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