French
Languages
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

Note

Cette page a été générée à partir de tutorials/simulators/5_noise_transformation.ipynb.

Transformation du bruit

Introduction

Ce notebook montre comment utiliser les fonctions utilitaires approximate_quantum_error et approximate_noise_model de Qiskit Aer pour transformer les canaux de bruit quantique en un canal de bruit quantique plus approprié.

Notre exemple guide est la simulation Clifford. Un simulateur Clifford peut simuler efficacement les calculs quantiques qui ne comprennent que les portes d’un ensemble limité et non universel de portes (les portes Clifford). Tous les bruits quantiques ne peuvent pas être ajoutés à de telles simulations. Nous cherchons donc à trouver un canal de bruit « fermé » qui peut être simulé dans un simulateur Clifford.

Nous commençons par importer les fonctions de transformation à partir des utilitaires du module Aer

[1]:
from qiskit_aer.utils import approximate_quantum_error, approximate_noise_model

Le nom « approximation » suggère que ces fonctions génèrent l’erreur la plus proche possible (en fonction du métrique de Hilbert-Schmidt) de celle donnée.

Nous démontrons l’approximation en utilisant plusieurs canaux d’erreur standard définis dans Qiskit.

[2]:
import numpy as np

# Import Aer QuantumError functions that will be used
from qiskit_aer.noise import amplitude_damping_error, reset_error, pauli_error

from qiskit.quantum_info import Kraus

Aperçu

Un canal quantique 1-qubit est une fonction \(\mathcal{C}:\mathbb{C}^{2\times2}\to\mathbb{C}^{2\times2}\) associant des opérateurs de densité entre eux (pour s’assurer que l’image est un opérateur de densité \(\mathcal{C}\) est nécessaire pour être complètement positif et préservant la trace, CPTP Completely Positive Trace Preserving).

Soient les canaux quantiques \(\mathcal{E}_{1},\dots,\mathcal{E}_{r}\), et les probabilités \(p_1, p_2, \dots, p_r\) de sorte que \(0\le p_i \le 1\) et \(p_1+\dots +p_r = 1\), un nouveau canal quantique \(\mathcal{C}_\mathcal{E}\) peut être construit de telle sorte que \(\mathcal{C}_\mathcal{E}(\rho)\) ait pour effet de choisir le canal \(\mathcal{E}_i\) avec probabilité \(p_i\) et de l’appliquer à \(\rho\).

La fonction de transformation du bruit résout le problème d’optimisation suivant : étant donné un canal \(\mathcal{C}\) (« objectif ») Et une liste des canaux \(\mathcal{E}_{1}, \dots, \mathcal{E}_{r}\), trouvez les probabilités \(p_1, p_2, \dots, p_r\) minimisant :math:` D (mathcal{C}, mathcal{C}_ mathcal{E}) ` selon une mesure de distance \(D\) (la métrique de Hilbert-Schmidt est actuellement utilisée).

Pour que l’approximation soit réaliste, en ce sens que le canal d’erreur approximatif sert de « limite supérieure » pour le canal d’erreur réel, nous ajoutons la contrainte de réalisme supplémentaire :

\[\text{F}(I,\mathcal{C})\ge F(I,\mathcal{C}_\mathcal{E})\]

\(\text{F}\) est une mesure de fidélité et :math:`I`est le canal identité.

Exemple: Approximer l’amplitude du bruit d’amortissement avec le bruit de réinitialisation.

Le bruit d’amortissement d’amplitude est décrit par un unique paramètre \(0\le \gamma \le 1\) et donné par les opérateurs de Kraus:

\[\begin{split}\left(\begin{array}{cc} 1 & 0\\ 0 & \sqrt{1-\gamma} \end{array}\right),\left(\begin{array}{cc} 0 & \sqrt{\gamma}\\ 0 & 0 \end{array}\right)\end{split}\]

L’erreur Reset est décrite par probabilités \(0\le p, q\le 1\) tel que \(p + q\le 1\) et donné par les opérateurs Kraus :

\[\begin{split}\left(\begin{array}{cc} \sqrt{p} & 0\\ 0 & 0 \end{array}\right),\left(\begin{array}{cc} 0 & \sqrt{p}\\ 0 & 0 \end{array}\right),\left(\begin{array}{cc} 0 & 0\\ \sqrt{q} & 0 \end{array}\right),\left(\begin{array}{cc} 0 & 0\\ 0 & \sqrt{q} \end{array}\right)\end{split}\]

Cela peut être considéré comme « réinitialiser » l’état quantique du qubit affecté à \(\left |0\right\rangle\) avec probabilité \(p\), à \(\left |1\right\rangle\) avec probabilité \(q\), et ne rien faire avec la probabilité \(1-(p + q)\).

Il n’est pas trop difficile de déterminer analytiquement les meilleures valeurs de \(p,q\) pour approximer un canal d’amortissement d’amplitude \(\gamma\), voir les détails ici. La meilleure approximation est :

\[p=\frac{1}{2}\left(1+\gamma-\sqrt{1-\gamma}\right), q=0\]
[3]:
gamma = 0.23
error = amplitude_damping_error(gamma)
results = approximate_quantum_error(error, operator_string="reset")

Nous avions seulement besoin du code ci-dessus pour effectuer l’approximation.

[4]:
print(results)

p = (1 + gamma - np.sqrt(1 - gamma)) / 2
q = 0

print("")
print("Expected results:")
print("P(0) = {}".format(1-(p+q)))
print("P(1) = {}".format(p))
print("P(2) = {}".format(q))
QuantumError on 1 qubits. Noise circuits:
  P(0) = 0.8237482193044617, Circuit =
   ┌───┐
q: ┤ I ├
   └───┘
  P(1) = 0.17625178069553835, Circuit =

q: ─|0>─

  P(2) = 2.158685879252966e-23, Circuit =
        ┌───┐
q: ─|0>─┤ X ├
        └───┘

Expected results:
P(0) = 0.8237482193696062
P(1) = 0.17625178063039387
P(2) = 0

Nous avons obtenu les résultats prédits analytiquement.

Différents types d’entrée

On donne à la fonction d’approximation deux arguments : le canal d’erreur à approximer, et un ensemble de canaux d’erreur qui peuvent être utilisés pour construire l’approximation.

Le canal d’erreur à approximer peut être donné comme n’importe quel paramètre qui peut être converti en objet QuantumError.

À titre d’exemple, nous construisons explicitement les matrices de Kraus de l’amortissement de l’amplitude et passent à la même fonction d’approximation que précédemment :

[5]:
gamma = 0.23
K0 = np.array([[1,0],[0,np.sqrt(1-gamma)]])
K1 = np.array([[0,np.sqrt(gamma)],[0,0]])
results = approximate_quantum_error(Kraus([K0, K1]), operator_string="reset")
print(results)
QuantumError on 1 qubits. Noise circuits:
  P(0) = 0.8237482193044623, Circuit =
   ┌───┐
q: ┤ I ├
   └───┘
  P(1) = 0.1762517806955376, Circuit =

q: ─|0>─

  P(2) = 6.463899246563026e-23, Circuit =
        ┌───┐
q: ─|0>─┤ X ├
        └───┘

Les opérateurs d’erreur qui sont utilisés pour construire le canal approximatif peuvent être donnés en tant que liste, un dictionnaire ou une chaîne de caractères indiquant des canaux codés en dur.

Tout canal peut être soit une liste d’opérateurs de Kraus, soit des objets “QuantumError”.

Le canal d’identité n’a pas besoin d’être donné directement ; il est toujours utilisé implicitement.

À titre d’exemple, nous nous approchons de l’amortissement d’amplitude à l’aide d’une représentation explicite de Kraus pour les bruits de réinitialisation :

[6]:
reset_to_0 = Kraus([np.array([[1,0],[0,0]]), np.array([[0,1],[0,0]])])
reset_to_1 = Kraus([np.array([[0,0],[1,0]]), np.array([[0,0],[0,1]])])
reset_kraus = [reset_to_0, reset_to_1]

gamma = 0.23
error = amplitude_damping_error(gamma)
results = approximate_quantum_error(error, operator_list=reset_kraus)
print(results)
QuantumError on 1 qubits. Noise circuits:
  P(0) = 0.8237482193044617, Circuit =
   ┌───┐
q: ┤ I ├
   └───┘
  P(1) = 0.17625178069553835, Circuit =
   ┌───────┐
q: ┤ kraus ├
   └───────┘
  P(2) = 2.158685879252966e-23, Circuit =
   ┌───────┐
q: ┤ kraus ├
   └───────┘

Notez la différence dans le canal de sortie : les probabilités sont les mêmes, mais les opérateurs Kraus en entrée ont été convertis en canaux généraux Kraus, qui ne peuvent pas être utilisés dans un simulateur de Clifford. Par conséquent, il est toujours préférable de passer un objet QuantumError au lieu des matrices Kraus, lorsque c’est possible.

[7]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
qiskit-terra0.24.0.dev0+dba2eff
qiskit-aer0.11.2
qiskit-ignis0.7.1
qiskit-ibmq-provider0.20.0
qiskit0.41.0
System information
Python version3.8.11
Python compilerClang 12.0.5 (clang-1205.0.22.11)
Python builddefault, Jul 27 2021 10:46:38
OSDarwin
CPUs8
Memory (Gb)64.0
Wed Feb 15 14:17:23 2023 JST

This code is a part of Qiskit

© Copyright IBM 2017, 2023.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

[ ]: