Parametri comunemente usati per la transpilazione
Versioni dei pacchetti
Il codice in questa pagina è stato sviluppato con i seguenti requisiti. Consigliamo di usare queste versioni o versioni più recenti.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Questa pagina descrive alcuni dei parametri più comunemente usati per la transpilazione locale. Questi parametri vengono configurati tramite argomenti di generate_preset_pass_manager o transpile.
Grado di approssimazione
Puoi usare il grado di approssimazione per specificare quanto vuoi che il circuito risultante corrisponda al circuito desiderato (di input). Si tratta di un valore float nell'intervallo (0.0 - 1.0), dove 0.0 indica la massima approssimazione e 1.0 (valore predefinito) indica nessuna approssimazione. Valori più bassi scambiano l'accuratezza dell'output con una maggiore facilità di esecuzione (cioè, meno gate). Il valore predefinito è 1.0.
Nella sintesi unitaria a due qubit (usata nelle fasi iniziali di tutti i livelli e nella fase di ottimizzazione con livello di ottimizzazione 3), questo valore specifica la fedeltà target della decomposizione in output. In altre parole, quanti errori vengono introdotti quando una rappresentazione matriciale di un circuito viene convertita in gate discreti. Se il grado di approssimazione è più basso (maggiore approssimazione), il circuito in output dalla sintesi si discosterà di più dalla matrice di input, ma probabilmente avrà anche meno gate (poiché qualsiasi operazione arbitraria a due qubit può essere decomposta perfettamente con al massimo tre gate CX) e sarà più facile da eseguire.
Quando il grado di approssimazione è inferiore a 1.0, potrebbero essere sintetizzati circuiti con uno o due gate CX, portando a meno errori dall'hardware ma più errori dall'approssimazione. Poiché CX è il gate più costoso in termini di errori, potrebbe essere vantaggioso ridurne il numero a scapito della fedeltà nella sintesi (questa tecnica è stata usata per aumentare il quantum volume sui dispositivi IBM®: Validating quantum computers using randomized model circuits).
Come esempio, generiamo un UnitaryGate casuale a due qubit che verrà sintetizzato nella fase iniziale. Impostare approximation_degree a un valore inferiore a 1.0 potrebbe generare un circuito approssimato. Dobbiamo anche specificare i basis_gates per comunicare al metodo di sintesi quali gate può usare per la sintesi approssimata.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import random_unitary
from qiskit.transpiler import generate_preset_pass_manager
UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)
qubits = QuantumRegister(2, name="q")
qc = QuantumCircuit(qubits)
qc.append(rand_U, qubits)
pass_manager = generate_preset_pass_manager(
optimization_level=1,
approximation_degree=0.85,
basis_gates=["sx", "rz", "cx"],
)
approx_qc = pass_manager.run(qc)
print(approx_qc.count_ops()["cx"])
2
Il risultato è 2 perché l'approssimazione richiede meno gate CX.
Seed del generatore di numeri casuali
Alcune parti del transpiler sono stocastiche, quindi esecuzioni ripetute della transpilazione possono restituire risultati diversi. Per ottenere un risultato riproducibile, puoi impostare il seed del generatore di numeri pseudocasuali usando l'argomento seed_transpiler. Esecuzioni ripetute con lo stesso seed restituiranno gli stessi risultati.
Esempio:
pass_manager = generate_preset_pass_manager(
optimization_level=1, seed_transpiler=11, basis_gates=["sx", "rz", "cx"]
)
optimized_1 = pass_manager.run(qc)
optimized_1.draw("mpl")
Layout iniziale
Prima della transpilazione, i qubit contenuti nel tuo circuito sono qubit virtuali che non corrispondono necessariamente ai qubit fisici del backend target. Puoi specificare la mappatura iniziale dai qubit virtuali ai qubit fisici usando l'argomento initial_layout. Nota che il layout finale dei qubit potrebbe differire da quello iniziale, poiché il transpiler potrebbe permutare i qubit tramite swap gate o altri metodi.
Nell'esempio seguente, costruiamo un layout iniziale per il mock backend FakeSherbrooke creando un oggetto Layout. Il nostro layout mappa il primo qubit del circuito al qubit 5 di Sherbrooke e il secondo qubit del circuito al qubit 6 di Sherbrooke. Nota che i qubit fisici sono sempre rappresentati da interi.
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit.transpiler import Layout
backend = FakeSherbrooke()
a, b = qubits
initial_layout = Layout({a: 5, b: 6})
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)
Oltre a specificare un oggetto Layout, puoi anche passare una lista di interi, dove l'-esimo elemento della lista contiene il qubit fisico a cui dovrebbe essere mappato l'-esimo qubit. Per esempio:
initial_layout = [5, 6]
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)
transpiled_circ.draw("mpl", idle_wires=False)
Puoi usare la funzione plot_error_map per generare un diagramma del grafo del dispositivo con informazioni sugli errori e con i qubit fisici etichettati. Puoi anche visualizzare diagrammi simili nella pagina Compute resources.
from qiskit.visualization import plot_error_map
plot_error_map(backend, figsize=(30, 24))
Opzioni per le fasi e i plugin del transpiler
Queste opzioni hanno il suffisso _method. Influenzano il modo in cui il transpiler funziona e vengono usate per ottenere un output migliore, diverso o specifico dal transpiler.
-
init_method(str) - Il plugin da usare per la fase di inizializzazione. -
layout_method(str) - Il pass di selezione del layout (trivial,dense,sabre). Può anche essere il nome di un plugin esterno da usare per la fase di layout. -
optimization_method(str) - Il plugin da usare per la fase di ottimizzazione. -
routing_method(str) - Nome del pass di routing (basic,lookahead,default,sabre,none). Può anche essere il nome di un plugin esterno da usare per la fase di routing. -
scheduling_method(str) - Nome del pass di scheduling. Può anche essere il nome di un plugin esterno da usare per la fase di scheduling.as_soon_as_possible: Pianifica le istruzioni in modo greedy: il prima possibile su una risorsa qubit (alias:asap).as_late_as_possible: Pianifica le istruzioni il più tardi possibile. Cioè, mantieni i qubit nello stato fondamentale quando possibile (alias:alap).
-
translation_method(str) - Nome del pass di traduzione (unroller,translator,synthesis). Può anche essere il nome di un plugin esterno da usare per la fase di traduzione. -
unitary_synthesis_method(str) - Il nome del metodo di sintesi unitaria da usare. Per impostazione predefinita viene usatodefault.
Per visualizzare un elenco di tutti i plugin installati per una determinata fase, esegui list_stage_plugins("stage_name"). Per esempio, se vuoi vedere un elenco di tutti i plugin installati per la fase di routing, esegui list_stage_plugins(routing).
Passi successivi
- Consulta l'argomento Opzioni predefinite e impostazioni di configurazione.
- Scopri come Impostare il livello di ottimizzazione.
- Prova la guida Confrontare le impostazioni del transpiler.
- Consulta la documentazione API del transpiler.