qiskit_noise_learning.sequences.PartialPauliPermutation
class qiskit_noise_learning.sequences.PartialPauliPermutation(partial_permutation_indices: NDArray[int8])
Bases : Instruction
Permutations partiellement spécifiées des Pauli sans phase à un qubit sur n qubits.
A PartialPauliPermutation représente une spécification partielle d'une couche de Cliffords à un seul qubit pour les cas où les phases spécifiques du groupe de Pauli n'ont pas besoin d'être contraintes. Le caractère partiel de la spécification vise à permettre la mise en place progressive de ces couches. Dès lors qu’une permutation partielle est « complète », au sens où elle constitue une spécification complète d’une permutation, comme l’indique la propriété bool PartialPauliPermutation.is_complete, un Clifford par défaut mettant en œuvre cette permutation est attribué à chaque qubit selon l’ordre défini dans COMPLETE_TO_C1_TABLEAU.
Deux permutations partielles sur un qubit sont fusionnables (voir et is_mergeable_with() merge()) s'il existe une opération de Clifford à un qubit qui met en œuvre leurs deux permutations, ce qui, sans perte de généralité, revient à dire qu'une opération de Pauli ne se transforme pas en une opération de Pauli différente de l'autre.
La représentation principale des données de la classe est une liste d’entiers, où chaque entier indexe une permutation partielle de Pauli à un seul qubit donnée dans partial_permutation_sets(), ce qui fournit un ordre fixe.
Toutefois, une représentation lisible setpar l'utilisateur peut également être utilisée pour la construction via la méthode de classe PartialPauliPermutation.from_sets() , ou être récupérée à partir d'une instance via la méthode PartialPauliPermutation.to_sets() . Pour un qubit unique, la permutation partielle est définie comme un tableau set dont les éléments sont des tuples de la forme (p0, p1), où p0 et p1 sont des chaînes tirées de ["Z", "X", "Y"]. Cela signifie tuple que p0 est injecté par la permutation en p1.
Paramètres
partial_permutation_indices – Un tableau NumPy contenant des permutations partielles spécifiées par leurs indices. Le nombre de qubits est déterminé par la longueur.
__init__
__init__(partial_permutation_indices: NDArray[int8])
Méthodes
Chronique « 1 » | Chronique « 2 » |
|---|---|
__init__(indices_de_permutation_partielle) | |
complete() | Renvoie une nouvelle permutation partielle qui est complète et cohérente avec elle-même. |
compose(autre) | Combiner avec une autre permutation partielle. |
empty(nombre de qubits) | Générer l'instance totalement non spécifiée sur num_qubits. |
from_qubit_sparse_pauli_lists(in_paulis,...) | Construisez une fonction PartialPauliPermutation qui associe in_paulis à out_paulis. |
from_qubit_sparse_paulis(in_pauli, out_pauli) | Construisez une fonction PartialPauliPermutation qui associe in_pauli à out_pauli. |
from_sets(ensembles) | Construire à partir d'une liste d'ensembles. |
is_mergeable_with(autre) | Cette instruction peut-elle être fusionnée avec une autre ou non? |
merge(autre) | Fusionner « soi » et « autrui » en une seule instruction. |
propagate(...) | Étant donné un opérateur de Pauli, appliquez-lui la transformation de Clifford impliquée par cette permutation. |
to_sets() | Renvoie la représentation sous forme d'ensemble. |
Attributs
Chronique « 1 » | Chronique « 2 » |
|---|---|
inverse | Renvoie l'inverse de cette permutation partielle. |
is_complete | La fonction « self » représente-t-elle une spécification complète des permutations de Pauli pour un seul qubit? |
num_qubits | |
partial_permutation_indices | Format numérique brut de la permutation partielle. |
structure_token | Un résumé hachable de cette instruction qui limite la possibilité de fusion. |
inverse
Type : Self
Renvoie l'inverse de cette permutation partielle.
Cela renvoie une inversion partiellement spécifiée : seules les correspondances existantes dans cette instance seront inversées. Il convient de noter que la convention de complétion a été choisie de manière à être cohérente avec l'inversion, en ce sens que self.inverse.complete() == self.complete().inverse. De plus, le Clifford implicite de COMPLETE_TO_C1_TABLEAU est l'inverse du Clifford implicite.
is_complete
Type : bool
La fonction « self » représente-t-elle une spécification complète des permutations de Pauli pour un seul qubit?
partial_permutation_indices
Type : NDArray[int8]
Format numérique brut de la permutation partielle.
structure_token
Type : Hashable
Un résumé hachable de cette instruction qui limite la possibilité de fusion.
Ce marqueur permet de vérifier à moindre coût l'impossibilité de fusion : les instructions comportant des marqueurs de structure différents ne peuvent jamais être fusionnées. Le jeton doit donc permettre de distinguer les différents types d'instructions les uns des autres.
complete
complete() → Self
Renvoie une nouvelle permutation partielle qui est complète et cohérente avec elle-même.
Notez que ces conventions ont été choisies afin de garantir que :
- Toute permutation partiellement spécifiée compatible avec l'identité est mise en correspondance avec l'identité, et
self.inverse.complete() == self.complete().inverse.
Retours
Un nouveau contenant PartialPauliPermutation l'achèvement de self.
compose
compose(other: Self) → Self
Combiner avec une autre permutation partielle.
Pour les permutations complètes, cette fonction renvoie self.compose(other) la permutation associée à C1 @ C2, où C1 et C2 sont les Cliffords associés, respectivement, à et self other. Les permutations partiellement spécifiées ne contiennent qu'une seule application, et la composition n'est définie de manière naturelle que lorsque la sortie de est other l'entrée de self. Notons enfin que la composition n'est pas définie si l'un des éléments et self other est incomplet, tandis que l'autre est complet. Cela s'explique par l'impossibilité de garantir la commutation entre la complétion et la composition, comme décrit ci-dessous.
Il convient de noter que la convention de complétion a été choisie de manière à être cohérente avec la composition, en ce sens que self.compose(other).complete() == self.complete().compose(other.complete()). De plus, pour les permutations complètes, l'application vers le Clifford impliquée par COMPLETE_TO_C1_TABLEAU est un homomorphisme de groupes (qui préserve la multiplication).
Paramètres
l'autre – L'autre avec lequel composer.
Retours
La permutation composée.
Augmentations
ValueError : si la composition de self avec n'est other pas définie.
empty
classmethod empty(num_qubits: int) → Self
Générer l'instance totalement non spécifiée sur num_qubits.
Paramètres
num_qubits – Nombre de qubits.
Retours
Une nouvelle chose insignifiante PartialPauliPermutation.
from_qubit_sparse_paulis
classmethod from_qubit_sparse_paulis(in_pauli: QubitSparsePauli, out_pauli: QubitSparsePauli) → Self
Construisez une fonction PartialPauliPermutation qui associe in_pauli à out_pauli.
Paramètres
- in_pauli – Le Pauli à cartographier.
- out_pauli – Le Pauli vers lequel effectuer la mise en correspondance.
Retours
Une nouvelle fonction PartialPauliPermutation qui associe in_pauli à out_pauli.
Augmentations
ValueError : si in_pauli et n'ont out_pauli pas le même nombre de qubits, ou s'ils n'agissent pas sur les mêmes qubits.
from_qubit_sparse_pauli_lists
classmethod from_qubit_sparse_pauli_lists(in_paulis: QubitSparsePauliList, out_paulis: QubitSparsePauliList) → Self
Construisez une fonction PartialPauliPermutation qui associe in_paulis à out_paulis.
Paramètres
- in_paulis – Les Paulis à répertorier.
- out_paulis – Les Paulis vers lesquels effectuer la mise en correspondance.
Retours
Un nouveau PartialPauliPermutation.
Augmentations
ValueError : si le nombre de qubits n'est pas cohérent ou si les permutations implicites ne sont pas cohérentes.
from_sets
classmethod from_sets(sets: list[frozenset[tuple[str, str]]]) → Self
Construire à partir d'une liste d'ensembles.
Consultez la documentation de la classe pour obtenir une description du format attendu.
Paramètres
ensembles – Les ensembles définissant la permutation partielle.
Retours
Une nouvelle instance.
Augmentations
ValueError : si l'un des ensembles n'est pas valide.
is_mergeable_with
is_mergeable_with(other)
Cette instruction peut-elle être fusionnée avec une autre ou non?
Deux instructions peuvent être fusionnées s'il existe une troisième instruction qui met en œuvre simultanément leurs deux actions. Le cas trivial est celui où les instructions sont identiques : la troisième instruction peut être une troisième occurrence de la même instruction. Cependant, des cas non triviaux sont possibles, car certains types d'instructions, notamment PartialPauliPermutation, ne spécifient pas nécessairement leur action dans son intégralité, de sorte que les contraintes d'instances inégales peuvent néanmoins être satisfaites simultanément par une seule troisième instance.
Si cette méthode renvoie True, alors la méthode merge() devrait aboutir.
Paramètres
autre – L'autre instruction permettant de vérifier la fusionnabilité.
Retours
Cette instruction est-elle fusionnable avec l'autre?
merge
merge(other)
Fusionner « soi » et « autrui » en une seule instruction.
Paramètres
autre – L'autre instruction à fusionner.
Retours
Une instruction (éventuellement la même instance) qui exécute simultanément l'action de cette instruction et celle de l'autre instruction.
propagate
propagate(pauli: QubitSparsePauli, inverse: bool = False) → QubitSparsePauli
propagate(pauli: PhasedQubitSparsePauli, inverse: bool = False) → PhasedQubitSparsePauli
Étant donné un opérateur de Pauli, appliquez-lui la transformation de Clifford impliquée par cette permutation.
Cette méthode fonctionne aussi bien pour la propagation phasée que pour la propagation non phasée, selon le type de Pauli fourni. La propagation sans déphasage peut être effectuée sur des permutations incomplètes, à condition que la permutation soit définie sur les états de Pauli. La propagation par étapes nécessite self que soit complète, afin qu'un Clifford explicite puisse être associé à cette instance.
Paramètres
pauli – Le Pauli sur lequel appliquer la couche.
Retours
Le Pauli évolué.
Augmentations
- ValueError : si
pauli.num_qubits != self.num_qubits, ou siisinstance(pauli, PhasedQubitSparsePauli and not self.is_complete, ou si n'estpaulipas synchronisé et que cette instance n'est pas définie sur celui-ci. - TypeError : si
pauliest un type non valide.
to_sets
to_sets() → list[frozenset[tuple[str, str]]]
Renvoie la représentation sous forme d'ensemble.