Skip to main content
IBM Quantum Platform

qiskit_noise_learning.sequences.PartialPauliPermutation

class qiskit_noise_learning.sequences.PartialPauliPermutation(partial_permutation_indices: NDArray[int8])

GitHub

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 »
inverseRenvoie l'inverse de cette permutation partielle.
is_completeLa fonction « self » représente-t-elle une spécification complète des permutations de Pauli pour un seul qubit?
num_qubits
partial_permutation_indicesFormat numérique brut de la permutation partielle.
structure_tokenUn 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 si isinstance(pauli, PhasedQubitSparsePauli and not self.is_complete, ou si n'est pauli pas synchronisé et que cette instance n'est pas définie sur celui-ci.
  • TypeError : si pauli est un type non valide.

to_sets

to_sets() → list[frozenset[tuple[str, str]]]

Renvoie la représentation sous forme d'ensemble.

Cette page a-t-elle été utile ?
Signaler un bogue, une coquille ou proposer du contenu sur GitHub.