Propagation
pauli_prop.propagation
Fonctions permettant d'effectuer la propagation de Pauli.
RotationGates
class RotationGates(gates, qargs, thetas)
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)
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
cliffords'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
thetas
circuit_to_rotation_gates
circuit_to_rotation_gates(circuit)
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)
Appliquer un opérateur de Pauli clairsemé, , à un circuit (représenté dans rot_gates), .
Pour la propagation de Schrödinger : . Pour la propagation de Heisenberg : .
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 sera atténué en fonction du taux de chaque générateur d'erreur anticommutatif, : .
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_termsimportantes 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 à
atolsont tronqués (remplacés par zéro).
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) –
spour l'évolution de Schrödingerhpour l'évolution de Heisenberg
Retours
L'opérateur évolué et la norme 1 de l'ensemble des coefficients tronqués.
Augmentations
- ValueError – n'est
frameni nihs. - ValueError – est
atolnégatif. - ValueError – n'est
max_termspas positif.
Type de retour
tuple [ SparsePauliOp, float ]
propagate_through_circuit
propagate_through_circuit(operator, circuit, max_terms, atol, frame)
Propager un opérateur de Pauli clairsemé, , à travers un circuit, .
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 : . Pour la propagation de Heisenberg : .
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 sera atténué en fonction du taux de chaque générateur d'erreur anticommutatif, : .
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_termsimportantes 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 à
atolsont tronqués (remplacés par zéro).
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) –
spour l'évolution de Schrödingerhpour l'évolution de Heisenberg
Retours
L'opérateur évolué
Augmentations
- ValueError – n'est
frameni nihs. - ValueError – est
atolnégatif. - ValueError – n'est
max_termspas positif.
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)
Transmettre un opérateur ( op1 ou ) via un autre opérateur ( op2 ou ).
Pour l'évolution de Schrödinger : .
Pour l'évolution de Heisenberg : .
L'évolution est calculée dans la base de Pauli en additionnant des termes de la forme (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.
est supposé être hermitien ( = )
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 plusmax_termsimportants du produit direct des trois opérateurs dans l'espace de Pauli.Lorsque et
Nonequemax_termsle 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 deop2. L'ensemble des termes inclus est étendu pour inclure son union avec l'ensemble des termes , pour . 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 à
atolseront 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_termsimportants du produit. En définissant cette taille de pas sur une valeur supérieure à 1, on accélère cette recherche d'un facteursearch_step**3, au risque toutefois de perdre en précision. Cette imprécision devrait être minime poursearch_step**3 << max_terms.
Retours
L'opérateur transformé
Augmentations
- ValueError – n'est
frameni nish. - ValueError – n'est
search_steppas positif. - ValueError – contient
max_termsune valeur non valide.
Type de retour
evolve_through_cliffords
evolve_through_cliffords(circuit)
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 .
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 ]