Sari la conținutul principal

Transpilează cu pass managers

Versiuni de pachete

Codul de pe această pagină a fost dezvoltat folosind următoarele cerințe. Recomandăm utilizarea acestor versiuni sau a unora mai noi.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Modalitatea recomandată de a transpila un Circuit este să creezi un staged pass manager și apoi să execuți metoda run cu circuitul ca intrare. Această pagină explică cum să transpilezi circuite cuantice în acest mod.

Ce este un (staged) pass manager?

În contextul SDK-ului Qiskit, transpilarea se referă la procesul de transformare a unui Circuit de intrare într-o formă potrivită pentru execuție pe un dispozitiv cuantic. Transpilarea are loc, de obicei, într-o secvență de pași numiți transpiler passes. Circuitul este procesat de fiecare transpiler pass în ordine, iar ieșirea unui pass devine intrarea următorului. De exemplu, un pass ar putea parcurge circuitul și îmbina toate secvențele consecutive de Gate-uri cu un singur Qubit, iar apoi pasul următor ar putea sintetiza aceste Gate-uri în setul de bază al dispozitivului țintă. Transpiler passes incluse în Qiskit se află în modulul qiskit.transpiler.passes.

Un pass manager este un obiect care stochează o listă de transpiler passes și le poate executa pe un Circuit. Creează un pass manager prin inițializarea unui PassManager cu o listă de transpiler passes. Pentru a rula transpilarea pe un Circuit, apelează metoda run cu un Circuit ca intrare.

Un staged pass manager este un tip special de pass manager care reprezintă un nivel de abstractizare superior față de un pass manager obișnuit. În timp ce un pass manager obișnuit este compus din mai multe transpiler passes, un staged pass manager este compus din mai multe pass managers. Aceasta este o abstractizare utilă deoarece transpilarea are loc, de obicei, în etape discrete, după cum este descris în Etapele Transpiler-ului, fiecare etapă fiind reprezentată de un pass manager. Staged pass managers sunt reprezentate de clasa StagedPassManager. Restul acestei pagini descrie cum să creezi și să personalizezi (staged) pass managers.

Generează un staged pass manager preset

Pentru a crea un staged pass manager preset cu valori implicite rezonabile, folosește funcția generate_preset_pass_manager:

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
backend = service.backend("ibm_fez")
pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend
)

Pentru a transpila un Circuit sau o listă de circuite cu un pass manager, transmite circuitul sau lista de circuite metodei run. Să facem asta pe un Circuit cu doi Qubiți constând dintr-un Hadamard urmat de două Gate-uri CX adiacente:

from qiskit import QuantumRegister, QuantumCircuit

# Create a circuit
qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)
a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)

# Transpile it by calling the run method of the pass manager
transpiled = pass_manager.run(circuit)

# Draw it, excluding idle qubits from the diagram
transpiled.draw("mpl", idle_wires=False)

Output of the previous code cell

Consultă Valori implicite de transpilare și opțiuni de configurare pentru o descriere a posibilelor argumente ale funcției generate_preset_pass_manager. Argumentele pentru generate_preset_pass_manager corespund argumentelor funcției transpile.

Ai dificultăți în a-ți aminti detalii despre pass manager? Încearcă să întrebi Qiskit Code Assistant.

Dacă pass managers preset nu îți satisfac nevoile, personalizează transpilarea creând (staged) pass managers sau chiar transpilation passes. Restul acestei pagini descrie cum să creezi pass managers. Pentru instrucțiuni despre cum să creezi transpilation passes, consultă Scrie-ți propriul transpiler pass.

Creează propriul tău pass manager

Modulul qiskit.transpiler.passes include multe transpiler passes care pot fi folosite pentru a crea pass managers. Pentru a crea un pass manager, inițializează un PassManager cu o listă de passes. De exemplu, următorul cod creează un transpiler pass care îmbină Gate-urile adiacente cu doi Qubiți și apoi le sintetizează într-o bază formată din Gate-urile RyR_y, RzR_z și RxxR_{xx}.

from qiskit.transpiler import PassManager
from qiskit.transpiler.passes import (
Collect2qBlocks,
ConsolidateBlocks,
UnitarySynthesis,
)

basis_gates = ["rx", "ry", "rxx"]
translate = PassManager(
[
Collect2qBlocks(),
ConsolidateBlocks(basis_gates=basis_gates),
UnitarySynthesis(basis_gates),
]
)

Pentru a demonstra acest pass manager în acțiune, testează-l pe un Circuit cu doi Qubiți constând dintr-un Hadamard urmat de două Gate-uri CX adiacente:

from qiskit import QuantumRegister, QuantumCircuit

qubits = QuantumRegister(2, name="q")
circuit = QuantumCircuit(qubits)

a, b = qubits
circuit.h(a)
circuit.cx(a, b)
circuit.cx(b, a)

circuit.draw("mpl")

Output of the previous code cell

Pentru a rula pass manager-ul pe Circuit, apelează metoda run.

translated = translate.run(circuit)
translated.draw("mpl")

Output of the previous code cell

Pentru un exemplu mai avansat care arată cum să creezi un pass manager pentru a implementa tehnica de suprimare a erorilor cunoscută sub numele de dynamical decoupling, consultă Creează un pass manager pentru dynamical decoupling.

Creează un staged pass manager

Un StagedPassManager este un pass manager compus din etape individuale, unde fiecare etapă este definită de o instanță PassManager. Poți crea un StagedPassManager specificând etapele dorite. De exemplu, următorul cod creează un staged pass manager cu două etape, init și translation. Etapa translation este definită de pass manager-ul creat anterior.

from qiskit.transpiler import PassManager, StagedPassManager
from qiskit.transpiler.passes import UnitarySynthesis, Unroll3qOrMore

basis_gates = ["rx", "ry", "rxx"]
init = PassManager(
[UnitarySynthesis(basis_gates, min_qubits=3), Unroll3qOrMore()]
)
staged_pm = StagedPassManager(
stages=["init", "translation"], init=init, translation=translate
)

Nu există o limită pentru numărul de etape pe care le poți adăuga într-un staged pass manager.

O altă modalitate utilă de a crea un staged pass manager este să începi cu un staged pass manager preset și apoi să înlocuiești unele dintre etape. De exemplu, următorul cod generează un pass manager preset cu nivelul de optimizare 3, apoi specifică o etapă pre_layout personalizată.

import numpy as np
from qiskit.circuit.library import HGate, PhaseGate, RXGate, TdgGate, TGate
from qiskit.transpiler.passes import InverseCancellation

pass_manager = generate_preset_pass_manager(3, backend)
inverse_gate_list = [
HGate(),
(RXGate(np.pi / 4), RXGate(-np.pi / 4)),
(PhaseGate(np.pi / 4), PhaseGate(-np.pi / 4)),
(TGate(), TdgGate()),
]
logical_opt = PassManager(
[
InverseCancellation(inverse_gate_list),
]
)

# Add pre-layout stage to run extra logical optimization
pass_manager.pre_layout = logical_opt

Funcțiile generator de etape pot fi utile pentru construirea unor pass managers personalizate. Acestea generează etape care oferă funcționalități comune folosite în multe pass managers. De exemplu, generate_embed_passmanager poate fi folosit pentru a genera o etapă care „înglobează" un Layout inițial selectat dintr-un layout pass în dispozitivul țintă specificat.

Pași următori