qiskit 1.3.0b1__cp39-abi3-macosx_11_0_arm64.whl → 1.3.0rc1__cp39-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +20 -1
  3. qiskit/_accelerate.abi3.so +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 +83 -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 +153 -1
  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/providers/__init__.py +1 -1
  196. qiskit/providers/backend.py +12 -1
  197. qiskit/providers/backend_compat.py +23 -3
  198. qiskit/providers/basic_provider/basic_simulator.py +12 -2
  199. qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
  200. qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
  201. qiskit/providers/models/pulsedefaults.py +2 -0
  202. qiskit/pulse/builder.py +59 -18
  203. qiskit/pulse/calibration_entries.py +4 -1
  204. qiskit/pulse/channels.py +2 -0
  205. qiskit/pulse/exceptions.py +2 -0
  206. qiskit/pulse/instruction_schedule_map.py +21 -6
  207. qiskit/pulse/instructions/acquire.py +2 -0
  208. qiskit/pulse/instructions/delay.py +2 -0
  209. qiskit/pulse/instructions/directives.py +8 -0
  210. qiskit/pulse/instructions/frequency.py +3 -0
  211. qiskit/pulse/instructions/instruction.py +2 -0
  212. qiskit/pulse/instructions/phase.py +3 -0
  213. qiskit/pulse/instructions/play.py +2 -0
  214. qiskit/pulse/instructions/reference.py +2 -0
  215. qiskit/pulse/instructions/snapshot.py +2 -0
  216. qiskit/pulse/library/pulse.py +2 -0
  217. qiskit/pulse/library/symbolic_pulses.py +28 -0
  218. qiskit/pulse/library/waveform.py +2 -0
  219. qiskit/pulse/macros.py +1 -1
  220. qiskit/pulse/schedule.py +12 -13
  221. qiskit/pulse/transforms/alignments.py +5 -3
  222. qiskit/pulse/transforms/dag.py +7 -0
  223. qiskit/qasm2/export.py +5 -3
  224. qiskit/qasm2/parse.py +46 -2
  225. qiskit/qasm3/__init__.py +1 -0
  226. qiskit/qasm3/ast.py +123 -15
  227. qiskit/qasm3/exporter.py +103 -77
  228. qiskit/qobj/converters/pulse_instruction.py +6 -4
  229. qiskit/qpy/__init__.py +181 -0
  230. qiskit/qpy/binary_io/circuits.py +20 -5
  231. qiskit/qpy/binary_io/schedules.py +3 -4
  232. qiskit/qpy/binary_io/value.py +310 -13
  233. qiskit/qpy/common.py +46 -2
  234. qiskit/qpy/formats.py +7 -0
  235. qiskit/qpy/interface.py +40 -4
  236. qiskit/quantum_info/__init__.py +4 -0
  237. qiskit/quantum_info/operators/channel/transformations.py +28 -21
  238. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  239. qiskit/quantum_info/operators/operator.py +54 -8
  240. qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
  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 +2 -0
  244. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  245. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
  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 +5 -5
  249. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  250. qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
  251. qiskit/result/mitigation/local_readout_mitigator.py +9 -1
  252. qiskit/result/mitigation/utils.py +57 -0
  253. qiskit/scheduler/config.py +2 -0
  254. qiskit/scheduler/methods/basic.py +3 -0
  255. qiskit/scheduler/schedule_circuit.py +2 -0
  256. qiskit/scheduler/sequence.py +2 -0
  257. qiskit/synthesis/__init__.py +25 -0
  258. qiskit/synthesis/arithmetic/__init__.py +16 -0
  259. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  260. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  261. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  262. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  263. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  264. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  265. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  266. qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
  267. qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
  268. qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
  269. qiskit/synthesis/evolution/__init__.py +1 -0
  270. qiskit/synthesis/evolution/lie_trotter.py +16 -42
  271. qiskit/synthesis/evolution/pauli_network.py +80 -0
  272. qiskit/synthesis/evolution/product_formula.py +165 -238
  273. qiskit/synthesis/evolution/qdrift.py +36 -29
  274. qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
  275. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  276. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  277. qiskit/synthesis/qft/qft_decompose_full.py +19 -1
  278. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
  279. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
  280. qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
  281. qiskit/synthesis/unitary/qsd.py +5 -5
  282. qiskit/transpiler/__init__.py +21 -14
  283. qiskit/transpiler/basepasses.py +1 -1
  284. qiskit/transpiler/passes/__init__.py +2 -0
  285. qiskit/transpiler/passes/basis/basis_translator.py +9 -565
  286. qiskit/transpiler/passes/basis/decompose.py +45 -12
  287. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  288. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  289. qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
  290. qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
  291. qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
  292. qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
  293. qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
  294. qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
  295. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  296. qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
  297. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  298. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  299. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  300. qiskit/transpiler/passes/optimization/consolidate_blocks.py +40 -130
  301. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
  302. qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
  303. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
  304. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  305. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  306. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  307. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  308. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  309. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  310. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  311. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  312. qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
  313. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  314. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  315. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  316. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  317. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
  318. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  319. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  320. qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
  321. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
  322. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  323. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
  324. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
  325. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
  326. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
  327. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +257 -93
  328. qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
  329. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  330. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
  331. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
  332. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
  333. qiskit/transpiler/passes/utils/gate_direction.py +12 -275
  334. qiskit/transpiler/passes/utils/gates_basis.py +7 -30
  335. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
  336. qiskit/transpiler/passmanager_config.py +22 -4
  337. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
  338. qiskit/transpiler/preset_passmanagers/common.py +5 -3
  339. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +124 -42
  340. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  341. qiskit/transpiler/target.py +74 -16
  342. qiskit/utils/deprecate_pulse.py +119 -0
  343. qiskit/visualization/circuit/_utils.py +2 -2
  344. qiskit/visualization/circuit/circuit_visualization.py +3 -2
  345. qiskit/visualization/circuit/matplotlib.py +1 -1
  346. qiskit/visualization/dag_visualization.py +1 -1
  347. qiskit/visualization/pass_manager_visualization.py +3 -14
  348. qiskit/visualization/pulse_v2/interface.py +3 -1
  349. qiskit/visualization/timeline/core.py +25 -2
  350. qiskit/visualization/timeline/interface.py +12 -0
  351. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/METADATA +3 -2
  352. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/RECORD +356 -345
  353. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/WHEEL +1 -1
  354. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/entry_points.txt +19 -0
  355. qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
  356. qiskit/synthesis/two_qubit/weyl.py +0 -97
  357. qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
  358. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/LICENSE.txt +0 -0
  359. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -11,17 +11,316 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
  """The Pauli expansion circuit module."""
14
- from typing import Optional, Callable, List, Union, Sequence, Dict, Tuple
14
+
15
+ from __future__ import annotations
16
+
17
+ from collections.abc import Sequence, Mapping
18
+ from typing import Optional, Callable, List, Union, Dict, Tuple
15
19
  from functools import reduce
16
20
  import numpy as np
17
21
 
18
22
  from qiskit.circuit import QuantumCircuit
19
- from qiskit.circuit import Parameter, ParameterVector
23
+ from qiskit.circuit import Parameter, ParameterVector, ParameterExpression
20
24
  from qiskit.circuit.library.standard_gates import HGate
25
+ from qiskit.utils.deprecation import deprecate_func
26
+ from qiskit._accelerate.circuit_library import pauli_feature_map as _fast_map
21
27
 
22
28
  from ..n_local.n_local import NLocal
23
29
 
24
30
 
31
+ def _normalize_entanglement(
32
+ entanglement: str | Mapping[int, Sequence[Sequence[int]]]
33
+ ) -> str | dict[int, list[tuple[int]]]:
34
+ if isinstance(entanglement, str):
35
+ return entanglement
36
+
37
+ return {
38
+ num_paulis: [tuple(connections) for connections in ent]
39
+ for num_paulis, ent in entanglement.items()
40
+ }
41
+
42
+
43
+ def pauli_feature_map(
44
+ feature_dimension: int,
45
+ reps: int = 2,
46
+ entanglement: (
47
+ str
48
+ | Mapping[int, Sequence[Sequence[int]]]
49
+ | Callable[[int], str | Mapping[int, Sequence[Sequence[int]]]]
50
+ ) = "full",
51
+ alpha: float = 2.0,
52
+ paulis: list[str] | None = None,
53
+ data_map_func: Callable[[Parameter], ParameterExpression] | None = None,
54
+ parameter_prefix: str = "x",
55
+ insert_barriers: bool = False,
56
+ name: str = "PauliFeatureMap",
57
+ ) -> QuantumCircuit:
58
+ r"""The Pauli expansion circuit.
59
+
60
+ The Pauli expansion circuit is a data encoding circuit that transforms input data
61
+ :math:`\vec{x} \in \mathbb{R}^n`, where :math:`n` is the ``feature_dimension``, as
62
+
63
+ .. math::
64
+
65
+ U_{\Phi(\vec{x})}=\exp\left(i\sum_{S \in \mathcal{I}}
66
+ \phi_S(\vec{x})\prod_{i\in S} P_i\right).
67
+
68
+ Here, :math:`S` is a set of qubit indices that describes the connections in the feature map,
69
+ :math:`\mathcal{I}` is a set containing all these index sets, and
70
+ :math:`P_i \in \{I, X, Y, Z\}`. Per default the data-mapping
71
+ :math:`\phi_S` is
72
+
73
+ .. math::
74
+
75
+ \phi_S(\vec{x}) = \begin{cases}
76
+ x_i \text{ if } S = \{i\} \\
77
+ \prod_{j \in S} (\pi - x_j) \text{ if } |S| > 1
78
+ \end{cases}.
79
+
80
+ The possible connections can be set using the ``entanglement`` and ``paulis`` arguments.
81
+ For example, for single-qubit :math:`Z` rotations and two-qubit :math:`YY` interactions
82
+ between all qubit pairs, we can set::
83
+
84
+
85
+ circuit = pauli_feature_map(..., paulis=["Z", "YY"], entanglement="full")
86
+
87
+ which will produce blocks of the form
88
+
89
+ .. code-block:: text
90
+
91
+ ┌───┐┌─────────────┐┌──────────┐ ┌───────────┐
92
+ ┤ H ├┤ P(2.0*x[0]) ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
93
+ ├───┤├─────────────┤├──────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───────────┤
94
+ ┤ H ├┤ P(2.0*x[1]) ├┤ RX(pi/2) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ RX(-pi/2) ├
95
+ └───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘
96
+
97
+ The circuit contains ``reps`` repetitions of this transformation.
98
+
99
+ Please refer to :func:`.z_feature_map` for the case of single-qubit Pauli-:math:`Z` rotations
100
+ and to :func:`.zz_feature_map` for the single- and two-qubit Pauli-:math:`Z` rotations.
101
+
102
+ Examples:
103
+
104
+ >>> prep = pauli_feature_map(2, reps=1, paulis=["ZZ"])
105
+ >>> print(prep)
106
+ ┌───┐
107
+ q_0: ┤ H ├──■──────────────────────────────────────■──
108
+ ├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
109
+ q_1: ┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
110
+ └───┘└───┘└────────────────────────────────┘└───┘
111
+
112
+ >>> prep = pauli_feature_map(2, reps=1, paulis=["Z", "XX"])
113
+ >>> print(prep)
114
+ ┌───┐┌─────────────┐┌───┐ ┌───┐
115
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ H ├──■──────────────────────────────────────■──┤ H ├
116
+ ├───┤├─────────────┤├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───┤
117
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ H ├
118
+ └───┘└─────────────┘└───┘└───┘└────────────────────────────────┘└───┘└───┘
119
+
120
+ >>> prep = pauli_feature_map(2, reps=1, paulis=["ZY"])
121
+ >>> print(prep)
122
+ ┌───┐┌──────────┐ ┌───────────┐
123
+ q_0: ┤ H ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
124
+ ├───┤└──────────┘┌─┴─┐┌────────────────────────────────┐┌─┴─┐└───────────┘
125
+ q_1: ┤ H ├────────────┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
126
+ └───┘ └───┘└────────────────────────────────┘└───┘
127
+
128
+ >>> from qiskit.circuit.library import EfficientSU2
129
+ >>> prep = pauli_feature_map(3, reps=3, paulis=["Z", "YY", "ZXZ"])
130
+ >>> wavefunction = EfficientSU2(3)
131
+ >>> classifier = prep.compose(wavefunction)
132
+ >>> classifier.num_parameters
133
+ 27
134
+ >>> classifier.count_ops()
135
+ OrderedDict([('cx', 39), ('rx', 36), ('u1', 21), ('h', 15), ('ry', 12), ('rz', 12)])
136
+
137
+ References:
138
+
139
+ [1] Havlicek et al. Supervised learning with quantum enhanced feature spaces,
140
+ `Nature 567, 209-212 (2019) <https://www.nature.com/articles/s41586-019-0980-2>`__.
141
+ """
142
+ # create parameter vector used in the Pauli feature map
143
+ parameters = ParameterVector(parameter_prefix, feature_dimension)
144
+
145
+ # the Rust implementation expects the entanglement to be a str or list[tuple[int]] (or the
146
+ # callable to return these types), therefore we normalize the entanglement here
147
+ if callable(entanglement):
148
+ normalized = lambda offset: _normalize_entanglement(entanglement(offset))
149
+ else:
150
+ normalized = _normalize_entanglement(entanglement)
151
+
152
+ # construct from Rust
153
+ circuit = QuantumCircuit._from_circuit_data(
154
+ _fast_map(
155
+ feature_dimension,
156
+ paulis=paulis,
157
+ entanglement=normalized,
158
+ reps=reps,
159
+ parameters=parameters,
160
+ data_map_func=data_map_func,
161
+ alpha=alpha,
162
+ insert_barriers=insert_barriers,
163
+ ),
164
+ name=name,
165
+ )
166
+
167
+ return circuit
168
+
169
+
170
+ def z_feature_map(
171
+ feature_dimension: int,
172
+ reps: int = 2,
173
+ entanglement: (
174
+ str | Sequence[Sequence[int]] | Callable[[int], str | Sequence[Sequence[int]]]
175
+ ) = "full",
176
+ alpha: float = 2.0,
177
+ data_map_func: Callable[[Parameter], ParameterExpression] | None = None,
178
+ parameter_prefix: str = "x",
179
+ insert_barriers: bool = False,
180
+ name: str = "ZFeatureMap",
181
+ ) -> QuantumCircuit:
182
+ """The first order Pauli Z-evolution circuit.
183
+
184
+ On 3 qubits and with 2 repetitions the circuit is represented by:
185
+
186
+ .. code-block:: text
187
+
188
+ ┌───┐┌─────────────┐┌───┐┌─────────────┐
189
+ ┤ H ├┤ P(2.0*x[0]) ├┤ H ├┤ P(2.0*x[0]) ├
190
+ ├───┤├─────────────┤├───┤├─────────────┤
191
+ ┤ H ├┤ U(2.0*x[1]) ├┤ H ├┤ P(2.0*x[1]) ├
192
+ ├───┤├─────────────┤├───┤├─────────────┤
193
+ ┤ H ├┤ P(2.0*x[2]) ├┤ H ├┤ P(2.0*x[2]) ├
194
+ └───┘└─────────────┘└───┘└─────────────┘
195
+
196
+ This is a sub-class of :class:`~qiskit.circuit.library.PauliFeatureMap` where the Pauli
197
+ strings are fixed as `['Z']`. As a result the first order expansion will be a circuit without
198
+ entangling gates.
199
+
200
+ Examples:
201
+
202
+ >>> prep = z_feature_map(3, reps=3, insert_barriers=True)
203
+ >>> print(prep)
204
+ ┌───┐ ░ ┌─────────────┐ ░ ┌───┐ ░ ┌─────────────┐ ░ ┌───┐ ░ ┌─────────────┐
205
+ q_0: ┤ H ├─░─┤ P(2.0*x[0]) ├─░─┤ H ├─░─┤ P(2.0*x[0]) ├─░─┤ H ├─░─┤ P(2.0*x[0]) ├
206
+ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤
207
+ q_1: ┤ H ├─░─┤ P(2.0*x[1]) ├─░─┤ H ├─░─┤ P(2.0*x[1]) ├─░─┤ H ├─░─┤ P(2.0*x[1]) ├
208
+ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤ ░ ├───┤ ░ ├─────────────┤
209
+ q_2: ┤ H ├─░─┤ P(2.0*x[2]) ├─░─┤ H ├─░─┤ P(2.0*x[2]) ├─░─┤ H ├─░─┤ P(2.0*x[2]) ├
210
+ └───┘ ░ └─────────────┘ ░ └───┘ ░ └─────────────┘ ░ └───┘ ░ └─────────────┘
211
+
212
+ >>> data_map = lambda x: x[0]*x[0] + 1 # note: input is an array
213
+ >>> prep = z_feature_map(3, reps=1, data_map_func=data_map)
214
+ >>> print(prep)
215
+ ┌───┐┌──────────────────────┐
216
+ q_0: ┤ H ├┤ P(2.0*x[0]**2 + 2.0) ├
217
+ ├───┤├──────────────────────┤
218
+ q_1: ┤ H ├┤ P(2.0*x[1]**2 + 2.0) ├
219
+ ├───┤├──────────────────────┤
220
+ q_2: ┤ H ├┤ P(2.0*x[2]**2 + 2.0) ├
221
+ └───┘└──────────────────────┘
222
+
223
+ >>> from qiskit.circuit.library import TwoLocal
224
+ >>> ry = TwoLocal(3, "ry", "cz", reps=1).decompose()
225
+ >>> classifier = z_feature_map(3, reps=1) + ry
226
+ >>> print(classifier)
227
+ ┌───┐┌─────────────┐┌──────────┐ ┌──────────┐
228
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ RY(θ[0]) ├─■──■─┤ RY(θ[3]) ├────────────
229
+ ├───┤├─────────────┤├──────────┤ │ │ └──────────┘┌──────────┐
230
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ RY(θ[1]) ├─■──┼──────■──────┤ RY(θ[4]) ├
231
+ ├───┤├─────────────┤├──────────┤ │ │ ├──────────┤
232
+ q_2: ┤ H ├┤ P(2.0*x[2]) ├┤ RY(θ[2]) ├────■──────■──────┤ RY(θ[5]) ├
233
+ └───┘└─────────────┘└──────────┘ └──────────┘
234
+
235
+ """
236
+ return pauli_feature_map(
237
+ feature_dimension=feature_dimension,
238
+ reps=reps,
239
+ entanglement=entanglement,
240
+ alpha=alpha,
241
+ paulis=["z"],
242
+ data_map_func=data_map_func,
243
+ parameter_prefix=parameter_prefix,
244
+ insert_barriers=insert_barriers,
245
+ name=name,
246
+ )
247
+
248
+
249
+ def zz_feature_map(
250
+ feature_dimension: int,
251
+ reps: int = 2,
252
+ entanglement: (
253
+ str | Sequence[Sequence[int]] | Callable[[int], str | Sequence[Sequence[int]]]
254
+ ) = "full",
255
+ alpha: float = 2.0,
256
+ data_map_func: Callable[[Parameter], ParameterExpression] | None = None,
257
+ parameter_prefix: str = "x",
258
+ insert_barriers: bool = False,
259
+ name: str = "ZZFeatureMap",
260
+ ) -> QuantumCircuit:
261
+ r"""Second-order Pauli-Z evolution circuit.
262
+
263
+ For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
264
+
265
+ .. code-block:: text
266
+
267
+ ┌───┐┌────────────────┐
268
+ ┤ H ├┤ P(2.0*φ(x[0])) ├──■───────────────────────────■───────────────────────────────────
269
+ ├───┤├────────────────┤┌─┴─┐┌─────────────────────┐┌─┴─┐
270
+ ┤ H ├┤ P(2.0*φ(x[1])) ├┤ X ├┤ P(2.0*φ(x[0],x[1])) ├┤ X ├──■───────────────────────────■──
271
+ ├───┤├────────────────┤└───┘└─────────────────────┘└───┘┌─┴─┐┌─────────────────────┐┌─┴─┐
272
+ ┤ H ├┤ P(2.0*φ(x[2])) ├─────────────────────────────────┤ X ├┤ P(2.0*φ(x[1],x[2])) ├┤ X ├
273
+ └───┘└────────────────┘ └───┘└─────────────────────┘└───┘
274
+
275
+ where :math:`\varphi` is a classical non-linear function, which defaults to :math:`\varphi(x) = x`
276
+ if and :math:`\varphi(x,y) = (\pi - x)(\pi - y)`.
277
+
278
+ Examples:
279
+
280
+ >>> from qiskit.circuit.library import ZZFeatureMap
281
+ >>> prep = zz_feature_map(2, reps=1)
282
+ >>> print(prep)
283
+ ┌───┐┌─────────────┐
284
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├──■──────────────────────────────────────■──
285
+ ├───┤├─────────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
286
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
287
+ └───┘└─────────────┘└───┘└────────────────────────────────┘└───┘
288
+
289
+ >>> from qiskit.circuit.library import EfficientSU2
290
+ >>> classifier = zz_feature_map(3) + EfficientSU2(3)
291
+ >>> classifier.num_parameters
292
+ 15
293
+ >>> classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
294
+ ParameterView([
295
+ ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
296
+ ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]),
297
+ ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]),
298
+ ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]),
299
+ ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]),
300
+ ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]),
301
+ ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]),
302
+ ParameterVectorElement(θ[11]), ParameterVectorElement(θ[12]),
303
+ ParameterVectorElement(θ[13]), ParameterVectorElement(θ[14]),
304
+ ParameterVectorElement(θ[15]), ParameterVectorElement(θ[16]),
305
+ ParameterVectorElement(θ[17]), ParameterVectorElement(θ[18]),
306
+ ParameterVectorElement(θ[19]), ParameterVectorElement(θ[20]),
307
+ ParameterVectorElement(θ[21]), ParameterVectorElement(θ[22]),
308
+ ParameterVectorElement(θ[23])
309
+ ])
310
+ """
311
+ return pauli_feature_map(
312
+ feature_dimension=feature_dimension,
313
+ reps=reps,
314
+ entanglement=entanglement,
315
+ alpha=alpha,
316
+ paulis=["z", "zz"],
317
+ data_map_func=data_map_func,
318
+ parameter_prefix=parameter_prefix,
319
+ insert_barriers=insert_barriers,
320
+ name=name,
321
+ )
322
+
323
+
25
324
  class PauliFeatureMap(NLocal):
26
325
  r"""The Pauli Expansion circuit.
27
326
 
@@ -54,13 +353,13 @@ class PauliFeatureMap(NLocal):
54
353
 
55
354
  which will produce blocks of the form
56
355
 
57
- .. parsed-literal::
356
+ .. code-block:: text
58
357
 
59
- ┌───┐┌──────────────┐┌──────────┐ ┌───────────┐
60
- ┤ H ├┤ U1(2.0*x[0]) ├┤ RX(pi/2) ├──■───────────────────────────────────────■──┤ RX(-pi/2) ├
61
- ├───┤├──────────────┤├──────────┤┌─┴─┐┌─────────────────────────────────┐┌─┴─┐├───────────┤
62
- ┤ H ├┤ U1(2.0*x[1]) ├┤ RX(pi/2) ├┤ X ├┤ U1(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ RX(-pi/2) ├
63
- └───┘└──────────────┘└──────────┘└───┘└─────────────────────────────────┘└───┘└───────────┘
358
+ ┌───┐┌─────────────┐┌──────────┐ ┌───────────┐
359
+ ┤ H ├┤ P(2.0*x[0]) ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
360
+ ├───┤├─────────────┤├──────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───────────┤
361
+ ┤ H ├┤ P(2.0*x[1]) ├┤ RX(pi/2) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ RX(-pi/2) ├
362
+ └───┘└─────────────┘└──────────┘└───┘└────────────────────────────────┘└───┘└───────────┘
64
363
 
65
364
  The circuit contains ``reps`` repetitions of this transformation.
66
365
 
@@ -70,28 +369,28 @@ class PauliFeatureMap(NLocal):
70
369
  Examples:
71
370
 
72
371
  >>> prep = PauliFeatureMap(2, reps=1, paulis=['ZZ'])
73
- >>> print(prep)
372
+ >>> print(prep.decompose())
74
373
  ┌───┐
75
- q_0: ┤ H ├──■───────────────────────────────────────■──
76
- ├───┤┌─┴─┐┌─────────────────────────────────┐┌─┴─┐
77
- q_1: ┤ H ├┤ X ├┤ U1(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
78
- └───┘└───┘└─────────────────────────────────┘└───┘
374
+ q_0: ┤ H ├──■──────────────────────────────────────■──
375
+ ├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
376
+ q_1: ┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
377
+ └───┘└───┘└────────────────────────────────┘└───┘
79
378
 
80
379
  >>> prep = PauliFeatureMap(2, reps=1, paulis=['Z', 'XX'])
81
- >>> print(prep)
82
- ┌───┐┌──────────────┐┌───┐ ┌───┐
83
- q_0: ┤ H ├┤ U1(2.0*x[0]) ├┤ H ├──■───────────────────────────────────────■──┤ H ├
84
- ├───┤├──────────────┤├───┤┌─┴─┐┌─────────────────────────────────┐┌─┴─┐├───┤
85
- q_1: ┤ H ├┤ U1(2.0*x[1]) ├┤ H ├┤ X ├┤ U1(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ H ├
86
- └───┘└──────────────┘└───┘└───┘└─────────────────────────────────┘└───┘└───┘
380
+ >>> print(prep.decompose())
381
+ ┌───┐┌─────────────┐┌───┐ ┌───┐
382
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├┤ H ├──■──────────────────────────────────────■──┤ H ├
383
+ ├───┤├─────────────┤├───┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐├───┤
384
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ H ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├┤ H ├
385
+ └───┘└─────────────┘└───┘└───┘└────────────────────────────────┘└───┘└───┘
87
386
 
88
387
  >>> prep = PauliFeatureMap(2, reps=1, paulis=['ZY'])
89
- >>> print(prep)
90
- ┌───┐┌──────────┐ ┌───────────┐
91
- q_0: ┤ H ├┤ RX(pi/2) ├──■───────────────────────────────────────■──┤ RX(-pi/2) ├
92
- ├───┤└──────────┘┌─┴─┐┌─────────────────────────────────┐┌─┴─┐└───────────┘
93
- q_1: ┤ H ├────────────┤ X ├┤ U1(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
94
- └───┘ └───┘└─────────────────────────────────┘└───┘
388
+ >>> print(prep.decompose())
389
+ ┌───┐┌──────────┐ ┌───────────┐
390
+ q_0: ┤ H ├┤ RX(pi/2) ├──■──────────────────────────────────────■──┤ RX(-pi/2) ├
391
+ ├───┤└──────────┘┌─┴─┐┌────────────────────────────────┐┌─┴─┐└───────────┘
392
+ q_1: ┤ H ├────────────┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├─────────────
393
+ └───┘ └───┘└────────────────────────────────┘└───┘
95
394
 
96
395
  >>> from qiskit.circuit.library import EfficientSU2
97
396
  >>> prep = PauliFeatureMap(3, reps=3, paulis=['Z', 'YY', 'ZXZ'])
@@ -104,13 +403,18 @@ class PauliFeatureMap(NLocal):
104
403
 
105
404
  References:
106
405
 
107
-
108
-
109
406
  [1] Havlicek et al. Supervised learning with quantum enhanced feature spaces,
110
407
  `Nature 567, 209-212 (2019) <https://www.nature.com/articles/s41586-019-0980-2>`__.
111
-
112
408
  """
113
409
 
410
+ @deprecate_func(
411
+ since="1.3",
412
+ additional_msg=(
413
+ "Use the pauli_feature_map function as a replacement. Note that this will no longer "
414
+ "return a BlueprintCircuit, but just a plain QuantumCircuit."
415
+ ),
416
+ pending=True,
417
+ )
114
418
  def __init__(
115
419
  self,
116
420
  feature_dimension: Optional[int] = None,
@@ -161,6 +465,7 @@ class PauliFeatureMap(NLocal):
161
465
  name=name,
162
466
  )
163
467
 
468
+ self._prefix = parameter_prefix
164
469
  self._data_map_func = data_map_func or self_product
165
470
  self._paulis = paulis or ["Z", "ZZ"]
166
471
  self._alpha = alpha
@@ -217,6 +522,11 @@ class PauliFeatureMap(NLocal):
217
522
 
218
523
  @property
219
524
  def entanglement_blocks(self):
525
+ """The blocks in the entanglement layers.
526
+
527
+ Returns:
528
+ The blocks in the entanglement layers.
529
+ """
220
530
  return [self.pauli_block(pauli) for pauli in self._paulis]
221
531
 
222
532
  @entanglement_blocks.setter
@@ -275,7 +585,10 @@ class PauliFeatureMap(NLocal):
275
585
  if pauli == "X":
276
586
  circuit.h(i)
277
587
  elif pauli == "Y":
278
- circuit.rx(-np.pi / 2 if inverse else np.pi / 2, i)
588
+ if inverse:
589
+ circuit.sxdg(i)
590
+ else:
591
+ circuit.sx(i)
279
592
 
280
593
  def cx_chain(circuit, inverse=False):
281
594
  num_cx = len(indices) - 1
@@ -12,13 +12,14 @@
12
12
 
13
13
  """Fourier checking circuit."""
14
14
 
15
- from typing import List
16
-
15
+ from collections.abc import Sequence
17
16
  import math
17
+
18
18
  from qiskit.circuit import QuantumCircuit
19
19
  from qiskit.circuit.exceptions import CircuitError
20
+ from qiskit.utils.deprecation import deprecate_func
20
21
 
21
- from .generalized_gates.diagonal import Diagonal
22
+ from .generalized_gates.diagonal import Diagonal, DiagonalGate
22
23
 
23
24
 
24
25
  class FourierChecking(QuantumCircuit):
@@ -52,7 +53,12 @@ class FourierChecking(QuantumCircuit):
52
53
  `arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
53
54
  """
54
55
 
55
- def __init__(self, f: List[int], g: List[int]) -> None:
56
+ @deprecate_func(
57
+ since="1.3",
58
+ additional_msg="Use qiskit.circuit.library.fourier_checking instead.",
59
+ pending=True,
60
+ )
61
+ def __init__(self, f: Sequence[int], g: Sequence[int]) -> None:
56
62
  """Create Fourier checking circuit.
57
63
 
58
64
  Args:
@@ -81,17 +87,72 @@ class FourierChecking(QuantumCircuit):
81
87
  "{1, -1}."
82
88
  )
83
89
 
84
- circuit = QuantumCircuit(num_qubits, name=f"fc: {f}, {g}")
85
-
90
+ # This definition circuit is not replaced by the circuit produced by fourier_checking,
91
+ # as the latter produces a slightly different circuit, with DiagonalGates instead
92
+ # of Diagonal circuits.
93
+ circuit = QuantumCircuit(int(num_qubits), name=f"fc: {f}, {g}")
86
94
  circuit.h(circuit.qubits)
87
-
88
95
  circuit.compose(Diagonal(f), inplace=True)
89
-
90
96
  circuit.h(circuit.qubits)
91
-
92
97
  circuit.compose(Diagonal(g), inplace=True)
93
-
94
98
  circuit.h(circuit.qubits)
95
-
96
99
  super().__init__(*circuit.qregs, name=circuit.name)
97
100
  self.compose(circuit.to_gate(), qubits=self.qubits, inplace=True)
101
+
102
+
103
+ def fourier_checking(f: Sequence[int], g: Sequence[int]) -> QuantumCircuit:
104
+ """Fourier checking circuit.
105
+
106
+ The circuit for the Fourier checking algorithm, introduced in [1],
107
+ involves a layer of Hadamards, the function :math:`f`, another layer of
108
+ Hadamards, the function :math:`g`, followed by a final layer of Hadamards.
109
+ The functions :math:`f` and :math:`g` are classical functions realized
110
+ as phase oracles (diagonal operators with {-1, 1} on the diagonal).
111
+
112
+ The probability of observing the all-zeros string is :math:`p(f,g)`.
113
+ The algorithm solves the promise Fourier checking problem,
114
+ which decides if f is correlated with the Fourier transform
115
+ of g, by testing if :math:`p(f,g) <= 0.01` or :math:`p(f,g) >= 0.05`,
116
+ promised that one or the other of these is true.
117
+
118
+ The functions :math:`f` and :math:`g` are currently implemented
119
+ from their truth tables but could be represented concisely and
120
+ implemented efficiently for special classes of functions.
121
+
122
+ Fourier checking is a special case of :math:`k`-fold forrelation [2].
123
+
124
+ **Reference Circuit:**
125
+
126
+ .. plot::
127
+ :include-source:
128
+
129
+ from qiskit.circuit.library import fourier_checking
130
+ circuit = fourier_checking([1, -1, -1, -1], [1, 1, -1, -1])
131
+ circuit.draw('mpl')
132
+
133
+ **Reference:**
134
+
135
+ [1] S. Aaronson, BQP and the Polynomial Hierarchy, 2009 (Section 3.2).
136
+ `arXiv:0910.4698 <https://arxiv.org/abs/0910.4698>`_
137
+
138
+ [2] S. Aaronson, A. Ambainis, Forrelation: a problem that
139
+ optimally separates quantum from classical computing, 2014.
140
+ `arXiv:1411.5729 <https://arxiv.org/abs/1411.5729>`_
141
+ """
142
+ num_qubits = math.log2(len(f))
143
+
144
+ if len(f) != len(g) or num_qubits == 0 or not num_qubits.is_integer():
145
+ raise CircuitError(
146
+ "The functions f and g must be given as truth "
147
+ "tables, each as a list of 2**n entries of "
148
+ "{1, -1}."
149
+ )
150
+ num_qubits = int(num_qubits)
151
+
152
+ circuit = QuantumCircuit(num_qubits, name=f"fc: {f}, {g}")
153
+ circuit.h(circuit.qubits)
154
+ circuit.append(DiagonalGate(f), range(num_qubits))
155
+ circuit.h(circuit.qubits)
156
+ circuit.append(DiagonalGate(g), range(num_qubits))
157
+ circuit.h(circuit.qubits)
158
+ return circuit
@@ -14,7 +14,7 @@
14
14
 
15
15
  from .diagonal import Diagonal, DiagonalGate
16
16
  from .permutation import Permutation, PermutationGate
17
- from .mcmt import MCMT, MCMTVChain
17
+ from .mcmt import MCMT, MCMTVChain, MCMTGate
18
18
  from .gms import GMS, MSGate
19
19
  from .gr import GR, GRX, GRY, GRZ
20
20
  from .pauli import PauliGate