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 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
où les sont les coefficients des termes/groupes échantillonnés. Le produit ordonné des évolutions échantillonnées ne reproduit pas exactement l' ; 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.
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.
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 emplacementsnum_termspour ce terme. Cela nécessite qu'unePrepareSlaterDeterminantporte ouInitializeModesprécède lesEvolutionportes 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 unUserWarningest émis à la place. TouteOrbitalRotationporte rencontrée avant ou entre ces portesEvolutionmet é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é. UnePrepareSlaterDeterminantporte met à jour ces ensembles de la même manière que le feraient sesOrbitalRotationcomposants etInitializeModess'ils étaient appliqués successivement : elle initialise les ensembles « occupé » et « inoccupé » à partir de sonoccupation, puis marque immédiatement chaque mode sur lequel elle agit comme « incertain » en raison de sa rotation. Consultez la chaîne de documentationrun()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é avecnp.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
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
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