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
@@ -0,0 +1,150 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2020.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Second-order Pauli-Z expansion circuit."""
14
+
15
+ from typing import Callable, List, Union, Optional, Dict, Tuple
16
+ import numpy as np
17
+ from qiskit.utils.deprecation import deprecate_func
18
+ from .pauli_feature_map import PauliFeatureMap
19
+
20
+
21
+ class ZZFeatureMap(PauliFeatureMap):
22
+ r"""Second-order Pauli-Z evolution circuit.
23
+
24
+ For 3 qubits and 1 repetition and linear entanglement the circuit is represented by:
25
+
26
+ .. code-block:: text
27
+
28
+ ┌───┐┌────────────────┐
29
+ ┤ H ├┤ P(2.0*φ(x[0])) ├──■───────────────────────────■───────────────────────────────────
30
+ ├───┤├────────────────┤┌─┴─┐┌─────────────────────┐┌─┴─┐
31
+ ┤ H ├┤ P(2.0*φ(x[1])) ├┤ X ├┤ P(2.0*φ(x[0],x[1])) ├┤ X ├──■───────────────────────────■──
32
+ ├───┤├────────────────┤└───┘└─────────────────────┘└───┘┌─┴─┐┌─────────────────────┐┌─┴─┐
33
+ ┤ H ├┤ P(2.0*φ(x[2])) ├─────────────────────────────────┤ X ├┤ P(2.0*φ(x[1],x[2])) ├┤ X ├
34
+ └───┘└────────────────┘ └───┘└─────────────────────┘└───┘
35
+
36
+ where :math:`\varphi` is a classical non-linear function, which defaults to :math:`\varphi(x) = x`
37
+ if and :math:`\varphi(x,y) = (\pi - x)(\pi - y)`.
38
+
39
+ Examples:
40
+
41
+ .. code-block::
42
+
43
+ from qiskit.circuit.library import ZZFeatureMap
44
+ prep = ZZFeatureMap(2, reps=1)
45
+ print(prep.decompose())
46
+
47
+ .. code-block:: text
48
+
49
+ ┌───┐┌─────────────┐
50
+ q_0: ┤ H ├┤ P(2.0*x[0]) ├──■──────────────────────────────────────■──
51
+ ├───┤├─────────────┤┌─┴─┐┌────────────────────────────────┐┌─┴─┐
52
+ q_1: ┤ H ├┤ P(2.0*x[1]) ├┤ X ├┤ P(2.0*(pi - x[0])*(pi - x[1])) ├┤ X ├
53
+ └───┘└─────────────┘└───┘└────────────────────────────────┘└───┘
54
+
55
+ .. code-block::
56
+
57
+ from qiskit.circuit.library import EfficientSU2
58
+ classifier = ZZFeatureMap(3).compose(EfficientSU2(3))
59
+ classifier.num_parameters
60
+
61
+ .. code-block:: text
62
+
63
+ 27
64
+
65
+ .. code-block::
66
+
67
+ classifier.parameters # 'x' for the data preparation, 'θ' for the SU2 parameters
68
+
69
+ .. code-block:: text
70
+
71
+ ParameterView([
72
+ ParameterVectorElement(x[0]), ParameterVectorElement(x[1]),
73
+ ParameterVectorElement(x[2]), ParameterVectorElement(θ[0]),
74
+ ParameterVectorElement(θ[1]), ParameterVectorElement(θ[2]),
75
+ ParameterVectorElement(θ[3]), ParameterVectorElement(θ[4]),
76
+ ParameterVectorElement(θ[5]), ParameterVectorElement(θ[6]),
77
+ ParameterVectorElement(θ[7]), ParameterVectorElement(θ[8]),
78
+ ParameterVectorElement(θ[9]), ParameterVectorElement(θ[10]),
79
+ ParameterVectorElement(θ[11]), ParameterVectorElement(θ[12]),
80
+ ParameterVectorElement(θ[13]), ParameterVectorElement(θ[14]),
81
+ ParameterVectorElement(θ[15]), ParameterVectorElement(θ[16]),
82
+ ParameterVectorElement(θ[17]), ParameterVectorElement(θ[18]),
83
+ ParameterVectorElement(θ[19]), ParameterVectorElement(θ[20]),
84
+ ParameterVectorElement(θ[21]), ParameterVectorElement(θ[22]),
85
+ ParameterVectorElement(θ[23])
86
+ ])
87
+
88
+ .. code-block::
89
+
90
+ classifier.count_ops()
91
+
92
+ .. code-block:: text
93
+
94
+ OrderedDict([('ZZFeatureMap', 1), ('EfficientSU2', 1)])
95
+
96
+ """
97
+
98
+ @deprecate_func(
99
+ since="1.3",
100
+ additional_msg=(
101
+ "Use the z_feature_map function as a replacement. Note that this will no longer "
102
+ "return a BlueprintCircuit, but just a plain QuantumCircuit."
103
+ ),
104
+ pending=True,
105
+ )
106
+ def __init__(
107
+ self,
108
+ feature_dimension: int,
109
+ reps: int = 2,
110
+ entanglement: Union[
111
+ str,
112
+ Dict[int, List[Tuple[int]]],
113
+ Callable[[int], Union[str, Dict[int, List[Tuple[int]]]]],
114
+ ] = "full",
115
+ data_map_func: Optional[Callable[[np.ndarray], float]] = None,
116
+ parameter_prefix: str = "x",
117
+ insert_barriers: bool = False,
118
+ name: str = "ZZFeatureMap",
119
+ ) -> None:
120
+ """Create a new second-order Pauli-Z expansion.
121
+
122
+ Args:
123
+ feature_dimension: Number of features.
124
+ reps: The number of repeated circuits, has a min. value of 1.
125
+ entanglement: Specifies the entanglement structure. Refer to
126
+ :class:`~qiskit.circuit.library.PauliFeatureMap` for detail.
127
+ data_map_func: A mapping function for data x.
128
+ parameter_prefix: The prefix used if default parameters are generated.
129
+ insert_barriers: If True, barriers are inserted in between the evolution instructions
130
+ and hadamard layers.
131
+
132
+ Raises:
133
+ ValueError: If the feature dimension is smaller than 2.
134
+ """
135
+ if feature_dimension < 2:
136
+ raise ValueError(
137
+ "The ZZFeatureMap contains 2-local interactions and cannot be "
138
+ f"defined for less than 2 qubits. You provided {feature_dimension}."
139
+ )
140
+
141
+ super().__init__(
142
+ feature_dimension=feature_dimension,
143
+ reps=reps,
144
+ entanglement=entanglement,
145
+ paulis=["Z", "ZZ"],
146
+ data_map_func=data_map_func,
147
+ parameter_prefix=parameter_prefix,
148
+ insert_barriers=insert_barriers,
149
+ name=name,
150
+ )
@@ -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