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
@@ -14,121 +14,18 @@
14
14
 
15
15
  from __future__ import annotations
16
16
  import typing
17
- from collections.abc import Callable, Iterable
17
+ from collections.abc import Callable
18
18
 
19
19
  from numpy import pi
20
20
 
21
- from qiskit.circuit import QuantumCircuit, Gate
21
+ from qiskit.circuit import QuantumCircuit
22
22
  from qiskit.circuit.library.standard_gates import RYGate, RZGate, CXGate
23
- from qiskit.utils.deprecation import deprecate_func
24
- from .n_local import n_local, BlockEntanglement
25
23
  from .two_local import TwoLocal
26
24
 
27
25
  if typing.TYPE_CHECKING:
28
26
  import qiskit # pylint: disable=cyclic-import
29
27
 
30
28
 
31
- def efficient_su2(
32
- num_qubits: int,
33
- su2_gates: str | Gate | Iterable[str | Gate] | None = None,
34
- entanglement: (
35
- BlockEntanglement
36
- | Iterable[BlockEntanglement]
37
- | Callable[[int], BlockEntanglement | Iterable[BlockEntanglement]]
38
- ) = "reverse_linear",
39
- reps: int = 3,
40
- skip_unentangled_qubits: bool = False,
41
- skip_final_rotation_layer: bool = False,
42
- parameter_prefix: str = "θ",
43
- insert_barriers: bool = False,
44
- name: str = "EfficientSU2",
45
- ):
46
- r"""The hardware-efficient :math:`SU(2)` 2-local circuit.
47
-
48
- The ``efficient_su2`` circuit consists of layers of single qubit operations spanned by
49
- :math:`SU(2)` and CX entanglements. This is a heuristic pattern that can be used to prepare trial
50
- wave functions for variational quantum algorithms or classification circuit for machine learning.
51
-
52
- :math:`SU(2)` is the special unitary group of degree 2, its elements are :math:`2 \times 2`
53
- unitary matrices with determinant 1, such as the Pauli rotation gates.
54
-
55
- On 3 qubits and using the Pauli :math:`Y` and :math:`Z` rotations as single qubit gates, the
56
- this circuit is represented by:
57
-
58
- .. parsed-literal::
59
-
60
- ┌──────────┐┌──────────┐ ░ ░ ░ ┌───────────┐┌───────────┐
61
- ┤ RY(θ[0]) ├┤ RZ(θ[3]) ├─░────────■───░─ ... ─░─┤ RY(θ[12]) ├┤ RZ(θ[15]) ├
62
- ├──────────┤├──────────┤ ░ ┌─┴─┐ ░ ░ ├───────────┤├───────────┤
63
- ┤ RY(θ[1]) ├┤ RZ(θ[4]) ├─░───■──┤ X ├─░─ ... ─░─┤ RY(θ[13]) ├┤ RZ(θ[16]) ├
64
- ├──────────┤├──────────┤ ░ ┌─┴─┐└───┘ ░ ░ ├───────────┤├───────────┤
65
- ┤ RY(θ[2]) ├┤ RZ(θ[5]) ├─░─┤ X ├──────░─ ... ─░─┤ RY(θ[14]) ├┤ RZ(θ[17]) ├
66
- └──────────┘└──────────┘ ░ └───┘ ░ ░ └───────────┘└───────────┘
67
-
68
- Examples:
69
-
70
- Per default, the ``"reverse_linear"`` entanglement is used, which, in the case of
71
- CX gates, is equivalent to an all-to-all entanglement:
72
-
73
- .. plot::
74
- :include-source:
75
- :context:
76
-
77
- from qiskit.circuit.library import efficient_su2
78
-
79
- circuit = efficient_su2(3, reps=1)
80
- circuit.draw("mpl")
81
-
82
- To specify which SU(2) gates should be used in the rotation layer, we can set the
83
- ``su2_gates`` argument. In addition, we can change the entanglement structure.
84
- For example:
85
-
86
- .. plot::
87
- :include-source:
88
- :context:
89
-
90
- circuit = efficient_su2(4, su2_gates=["rx", "y"], entanglement="circular", reps=1)
91
- circuit.draw("mpl")
92
-
93
- Args:
94
- num_qubits: The number of qubits.
95
- su2_gates: The :math:`SU(2)` single qubit gates to apply in single qubit gate layers.
96
- If only one gate is provided, the same gate is applied to each qubit.
97
- If a list of gates is provided, all gates are applied to each qubit in the provided
98
- order.
99
- reps: Specifies how often the structure of a rotation layer followed by an entanglement
100
- layer is repeated.
101
- entanglement: The indices specifying on which qubits the input blocks act.
102
- See :func:`.n_local` for detailed information.
103
- skip_final_rotation_layer: Whether a final rotation layer is added to the circuit.
104
- skip_unentangled_qubits: If ``True``, the rotation gates act only on qubits that
105
- are entangled. If ``False``, the rotation gates act on all qubits.
106
- parameter_prefix: The name of the free parameters.
107
- insert_barriers: If True, barriers are inserted in between each layer. If False,
108
- no barriers are inserted.
109
- name: The name of the circuit.
110
-
111
- Returns:
112
- An efficient-SU(2) circuit.
113
- """
114
- if su2_gates is None:
115
- su2_gates = ["ry", "rz"]
116
-
117
- return n_local(
118
- num_qubits,
119
- su2_gates,
120
- ["cx"],
121
- entanglement,
122
- reps,
123
- insert_barriers,
124
- parameter_prefix,
125
- True,
126
- skip_final_rotation_layer,
127
- skip_unentangled_qubits,
128
- name,
129
- )
130
-
131
-
132
29
  class EfficientSU2(TwoLocal):
133
30
  r"""The hardware efficient SU(2) 2-local circuit.
134
31
 
@@ -142,7 +39,7 @@ class EfficientSU2(TwoLocal):
142
39
  On 3 qubits and using the Pauli :math:`Y` and :math:`Z` su2_gates as single qubit gates, the
143
40
  hardware efficient SU(2) circuit is represented by:
144
41
 
145
- .. code-block:: text
42
+ .. parsed-literal::
146
43
 
147
44
  ┌──────────┐┌──────────┐ ░ ░ ░ ┌───────────┐┌───────────┐
148
45
  ┤ RY(θ[0]) ├┤ RZ(θ[3]) ├─░────────■───░─ ... ─░─┤ RY(θ[12]) ├┤ RZ(θ[15]) ├
@@ -158,7 +55,7 @@ class EfficientSU2(TwoLocal):
158
55
  Examples:
159
56
 
160
57
  >>> circuit = EfficientSU2(3, reps=1)
161
- >>> print(circuit.decompose())
58
+ >>> print(circuit)
162
59
  ┌──────────┐┌──────────┐ ┌──────────┐┌──────────┐
163
60
  q_0: ┤ RY(θ[0]) ├┤ RZ(θ[3]) ├──■────■──┤ RY(θ[6]) ├┤ RZ(θ[9]) ├─────────────
164
61
  ├──────────┤├──────────┤┌─┴─┐ │ └──────────┘├──────────┤┌───────────┐
@@ -167,8 +64,7 @@ class EfficientSU2(TwoLocal):
167
64
  q_2: ┤ RY(θ[2]) ├┤ RZ(θ[5]) ├─────┤ X ├───┤ X ├────┤ RY(θ[8]) ├┤ RZ(θ[11]) ├
168
65
  └──────────┘└──────────┘ └───┘ └───┘ └──────────┘└───────────┘
169
66
 
170
- >>> ansatz = EfficientSU2(4, su2_gates=['rx', 'y'], entanglement='circular', reps=1,
171
- ... flatten=True)
67
+ >>> ansatz = EfficientSU2(4, su2_gates=['rx', 'y'], entanglement='circular', reps=1)
172
68
  >>> qc = QuantumCircuit(4) # create a circuit and append the RY variational form
173
69
  >>> qc.compose(ansatz, inplace=True)
174
70
  >>> qc.draw()
@@ -182,17 +78,8 @@ class EfficientSU2(TwoLocal):
182
78
  q_3: ┤ RX(θ[3]) ├┤ Y ├──■──────────────────────┤ X ├────┤ RX(θ[7]) ├┤ Y ├
183
79
  └──────────┘└───┘ └───┘ └──────────┘└───┘
184
80
 
185
- .. seealso::
186
-
187
- The :func:`.efficient_su2` function constructs a functionally equivalent circuit, but faster.
188
-
189
81
  """
190
82
 
191
- @deprecate_func(
192
- since="1.3",
193
- additional_msg="Use the function qiskit.circuit.library.efficient_su2 instead.",
194
- pending=True,
195
- )
196
83
  def __init__(
197
84
  self,
198
85
  num_qubits: int | None = None,
@@ -15,263 +15,16 @@
15
15
  from __future__ import annotations
16
16
  from collections.abc import Sequence
17
17
 
18
- import typing
19
- import warnings
20
- import itertools
21
18
  import numpy as np
22
19
 
23
20
  from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
24
21
  from qiskit.circuit.parameter import Parameter
25
- from qiskit.circuit.parametervector import ParameterVector
26
22
  from qiskit.circuit.quantumregister import QuantumRegister
27
23
  from qiskit.circuit.quantumcircuit import QuantumCircuit
28
24
  from qiskit.quantum_info import Operator, Pauli, SparsePauliOp
29
- from qiskit.quantum_info.operators.base_operator import BaseOperator
30
-
31
- from qiskit._accelerate.circuit_library import pauli_evolution
32
25
 
33
26
  from .n_local import NLocal
34
27
 
35
- if typing.TYPE_CHECKING:
36
- from qiskit.synthesis.evolution import EvolutionSynthesis
37
-
38
-
39
- def evolved_operator_ansatz(
40
- operators: BaseOperator | Sequence[BaseOperator],
41
- reps: int = 1,
42
- evolution: EvolutionSynthesis | None = None,
43
- insert_barriers: bool = False,
44
- name: str = "EvolvedOps",
45
- parameter_prefix: str | Sequence[str] = "t",
46
- remove_identities: bool = True,
47
- flatten: bool | None = None,
48
- ) -> QuantumCircuit:
49
- r"""Construct an ansatz out of operator evolutions.
50
-
51
- For a set of operators :math:`[O_1, ..., O_J]` and :math:`R` repetitions (``reps``), this circuit
52
- is defined as
53
-
54
- .. math::
55
-
56
- \prod_{r=1}^{R} \left( \prod_{j=J}^1 e^{-i\theta_{j, r} O_j} \right)
57
-
58
- where the exponentials :math:`exp(-i\theta O_j)` are expanded using the product formula
59
- specified by ``evolution``.
60
-
61
- Examples:
62
-
63
- .. plot::
64
- :include-source:
65
-
66
- from qiskit.circuit.library import evolved_operator_ansatz
67
- from qiskit.quantum_info import Pauli
68
-
69
- ops = [Pauli("ZZI"), Pauli("IZZ"), Pauli("IXI")]
70
- ansatz = evolved_operator_ansatz(ops, reps=3, insert_barriers=True)
71
- ansatz.draw("mpl")
72
-
73
- Args:
74
- operators: The operators to evolve. Can be a single operator or a sequence thereof.
75
- reps: The number of times to repeat the evolved operators.
76
- evolution: A specification of which evolution synthesis to use for the
77
- :class:`.PauliEvolutionGate`. Defaults to first order Trotterization. Note, that
78
- operators of type :class:`.Operator` are evolved using the :class:`.HamiltonianGate`,
79
- as there are no Hamiltonian terms to expand in Trotterization.
80
- insert_barriers: Whether to insert barriers in between each evolution.
81
- name: The name of the circuit.
82
- parameter_prefix: Set the names of the circuit parameters. If a string, the same prefix
83
- will be used for each parameters. Can also be a list to specify a prefix per
84
- operator.
85
- remove_identities: If ``True``, ignore identity operators (note that we do not check
86
- :class:`.Operator` inputs). This will also remove parameters associated with identities.
87
- flatten: If ``True``, a flat circuit is returned instead of nesting it inside multiple
88
- layers of gate objects. Setting this to ``False`` is significantly less performant,
89
- especially for parameter binding, but can be desirable for a cleaner visualization.
90
- """
91
- if reps < 0:
92
- raise ValueError("reps must be a non-negative integer.")
93
-
94
- if isinstance(operators, BaseOperator):
95
- operators = [operators]
96
- elif len(operators) == 0:
97
- return QuantumCircuit()
98
-
99
- num_operators = len(operators)
100
- if not isinstance(parameter_prefix, str):
101
- if num_operators != len(parameter_prefix):
102
- raise ValueError(
103
- f"Mismatching number of operators ({len(operators)}) and parameter_prefix "
104
- f"({len(parameter_prefix)})."
105
- )
106
-
107
- num_qubits = operators[0].num_qubits
108
- if remove_identities:
109
- operators, parameter_prefix = _remove_identities(operators, parameter_prefix)
110
-
111
- if any(op.num_qubits != num_qubits for op in operators):
112
- raise ValueError("Inconsistent numbers of qubits in the operators.")
113
-
114
- # get the total number of parameters
115
- if isinstance(parameter_prefix, str):
116
- parameters = ParameterVector(parameter_prefix, reps * num_operators)
117
- param_iter = iter(parameters)
118
- else:
119
- # this creates the parameter vectors per operator, e.g.
120
- # [[a0, a1, a2, ...], [b0, b1, b2, ...], [c0, c1, c2, ...]]
121
- # and turns them into an iterator
122
- # a0 -> b0 -> c0 -> a1 -> b1 -> c1 -> a2 -> ...
123
- per_operator = [ParameterVector(prefix, reps).params for prefix in parameter_prefix]
124
- param_iter = itertools.chain.from_iterable(zip(*per_operator))
125
-
126
- # fast, Rust-path
127
- if (
128
- flatten is not False # captures None and True
129
- and evolution is None
130
- and all(isinstance(op, SparsePauliOp) for op in operators)
131
- ):
132
- sparse_labels = [op.to_sparse_list() for op in operators]
133
- expanded_paulis = []
134
- for _ in range(reps):
135
- for term in sparse_labels:
136
- param = next(param_iter)
137
- expanded_paulis += [
138
- (pauli, indices, 2 * coeff * param) for pauli, indices, coeff in term
139
- ]
140
-
141
- data = pauli_evolution(num_qubits, expanded_paulis, insert_barriers, False)
142
- circuit = QuantumCircuit._from_circuit_data(data, add_regs=True)
143
- circuit.name = name
144
-
145
- return circuit
146
-
147
- # slower, Python-path
148
- if evolution is None:
149
- from qiskit.synthesis.evolution import LieTrotter
150
-
151
- evolution = LieTrotter(insert_barriers=insert_barriers)
152
-
153
- circuit = QuantumCircuit(num_qubits, name=name)
154
-
155
- # pylint: disable=cyclic-import
156
- from qiskit.circuit.library.hamiltonian_gate import HamiltonianGate
157
-
158
- for rep in range(reps):
159
- for i, op in enumerate(operators):
160
- if isinstance(op, Operator):
161
- gate = HamiltonianGate(op, next(param_iter))
162
- if flatten:
163
- warnings.warn(
164
- "Cannot flatten the evolution of an Operator, flatten is set to "
165
- "False for this operator."
166
- )
167
- flatten_operator = False
168
-
169
- elif isinstance(op, BaseOperator):
170
- gate = PauliEvolutionGate(op, next(param_iter), synthesis=evolution)
171
- flatten_operator = flatten is True or flatten is None
172
- else:
173
- raise ValueError(f"Unsupported operator type: {type(op)}")
174
-
175
- if flatten_operator:
176
- circuit.compose(gate.definition, inplace=True)
177
- else:
178
- circuit.append(gate, circuit.qubits)
179
-
180
- if insert_barriers and (rep < reps - 1 or i < num_operators - 1):
181
- circuit.barrier()
182
-
183
- return circuit
184
-
185
-
186
- def hamiltonian_variational_ansatz(
187
- hamiltonian: SparsePauliOp | Sequence[SparsePauliOp],
188
- reps: int = 1,
189
- insert_barriers: bool = False,
190
- name: str = "HVA",
191
- parameter_prefix: str = "t",
192
- ) -> QuantumCircuit:
193
- r"""Construct a Hamiltonian variational ansatz.
194
-
195
- For a Hamiltonian :math:`H = \sum_{k=1}^K H_k` where the terms :math:`H_k` consist of only
196
- commuting Paulis, but the terms do not commute among each other :math:`[H_k, H_{k'}] \neq 0`, the
197
- Hamiltonian variational ansatz (HVA) is
198
-
199
- .. math::
200
-
201
- \prod_{r=1}^{R} \left( \prod_{k=K}^1 e^{-i\theta_{k, r} H_k} \right)
202
-
203
- where the exponentials :math:`exp(-i\theta H_k)` are implemented exactly [1, 2]. Note that this
204
- differs from :func:`.evolved_operator_ansatz`, where no assumptions on the structure of the
205
- operators are done.
206
-
207
- The Hamiltonian can be passed as :class:`.SparsePauliOp`, in which case we split the Hamiltonian
208
- into commuting terms :math:`\{H_k\}_k`. Note, that this may not be optimal and if the
209
- minimal set of commuting terms is known it can be passed as sequence into this function.
210
-
211
- Examples:
212
-
213
- A single operator will be split into commuting terms automatically:
214
-
215
- .. plot::
216
- :include-source:
217
-
218
- from qiskit.quantum_info import SparsePauliOp
219
- from qiskit.circuit.library import hamiltonian_variational_ansatz
220
-
221
- # this Hamiltonian will be split into the two terms [ZZI, IZZ] and [IXI]
222
- hamiltonian = SparsePauliOp(["ZZI", "IZZ", "IXI"])
223
- ansatz = hamiltonian_variational_ansatz(hamiltonian, reps=2)
224
- ansatz.draw("mpl")
225
-
226
- Alternatively, we can directly provide the terms:
227
-
228
- .. plot::
229
- :include-source:
230
-
231
- from qiskit.quantum_info import SparsePauliOp
232
- from qiskit.circuit.library import hamiltonian_variational_ansatz
233
-
234
- zz = SparsePauliOp(["ZZI", "IZZ"])
235
- x = SparsePauliOp(["IXI"])
236
- ansatz = hamiltonian_variational_ansatz([zz, x], reps=2)
237
- ansatz.draw("mpl")
238
-
239
-
240
- Args:
241
- hamiltonian: The Hamiltonian to evolve. If given as single operator, it will be split into
242
- commuting terms. If a sequence of :class:`.SparsePauliOp`, then it is assumed that
243
- each element consists of commuting terms, but the elements do not commute among each
244
- other.
245
- reps: The number of times to repeat the evolved operators.
246
- insert_barriers: Whether to insert barriers in between each evolution.
247
- name: The name of the circuit.
248
- parameter_prefix: Set the names of the circuit parameters. If a string, the same prefix
249
- will be used for each parameters. Can also be a list to specify a prefix per
250
- operator.
251
-
252
- References:
253
-
254
- [1] D. Wecker et al. Progress towards practical quantum variational algorithms (2015)
255
- `Phys Rev A 92, 042303 <https://journals.aps.org/pra/abstract/10.1103/PhysRevA.92.042303>`__
256
- [2] R. Wiersema et al. Exploring entanglement and optimization within the Hamiltonian
257
- Variational Ansatz (2020) `arXiv:2008.02941 <https://arxiv.org/abs/2008.02941>`__
258
-
259
- """
260
- # If a single operator is given, check if it is a sum of operators (a SparsePauliOp),
261
- # and split it into commuting terms. Otherwise treat it as single operator.
262
- if isinstance(hamiltonian, SparsePauliOp):
263
- hamiltonian = hamiltonian.group_commuting()
264
-
265
- return evolved_operator_ansatz(
266
- hamiltonian,
267
- reps=reps,
268
- evolution=None,
269
- insert_barriers=insert_barriers,
270
- name=name,
271
- parameter_prefix=parameter_prefix,
272
- flatten=True,
273
- )
274
-
275
28
 
276
29
  class EvolvedOperatorAnsatz(NLocal):
277
30
  """The evolved operator ansatz."""
@@ -501,15 +254,3 @@ def _is_pauli_identity(operator):
501
254
  if isinstance(operator, Pauli):
502
255
  return not np.any(np.logical_or(operator.x, operator.z))
503
256
  return False
504
-
505
-
506
- def _remove_identities(operators, prefixes):
507
- identity_ops = {index for index, op in enumerate(operators) if _is_pauli_identity(op)}
508
-
509
- if len(identity_ops) == 0:
510
- return operators, prefixes
511
-
512
- cleaned_ops = [op for i, op in enumerate(operators) if i not in identity_ops]
513
- cleaned_prefix = [prefix for i, prefix in enumerate(prefixes) if i not in identity_ops]
514
-
515
- return cleaned_ops, cleaned_prefix
@@ -13,127 +13,14 @@
13
13
  """The ExcitationPreserving 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
  from numpy import pi
18
18
 
19
19
  from qiskit.circuit import QuantumCircuit, Parameter
20
20
  from qiskit.circuit.library.standard_gates import RZGate
21
- from qiskit.utils.deprecation import deprecate_func
22
- from .n_local import n_local, BlockEntanglement
23
21
  from .two_local import TwoLocal
24
22
 
25
23
 
26
- def excitation_preserving(
27
- num_qubits: int,
28
- mode: str = "iswap",
29
- entanglement: (
30
- BlockEntanglement
31
- | Iterable[BlockEntanglement]
32
- | Callable[[int], BlockEntanglement | Iterable[BlockEntanglement]]
33
- ) = "full",
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 = "ExcitationPreserving",
40
- ):
41
- r"""The heuristic excitation-preserving wave function ansatz.
42
-
43
- The ``excitation_preserving`` circuit preserves the ratio of :math:`|00\rangle`,
44
- :math:`|01\rangle + |10\rangle` and :math:`|11\rangle` states. To this end, this circuit
45
- uses two-qubit interactions of the form
46
-
47
- .. math::
48
-
49
- \newcommand{\rotationangle}{\theta/2}
50
-
51
- \begin{pmatrix}
52
- 1 & 0 & 0 & 0 \\
53
- 0 & \cos\left(\rotationangle\right) & -i\sin\left(\rotationangle\right) & 0 \\
54
- 0 & -i\sin\left(\rotationangle\right) & \cos\left(\rotationangle\right) & 0 \\
55
- 0 & 0 & 0 & e^{-i\phi}
56
- \end{pmatrix}
57
-
58
- for the mode ``"fsim"`` or with :math:`e^{-i\phi} = 1` for the mode ``"iswap"``.
59
-
60
- Note that other wave functions, such as UCC-ansatzes, are also excitation preserving.
61
- However these can become complex quickly, while this heuristically motivated circuit follows
62
- a simpler pattern.
63
-
64
- This trial wave function consists of layers of :math:`Z` rotations with 2-qubit entanglements.
65
- The entangling is creating using :math:`XX+YY` rotations and optionally a controlled-phase
66
- gate for the mode ``"fsim"``.
67
-
68
- Examples:
69
-
70
- With linear entanglement, this circuit is given by:
71
-
72
- .. plot::
73
- :include-source:
74
- :context:
75
-
76
- from qiskit.circuit.library import excitation_preserving
77
-
78
- ansatz = excitation_preserving(3, reps=1, insert_barriers=True, entanglement="linear")
79
- ansatz.draw("mpl")
80
-
81
- The entanglement structure can be explicitly specified with the ``entanglement``
82
- argument. The ``"fsim"`` mode includes an additional parameterized :class:`.CPhaseGate`
83
- in each block:
84
-
85
- .. plot::
86
- :include-source:
87
- :context:
88
-
89
- ansatz = excitation_preserving(3, reps=1, mode="fsim", entanglement=[[0, 2]])
90
- ansatz.draw("mpl")
91
-
92
- Args:
93
- num_qubits: The number of qubits.
94
- mode: Choose the entangler mode, can be `"iswap"` or `"fsim"`.
95
- reps: Specifies how often the structure of a rotation layer followed by an entanglement
96
- layer is repeated.
97
- entanglement: The indices specifying on which qubits the input blocks act.
98
- See :func:`.n_local` for detailed information.
99
- skip_final_rotation_layer: Whether a final rotation layer is added to the circuit.
100
- skip_unentangled_qubits: If ``True``, the rotation gates act only on qubits that
101
- are entangled. If ``False``, the rotation gates act on all qubits.
102
- parameter_prefix: The name of the free parameters.
103
- insert_barriers: If True, barriers are inserted in between each layer. If False,
104
- no barriers are inserted.
105
- name: The name of the circuit.
106
-
107
- Returns:
108
- An excitation-preserving circuit.
109
- """
110
- supported_modes = ["iswap", "fsim"]
111
- if mode not in supported_modes:
112
- raise ValueError(f"Unsupported mode {mode}, choose one of {supported_modes}")
113
-
114
- theta = Parameter("θ")
115
- swap = QuantumCircuit(2, name="Interaction")
116
- swap.rxx(theta, 0, 1)
117
- swap.ryy(theta, 0, 1)
118
- if mode == "fsim":
119
- phi = Parameter("φ")
120
- swap.cp(phi, 0, 1)
121
-
122
- return n_local(
123
- num_qubits,
124
- ["rz"],
125
- [swap.to_gate()],
126
- entanglement,
127
- reps,
128
- insert_barriers,
129
- parameter_prefix,
130
- True,
131
- skip_final_rotation_layer,
132
- skip_unentangled_qubits,
133
- name,
134
- )
135
-
136
-
137
24
  class ExcitationPreserving(TwoLocal):
138
25
  r"""The heuristic excitation-preserving wave function ansatz.
139
26
 
@@ -170,7 +57,7 @@ class ExcitationPreserving(TwoLocal):
170
57
  Examples:
171
58
 
172
59
  >>> ansatz = ExcitationPreserving(3, reps=1, insert_barriers=True, entanglement='linear')
173
- >>> print(ansatz.decompose()) # show the circuit
60
+ >>> print(ansatz) # show the circuit
174
61
  ┌──────────┐ ░ ┌────────────┐┌────────────┐ ░ ┌──────────┐
175
62
  q_0: ┤ RZ(θ[0]) ├─░─┤0 ├┤0 ├─────────────────────────────░─┤ RZ(θ[5]) ├
176
63
  ├──────────┤ ░ │ RXX(θ[3]) ││ RYY(θ[3]) │┌────────────┐┌────────────┐ ░ ├──────────┤
@@ -179,10 +66,10 @@ class ExcitationPreserving(TwoLocal):
179
66
  q_2: ┤ RZ(θ[2]) ├─░─────────────────────────────┤1 ├┤1 ├─░─┤ RZ(θ[7]) ├
180
67
  └──────────┘ ░ └────────────┘└────────────┘ ░ └──────────┘
181
68
 
182
- >>> ansatz = ExcitationPreserving(2, reps=1, flatten=True)
69
+ >>> ansatz = ExcitationPreserving(2, reps=1)
183
70
  >>> qc = QuantumCircuit(2) # create a circuit and append the RY variational form
184
71
  >>> qc.cry(0.2, 0, 1) # do some previous operation
185
- >>> qc.compose(ansatz, inplace=True) # add the excitation-preserving
72
+ >>> qc.compose(ansatz, inplace=True) # add the swaprz
186
73
  >>> qc.draw()
187
74
  ┌──────────┐┌────────────┐┌────────────┐┌──────────┐
188
75
  q_0: ─────■─────┤ RZ(θ[0]) ├┤0 ├┤0 ├┤ RZ(θ[3]) ├
@@ -191,8 +78,8 @@ class ExcitationPreserving(TwoLocal):
191
78
  └─────────┘└──────────┘└────────────┘└────────────┘└──────────┘
192
79
 
193
80
  >>> ansatz = ExcitationPreserving(3, reps=1, mode='fsim', entanglement=[[0,2]],
194
- ... insert_barriers=True, flatten=True)
195
- >>> print(ansatz.decompose())
81
+ ... insert_barriers=True)
82
+ >>> print(ansatz)
196
83
  ┌──────────┐ ░ ┌────────────┐┌────────────┐ ░ ┌──────────┐
197
84
  q_0: ┤ RZ(θ[0]) ├─░─┤0 ├┤0 ├─■──────░─┤ RZ(θ[5]) ├
198
85
  ├──────────┤ ░ │ ││ │ │ ░ ├──────────┤
@@ -200,19 +87,8 @@ class ExcitationPreserving(TwoLocal):
200
87
  ├──────────┤ ░ │ ││ │ │θ[4] ░ ├──────────┤
201
88
  q_2: ┤ RZ(θ[2]) ├─░─┤1 ├┤1 ├─■──────░─┤ RZ(θ[7]) ├
202
89
  └──────────┘ ░ └────────────┘└────────────┘ ░ └──────────┘
203
-
204
- .. seealso::
205
-
206
- The :func:`.excitation_preserving` function constructs a functionally equivalent circuit,
207
- but faster.
208
-
209
90
  """
210
91
 
211
- @deprecate_func(
212
- since="1.3",
213
- additional_msg="Use the function qiskit.circuit.library.excitation_preserving instead.",
214
- pending=True,
215
- )
216
92
  def __init__(
217
93
  self,
218
94
  num_qubits: int | None = None,