qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__cp39-abi3-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +20 -1
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/assembler/assemble_schedules.py +2 -0
  5. qiskit/circuit/__init__.py +44 -1
  6. qiskit/circuit/_standard_gates_commutations.py +585 -0
  7. qiskit/circuit/barrier.py +2 -0
  8. qiskit/circuit/controlflow/builder.py +3 -3
  9. qiskit/circuit/controlflow/if_else.py +13 -5
  10. qiskit/circuit/controlflow/while_loop.py +10 -2
  11. qiskit/circuit/delay.py +20 -3
  12. qiskit/circuit/equivalence.py +13 -214
  13. qiskit/circuit/gate.py +3 -1
  14. qiskit/circuit/instruction.py +32 -11
  15. qiskit/circuit/instructionset.py +2 -0
  16. qiskit/circuit/library/__init__.py +110 -14
  17. qiskit/circuit/library/arithmetic/__init__.py +9 -2
  18. qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
  19. qiskit/circuit/library/arithmetic/adders/adder.py +154 -2
  20. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
  21. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
  22. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
  23. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  24. qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
  25. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
  26. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
  27. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
  28. qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
  29. qiskit/circuit/library/basis_change/qft.py +20 -38
  30. qiskit/circuit/library/blueprintcircuit.py +64 -0
  31. qiskit/circuit/library/boolean_logic/__init__.py +4 -4
  32. qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
  33. qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
  34. qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
  35. qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
  36. qiskit/circuit/library/data_preparation/__init__.py +6 -3
  37. qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
  38. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  39. qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
  40. qiskit/circuit/library/fourier_checking.py +72 -11
  41. qiskit/circuit/library/generalized_gates/__init__.py +1 -1
  42. qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
  43. qiskit/circuit/library/generalized_gates/gms.py +67 -14
  44. qiskit/circuit/library/generalized_gates/gr.py +4 -4
  45. qiskit/circuit/library/generalized_gates/isometry.py +2 -2
  46. qiskit/circuit/library/generalized_gates/linear_function.py +12 -6
  47. qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
  48. qiskit/circuit/library/generalized_gates/permutation.py +8 -6
  49. qiskit/circuit/library/generalized_gates/rv.py +8 -9
  50. qiskit/circuit/library/graph_state.py +93 -10
  51. qiskit/circuit/library/grover_operator.py +270 -2
  52. qiskit/circuit/library/hidden_linear_function.py +83 -20
  53. qiskit/circuit/library/iqp.py +99 -20
  54. qiskit/circuit/library/n_local/__init__.py +19 -7
  55. qiskit/circuit/library/n_local/efficient_su2.py +118 -5
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
  57. qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
  58. qiskit/circuit/library/n_local/n_local.py +406 -5
  59. qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
  60. qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
  61. qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
  62. qiskit/circuit/library/n_local/two_local.py +14 -7
  63. qiskit/circuit/library/overlap.py +91 -26
  64. qiskit/circuit/library/pauli_evolution.py +17 -15
  65. qiskit/circuit/library/phase_estimation.py +80 -4
  66. qiskit/circuit/library/quantum_volume.py +72 -20
  67. qiskit/circuit/library/standard_gates/__init__.py +20 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +2 -1
  69. qiskit/circuit/library/standard_gates/ecr.py +2 -2
  70. qiskit/circuit/library/standard_gates/h.py +4 -3
  71. qiskit/circuit/library/standard_gates/i.py +2 -1
  72. qiskit/circuit/library/standard_gates/iswap.py +2 -2
  73. qiskit/circuit/library/standard_gates/p.py +20 -12
  74. qiskit/circuit/library/standard_gates/r.py +1 -1
  75. qiskit/circuit/library/standard_gates/rx.py +4 -3
  76. qiskit/circuit/library/standard_gates/rxx.py +2 -2
  77. qiskit/circuit/library/standard_gates/ry.py +4 -3
  78. qiskit/circuit/library/standard_gates/ryy.py +2 -2
  79. qiskit/circuit/library/standard_gates/rz.py +13 -12
  80. qiskit/circuit/library/standard_gates/rzx.py +6 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +1 -1
  82. qiskit/circuit/library/standard_gates/s.py +4 -4
  83. qiskit/circuit/library/standard_gates/swap.py +3 -3
  84. qiskit/circuit/library/standard_gates/sx.py +4 -3
  85. qiskit/circuit/library/standard_gates/t.py +2 -2
  86. qiskit/circuit/library/standard_gates/u.py +11 -3
  87. qiskit/circuit/library/standard_gates/u1.py +65 -15
  88. qiskit/circuit/library/standard_gates/u2.py +4 -1
  89. qiskit/circuit/library/standard_gates/u3.py +31 -3
  90. qiskit/circuit/library/standard_gates/x.py +7 -5
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
  93. qiskit/circuit/library/standard_gates/y.py +4 -3
  94. qiskit/circuit/library/standard_gates/z.py +3 -3
  95. qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
  96. qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
  97. qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
  98. qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
  99. qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
  100. qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
  101. qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
  102. qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
  103. qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
  104. qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
  105. qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
  106. qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
  107. qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
  108. qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
  109. qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
  110. qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
  111. qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
  112. qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
  113. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
  114. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
  115. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
  116. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
  117. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
  118. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
  119. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
  120. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
  121. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
  122. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
  123. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
  124. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
  125. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
  126. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
  127. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
  128. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
  129. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
  130. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
  131. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
  132. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
  133. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
  134. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
  135. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
  136. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
  137. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
  138. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
  139. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
  140. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
  141. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
  142. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
  143. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
  144. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
  145. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
  146. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
  147. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
  148. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
  149. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
  150. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
  151. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
  152. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
  153. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
  154. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
  155. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
  156. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
  157. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
  158. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
  159. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
  160. qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
  161. qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
  162. qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
  163. qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
  164. qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
  165. qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
  166. qiskit/circuit/parameter.py +4 -0
  167. qiskit/circuit/parameterexpression.py +167 -34
  168. qiskit/circuit/quantumcircuit.py +162 -126
  169. qiskit/circuit/singleton.py +2 -0
  170. qiskit/circuit/store.py +2 -0
  171. qiskit/circuit/twirling.py +145 -0
  172. qiskit/compiler/assembler.py +17 -4
  173. qiskit/compiler/scheduler.py +2 -0
  174. qiskit/compiler/sequencer.py +2 -0
  175. qiskit/compiler/transpiler.py +81 -26
  176. qiskit/converters/circuit_to_dag.py +2 -2
  177. qiskit/converters/circuit_to_dagdependency.py +1 -1
  178. qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
  179. qiskit/converters/circuit_to_instruction.py +1 -1
  180. qiskit/converters/dag_to_circuit.py +7 -5
  181. qiskit/converters/dag_to_dagdependency.py +1 -1
  182. qiskit/converters/dag_to_dagdependency_v2.py +1 -1
  183. qiskit/converters/dagdependency_to_circuit.py +5 -1
  184. qiskit/converters/dagdependency_to_dag.py +6 -1
  185. qiskit/dagcircuit/collect_blocks.py +3 -3
  186. qiskit/dagcircuit/dagdependency.py +18 -5
  187. qiskit/dagcircuit/dagdependency_v2.py +1 -1
  188. qiskit/dagcircuit/dagnode.py +2 -2
  189. qiskit/passmanager/__init__.py +2 -2
  190. qiskit/primitives/backend_estimator.py +5 -2
  191. qiskit/primitives/backend_sampler_v2.py +61 -18
  192. qiskit/primitives/base/base_estimator.py +2 -2
  193. qiskit/primitives/containers/data_bin.py +9 -1
  194. qiskit/primitives/statevector_sampler.py +1 -1
  195. qiskit/primitives/utils.py +1 -1
  196. qiskit/providers/__init__.py +3 -3
  197. qiskit/providers/backend.py +12 -1
  198. qiskit/providers/backend_compat.py +23 -3
  199. qiskit/providers/basic_provider/basic_simulator.py +12 -2
  200. qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
  201. qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
  202. qiskit/providers/models/pulsedefaults.py +2 -0
  203. qiskit/pulse/builder.py +59 -18
  204. qiskit/pulse/calibration_entries.py +4 -1
  205. qiskit/pulse/channels.py +2 -0
  206. qiskit/pulse/exceptions.py +2 -0
  207. qiskit/pulse/instruction_schedule_map.py +21 -6
  208. qiskit/pulse/instructions/acquire.py +2 -0
  209. qiskit/pulse/instructions/delay.py +2 -0
  210. qiskit/pulse/instructions/directives.py +8 -0
  211. qiskit/pulse/instructions/frequency.py +3 -0
  212. qiskit/pulse/instructions/instruction.py +2 -0
  213. qiskit/pulse/instructions/phase.py +3 -0
  214. qiskit/pulse/instructions/play.py +2 -0
  215. qiskit/pulse/instructions/reference.py +2 -0
  216. qiskit/pulse/instructions/snapshot.py +2 -0
  217. qiskit/pulse/library/pulse.py +2 -0
  218. qiskit/pulse/library/symbolic_pulses.py +28 -0
  219. qiskit/pulse/library/waveform.py +2 -0
  220. qiskit/pulse/macros.py +1 -1
  221. qiskit/pulse/schedule.py +12 -13
  222. qiskit/pulse/transforms/alignments.py +5 -3
  223. qiskit/pulse/transforms/dag.py +7 -0
  224. qiskit/qasm2/export.py +5 -3
  225. qiskit/qasm2/parse.py +46 -2
  226. qiskit/qasm3/__init__.py +1 -0
  227. qiskit/qasm3/ast.py +123 -15
  228. qiskit/qasm3/exporter.py +103 -77
  229. qiskit/qobj/converters/pulse_instruction.py +6 -4
  230. qiskit/qpy/__init__.py +181 -0
  231. qiskit/qpy/binary_io/circuits.py +20 -5
  232. qiskit/qpy/binary_io/schedules.py +3 -4
  233. qiskit/qpy/binary_io/value.py +310 -13
  234. qiskit/qpy/common.py +46 -2
  235. qiskit/qpy/formats.py +7 -0
  236. qiskit/qpy/interface.py +40 -4
  237. qiskit/quantum_info/__init__.py +4 -0
  238. qiskit/quantum_info/operators/channel/transformations.py +28 -21
  239. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  240. qiskit/quantum_info/operators/operator.py +54 -8
  241. qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
  242. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  243. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
  244. qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
  245. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  246. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
  247. qiskit/quantum_info/states/densitymatrix.py +5 -5
  248. qiskit/quantum_info/states/stabilizerstate.py +1 -1
  249. qiskit/quantum_info/states/statevector.py +6 -6
  250. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  251. qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
  252. qiskit/result/mitigation/local_readout_mitigator.py +9 -1
  253. qiskit/result/mitigation/utils.py +57 -0
  254. qiskit/scheduler/config.py +2 -0
  255. qiskit/scheduler/methods/basic.py +3 -0
  256. qiskit/scheduler/schedule_circuit.py +2 -0
  257. qiskit/scheduler/sequence.py +2 -0
  258. qiskit/synthesis/__init__.py +25 -0
  259. qiskit/synthesis/arithmetic/__init__.py +16 -0
  260. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  261. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  262. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  263. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  264. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  265. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  266. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  267. qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
  268. qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
  269. qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
  270. qiskit/synthesis/evolution/__init__.py +1 -0
  271. qiskit/synthesis/evolution/lie_trotter.py +16 -42
  272. qiskit/synthesis/evolution/pauli_network.py +80 -0
  273. qiskit/synthesis/evolution/product_formula.py +165 -238
  274. qiskit/synthesis/evolution/qdrift.py +36 -29
  275. qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
  276. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  277. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  278. qiskit/synthesis/qft/qft_decompose_full.py +19 -1
  279. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
  280. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
  281. qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
  282. qiskit/synthesis/unitary/qsd.py +5 -5
  283. qiskit/transpiler/__init__.py +21 -14
  284. qiskit/transpiler/basepasses.py +1 -1
  285. qiskit/transpiler/passes/__init__.py +2 -0
  286. qiskit/transpiler/passes/basis/basis_translator.py +9 -565
  287. qiskit/transpiler/passes/basis/decompose.py +45 -12
  288. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  289. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  290. qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
  291. qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
  292. qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
  293. qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
  294. qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
  295. qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
  296. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  297. qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
  298. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  299. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  300. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  301. qiskit/transpiler/passes/optimization/consolidate_blocks.py +48 -131
  302. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
  303. qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
  304. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
  305. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  306. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  307. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  308. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  309. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  310. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  311. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  312. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  313. qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
  314. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  315. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  316. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  317. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  318. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
  319. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  320. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  321. qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
  322. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
  323. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  324. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
  325. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
  326. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
  327. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
  328. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +262 -99
  329. qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
  330. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  331. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
  332. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
  333. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
  334. qiskit/transpiler/passes/utils/gate_direction.py +12 -275
  335. qiskit/transpiler/passes/utils/gates_basis.py +7 -30
  336. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
  337. qiskit/transpiler/passmanager_config.py +22 -4
  338. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
  339. qiskit/transpiler/preset_passmanagers/common.py +5 -3
  340. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +125 -42
  341. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  342. qiskit/transpiler/target.py +74 -16
  343. qiskit/utils/deprecate_pulse.py +119 -0
  344. qiskit/visualization/circuit/_utils.py +2 -2
  345. qiskit/visualization/circuit/circuit_visualization.py +3 -2
  346. qiskit/visualization/circuit/matplotlib.py +1 -1
  347. qiskit/visualization/dag_visualization.py +1 -1
  348. qiskit/visualization/pass_manager_visualization.py +3 -14
  349. qiskit/visualization/pulse_v2/interface.py +3 -1
  350. qiskit/visualization/timeline/core.py +25 -2
  351. qiskit/visualization/timeline/interface.py +12 -0
  352. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/METADATA +9 -8
  353. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
  354. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
  355. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/entry_points.txt +19 -0
  356. qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
  357. qiskit/synthesis/two_qubit/weyl.py +0 -97
  358. qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
  359. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/LICENSE.txt +0 -0
  360. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/top_level.txt +0 -0
@@ -14,18 +14,121 @@
14
14
 
15
15
  from __future__ import annotations
16
16
  import typing
17
- from collections.abc import Callable
17
+ from collections.abc import Callable, Iterable
18
18
 
19
19
  from numpy import pi
20
20
 
21
- from qiskit.circuit import QuantumCircuit
21
+ from qiskit.circuit import QuantumCircuit, Gate
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
23
25
  from .two_local import TwoLocal
24
26
 
25
27
  if typing.TYPE_CHECKING:
26
28
  import qiskit # pylint: disable=cyclic-import
27
29
 
28
30
 
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
+
29
132
  class EfficientSU2(TwoLocal):
30
133
  r"""The hardware efficient SU(2) 2-local circuit.
31
134
 
@@ -39,7 +142,7 @@ class EfficientSU2(TwoLocal):
39
142
  On 3 qubits and using the Pauli :math:`Y` and :math:`Z` su2_gates as single qubit gates, the
40
143
  hardware efficient SU(2) circuit is represented by:
41
144
 
42
- .. parsed-literal::
145
+ .. code-block:: text
43
146
 
44
147
  ┌──────────┐┌──────────┐ ░ ░ ░ ┌───────────┐┌───────────┐
45
148
  ┤ RY(θ[0]) ├┤ RZ(θ[3]) ├─░────────■───░─ ... ─░─┤ RY(θ[12]) ├┤ RZ(θ[15]) ├
@@ -55,7 +158,7 @@ class EfficientSU2(TwoLocal):
55
158
  Examples:
56
159
 
57
160
  >>> circuit = EfficientSU2(3, reps=1)
58
- >>> print(circuit)
161
+ >>> print(circuit.decompose())
59
162
  ┌──────────┐┌──────────┐ ┌──────────┐┌──────────┐
60
163
  q_0: ┤ RY(θ[0]) ├┤ RZ(θ[3]) ├──■────■──┤ RY(θ[6]) ├┤ RZ(θ[9]) ├─────────────
61
164
  ├──────────┤├──────────┤┌─┴─┐ │ └──────────┘├──────────┤┌───────────┐
@@ -64,7 +167,8 @@ class EfficientSU2(TwoLocal):
64
167
  q_2: ┤ RY(θ[2]) ├┤ RZ(θ[5]) ├─────┤ X ├───┤ X ├────┤ RY(θ[8]) ├┤ RZ(θ[11]) ├
65
168
  └──────────┘└──────────┘ └───┘ └───┘ └──────────┘└───────────┘
66
169
 
67
- >>> ansatz = EfficientSU2(4, su2_gates=['rx', 'y'], entanglement='circular', reps=1)
170
+ >>> ansatz = EfficientSU2(4, su2_gates=['rx', 'y'], entanglement='circular', reps=1,
171
+ ... flatten=True)
68
172
  >>> qc = QuantumCircuit(4) # create a circuit and append the RY variational form
69
173
  >>> qc.compose(ansatz, inplace=True)
70
174
  >>> qc.draw()
@@ -78,8 +182,17 @@ class EfficientSU2(TwoLocal):
78
182
  q_3: ┤ RX(θ[3]) ├┤ Y ├──■──────────────────────┤ X ├────┤ RX(θ[7]) ├┤ Y ├
79
183
  └──────────┘└───┘ └───┘ └──────────┘└───┘
80
184
 
185
+ .. seealso::
186
+
187
+ The :func:`.efficient_su2` function constructs a functionally equivalent circuit, but faster.
188
+
81
189
  """
82
190
 
191
+ @deprecate_func(
192
+ since="1.3",
193
+ additional_msg="Use the function qiskit.circuit.library.efficient_su2 instead.",
194
+ pending=True,
195
+ )
83
196
  def __init__(
84
197
  self,
85
198
  num_qubits: int | None = None,
@@ -15,16 +15,263 @@
15
15
  from __future__ import annotations
16
16
  from collections.abc import Sequence
17
17
 
18
+ import typing
19
+ import warnings
20
+ import itertools
18
21
  import numpy as np
19
22
 
20
23
  from qiskit.circuit.library.pauli_evolution import PauliEvolutionGate
21
24
  from qiskit.circuit.parameter import Parameter
25
+ from qiskit.circuit.parametervector import ParameterVector
22
26
  from qiskit.circuit.quantumregister import QuantumRegister
23
27
  from qiskit.circuit.quantumcircuit import QuantumCircuit
24
28
  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
25
32
 
26
33
  from .n_local import NLocal
27
34
 
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
+
28
275
 
29
276
  class EvolvedOperatorAnsatz(NLocal):
30
277
  """The evolved operator ansatz."""
@@ -254,3 +501,15 @@ def _is_pauli_identity(operator):
254
501
  if isinstance(operator, Pauli):
255
502
  return not np.any(np.logical_or(operator.x, operator.z))
256
503
  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,14 +13,127 @@
13
13
  """The ExcitationPreserving 2-local circuit."""
14
14
 
15
15
  from __future__ import annotations
16
- from collections.abc import Callable
16
+ from collections.abc import Callable, Iterable
17
17
  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
21
23
  from .two_local import TwoLocal
22
24
 
23
25
 
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
+
24
137
  class ExcitationPreserving(TwoLocal):
25
138
  r"""The heuristic excitation-preserving wave function ansatz.
26
139
 
@@ -57,7 +170,7 @@ class ExcitationPreserving(TwoLocal):
57
170
  Examples:
58
171
 
59
172
  >>> ansatz = ExcitationPreserving(3, reps=1, insert_barriers=True, entanglement='linear')
60
- >>> print(ansatz) # show the circuit
173
+ >>> print(ansatz.decompose()) # show the circuit
61
174
  ┌──────────┐ ░ ┌────────────┐┌────────────┐ ░ ┌──────────┐
62
175
  q_0: ┤ RZ(θ[0]) ├─░─┤0 ├┤0 ├─────────────────────────────░─┤ RZ(θ[5]) ├
63
176
  ├──────────┤ ░ │ RXX(θ[3]) ││ RYY(θ[3]) │┌────────────┐┌────────────┐ ░ ├──────────┤
@@ -66,10 +179,10 @@ class ExcitationPreserving(TwoLocal):
66
179
  q_2: ┤ RZ(θ[2]) ├─░─────────────────────────────┤1 ├┤1 ├─░─┤ RZ(θ[7]) ├
67
180
  └──────────┘ ░ └────────────┘└────────────┘ ░ └──────────┘
68
181
 
69
- >>> ansatz = ExcitationPreserving(2, reps=1)
182
+ >>> ansatz = ExcitationPreserving(2, reps=1, flatten=True)
70
183
  >>> qc = QuantumCircuit(2) # create a circuit and append the RY variational form
71
184
  >>> qc.cry(0.2, 0, 1) # do some previous operation
72
- >>> qc.compose(ansatz, inplace=True) # add the swaprz
185
+ >>> qc.compose(ansatz, inplace=True) # add the excitation-preserving
73
186
  >>> qc.draw()
74
187
  ┌──────────┐┌────────────┐┌────────────┐┌──────────┐
75
188
  q_0: ─────■─────┤ RZ(θ[0]) ├┤0 ├┤0 ├┤ RZ(θ[3]) ├
@@ -78,8 +191,8 @@ class ExcitationPreserving(TwoLocal):
78
191
  └─────────┘└──────────┘└────────────┘└────────────┘└──────────┘
79
192
 
80
193
  >>> ansatz = ExcitationPreserving(3, reps=1, mode='fsim', entanglement=[[0,2]],
81
- ... insert_barriers=True)
82
- >>> print(ansatz)
194
+ ... insert_barriers=True, flatten=True)
195
+ >>> print(ansatz.decompose())
83
196
  ┌──────────┐ ░ ┌────────────┐┌────────────┐ ░ ┌──────────┐
84
197
  q_0: ┤ RZ(θ[0]) ├─░─┤0 ├┤0 ├─■──────░─┤ RZ(θ[5]) ├
85
198
  ├──────────┤ ░ │ ││ │ │ ░ ├──────────┤
@@ -87,8 +200,19 @@ class ExcitationPreserving(TwoLocal):
87
200
  ├──────────┤ ░ │ ││ │ │θ[4] ░ ├──────────┤
88
201
  q_2: ┤ RZ(θ[2]) ├─░─┤1 ├┤1 ├─■──────░─┤ RZ(θ[7]) ├
89
202
  └──────────┘ ░ └────────────┘└────────────┘ ░ └──────────┘
203
+
204
+ .. seealso::
205
+
206
+ The :func:`.excitation_preserving` function constructs a functionally equivalent circuit,
207
+ but faster.
208
+
90
209
  """
91
210
 
211
+ @deprecate_func(
212
+ since="1.3",
213
+ additional_msg="Use the function qiskit.circuit.library.excitation_preserving instead.",
214
+ pending=True,
215
+ )
92
216
  def __init__(
93
217
  self,
94
218
  num_qubits: int | None = None,