SolovayKitaev
class qiskit.transpiler.passes.SolovayKitaev(*args, **kwargs)
Bases: TransformationPass
Decomponha aproximadamente as portas 1q em uma base discreta usando o algoritmo Solovay-Kitaev.
O teorema [1] de Solovay-Kitaev afirma que qualquer porta de qubit único pode ser aproximada com precisão arbitrária por um conjunto de portas de qubit único fixas, se o conjunto gerar um subconjunto denso em . Esse é um resultado importante, pois significa que qualquer porta de um único qubit pode ser expressa em termos de um conjunto de portas discretas e universais que sabemos como implementar de forma tolerante a falhas. Portanto, o algoritmo Solovay-Kitaev nos permite pegar qualquer circuito não tolerante a falhas e reformulá-lo de maneira tolerante a falhas.
Essa implementação do algoritmo Solovay-Kitaev é baseada em [2].
Por exemplo, o seguinte circuito
┌─────────┐
q_0: ┤ RX(0.8) ├
└─────────┘pode ser decomposto em
global phase: 7π/8
┌───┐┌───┐┌───┐
q_0: ┤ H ├┤ T ├┤ H ├
└───┘└───┘└───┘com um L2-error de aproximadamente 0.01.
Exemplos
Por padrão, o conjunto de portas de base é ["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.828408279166474Conjuntos de portas individuais podem ser especificados no inicializador.
from qiskit.transpiler.passes import SolovayKitaev
basis = ["s", "sdg", "t", "tdg", "z", "h"]
skd = SolovayKitaev(recursion_degree=2, basis_gates=basis)Para gerar e armazenar aproximações básicas entre diferentes instâncias, o método SolovayKitaevDecomposition e seu save_basic_approximations() método podem ser usados.
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)Referências
[1] Kitaev, A Yu (1997). Cálculos quânticos: algoritmos e correção de erros. Pesquisas matemáticas russas. 52 (6): 1191–1249. Online.
[2] Dawson, Christopher M.; Nielsen, Michael A. (2005) O Algoritmo Solovay-Kitaev. arXiv:quant-ph/0505030.
Parâmetros
- recursion_degree - A profundidade de recursão do algoritmo Solovay-Kitaev. Uma profundidade de recursão maior aumenta a precisão e o comprimento da decomposição.
- basic_approximations - As aproximações básicas para encontrar a melhor decomposição discreta na raiz da recursão. Se for uma cadeia de caracteres, especifica o arquivo do qual carregar as aproximações. Se for um dicionário, ele contém
{label: SO(3)-matrix}pairs. Se forNone, será gerado um padrão com base nos portões , e até a profundidade 16. Observe que, sebasic_approximationsfor passado,basis_gatesedepthnão poderão ser definidos. - basis_gates - As portas de base usadas para construir a rede de aproximações básicas. O padrão é
["h", "t", "tdg"]. Esse argumento não pode ser definido sebasic_approximationsfor fornecido. - depth - A profundidade máxima da porta usada em aproximações básicas. Esse argumento não pode ser definido se
basic_approximationsfor fornecido.
Atributos
is_analysis_pass
Verificar se o passe é um passe de análise.
Se a passagem for um AnalysisPass,, isso significa que a passagem pode analisar o DAG e escrever os resultados dessa análise no conjunto de propriedades. As modificações no DAG não são permitidas por esse tipo de passe.
is_transformation_pass
Verificar se o passe é um passe de transformação.
Se a passagem for um TransformationPass,, isso significa que a passagem pode manipular o DAG, mas não pode modificar o conjunto de propriedades (mas pode ser lido).
Métodos
execute
execute(passmanager_ir, state, callback=None)
Executar a tarefa de otimização para a entrada Qiskit IR.
Parâmetros
- passmanager_ir (Any) – Qiskit IR para otimizar.
- state (PassManagerState) – Estado associado à execução do fluxo de trabalho pelo próprio gerenciador de passes.
- callback (Callable | None) – Uma função de retorno de chamada que é chamada a cada execução da tarefa de otimização.
Retorna
Qiskit IR otimizado e estado do fluxo de trabalho.
Tipo de retorno
tupla [ Any, PassManagerState ]
name
run
run(dag)
Execute o passe SolovayKitaev no dag.
Parâmetros
dag (DAGCircuit) – A entrada dag.
Retorna
Saída dag com 1q gates sintetizados na base de alvo discreto.
Aumentos
TranspilerError – se um portão não tiver que_matrix
Tipo de retorno
update_status
update_status(state, run_state)
Atualizar o status do fluxo de trabalho.
Parâmetros
- state (PassManagerState) – Passar o estado do gerenciador para atualizar.
- run_state (RunState) – Status de conclusão da tarefa atual.
Retorna
Estado do gerenciador de passes atualizado.
Tipo de retorno