Skip to main content
IBM Quantum Platform

Parametri comunemente utilizzati per la transpilazione

  • Il codice di questa pagina è stato sviluppato in base ai seguenti requisiti. Si consiglia di utilizzare queste versioni o versioni più recenti.

    qiskit[all]~=2.5.1
    qiskit-ibm-runtime~=0.47.0
    

Questa pagina descrive alcuni dei parametri più comunemente utilizzati per la transpilazione locale. Questi parametri sono configurati utilizzando gli argomenti di generate_preset_pass_manager o transpile.


Grado di approssimazione

È possibile utilizzare il grado di approssimazione per specificare quanto si desidera che il circuito risultante corrisponda al circuito desiderato (di ingresso). Si tratta di un valore fluttuante nell'intervallo ( 0.0 - 1.0 ), dove 0.0 rappresenta la massima approssimazione e 1.0 (valore predefinito) non rappresenta alcuna approssimazione. I valori più piccoli scambiano l'accuratezza dell'uscita con la facilità di esecuzione (cioè con un numero inferiore di porte). Il valore predefinito è 1.0.

Nella sintesi unitaria a due equbit (utilizzata nelle fasi iniziali di tutti i livelli e per la fase di ottimizzazione con il livello di ottimizzazione 3), questo valore specifica la fedeltà target della decomposizione in uscita. Ovvero, quanto errore viene introdotto quando la rappresentazione matriciale di un circuito viene convertita in porte discrete. Se il grado di approssimazione è un valore più basso (maggiore approssimazione), il circuito di uscita dalla sintesi differirà maggiormente dalla matrice di ingresso, ma probabilmente avrà anche meno porte (perché qualsiasi operazione arbitraria a due qubit può essere decomposta perfettamente con al massimo tre porte CX) ed è più facile da eseguire.

Quando il grado di approssimazione è inferiore a 1.0, si possono sintetizzare circuiti con una o due porte CX, che comportano un errore minore dall'hardware, ma maggiore dall'approssimazione. Poiché CX è il gate più costoso in termini di errore, potrebbe essere vantaggioso diminuirne il numero a scapito della fedeltà della sintesi (questa tecnica è stata utilizzata per aumentare il volume quantistico sui dispositivi IBM® ): Validating quantum computers using randomized model circuits ).

A titolo di esempio, generiamo un UnitaryGate casuale a due qubit che verrà sintetizzato nella fase iniziale. Impostando approximation_degree a meno di 1.0 si potrebbe generare un circuito approssimativo. Dobbiamo anche specificare basis_gates per far sapere al metodo di sintesi quali porte può utilizzare per la sintesi approssimativa.

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"])

Output:

2

In questo modo si ottiene un risultato di 2 perché l'approssimazione richiede un numero inferiore di porte CX.


Seme del generatore di numeri casuali

Alcune parti del transpiler sono stocastiche, quindi ripetute esecuzioni del transpiler possono dare risultati diversi. Per ottenere un risultato riproducibile, è possibile impostare il seme del generatore di numeri pseudorandom utilizzando l'argomento seed_transpiler . Esecuzioni ripetute con lo stesso seme daranno 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")

Output:

Output of the previous code cell

Layout iniziale

Prima della transpilazione, i qubit contenuti nel circuito sono qubit virtuali che non corrispondono necessariamente a qubit fisici sul backend di destinazione. È possibile specificare la mappatura iniziale dei qubit virtuali sui qubit fisici utilizzando l'argomento initial_layout . Si noti che la disposizione finale dei qubit può differire da quella iniziale perché il transpiler può permutare i qubit utilizzando porte di scambio o altri mezzi.

Nell'esempio seguente, si costruisce un layout iniziale per il backend FakeSherbrooke creando un oggetto Layout oggetto. Il nostro layout mappa il primo qubit del nostro circuito al qubit 5 di Sherbrooke e mappa il secondo qubit del nostro circuito al qubit 6 di Sherbrooke. Si noti che i qubit fisici sono sempre rappresentati da numeri interi.

Note

In questi esempi viene utilizzato il backend FakeSherbrooke``qiskit_ibm_runtime fittizio di, ma è possibile provarlo su qualsiasi backend reale o fittizio compatibile con Qiskit. I tuoi risultati potrebbero essere diversi.

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)

Output:

Output of the previous code cell

Oltre a specificare un oggetto Layout, è possibile passare un elenco di numeri interi, dove il ii -esimo elemento dell'elenco contiene il qubit fisico a cui deve essere mappato il ii -esimo qubit. Ad 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)

Output:

Output of the previous code cell

È possibile utilizzare la funzione plot_error_map per generare un diagramma del grafico del dispositivo con le informazioni sugli errori e con l'etichetta dei qubit fisici. È possibile visualizzare diagrammi simili anche nella pagina delle risorse di calcolo.

from qiskit.visualization import plot_error_map

plot_error_map(backend, figsize=(30, 24))

Output:

Output of the previous code cell

Opzioni della fase di transpilazione e dei plugin

Queste opzioni hanno il suffisso _method. Influenzano il funzionamento del transpiler e vengono utilizzati per cercare di ottenere un risultato migliore, diverso o specifico dal transpiler.

  • init_method (str) - Il plugin da usare per la fase di inizializzazione.

  • layout_method (str) - Il passaggio di selezione del layout (trivial, dense, sabre). Può anche essere il nome del 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 passaggio di instradamento (basic, lookahead, default, sabre, none). Può anche essere il nome del plugin esterno da usare per la fase di instradamento.

  • scheduling_method (str) - Nome del passaggio di pianificazione. Questo può anche essere il nome del plugin esterno da utilizzare per la fase di pianificazione.

    • as_soon_as_possible: Programmare le istruzioni con avidità: il prima possibile su una risorsa di qubit (alias: asap).
    • as_late_as_possible: Programmare le istruzioni in ritardo. Ovvero, mantenere i qubit nello stato ground quando possibile (alias: alap).
  • translation_method (str) - Nome del passaggio di traduzione (unroller, translator, synthesis). Può anche essere il nome del plugin esterno da usare per la fase di traduzione.

  • unitary_synthesis_method (str) - Il nome del metodo di sintesi unitaria da utilizzare. Per impostazione predefinita viene utilizzato default .

Per vedere un elenco di tutti i plugin installati per un determinato stadio, eseguire list_stage_plugins("stage_name"). Per esempio, se si vuole vedere un elenco di tutti i plugin installati per lo stadio di routing, eseguire list_stage_plugins(routing).


Passi successivi

Questa pagina è stata utile?
Segnala un bug, un errore di battitura o richiedi contenuti su GitHub.