Skip to main content
IBM Quantum Platform

UCC

class UCC(uccsd_op)

Bases : FermionicGate

Met en œuvre l'approche UCCSD (Unitary Coupled-Cluster Singles and Doubles).

Un opérateur de type « coupled-cluster » unitaire se présente sous la forme suivante :

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,

avec les orbitales occupées i,ji, j et les orbitales virtuelles a,ba, b, ainsi que les amplitudes t1=tiat_1 = t^a_i et t2=tijabt_2 = t^{ab}_{ij} fournies par l'opérateur, cette porte s'enroule.

L'opérateur lui-même est généré par ffsim, et cette porte le transforme en un FermionicCircuit. Cette répartition des tâches est délibérée : ffsim gère les aspects mathématiques de l'ansatz (les conventions d'amplitude et le regroupement des vecteurs de paramètres pilotés par un optimiseur variationnel), tandis que cette porte exprime le résultat sous forme de modes fermioniques afin que le transpileur puisse le convertir à l'aide de n'importe quel codage fermion-qubit. ffsim ne fournit aucune porte Qiskit pour l'UCCSD; c'est donc la seule voie permettant de relier l'un de ses opérateurs UCCSD à un circuit; voir le guide des relations ffsim.

Accepte n'importe lequel des quatre opérateurs UCCSD de ffsim, dont le type détermine la variante de spin et le nombre de modes sur lesquels cette porte agit. Ces quatre modes agissent sur les modes de spin 2 * norb par bloc (le mode p correspond à l’orbitale alpha p, le mode norb + p à l’orbitale bêta p), les orbitales occupées étant classées avant les orbitales virtuelles :

Remarque

L'opérateur de cluster ne voit jamais que la partie d'un bloc d' t2t_2 s de même spin qui est symétrique sous l'échange simultané t2[i,j,a,b]=t2[j,i,b,a]t_2[i,j,a,b] = t_2[j,i,b,a], car l' aa†ab†ajaia^\dagger_a a^\dagger_b a_j a_i d'excitation sous-jacente est invariante sous le réétiquetage des paires (i,a)↔(j,b)(i,a) \leftrightarrow (j,b). Les amplitudes de type « coupled-cluster » (provenant de PySCF, ou de celles propres à ffsim uccsd_generator_restricted()) conservent toujours cette symétrie; ce portail et ffsim s'accordent donc parfaitement sur ce point. Une construction manuelle sans t2 cela décrit ici la même approche que son équivalent symétrisé, tandis que ffsim lit le tenseur brut.

Remarque

Contrairement à UCJ, cette approche n'implique aucune rotation orbitale finale propre : ses amplitudes d' t1t_1 s fournissent déjà les excitations individuelles, de sorte qu'une rotation postérieure constituerait une liberté redondante. Les opérateurs de ffsim exposent un final_orbital_rotation; lorsqu'un tel caractère est défini, cette porte l'ajoute à la fin sous la forme d'un. de fermeture OrbitalRotation.

Remarque

Étant donné que les termes d'excitation individuels de l' T−T†T - T^\dagger ne commutent pas, le circuit produit par cette definition() porte est une approximation de la fonction exponentielle par une formule de produit du premier ordre (Trotter), et non une décomposition exacte (ce qui est le cas habituellement pour les circuits d'ansatz UCC). La méthode de simulation par vecteur d'état (_apply_unitary_placed_()), en revanche, applique l'exponentielle de manière exacte via scipyles expm_multiply. Par conséquent, la porte simulée et son circuit synthétisé ne concordent que dans les limites de l'erreur de Trotter; utilisez une formule de produit d'ordre supérieur lors de la transpilation pour réduire cette erreur.

Remarque

ffsim ne prend pas en charge Windows (en raison de sa dépendance inconditionnelle à l' PySCF ), ce qui rend l'utilisation de la fonction extra ffsim (pip install "qiskit-fermions[ffsim]") obligatoire dans ce cas et la rend indisponible sous Windows. Utilisez WSL sous Windows.

Attention

Il s'agit d'un prototype de développement précoce. Attention aux modifications de l'interface pouvant survenir sans préavis pendant la phase de développement préliminaire de ce logiciel.

>>> 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'initialisation d'une instance de cette porte s'effectue à l'aide de l'argument indiqué ci-dessous.

Paramètres

uccsd_op (Any) – l'opérateur ffsim UCCSD à partir duquel construire le circuit, à savoir l'un des éléments suivants UCCSDOpRestrictedReal:, UCCSDOpRestricted, ou UCCSDOpUnrestrictedReal UCCSDOpUnrestricted. Son type détermine la variante de spin (voir la chaîne de documentation de la classe).

Augmentations

  • MissingOptionalLibraryError – si n'est ffsim pas installé.
  • TypeError – si n'est uccsd_op pas l'un des quatre types d'opérateurs UCCSD de ffsim.

Attributs

norb

Le nombre d'orbitales spatiales.

uccsd_op

L'opérateur ffsim UCCSD à partir duquel cette porte construit son circuit.


Méthodes

cluster_operator

cluster_operator()

Renvoie le générateur de grappes anti-hermitéen T−T†T - T^\dagger.

Le générateur est exprimé selon la convention du mode « bloc-spin » (le mode p correspond à l'orbitale alpha p, le mode norb + p à l'orbitale bêta p). Les orbitales occupées sont classées avant les orbitales virtuelles.

Étant anti-hermiten, ce générateur est lié à l'ansatz unitaire par la relation eT−T†=e−iHe^{T - T^\dagger} = e^{-i H}, avec l' H=i(T−T†)H = i (T - T^\dagger) hermiten. C'est cette relation HH qui « consomme Evolution », puisqu'elle nécessite un opérateur hermiten pour produire un opérateur unitaire, et c'est ainsi que l'ansatz est _build_definition() exprimé.

L'opérateur inversé associe groups à chaque excitation son conjugué hermitien. Ce regroupement est porteur : il se décompose Evolution groupe par groupe, de sorte que chaque groupe devient un facteur e−iHke^{-i H_k} de la formule du produit, et la multiplication par ii rend chaque groupe individuellement hermitien – chaque facteur est donc un véritable unitaire. En revanche, effectuer le fractionnement terme par terme ne serait pas la bonne solution (voir le commentaire ci-dessous).

Retours

Le générateur de clusters T−T†T - T^\dagger en tant que FermionOperator.

Type de retour

FermionOperator

Méthodes protocolaires

_apply_unitary_placed_

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

Applique l'ansatz après avoir superposé ses modes aux modes globaux du vecteur.

Cela permet de construire la définition de la porte (l'évolution de l'opérateur de grappe) et de l'appliquer à vec, le circuit de définition étant placé sur les modes globaux freg_indices. Comme le seul élément de la définition contient Evolution l 'ensemble du générateur de grappes, son propre élément l'élève _apply_unitary_placed_ à la puissance exacte (via scipyles expm_multiply) – ce chemin ne génère donc aucune erreur de Trotter, contrairement au circuit synthétisé. Voir _define() pour connaître la séquence exacte des portes.

Paramètres

  • vec (ndarray) – le vecteur d'état sur lequel agir.
  • norb (int) – le nombre d'orbitales spatiales du vecteur d'état global.
  • nelec (int |tuple[int, int]) – soit un seul entier pour un système sans spin, soit une paire d'entiers indiquant le nombre de fermions de spin alpha et de spin bêta.
  • copy (bool) – s'il faut copier le vecteur avant d'effectuer une opération dessus.
  • freg_indices (list[int]) – les indices des modes absolus (globaux) auxquels se superposent les modes locaux de cette porte.

Retours

Le vecteur transformé.

Type de retour

ndarray

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.