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 :
avec les orbitales occupées et les orbitales virtuelles , ainsi que les amplitudes et 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 :
UCCSDOpRestrictedRealetUCCSDOpRestrictedpartagent une même paramétrisation spatiale entre les deux secteurs de spin :t1a la forme et(nocc, nvrt)t2a la forme(nocc, nocc, nvrt, nvrt).UCCSDOpUnrestrictedRealetUCCSDOpUnrestrictedparamétrer les secteurs de spin indépendamment :t1est une paire et(t1a, t1b)t2un triplet(t2aa, t2ab, t2bb).
L'opérateur de cluster ne voit jamais que la partie d'un bloc d' s de même spin qui est symétrique sous l'échange simultané , car l' d'excitation sous-jacente est invariante sous le réétiquetage des paires . 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.
Contrairement à UCJ, cette approche n'implique aucune rotation orbitale finale propre : ses amplitudes d' 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.
Étant donné que les termes d'excitation individuels de l' 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.
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.
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
ffsimpas installé. - TypeError – si n'est
uccsd_oppas 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 .
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 , avec l' hermiten. C'est cette relation 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 de la formule du produit, et la multiplication par 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 en tant que FermionOperator.
Type de retour
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