Commuting2qGateRouter
class qiskit.transpiler.passes.Commuting2qGateRouter(*args, **kwargs)
Bases : TransformationPass
Une classe permettant d'intervertir une ou plusieurs portes de migration alternante avec la carte de couplage.
Ce passage permet d'acheminer des blocs de portes à deux qubits commutés, encapsulés sous forme d'instructions Commuting2qBlock . Ce laissez-passer ne s'applique pas aux autres instructions. La mise en correspondance avec la carte de couplage s'effectue à l'aide de stratégies d'échange, voir SwapStrategy. La stratégie d'échange doit être adaptée au problème et à la carte de couplage. Cette passe de transpilation devrait idéalement être exécutée avant que le circuit quantique ne soit élargi avec des qubits ancillaires inactifs. Sinon, nous pourrions échanger des qubits en dehors de la partie de la puce que nous voulons utiliser. Par conséquent, la stratégie d'échange et la carte de couplage qui lui est associée ne représentent pas des qubits physiques. Ils représentent plutôt un mappage intermédiaire qui correspond aux qubits physiques une fois que la disposition initiale est appliquée. L'exemple ci-dessous montre comment mapper un qubit à quatre qubits PauliEvolutionGate aux qubits 0, 1, 3 et 4 du dispositif à cinq qubits à l'aide de la carte de couplage suivante
0 -- 1 -- 2
|
3
|
4Pour ce faire, nous utilisons une stratégie d'échange de lignes pour les qubits 0, 1, 3 et 4, définie en fonction des qubits virtuels 0, 1, 2 et 3.
from qiskit import QuantumCircuit
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import Layout, CouplingMap, PassManager
from qiskit.transpiler.passes import FullAncillaAllocation
from qiskit.transpiler.passes import EnlargeWithAncilla
from qiskit.transpiler.passes import ApplyLayout
from qiskit.transpiler.passes import SetLayout
from qiskit.transpiler.passes.routing.commuting_2q_gate_routing import (
SwapStrategy,
FindCommutingPauliEvolutions,
Commuting2qGateRouter,
)
# Define the circuit on virtual qubits
op = SparsePauliOp.from_list([("IZZI", 1), ("ZIIZ", 2), ("ZIZI", 3)])
circ = QuantumCircuit(4)
circ.append(PauliEvolutionGate(op, 1), range(4))
# Define the swap strategy on qubits before the initial_layout is applied.
swap_strat = SwapStrategy.from_line([0, 1, 2, 3])
# Choose qubits 0, 1, 3, and 4 from the backend coupling map shown above.
backend_cmap = CouplingMap(couplinglist=[(0, 1), (1, 2), (1, 3), (3, 4)])
initial_layout = Layout.from_intlist([0, 1, 3, 4], *circ.qregs)
pm_pre = PassManager(
[
FindCommutingPauliEvolutions(),
Commuting2qGateRouter(swap_strat),
SetLayout(initial_layout),
FullAncillaAllocation(backend_cmap),
EnlargeWithAncilla(),
ApplyLayout(),
]
)
# Insert swap gates, map to initial_layout and finally enlarge with ancilla.
pm_pre.run(circ).draw("mpl")Ce gestionnaire de passage s'appuie sur le site current_layout qui correspond à la disposition des qubits au fur et à mesure de l'application des portes de permutation. La passe traversera tous les nœuds du dag. Si un nœud doit être acheminé à l'aide d'une stratégie de permutation, il sera décomposé en sous-instructions avec des couches de permutation entre les deux et le site current_layout sera modifié. Les nœuds qui ne devraient pas être acheminés à l'aide de stratégies d'échange seront ajoutés au dag en tenant compte de current_layout .
Paramètres
- swap_strategy - instance de
SwapStrategyqui contient les couches de permutation utilisées, ainsi que l'ordre dans lequel elles doivent être appliquées, pour faire correspondre l'instruction au matériel. Si ce champ n'est pas indiqué, il doit être contenu dans l'ensemble des propriétés du laissez-passer. Cela permet aux autres passes de déterminer la stratégie d'échange la plus appropriée au moment de l'exécution. - edge_coloring - Une coloration optionnelle des bords de la carte de couplage ( I.e. deux arêtes qui partagent un nœud n'ont pas la même couleur). Si la coloration des bords est donnée, les portes de commutation qui peuvent être appliquées simultanément compte tenu de la permutation actuelle des qubits sont regroupées en fonction de la coloration des bords et appliquées conformément à cette coloration. Ici, une couleur est un nombre entier qui est utilisé comme index pour définir et accéder aux groupes de portes de commutation qui peuvent être appliqués simultanément. Si la coloration des bords n'est pas donnée, les ensembles seront constitués à l'aide d'un algorithme gourmand. La coloration des bords est utile pour positionner des portes telles que
RZZGates à côté de portes d'échange afin d'exploiter les annulations de CX.
Attributs
is_analysis_pass
Vérifier si la passe est une passe d'analyse.
Si le passe est un AnalysisPass,, cela signifie qu'il peut analyser le DAG et écrire les résultats de cette analyse dans l'ensemble de propriétés. Les modifications sur le DAG ne sont pas autorisées par ce type de passe.
is_transformation_pass
Vérifier si le laissez-passer est un laissez-passer de transformation.
Si la passe est une TransformationPass,, cela signifie qu'elle peut manipuler le DAG, mais qu'elle ne peut pas modifier l'ensemble des propriétés (mais qu'elle peut les lire).
Méthodes
execute
execute(passmanager_ir, state, callback=None)
Exécuter la tâche d'optimisation pour l'entrée Qiskit IR.
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
Qiskit IR optimisé et état du flux de travail.
Type de retour
name
run
run(dag)
Exécuter la passe en décomposant les nœuds sur lesquels elle s'applique.
Paramètres
dag (DAGCircuit) – Le dag auquel nous allons ajouter des swaps.
Retours
Un dag où des swaps ont été ajoutés pour le type de porte prévu.
Augmentations
- TranspilerError – Si aucune stratégie d'échange n'a été spécifiée lors de l'initialisation et qu'aucune stratégie d'échange n'est définie dans l'ensemble de propriétés.
- TranspilerError – Si le circuit quantique comporte plus d'un registre de qubits.
- TranspilerError – S'il existe des qubits qui ne figurent pas dans le registre quantique.
Type de retour
swap_decompose
swap_decompose(dag, node, current_layout, swap_strategy)
Prenez une instance de Commuting2qBlock et associez-la à la carte de couplage.
Le mappage est effectué à l'aide de la stratégie d'échange.
Paramètres
- dag (DAGCircuit) – Le dag qui contient le
Commuting2qBlockque nous parcourons. - node (DAGOpNode) – Un nœud dont l'opération est une
Commuting2qBlock. - current_layout (Layout) – La présentation avant l'application des swaps. Cette fonction modifie la disposition de manière à ce que les portes suivantes puissent être correctement composées sur le dag.
- swap_strategy (SwapStrategy) – La stratégie d'échange utilisée pour décomposer le nœud.
Retours
Un dag compatible avec la carte de couplage où des portes d'échange ont été ajoutées pour faire correspondre les portes du site Commuting2qBlock au matériel.
Type de retour
update_status
update_status(state, run_state)
Mettre à jour le statut du flux de travail.
Paramètres
- state (PassManagerState) – Transmettre l'état du gestionnaire à mettre à jour.
- run_state (RunState) – Statut d'achèvement de la tâche en cours.
Retours
Mise à jour de l'état du gestionnaire de passe.
Type de retour