Skip to main content
IBM Quantum Platform

Propagation

pauli_prop.propagation

Fonctions permettant d'effectuer la propagation de Pauli.

RotationGates

class RotationGates(gates, qargs, thetas)

GitHub

Bases : NamedTuple

Une représentation minimale intermédiaire d'un QuantumCircuit.

Rotations de Pauli prises en charge : rx/rxx, ry/ryy, rz/rzz, PauliEvolutionGate

Créer une nouvelle instance de RotationGates(gates,, qargs, thetas)

Paramètres

append_circuit_instruction

append_circuit_instruction(inst, qargs, num_qubits, *, clifford=None)

GitHub

Analyse une instruction de circuit et ajoute ses données aux listes internes.

Paramètres

  • inst (CircuitInstruction) – L'instruction du circuit permettant d'analyser et d'ajouter
  • qargs (list[int]) – La liste des indices des qubits de l'instruction dans le contexte de son circuit
  • num_qubits (int) – Le nombre de qubits du circuit contenant cette instruction
  • clifford (Clifford | None) – Un Clifford facultatif par lequel l'instruction fournie doit être acheminée. Le circuit de Clifford doit agir sur tous les qubits du circuit.

Augmentations

  • ValueError – Porte non prise en charge détectée dans le circuit
  • ValueError – Si elle est fournie, elle doit clifford s'appliquer à tous les qubits du circuit

Type de retour

Aucun

count

count(value, /)

Renvoie le nombre d'occurrences de la valeur.

gates

Type : list[ndarray[tuple[int,...], dtype[bool]]]

Une représentation des portes de type « ZX-calculus ».

index

index(value, start=0, stop=9223372036854775807, /)

Renvoie l'index de la première occurrence de la valeur.

Génère une exception « ValueError » si la valeur n'est pas présente.

qargs

Type : list[list[int]]

Les indices des qubits sur lesquels agit chaque porte.

thetas

Type : list[float]

Les angles de rotation de toutes les portes.

circuit_to_rotation_gates

circuit_to_rotation_gates(circuit)

GitHub

Convertit le circuit fourni en une représentation intermédiaire.

Prend en charge les portes de rotation de Pauli (« rx/rxx », « ry/ryy », « rz/rzz », « ‘PauliEvolutionGate’ ») et les canaux d'erreur de Pauli-Lindblad, spécifiés sous forme d'instructions « PauliLindbladError ».

Paramètres

circuit (QuantumCircuit) –

Le circuit à convertir. Peut contenir des rotations de Pauli (rx/rxx, ry/ryy, rz/rzz, PauliEvolutionGate ) et, éventuellement, des instructions « PauliLindbladError ».

Retours

Une instance RotationGates si le circuit ne contient pas d'instructions PauliLindbladError ; sinon, une instance NoisyRotationGates est renvoyée.

Augmentations

ValueError – lorsqu'une porte non prise en charge est détectée dans circuit.

Type de retour

RotationGates | NoisyRotationGates

propagate_through_rotation_gates

propagate_through_rotation_gates(operator, rot_gates, max_terms, atol, frame)

GitHub

Appliquer un opérateur de Pauli clairsemé, OO, à un circuit (représenté dans rot_gates), UU.

Pour la propagation de Schrödinger : UOUU O U^{\dagger}. Pour la propagation de Heisenberg : UOUU^{\dagger} O U.

Si est rot_gates une instance NoisyRotationGates de, l'opérateur sera propagé à travers chaque générateur de bruit. Le coefficient associé à chaque terme de operatorl'expression cic_i sera atténué en fonction du taux de chaque générateur d'erreur anticommutatif, rir_i : ci=exp(2.0ri)c_i *= exp(-2.0 * r_i).

En général, la mémoire et le temps nécessaires à la propagation à travers un circuit augmentent de manière exponentielle avec le nombre d'opérations du circuit, en raison de la croissance exponentielle du nombre de termes de l'opérateur dans la base de Pauli. Pour pallier cette difficulté exponentielle, on peut tronquer les petits termes de Pauli (c'est-à-dire les fixer à zéro), ce qui entraîne un biais proportionnel aux amplitudes des termes tronqués. Après avoir été propagés à travers chaque opération du circuit, les termes sont tronqués par rapport à deux paramètres :

  • Seules les composantes de Pauli les plus max_terms importantes sont conservées; tous les termes de moindre ampleur seront tronqués. Cette option permet d'estimer à l'avance le temps et la mémoire nécessaires au calcul.
  • Les termes dont la valeur absolue est inférieure à atol sont tronqués (remplacés par zéro).
Remarque

Cette fonction pré-alloue de l'espace en mémoire pour l'opérateur complet et le tampon de l'opérateur. Il incombe à l'appelant de s'assurer qu'il dispose de suffisamment de mémoire pour contenir les opérateurs comportant des termes max_terms . Lorsque max_terms est égal à None, les besoins en mémoire et en temps augmentent généralement de manière exponentielle avec le nombre d'opérations du circuit.

Paramètres

  • operator (SparsePauliOp) – L'opérateur à propager
  • rot_gates (RotationGates | NoisyRotationGates) – Un circuit représenté sous la forme de RotationGates.
  • max_terms (int) – Le nombre maximal de termes que l'opérateur peut contenir au fur et à mesure de sa propagation
  • atol (float) – Les termes dont la valeur absolue du coefficient est inférieure à cette valeur ne seront pas ajoutés à l'opérateur lors de sa propagation. Ce paramètre ne garantit pas la précision de l'opérateur renvoyé.
  • frame (str) –s pour l'évolution de Schrödinger h pour l'évolution de Heisenberg

Retours

L'opérateur évolué et la norme 1 de l'ensemble des coefficients tronqués.

Augmentations

Type de retour

tuple [ SparsePauliOp, float ]

propagate_through_circuit

propagate_through_circuit(operator, circuit, max_terms, atol, frame)

GitHub

Propager un opérateur de Pauli clairsemé, OO, à travers un circuit, UU.

Prend en charge les portes de rotation de Pauli (« rx/rxx », « ry/ryy », « rz/rzz », « ‘PauliEvolutionGate’ ») et les canaux d'erreur de Pauli-Lindblad, spécifiés sous forme d'instructions « PauliLindbladError ».

Pour la propagation de Schrödinger : UOUU O U^{\dagger}. Pour la propagation de Heisenberg : UOUU^{\dagger} O U.

Si le fichier contient circuit des instructions relatives au bruit de Pauli-Lindblad, l'opérateur sera propagé à travers chaque générateur de bruit. Le coefficient associé à chaque terme de operatorl'expression cic_i sera atténué en fonction du taux de chaque générateur d'erreur anticommutatif, rir_i : ci=exp(2.0ri)c_i *= exp(-2.0 * r_i).

En général, la mémoire et le temps nécessaires à la propagation à travers un circuit augmentent de manière exponentielle avec le nombre d'opérations du circuit, en raison de la croissance exponentielle du nombre de termes de l'opérateur dans la base de Pauli. Pour pallier cette difficulté exponentielle, on peut tronquer les petits termes de Pauli (c'est-à-dire les fixer à zéro), ce qui entraîne un biais proportionnel aux amplitudes des termes tronqués. Après avoir été propagés à travers chaque opération du circuit, les termes sont tronqués par rapport à deux paramètres :

  • Seules les composantes de Pauli les plus max_terms importantes sont conservées; tous les termes de moindre ampleur seront tronqués. Cette option permet d'estimer à l'avance le temps et la mémoire nécessaires au calcul.
  • Les termes dont la valeur absolue est inférieure à atol sont tronqués (remplacés par zéro).
Remarque

Cette fonction pré-alloue de l'espace en mémoire pour l'opérateur complet et le tampon de l'opérateur. Il incombe à l'appelant de s'assurer qu'il dispose de suffisamment de mémoire pour contenir les opérateurs comportant des termes max_terms . Lorsque max_terms est égal à None, les besoins en mémoire et en temps augmentent généralement de manière exponentielle avec le nombre d'opérations du circuit.

Paramètres

  • operator (SparsePauliOp) – L'opérateur à propager
  • circuit (QuantumCircuit) – Le circuit par lequel l'opérateur sera propagé
  • max_terms (int) – Le nombre maximal de termes que l'opérateur peut contenir au fur et à mesure de sa propagation
  • atol (float) – Les termes dont la valeur absolue du coefficient est inférieure à cette valeur ne seront pas ajoutés à l'opérateur lors de sa propagation. Ce paramètre ne garantit pas la précision de l'opérateur renvoyé.
  • frame (str) –s pour l'évolution de Schrödinger h pour l'évolution de Heisenberg

Retours

L'opérateur évolué

Augmentations

Type de retour

tuple [ SparsePauliOp, float ]

propagate_through_operator

propagate_through_operator(op1, op2, max_terms=None, coerce_op1_traceless=False, num_leading_terms=0, frame='s', atol=0.0, search_step=4)

GitHub

Transmettre un opérateur ( op1 ou OO ) via un autre opérateur ( op2 ou UU ).

Pour l'évolution de Schrödinger : UOUU O U^{\dagger}.

Pour l'évolution de Heisenberg : UOUU^{\dagger} O U.

L'évolution est calculée dans la base de Pauli en additionnant des termes de la forme UiOjUkU_i O_j U_k (en faisant abstraction du crosse-de-chasse, voir la note ci-dessous). Le nombre de ces termes est proportionnel au cube de la taille de l'opérateur (len( op1 ) * len( op2 )**2) et comprendra généralement de nombreux Paulis en double.

La définition de max_terms donne un résultat approximatif, dans lequel seuls les max_terms termes les plus importants (en termes d'amplitude des coefficients) sont calculés. Cette méthode peut être beaucoup plus rapide, mais elle entraîne quelques erreurs dues à la troncature des termes de plus petite taille.

Le calcul approximatif comporte deux étapes : la recherche des termes à conserver, puis le calcul de ces termes. Une augmentation search_step considérable (cubique) accélère considérablement la recherche, au prix d'une perte de précision souvent minime.

Il est possible que certains « Paulis » présents dans les termes conservés soient également apparus dans les termes tronqués. Comme ces termes tronqués ne sont jamais calculés, ils ne peuvent en aucun cas être fusionnés avec les termes conservés partageant le même Pauli. Ainsi, la peut n``th-largest term in the approximate result is not guaranteed to equal the nth-largest term in the exact result. Likewise, convergence to the exact result with increasing ``max_terms être non monotone.

Remarque

OO est supposé être hermitien ( OjO_j = OjO_j^{\dagger} )

Paramètres

  • op1 (SparsePauliOp) – L'opérateur à propager

  • op2 (SparsePauliOp) – L'opérateur par lequel la propagation doit s'effectuer

  • max_terms (int | None) –

    Lorsque ce n'est pas le cas None, on obtient un résultat approximatif ne prenant en compte que les termes les plus max_terms importants du produit direct des trois opérateurs dans l'espace de Pauli.

    Lorsque et None que max_terms le nombre de qubits est < 12, the propagation will be performed in the computational basis using matrix multiplication. For systems > 12 qubits, tous les termes de Pauli sont calculés et additionnés; cependant, cette méthode n'est généralement pas adaptée au calcul de l'évolution exacte en raison de la présence de nombreux termes redondants.

  • coerce_op1_traceless (bool) – Un indicateur permettant de déterminer s'il faut supprimer les termes d'identité de l'opérateur de sortie.

  • num_leading_terms (int) – Le nombre de termes dans op1 à conjuguer par chaque terme de op2. L'ensemble des termes inclus est étendu pour inclure son union avec l'ensemble des termes UiOjUiU_i O_j U_i^{\dagger}, pour j<numleadingtermsj < num_leading_terms. Cela peut améliorer la précision des composantes dominantes de O dans le résultat, moyennant un certain coût en temps de calcul.

  • frame (str) – s pour l'évolution de Schrödinger, h pour l'évolution de Heisenberg

  • atol (float) – Les termes de l'opérateur évolué dont les amplitudes sont inférieures à atol seront tronqués

  • search_step (int) – Un paramètre permettant d'accélérer la recherche dans l'espace d' 3D s très vaste afin d'identifier les termes les plus max_terms importants du produit. En définissant cette taille de pas sur une valeur supérieure à 1, on accélère cette recherche d'un facteur search_step**3, au risque toutefois de perdre en précision. Cette imprécision devrait être minime pour search_step**3 << max_terms.

Retours

L'opérateur transformé

Augmentations

Type de retour

SparsePauliOp

evolve_through_cliffords

evolve_through_cliffords(circuit)

GitHub

Appliquez l'évolution (dans le référentiel de Schrödinger) à toutes les instructions non-Clifford via toutes les portes de Clifford du circuit.

Cette opération déplace toutes les portes de Clifford détectées au début du circuit et met à jour les bases des portes de rotation de Pauli (par exemple RxGate,, RzzGate, PauliEvolutionGate) et des canaux de type « PauliLindbladError ». Les autres opérations ne sont pas prises en charge. Consultez la documentation sur Pauli.evolve pour plus d'informations sur l'évolution des Paulis par les Cliffords.

L'effet est similaire à celui obtenu en adoptant le modèle d'interaction de Clifford présenté à l'adresse arXiv:2306.04797, mais sans attribuer à tous les angles de rotation la valeur de π/4\leq \pi/4.

La fonction renvoie deux objets représentant respectivement les parties Clifford et non-Clifford du circuit.

Paramètres

circuit (QuantumCircuit) – Le à QuantumCircuit transformer. Ne peut contenir que des portes de rotation de Pauli ( PauliLindbladError ajoutées au circuit en tant que canaux quantiques) et des portes de Clifford reconnues.

Retours

  • Clifford – Un seul opérateur Clifford à qubits multiples représentant la première partie du circuit
  • QuantumCircuit - Un circuit comprenant la partie restante, transformée, du circuit

Augmentations

ValueError – Le circuit d'entrée contient une porte non prise en charge

Type de retour

tuple [ Clifford, QuantumCircuit ]

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