SolovayKitaev
class qiskit.transpiler.passes.SolovayKitaev(*args, **kwargs)
Bases : TransformationPass
Décomposer approximativement les portes 1q en une base discrète à l'aide de l'algorithme Solovay-Kitaev.
Le théorème de Solovay-Kitaev [1] stipule que toute porte à qubit unique peut être approximée avec une précision arbitraire par un ensemble de portes à qubit unique fixes, si l'ensemble génère un sous-ensemble dense dans . Il s'agit d'un résultat important, car il signifie que toute porte à qubit unique peut être exprimée en termes d'un ensemble de portes discret et universel que nous savons comment mettre en œuvre de manière tolérante aux fautes. Par conséquent, l'algorithme de Solovay-Kitaev nous permet de prendre n'importe quel circuit non tolérant aux fautes et de le reformuler de manière à ce qu'il soit tolérant aux fautes.
Cette mise en œuvre de l'algorithme de Solovay-Kitaev est basée sur [2.]
Par exemple, le circuit suivant
┌─────────┐
q_0: ┤ RX(0.8) ├
└─────────┘peut être décomposé en
global phase: 7π/8
┌───┐┌───┐┌───┐
q_0: ┤ H ├┤ T ├┤ H ├
└───┘└───┘└───┘avec un L2-error d'environ 0.01.
Exemples
Par défaut, l'ensemble de portes de base est ["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.828408279166474Des ensembles de portes individuels peuvent être spécifiés dans l'initialiseur.
from qiskit.transpiler.passes import SolovayKitaev
basis = ["s", "sdg", "t", "tdg", "z", "h"]
skd = SolovayKitaev(recursion_degree=2, basis_gates=basis)Pour générer et stocker des approximations de base entre différentes instances, la méthode SolovayKitaevDecomposition et sa save_basic_approximations() méthode peuvent être utilisées.
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)Références :
[1] Kitaev, A Yu (1997). Calculs quantiques : algorithmes et correction d'erreurs. Revue mathématique russe. 52 (6) : 1191-1249. En ligne.
[2] Dawson, Christopher M.; Nielsen, Michael A. (2005) L'algorithme de Solovay-Kitaev. arXiv:quant-ph/0505030.
Paramètres
- recursion_degree - Profondeur de récursion pour l'algorithme Solovay-Kitaev. Une profondeur de récursion plus importante augmente la précision et la longueur de la décomposition.
- basic_approximations - Approximations de base pour la recherche de la meilleure décomposition discrète à la racine de la récursion. S'il s'agit d'une chaîne, elle spécifie le fichier à partir duquel les approximations doivent être chargées. S'il s'agit d'un dictionnaire, il contient les paires
{label: SO(3)-matrix}. SiNone, un défaut basé sur les portes , et jusqu'à la profondeur 16 est généré. Notez que sibasic_approximationsest transmis,basis_gatesetdepthne peuvent pas être définis. - basis_gates - Portes de base utilisées pour construire le réseau d'approximations de base. La valeur par défaut est
["h", "t", "tdg"]. Cet argument ne peut pas être défini sibasic_approximationsest fourni. - depth - Profondeur maximale de la porte utilisée dans les approximations de base. Cet argument ne peut pas être défini si
basic_approximationsest fourni.
Attributs
is_analysis_pass
Vérifier si la passe est une passe d'analyse.
Si le passe est un AnalysisPass,, cela signifie qu'il peut analyser le DAG et écrire les résultats de cette analyse dans l'ensemble de propriétés. Les modifications sur le DAG ne sont pas autorisées par ce type de passe.
is_transformation_pass
Vérifier si le laissez-passer est un laissez-passer de transformation.
Si la passe est une TransformationPass,, cela signifie qu'elle peut manipuler le DAG, mais qu'elle ne peut pas modifier l'ensemble des propriétés (mais qu'elle peut les lire).
Méthodes
execute
execute(passmanager_ir, state, callback=None)
Exécuter la tâche d'optimisation pour l'entrée Qiskit IR.
Paramètres
- passmanager_ir (DAGCircuit) – IR Qiskit à optimiser.
- state (DAGCircuit) – État lié à l'exécution du flux de travail par le gestionnaire de passes lui-même.
- callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – Une fonction de rappel qui est appelée à chaque exécution d'une tâche d'optimisation.
Retours
Qiskit IR optimisé et état du flux de travail.
Type de retour
name
run
run(dag)
Exécuter la passe SolovayKitaev sur dag.
Paramètres
dag (DAGCircuit) – L'entrée dag.
Retours
Sortie dag avec 1q portes synthétisées dans la base cible discrète.
Augmentations
TranspilerError – si une porte ne doit pas_matrix
Type de retour
update_status
update_status(state, run_state)
Mettre à jour le statut du flux de travail.
Paramètres
- state (PassManagerState) – Transmettre l'état du gestionnaire à mettre à jour.
- run_state (RunState) – Statut d'achèvement de la tâche en cours.
Retours
Mise à jour de l'état du gestionnaire de passe.
Type de retour