Skip to main content
IBM Quantum Platform

TwoQubitPeepholeOptimization

class qiskit.transpiler.passes.TwoQubitPeepholeOptimization(*args, **kwargs)

GitHub

Bases : TransformationPass

Optimisation unitaire unifiée à deux qubits par la méthode du « peephole »

Ce passage du transpileur est conçu pour effectuer une optimisation unitaire « peephole » à deux qubits. Cette étape identifie tous les blocs de 2 qubits du circuit, calcule l'opérateur unitaire correspondant à chaque bloc, puis synthétise cet opérateur unitaire. Si l'opération unitaire à deux qubits synthétisée est « meilleure » que le sous-circuit d'origine, ce sous-circuit est alors utilisé pour remplacer le sous-circuit d'origine. L'heuristique utilisée pour déterminer la meilleure option examine d'abord le nombre de portes à deux qubits dans le circuit et privilégie la synthèse comportant le moins de portes à deux qubits; si ce nombre est identique, elle examine ensuite la fidélité estimée du circuit et choisit le sous-circuit présentant la fidélité estimée la plus élevée; enfin, si nécessaire, elle choisit le sous-circuit comportant le moins de portes au total.

Si la cible est surcomplète, la passe testera tous les décomposeurs pris en charge pour toutes les portes disponibles sur un qubit donné. La décomposition qui présente les meilleures performances attendues selon l'heuristique ci-dessus sera sélectionnée et utilisée pour remplacer le bloc.

Cette passe est conçue pour être exécutée sur un circuit physique, et on suppose que les opérations effectuées sur un qubit donné correspondent au qubit matériel de la cible. Cependant, le résultat de cette étape peut ne pas utiliser d’opérations matérielles; plus précisément, des portes à un seul qubit peuvent être générées en dehors des opérations prises en charge par la cible, généralement uniquement si une porte paramétrée prise en charge par celle-ci TwoQubitControlledUDecomposer est utilisée pour la synthèse. Ainsi, si cette passe est exécutée au cours d'une étape d'optimisation physique (telle que l'étape d'optimisation ), elle doit être associée à des passes telles que BasisTranslator et/ou Optimize1qGatesDecomposition afin de garantir que ces portes à un seul qubit non conformes soient remplacées par des opérations prises en charge par le matériel avant la fin de l'étape.

Ce passage est multithread et effectuera l'analyse en parallèle, en utilisant tous les cœurs disponibles sur votre système local. Vous pouvez consulter le guide de configuration pour obtenir plus de détails sur la manière de contrôler le comportement du multithreading de Qiskit de manière plus générale, ce qui permettra également de contrôler cette étape

Ce passage fonctionne de la même manière que si vous exécutiez ConsolidateBlocks et UnitarySynthesis séquentiellement dans votre gestionnaire de passages. Cependant, cette passe offre de meilleures performances d'exécution grâce à la synthèse en parallèle. Il intègre également des heuristiques améliorées, rendues possibles par le fait que l'optimisation s'effectue en une seule étape, ce qui peut se traduire par des résultats de meilleure qualité, en particulier dans le cas de cibles surcomplètes et/ou hétérogènes. Toutefois, ces heuristiques et cette étape dans son ensemble ne s'appliquent qu'aux circuits physiques. De plus, contrairement à UnitarySynthesis « pass », cette fonction n'utilise pas les plugins de synthèse unitaire. Il s'agit d'un compromis en matière de performances, qui implique de renoncer à la modularité offerte par cette interface. En interne, il n'utilise actuellement que et TwoQubitControlledUDecomposer pour synthétiser les opérateurs TwoQubitBasisDecomposer unitaires à deux qubits. Vous ne devez pas utiliser ce pass si vous avez besoin de l'interface enfichable et de la possibilité d'utiliser différents algorithmes de synthèse; vous devriez plutôt utiliser une combinaison de ConsolidateBlocks et UnitarySynthesis pour tirer parti du mécanisme de plug-in dans UnitarySynthesis.

from qiskit.circuit import QuantumCircuit
from qiskit.transpiler.passes import TwoQubitPeepholeOptimization
from qiskit.providers.fake_provider import GenericBackendV2

# Build an unoptimized 2 qubit circuit
unoptimized = QuantumCircuit(2)
for i in range(10):
  if i % 2:
    unoptimized.cx(0, 1)
  else:
    unoptimized.cx(1, 0)
# Generate a target with random error rates
backend = GenericBackendV2(2, ["u", "cx"], coupling_map=[[0, 1], [1, 0]])
# Instantiate pass
peephole_pass = TwoQubitPeepholeOptimization(backend.target)
# Run pass and visualize output
optimized = peephole_pass(unoptimized)
optimized.draw("mpl")
Circuit optimisé

Initialiser le pass

Paramètres

  • cible – La cible pour laquelle la passe doit être effectuée
  • degree_of_approximation – cadran heuristique utilisé pour l'approximation de circuits (approximation de 1.0=no, approximation de 0.0=maximal ). L'approximation permet de réduire le nombre de portes utilisées dans les opérateurs unitaires synthétisés plus petits, au prix d'un écart par rapport à l'opérateur unitaire d'origine. Si None, l'approximation est effectuée sur la base des fidélités des portes spécifiées dans le target.

Attributs

is_analysis_pass

Vérifiez si le passage est un passage d'analyse.

Si le pass est de type « AnalysisPass, », cela signifie qu’il est capable d’analyser le DAG et d’enregistrer les résultats de cette analyse dans l’ensemble de propriétés. Ce type de passe ne permet pas d'apporter des modifications au DAG.

is_transformation_pass

Vérifiez si le passage est un passage de transformation.

Si le pass est de type « TransformationPass, », cela signifie qu’il peut manipuler le DAG, mais qu’il ne peut pas modifier l’ensemble de propriétés (bien qu’il puisse le consulter).


Méthodes

execute

execute(passmanager_ir, state, callback=None)

GitHub

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

Paramètres

  • passmanager_ir (DAGCircuit) – IR Qiskit à optimiser.
  • state (DAGCircuit) – État lié à l'exécution du flux de travail par le gestionnaire de passes lui-même.
  • callback (Callable[[Task, DAGCircuit, 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 [ DAGCircuit, PassManagerState ]

name

name()

GitHub

Nom du col.

Type de retour

str

run

run(dag)

GitHub

Exécutez un passage sur le DAGCircuit. Cette fonctionnalité est mise en œuvre par le développeur de la carte.

Paramètres

dag (DAGCircuit) – le jour où le col est franchi.

Augmentations

NotImplementedError – lorsque cela n'est pas mis en œuvre pendant un passage.

Type de retour

DAGCircuit

update_status

update_status(state, run_state)

GitHub

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.