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
mit den besetzten und den virtuellen Orbitalen sowie den vom Operator bereitgestellten Amplituden und , 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:
UCCSDOpRestrictedRealundUCCSDOpRestrictedteilen sich eine räumliche Parametrisierung zwischen beiden Spinsektoren:t1hat die Form und(nocc, nvrt)t2hat die Form(nocc, nocc, nvrt, nvrt).UCCSDOpUnrestrictedRealund die Spinsektoren unabhängig voneinanderUCCSDOpUnrestrictedparametrisieren:t1ist ein Paar(t1a, t1b)undt2ein Tripel(t2aa, t2ab, t2bb).
Der Cluster-Operator sieht immer nur den Teil eines „Same-Spin“- -Blocks, der unter dem simultanen Austausch symmetrisch ist, da die zugrunde liegende Anregung invariant gegenüber einer Umbenennung der Paare 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.
Im Gegensatz UCJdazu beinhaltet dieser Ansatz keine eigene abschließende Orbitalrotation: Seine „ “-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.
Da die einzelnen Anregungsterme von „ “ 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.
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.
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
ffsimist. - TypeError – wenn nicht zu den vier UCCSD-Operatortypen von ffsim
uccsd_opgehö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 „ “ 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 „ “, wobei der hermitische Operator durch „ “ gegeben ist. Dieses „ “ 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 der Produktformel wird, und durch Multiplikation mit 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 als FermionOperator.
Rückgabetyp
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