SolovayKitaev
class qiskit.transpiler.passes.SolovayKitaev(*args, **kwargs)
Basi: TransformationPass
Decomporre approssimativamente le porte di 1q in una base discreta utilizzando l'algoritmo di Solovay-Kitaev.
Il teorema di Solovay-Kitaev [1] afferma che qualsiasi porta a singolo qubit può essere approssimata con precisione arbitraria da un insieme di porte a singolo qubit fisse, se l'insieme genera un sottoinsieme denso in . Si tratta di un risultato importante, poiché significa che qualsiasi porta a singolo qubit può essere espressa in termini di un insieme discreto e universale di porte che sappiamo come implementare in modo tollerante ai guasti. Pertanto, l'algoritmo di Solovay-Kitaev ci permette di prendere qualsiasi circuito non tollerante ai guasti e di riformularlo in modo tollerante ai guasti.
Questa implementazione dell'algoritmo di Solovay-Kitaev si basa su [2].
Ad esempio, il seguente circuito
┌─────────┐
q_0: ┤ RX(0.8) ├
└─────────┘può essere scomposto in
global phase: 7π/8
┌───┐┌───┐┌───┐
q_0: ┤ H ├┤ T ├┤ H ├
└───┘└───┘└───┘con un L2-error di circa 0.01.
Esempi
Per impostazione predefinita, il gate di base impostato è ["t", "tdg", "h"]:
import numpy as np
from qiskit.circuit import QuantumCircuit
from qiskit.transpiler.passes.synthesis import SolovayKitaev
from qiskit.quantum_info import Operator
circuit = QuantumCircuit(1)
circuit.rx(0.8, 0)
print("Original circuit:")
print(circuit.draw())
skd = SolovayKitaev(recursion_degree=2)
discretized = skd(circuit)
print("Discretized circuit:")
print(discretized.draw())
print("Error:", np.linalg.norm(Operator(circuit).data - Operator(discretized).data))Original circuit:
┌─────────┐
q: ┤ Rx(0.8) ├
└─────────┘
Discretized circuit:
global phase: 7π/8
┌───┐┌───┐┌───┐
q: ┤ H ├┤ T ├┤ H ├
└───┘└───┘└───┘
Error: 2.828408279166474I set di porte individuali possono essere specificati nell'inizializzatore.
from qiskit.transpiler.passes import SolovayKitaev
basis = ["s", "sdg", "t", "tdg", "z", "h"]
skd = SolovayKitaev(recursion_degree=2, basis_gates=basis)Per generare e memorizzare approssimazioni di base tra diverse istanze, è possibile utilizzare il metodo SolovayKitaevDecomposition e il suo save_basic_approximations() metodo.
from qiskit.transpiler.passes import SolovayKitaev
from qiskit.synthesis import SolovayKitaevDecomposition
# generate basic approximations
basis = ["s", "sdg", "t", "tdg", "z", "h"]
decomp = SolovayKitaevDecomposition(basis_gates=basis, depth=5)
# store them in a local file
fname = "sk_approx.bin"
decomp.save_basic_approximations(fname)
# load them for running Solovay-Kitaev
skd = SolovayKitaev(recursion_degree=2, basic_approximations=fname)Riferimenti:
[1] Kitaev, A Yu (1997). Calcoli quantistici: algoritmi e correzione degli errori. Indagini matematiche russe. 52 (6): 1191–1249. Online.
[2] Dawson, Christopher M.; Nielsen, Michael A. (2005) L'algoritmo di Solovay-Kitaev. arXiv:quant-ph/0505030.
Parametri
- grado_di_ricorsione - La profondità di ricorsione dell'algoritmo Solovay-Kitaev. Una maggiore profondità di ricorsione aumenta la precisione e la lunghezza della decomposizione.
- approssimazioni_di_base - Le approssimazioni di base per trovare la migliore decomposizione discreta alla radice della ricorsione. Se è una stringa, specifica il file da cui caricare le approssimazioni. Se è un dizionario, contiene le coppie
{label: SO(3)-matrix}. SeNone, viene generato un valore predefinito basato sulle porte , e fino alla profondità 16. Si noti che se viene passatobasic_approximations,basis_gatesedepthnon possono essere impostati. - porte_base - Le porte base utilizzate per costruire la rete di approssimazioni di base. L'impostazione predefinita è
["h", "t", "tdg"]. Questo argomento non può essere impostato se viene fornitobasic_approximations. - depth - La profondità massima del gate utilizzata nelle approssimazioni di base. Questo argomento non può essere impostato se viene fornito
basic_approximations.
Attributi
is_analysis_pass
Controlla se il passaggio è un passaggio di analisi.
Se il passo è un AnalysisPass,, significa che il passo può analizzare il DAG e scrivere i risultati di tale analisi nel set di proprietà. Questo tipo di passaggio non consente di modificare il DAG.
is_transformation_pass
Controlla se il passaggio è un passaggio di trasformazione.
Se il passaggio è un TransformationPass,, significa che il passaggio può manipolare il DAG, ma non può modificare il set di proprietà (ma può essere letto).
Metodi
execute
execute(passmanager_ir, state, callback=None)
Eseguire l'attività di ottimizzazione per l'IR Qiskit in ingresso.
Parametri
- passmanager_ir (DAGCircuit) – Qiskit IR da ottimizzare.
- state (DAGCircuit) – Stato associato all'esecuzione del flusso di lavoro da parte dello stesso gestore dei passaggi.
- callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – Una funzione di callback che viene chiamata ad ogni esecuzione di un'attività di ottimizzazione.
Risultati
Qiskit IR ottimizzato e stato del flusso di lavoro.
Tipo di restituzione
name
run
run(dag)
Eseguire il passaggio SolovayKitaev su dag.
Parametri
dag (DAGCircuit) – L'input dag.
Risultati
Output dag con le porte 1q sintetizzate nella base di destinazione discreta.
Aumenti
TranspilerError – se un gate non deve_matrix
Tipo di restituzione
update_status
update_status(state, run_state)
Aggiornare lo stato del flusso di lavoro.
Parametri
- state (PassManagerState) – Passare lo stato del gestore da aggiornare.
- run_state (RunState) – Stato di completamento dell'attività corrente.
Risultati
Stato aggiornato del gestore dei passaggi.
Tipo di restituzione