Skip to main content
IBM Quantum Platform

UCC

class UCC(uccsd_op)

Basen: FermionicGate

Implementiert den UCCSD-Ansatz (Unitary Coupled-Cluster Singles and Doubles).

Ein unitärer Coupled-Cluster-Operator hat die Form

eT−T†,T=∑iatia aa†ai+∑ijabtijab aa†ab†ajai,e^{T - T^\dagger}, \qquad T = \sum_{ia} t^a_i\, a^\dagger_a a_i + \sum_{ijab} t^{ab}_{ij}\, a^\dagger_a a^\dagger_b a_j a_i,

mit den besetzten i,ji, j und den virtuellen a,ba, b Orbitalen sowie den vom Operator bereitgestellten Amplituden t1=tiat_1 = t^a_i und t2=tijabt_2 = t^{ab}_{ij}, um die sich dieses Gate wickelt.

Der Operator selbst wird von ffsim erstellt, und dieses Gatter wandelt ihn in ein FermionicCircuit. um. Diese Arbeitsteilung ist bewusst gewählt: ffsim ist für die mathematischen Grundlagen zuständig (die Amplitudenkonventionen und die Parametervektor-Packung, die ein Variationsoptimierer steuert), während dieses Gate das Ergebnis als fermionische Moden ausdrückt, sodass der Transpiler es durch eine beliebige Fermion-zu-Qubit-Kodierung umsetzen kann. ffsim liefert überhaupt kein Qiskit-Gate für UCCSD aus, daher ist dies der einzige Weg von einem seiner UCCSD-Operatoren zu einer Schaltung; siehe den ffsim-Beziehungsleitfaden.

Akzeptiert jeden der vier UCCSD-Operatoren von ffsim, deren Typ die Spinvariante und die Anzahl der Moden festlegt, auf die dieses Gatter wirkt. Alle vier wirken auf 2 * norb Block-Spin-Moden ein (Modus p ist das Alpha-Orbital p, Modus norb + p ist das Beta-Orbital p), wobei die besetzten Orbitalen vor den virtuellen aufgeführt werden:

Anmerkung

Der Cluster-Operator sieht immer nur den Teil eines „Same-Spin“- t2t_2 -Blocks, der unter dem simultanen Austausch t2[i,j,a,b]=t2[j,i,b,a]t_2[i,j,a,b] = t_2[j,i,b,a] symmetrisch ist, da die zugrunde liegende Anregung aa†ab†ajaia^\dagger_a a^\dagger_b a_j a_i invariant gegenüber einer Umbenennung der Paare (i,a)↔(j,b)(i,a) \leftrightarrow (j,b) ist. Coupled-Cluster-Amplituden (von PySCF, oder aus ffsim selbst uccsd_generator_restricted()) weisen stets diese Symmetrie auf, sodass dieses Gate und ffsim in diesem Punkt exakt übereinstimmen. Ein handgeschriebener Ausdruck ohne t2 dieses Element beschreibt hier denselben Ansatz wie sein symmetrisiertes Gegenstück, während ffsim den Roh-Tensor ausliest.

Anmerkung

Im Gegensatz UCJdazu beinhaltet dieser Ansatz keine eigene abschließende Orbitalrotation: Seine „ t1t_1 “-Amplituden liefern bereits die einzelnen Anregungen, sodass eine nachgelagerte Rotation eine redundante Freiheit darstellen würde. Die Operatoren von ffsim geben ein final_orbital_rotation; aus; wenn eines gesetzt ist, fügt dieses Gate es als schließendes. an OrbitalRotation.

Anmerkung

Da die einzelnen Anregungsterme von „ T−T†T - T^\dagger “ nicht kommutieren, stellt der durch dieses definition() Gatter erzeugte Schaltkreis eine Produktformel-Näherung erster Ordnung (Trotter) der Exponentialfunktion dar und keine exakte Zerlegung (was bei UCC-Ansatzschaltkreisen üblicherweise der Fall ist). Der Simulationspfad des Zustandsvektors (_apply_unitary_placed_()) wendet die Exponentialfunktion hingegen exakt über scipydie von an expm_multiply. Folglich stimmen das simulierte Gatter und seine synthetisierte Schaltung nur bis auf den Trotter-Fehler überein; verwenden Sie bei der Transpilierung eine Produktformel höherer Ordnung, um diesen Fehler zu verringern.

Anmerkung

ffsim unterstützt Windows nicht (aufgrund seiner bedingungslosen Abhängigkeit von „ PySCF “), daher erfordert dieses Gate das zusätzliche ffsim „( )pip install "qiskit-fermions[ffsim]"“ und ist dort nicht verfügbar. Verwenden Sie WSL unter Windows.

Vorsicht

Dies ist ein früher Entwicklungsprototyp. Bitte beachten Sie, dass es während der Entwicklungsphase vor der Veröffentlichung dieses Pakets ohne Vorankündigung zu Änderungen an der Benutzeroberfläche kommen kann.

>>> import ffsim
>>> import numpy as np
>>> from qiskit_fermions.circuit.library import UCC
>>> uccsd_op = ffsim.UCCSDOpRestrictedReal(
...     t1=np.zeros((1, 1)), t2=np.zeros((1, 1, 1, 1))
... )
>>> gate = UCC(uccsd_op)
>>> gate.norb, gate.num_modes
(2, 4)

Die Initialisierung einer Instanz dieses Gatters kann mit dem unten aufgeführten Argument erfolgen.

Parameter

uccsd_op (Any) – den ffsim-UCCSD-Operator, aus dem die Schaltung aufgebaut werden soll: entweder UCCSDOpRestrictedReal, UCCSDOpRestricted, oder UCCSDOpUnrestrictedReal UCCSDOpUnrestricted. Sein Typ bestimmt die Spin-Variante (siehe die Docstring der Klasse).

Erhöhungen

  • MissingOptionalLibraryError – falls nicht installiert ffsim ist.
  • TypeError – wenn nicht zu den vier UCCSD-Operatortypen von ffsim uccsd_op gehört.

Attribute

norb

Die Anzahl der Raumorbitale.

uccsd_op

Der ffsim-UCCSD-Operator, auf dem die Schaltung dieses Gatters basiert.


Methoden

cluster_operator

cluster_operator()

Gibt den antihermitischen Clustergenerator „ T−T†T - T^\dagger “ zurück.

Der Generator wird gemäß der Konvention für den Block-Spin-Modus ausgedrückt (Modus p ist das Alpha-Orbital p, Modus norb + p ist das Beta-Orbital p). Besetzte Orbitalen werden vor virtuellen Orbitalen aufgeführt.

Da dieser Generator antihermitisch ist, steht er mit dem ansatzunitären Operator in der Beziehung „ eT−T†=e−iHe^{T - T^\dagger} = e^{-i H} “, wobei der hermitische Operator durch „ H=i(T−T†)H = i (T - T^\dagger) “ gegeben ist. Dieses „ HH “ ist das, was verbraucht Evolution , da es einen hermitischen Operator erfordert, um einen unitären Operator zu erzeugen, und auf diese Weise _build_definition() drückt den Ansatz aus.

Der Operator „returned“ überträgt groups dieses Paar aus jeder Anregung und ihrem hermitischen Konjugierten. Diese Gruppierung ist tragend: Sie zerlegt Evolution sich Gruppe für Gruppe, sodass jede Gruppe zu einem Faktor e−iHke^{-i H_k} der Produktformel wird, und durch Multiplikation mit ii bleibt jede Gruppe für sich genommen hermitisch – folglich ist jeder Faktor ein echtes Unitar. Eine Aufteilung nach einzelnen Termen wäre hingegen nicht sinnvoll (siehe den Kommentar unten).

Rückgabe

Der Cluster-Generator T−T†T - T^\dagger als FermionOperator.

Rückgabetyp

FermionOperator

Protokollmethoden

_apply_unitary_placed_

_apply_unitary_placed_(vec, norb, nelec, copy, freg_indices)

Wendet den Ansatz an, nachdem dessen Moden auf die globalen Moden des Vektors abgebildet wurden.

Dadurch wird die Definition des Gatters (die Entwicklung des Cluster-Operators) erstellt und auf angewendet vec, wobei die Definitionsschaltung auf die globalen Moden aufgebracht wird freg_indices. Da das einzelne der Definition den gesamten Clustergenerator enthält Evolution , _apply_unitary_placed_ potenziert es diesen genau (über scipy``expm_multiply) – daher entsteht bei diesem Pfad im Gegensatz zur synthetisierten Schaltung kein Trotter-Fehler. Die genaue Gate-Sequenz finden Sie _define() unter.

Parameter

  • vec (ndarray) – der Zustandsvektor, auf den die Aktion angewendet werden soll.
  • norb (int) – die Anzahl der räumlichen Orbitalen des globalen Zustandsvektors.
  • nelec (int |tuple[int, int]) – entweder eine einzelne ganze Zahl für ein spinloses System oder ein Paar ganzer Zahlen, das die Anzahl der Alpha- und Beta-Fermionen angibt.
  • copy (bool) – ob der Vektor vor der Bearbeitung kopiert werden soll.
  • freg_indices (list[int]) – die absoluten (globalen) Modenindizes, auf die die lokalen Moden dieses Gatters abgebildet werden.

Rückgabe

Der transformierte Vektor.

Rückgabetyp

ndarray

War diese Seite hilfreich?
Melden Sie auf GitHub einen Fehler, einen Tippfehler oder fordern Sie Inhalte an.