Skip to main content
IBM Quantum Platform

QDriftTrotterization

class QDriftTrotterization(num_terms, *, filter_trivial=False, rng=None)

Bases : GenericPass[DAGCircuit, DAGCircuit]

Une passe de transpilation visant à « trotteriser » les portes Evolution à l'aide du protocole « qDRIFT ».

Ce passage remplace l'évolution exacte eitHe^{-i t H} de chaque Evolution porte par une formule de produit aléatoire : il prélève des échantillons num_terms parmi les termes de l'hamiltonien (ou groups, s'il est défini), chaque terme étant échantillonné avec une probabilité proportionnelle à la valeur absolue de son coefficient, et génère une Evolution porte par échantillon. Chaque porte échantillonnée fait évoluer son terme (de magnitude unitaire et conservant le signe) pendant la même durée

δ=λtnum_terms,λ=jcj,\delta = \frac{\lambda t}{\texttt{num\_terms}}, \qquad \lambda = \sum_j |c_j|,

où les cjc_j sont les coefficients des termes/groupes échantillonnés. Le produit ordonné des évolutions échantillonnées ne reproduit pas exactement l' eitHe^{-i t H}; en revanche, sa valeur attendue sur l'échantillon s'approche de l'évolution exacte, avec une erreur qui diminue à mesure que augmente num_terms . Comme le résultat dépend des tirages aléatoires, il varie d'une exécution à l'autre, sauf si une valeur fixe est rng fournie.

Conseil

Les termes diagonaux dans la base occupation-nombre (c'est-à-dire les produits d'opérateurs numériques) n'ont aucun effet sur les chaînes de bits échantillonnées; leur inclusion ne fait donc qu'augmenter la surcharge liée à l'échantillonnage. Filtrez-les à l'aide de filter_diagonal_terms() sur l'hamiltonien avant de construire la Evolution porte, plutôt qu'à chaque appel à run(): cette étape s'exécute une fois par circuit transpilé; ainsi, effectuer le filtrage en amont évite de répéter le même travail de filtrage pour chaque circuit généré à partir du même hamiltonien.

Voir aussi

Le protocole « qDRIFT » a été présenté dans arXiv:1811.08017.

L'initialisation de ce passage du transcompilateur peut être effectuée à l'aide des arguments indiqués ci-dessous.

Paramètres

  • num_terms (int) – le nombre de termes à échantillonner pour la « trotterisation » d’ qDRIFT. Cela correspond au nombre de portes Evolution émises par porte d'entrée; une valeur plus élevée réduit l'erreur de trotterisation, au prix d'un circuit plus profond.
  • filter_trivial (bool) – Lorsqu'il est réglé sur True, la boucle d'échantillonnage rejette un terme échantillonné à moins qu'il ne couple un mode connu pour être occupé à un mode connu pour être inoccupé. Tout terme n'agissant que dans l'un de ces deux ensembles ne peut pas modifier l'occupation et n'a donc aucun effet sur une chaîne de bits échantillonnée; ainsi, le tirage au sort permet d'éviter de gaspiller l'un des emplacements num_terms pour ce terme. Cela nécessite qu'une PrepareSlaterDeterminant porte ou InitializeModes précède les Evolution portes soumises à la méthode de Trotter (afin d'initialiser les ensembles de modes occupés et inoccupés); si aucune n'est trouvée, ou si les ensembles de modes qu'elle initialise s'avèrent être entièrement occupés ou entièrement inoccupés, le filtrage est ignoré pour cette porte et un UserWarning est émis à la place. Toute OrbitalRotation porte rencontrée avant ou entre ces portes Evolution met également à jour ces ensembles : chaque mode sur lequel elle agit devient « incertain » (puisque la rotation peut le mélanger avec n’importe quel autre mode qu’elle touche), tout comme un mode touché par un terme d’ qDRIFT e accepté. Une PrepareSlaterDeterminant porte met à jour ces ensembles de la même manière que le feraient ses OrbitalRotation composants et InitializeModes s'ils étaient appliqués successivement : elle initialise les ensembles « occupé » et « inoccupé » à partir de son occupation, puis marque immédiatement chaque mode sur lequel elle agit comme « incertain » en raison de sa rotation. Consultez la chaîne de documentation run() pour connaître la règle d'acceptation exacte.
  • rng (np.random.Generator | int | None) – le générateur de nombres aléatoires (GNA) à utiliser. Lorsqu'il s'agit d'un int, le générateur de nombres aléatoires interne sera initialisé avec np.random.default_rng(seed=rng).

Attributs

MAX_SAMPLE_RETRIES

Valeur par défaut : 1000000

Le nombre maximal d'échantillons rejetés consécutifs toléré par filter_trivial avant que celui-ci n'abandonne run() et ne déclenche RuntimeError. Cela permet d'éviter une boucle infinie lorsque les termes restants de l’hamiltonien ne peuvent pas relier les ensembles de modes occupés et inoccupés suivis — par exemple, lorsque ces deux ensembles restent petits et disjoints (peu de modes ont été marqués comme occupés ou inoccupés, et aucun n’est encore devenu « incertain ») et que le support d’aucun terme restant ne touche les deux ensembles.

num_terms

Le nombre de termes à inclure dans la « trotterisation » d' qDRIFT.

filter_trivial

Détermine s'il faut rejeter les termes échantillonnés qui ne peuvent pas affecter la chaîne de bits échantillonnée (voir la documentation de la classe pour l'argument filter_trivial ).


Méthodes

run

run(dag)

Exécute cette passe de transpilation.

Chaque Evolution nœud est remplacé par des portes Evolution à un seul terme num_terms échantillonnées (voir la chaîne de documentation de la classe). Les nœuds qui ne sont pas des Evolution portes sont copiés tels quels vers la sortie. L'échantillonnage étant aléatoire, le résultat varie d'une exécution à l'autre, sauf si la graine a rng été définie.

Lorsque filter_trivial est défini, cette méthode suit les ensembles de modes dont on sait qu'ils sont occupés ou inoccupés, à partir d'une ou plusieurs InitializeModes portes précédant les Evolution portes du circuit (plusieurs de ces portes placées en parallèle, par exemple une par secteur de spin, sont cumulées). Un terme échantillonné n'est accepté que si son support recoupe les deux ensembles, c'est-à-dire s'il associe un mode connu comme occupé à un mode connu comme inoccupé; dans le cas contraire, il est écarté et rééchantillonné, car il ne peut pas influencer la chaîne de bits échantillonnée. Une fois qu’un terme est accepté, chaque mode figurant dans son ensemble de soutien devient « incertain » et est ajouté aux deux ensembles, ce qui le rend éligible pour jouer l’un ou l’autre rôle dans les échantillons suivants. Toute porte OrbitalRotation présente dans le circuit met à jour ces ensembles de la même manière : chaque mode sur lequel elle agit devient lui aussi « incertain », car la rotation peut le mélanger avec n’importe quel autre mode de son support. Une porte PrepareSlaterDeterminant logique est considérée comme la combinaison de ses OrbitalRotation composantes et InitializeModes appliquées dos à dos : sa première occupation composante définit les ensembles « occupé » et « inoccupé », puis chaque mode sur lequel elle agit est immédiatement marqué comme « incertain », puisqu’elle comporte également une rotation.

Paramètres

dag (DAGCircuit) – le circuit d'entrée avec des instructions basées sur les fermions. Seules les instances FermionicGate telles qu’elles op sont prises en charge DAGOpNode sont acceptées.

Retours

Le circuit de sortie, qui agit toujours sur un registre fermionique.

Augmentations

RuntimeError – si est filter_trivial True et que échantillons consécutifs MAX_SAMPLE_RETRIES sont rejetés sans qu'un terme non trivial ait pu être généré.

Type de retour

DAGCircuit

Méthodes héritées

execute

execute(passmanager_ir, state, callback=None)

Exécuter la tâche d'optimisation pour le fichier IR Qiskit fourni.

Paramètres

  • passmanager_ir (IR) – IR de Qiskit à optimiser.
  • state (PassManagerState) – État associé à l'exécution du workflow par le gestionnaire de passes lui-même.
  • callback (Callable[[Task, IR_OUT, PropertySet, float, int], None] | None) – Une fonction de rappel qui est appelée à chaque exécution d'une tâche d'optimisation.

Retours

Optimisation de l'IR de Qiskit et état d'avancement du flux de travail.

Type de retour

tuple [ IR_OUT, PassManagerState ]

name

name()

Nom du col.

Type de retour

str

update_status

update_status(state, run_state)

Mettre à jour le statut du workflow.

Paramètres

  • state (PassManagerState) – Transmettre l'état du gestionnaire pour la mise à jour.
  • run_state (RunState) – État d'avancement de la tâche en cours.

Retours

Mise à jour de l'état du gestionnaire de pass.

Type de retour

PassManagerState

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