Skip to main content
IBM Quantum Platform

UCC

class UCC(uccsd_op)

Basi: FermionicGate

Implementa l'approccio UCCSD (Unitary Coupled-Cluster Singles and Doubles).

Un operatore unitario di tipo "coupled-cluster" ha la forma

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,

con orbitali occupati i,ji, j e orbitali virtuali a,ba, b, e le ampiezze t1=tiat_1 = t^a_i e t2=tijabt_2 = t^{ab}_{ij} fornite dall'operatore, questo gate si chiude.

L'operatore stesso è generato da ffsim, e questo gate lo trasforma in un FermionicCircuit. Questa divisione dei compiti è intenzionale: ffsim gestisce la parte matematica dell'ansatz (le convenzioni relative all'ampiezza e l'organizzazione del vettore dei parametri su cui agisce l'ottimizzatore variazionale), mentre questo gate esprime il risultato sotto forma di modi fermionici, in modo che il transpiler possa tradurlo utilizzando qualsiasi codifica da fermioni a qubit. ffsim non fornisce alcun gate Qiskit per UCCSD, quindi questa è l'unica via per passare da uno dei suoi operatori UCCSD a un circuito; consultare la guida alle relazioni di ffsim.

Accetta uno qualsiasi dei quattro operatori UCCSD di ffsim, il cui tipo determina la variante di spin e il numero di modi su cui agisce questo gate. Tutti e quattro agiscono sui modi di spin 2 * norb a blocchi (il modo p è l'orbitale alfa p, il modo norb + p è l'orbitale beta p), con gli orbitali occupati elencati prima di quelli virtuali:

Nota

L'operatore del cluster vede sempre e solo la parte di un blocco “ t2t_2 ” a spin uguale che è simmetrica rispetto allo scambio simultaneo t2[i,j,a,b]=t2[j,i,b,a]t_2[i,j,a,b] = t_2[j,i,b,a], poiché l’eccitazione sottostante aa†ab†ajaia^\dagger_a a^\dagger_b a_j a_i è invariante rispetto alla rietichettatura delle coppie (i,a)↔(j,b)(i,a) \leftrightarrow (j,b). Le ampiezze del metodo “coupled-cluster” (tratte da PySCF, o dallo stesso ffsim uccsd_generator_restricted()) presentano sempre tale simmetria, quindi questo gate e ffsim concordano perfettamente su di esse. Un oggetto creato manualmente senza t2 tale parametro descrive qui lo stesso approccio della sua controparte simmetrizzata, mentre ffsim legge il tensore grezzo.

Nota

A differenza di UCJ, questo approccio non comporta alcuna rotazione orbitale finale propria: le sue ampiezze di t1t_1 forniscono già le singole eccitazioni, quindi una rotazione secondaria costituirebbe una libertà ridondante. Gli operatori di ffsim espongono un final_orbital_rotation; quando ne viene impostato uno, questo gate lo aggiunge come punto di chiusura OrbitalRotation.

Nota

Poiché i singoli termini di eccitazione di T−T†T - T^\dagger** non** commutano, il circuito generato da questo definition() gate è un’approssimazione di primo ordine (formula di Trotter) dell’esponenziale, non una scomposizione esatta (come avviene solitamente nei circuiti basati sull’ansatz UCC). Il percorso di simulazione con vettore di stato (_apply_unitary_placed_()), al contrario, applica l’esponenziale in modo esatto tramite scipyi expm_multiply. Di conseguenza, la porta simulata e il suo circuito sintetizzato coincidono solo entro i limiti dell’errore di Trotter; per ridurre tale errore, utilizzare una formula di prodotto di ordine superiore durante la transpilazione.

Nota

ffsim non supporta Windows (a causa della sua dipendenza incondizionata da PySCF ), quindi questo gate richiede il comando extra ffsim (pip install "qiskit-fermions[ffsim]") e non è disponibile su tale sistema. Utilizza WSL su Windows.

Attenzione

Si tratta di un prototipo in fase iniziale di sviluppo. Si prega di prestare attenzione alle modifiche all'interfaccia che potrebbero essere apportate senza preavviso durante la fase di sviluppo pre-rilascio di questo pacchetto.

>>> 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)

L'inizializzazione di un'istanza di questo gate può essere effettuata utilizzando l'argomento indicato di seguito.

Parametri

uccsd_op (Any) – l'operatore ffsim UCCSD da utilizzare per costruire il circuito, scegliendo tra UCCSDOpRestrictedReal, UCCSDOpRestricted, o UCCSDOpUnrestrictedReal UCCSDOpUnrestricted. Il suo tipo determina la variante di spin (vedere la stringa di documentazione della classe).

Aumenti

  • MissingOptionalLibraryError – se non ffsim è installato.
  • TypeError – se non uccsd_op è uno dei quattro tipi di operatore UCCSD di ffsim.

Attributi

norb

Il numero degli orbitali spaziali.

uccsd_op

L'operatore ffsim UCCSD su cui si basa il circuito di questo gate.


Metodi

cluster_operator

cluster_operator()

Restituisce il generatore di cluster anti-ermitiano T−T†T - T^\dagger.

Il generatore è espresso secondo la convenzione della modalità a spin a blocchi (la modalità p corrisponde all’orbitale alfa p, la modalità norb + p corrisponde all’orbitale beta p). Gli orbitali occupati vengono elencati prima di quelli virtuali.

Essendo anti-ermitiano, questo generatore è correlato all'ansatz unitario tramite l' eT−T†=e−iHe^{T - T^\dagger} = e^{-i H}, con l' H=i(T−T†)H = i (T - T^\dagger) ermitiano. È proprio quell' HH che " Evolution consuma", poiché richiede un operatore ermitiano per produrre un operatore unitario, ed è così che " _build_definition() esprime" l'ansatz.

L'operatore inverso trasporta quella groups coppia, costituita da ogni eccitazione e dal suo coniugato ermitiano. Tale raggruppamento è portante: si scompone Evolution gruppo per gruppo, cosicché ogni gruppo diventa un fattore e−iHke^{-i H_k} della formula del prodotto, e moltiplicando per ii ogni gruppo risulta individualmente ermitiano – quindi ogni fattore è un vero e proprio unitario. Una suddivisione termine per termine, invece, non sarebbe appropriata (vedi il commento qui sotto).

Risultati

Il generatore di cluster T−T†T - T^\dagger come FermionOperator.

Tipo di restituzione

FermionOperator

Metodi del protocollo

_apply_unitary_placed_

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

Applica l'ansatz dopo aver mappato le sue modalità sulle modalità globali del vettore.

Questo crea la definizione della porta (l’evoluzione dell’operatore a grappolo) e la applica a vec, con il circuito di definizione posizionato sulle modalità globali freg_indices. Poiché l’unico elemento della definizione Evolution contiene l’ intero generatore a grappolo, il suo stesso elemento lo _apply_unitary_placed_ eleva esattamente a potenza (tramite scipy’s expm_multiply) – pertanto questo percorso non comporta alcun errore di Trotter, a differenza del circuito sintetizzato. Vedi _define() per la sequenza esatta dei gate.

Parametri

  • vec (ndarray) – il vettore di stato su cui agire.
  • norb (int) – il numero di orbitali spaziali del vettore di stato globale.
  • nelec (int |tuple[int, int]) – o un singolo numero intero per un sistema privo di spin, oppure una coppia di numeri interi che indicano il numero di fermioni con spin alfa e beta.
  • copy (bool) – se copiare il vettore prima di effettuare operazioni su di esso.
  • freg_indices (list[int]) – gli indici delle modalità assolute (globali) a cui si mappano le modalità locali di questo gate.

Risultati

Il vettore trasformato.

Tipo di restituzione

ndarray

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.