SolovayKitaev
class qiskit.transpiler.passes.SolovayKitaev(*args, **kwargs)
Bases: TransformationPass
Descomponga aproximadamente las puertas 1q a una base discreta utilizando el algoritmo Solovay-Kitaev.
El teorema Solovay-Kitaev [1] afirma que cualquier puerta de un solo qubit puede aproximarse con precisión arbitraria mediante un conjunto de puertas fijas de un solo qubit, si el conjunto genera un subconjunto denso en . Se trata de un resultado importante, ya que significa que cualquier puerta de un solo qubit puede expresarse en términos de un conjunto de puertas discretas y universales que sabemos cómo implementar con tolerancia a fallos. Por lo tanto, el algoritmo Solovay-Kitaev nos permite tomar cualquier circuito no tolerante a fallos y reformularlo de forma tolerante a fallos.
Esta aplicación del algoritmo Solovay-Kitaev se basa en [2].
Por ejemplo, el siguiente circuito
┌─────────┐
q_0: ┤ RX(0.8) ├
└─────────┘puede descomponerse en
global phase: 7π/8
┌───┐┌───┐┌───┐
q_0: ┤ H ├┤ T ├┤ H ├
└───┘└───┘└───┘con un L2-error de aproximadamente 0.01.
Ejemplos
Por defecto, la base de la puerta es ["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.828408279166474Los conjuntos de puertas individuales se pueden especificar en el inicializador.
from qiskit.transpiler.passes import SolovayKitaev
basis = ["s", "sdg", "t", "tdg", "z", "h"]
skd = SolovayKitaev(recursion_degree=2, basis_gates=basis)Para generar y almacenar aproximaciones básicas entre diferentes instancias, se puede utilizar el método SolovayKitaevDecomposition y su save_basic_approximations() método.
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)Referencias:
[1] Kitaev, A Yu (1997). Cálculos cuánticos: algoritmos y corrección de errores. Encuestas matemáticas rusas. 52 (6): 1191-1249. En línea.
[2] Dawson, Christopher M.; Nielsen, Michael A. (2005) El algoritmo de Solovay-Kitaev. arXiv:quant-ph/0505030.
Parámetros
- recursion_degree - La profundidad de recursión para el algoritmo Solovay-Kitaev. Una mayor profundidad de recursión aumenta la precisión y la longitud de la descomposición.
- basic_approximations - Las aproximaciones básicas para encontrar la mejor descomposición discreta en la raíz de la recursión. Si es una cadena, especifica el archivo desde el que cargar las aproximaciones. Si es un diccionario, contiene pares
{label: SO(3)-matrix}. SiNone, se genera un valor predeterminado basado en las puertas , y hasta la profundidad 16. Tenga en cuenta que si se pasabasic_approximations,basis_gatesydepthno se pueden establecer. - basis_gates - Las puertas base utilizadas para construir la red de aproximaciones básicas. Por defecto
["h", "t", "tdg"]. Este argumento no puede establecerse si se proporcionabasic_approximations. - profundidad - La profundidad máxima de la puerta utilizada en las aproximaciones básicas. Este argumento no puede establecerse si se proporciona
basic_approximations.
Atributos
is_analysis_pass
Comprueba si el pase es un pase de análisis.
Si el pase es un AnalysisPass, significa que el pase puede analizar el DAG y escribir los resultados de ese análisis en el conjunto de propiedades. Este tipo de paso no permite realizar modificaciones en el DAG.
is_transformation_pass
Comprueba si el pase es un pase de transformación.
Si el pase es un TransformationPass, significa que el pase puede manipular el DAG, pero no puede modificar el conjunto de propiedades (pero se puede leer).
Métodos
execute
execute(passmanager_ir, state, callback=None)
Ejecutar la tarea de optimización para la entrada Qiskit IR.
Parámetros
- passmanager_ir (Any) – Qiskit IR para optimizar.
- state (PassManagerState) – Estado asociado a la ejecución del flujo de trabajo por el propio gestor de pases.
- callback (Callable | None) – Una función de devolución de llamada que se invoca cada vez que se ejecuta una tarea de optimización.
Devuelve
Qiskit IR optimizado y estado del flujo de trabajo.
Tipo de retorno
tupla [ Any, PassManagerState ]
name
run
run(dag)
Ejecuta el pase SolovayKitaev en dag.
Parámetros
dag (DAGCircuit) – El dag de entrada.
Devuelve
Dag de salida con 1q compuertas sintetizadas en la base objetivo discreta.
Eleva
TranspilerError – si una puerta no tiene que_matrix
Tipo de retorno
update_status
update_status(state, run_state)
Actualizar el estado del flujo de trabajo.
Parámetros
- state (PassManagerState) – Pasar estado de gestor a actualizar.
- run_state (RunState) – Estado de finalización de la tarea actual.
Devuelve
Estado del gestor de pases actualizado.
Tipo de retorno