Spanish
Idiomas
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

Nota

Esta página fue generada a partir de tutorials/simulators/5_noise_transformation.ipynb.

Transformación de Ruido

Introducción

Este cuaderno muestra como usar las funciones de utilidad approximate_quantum_error y approximate_noise_model de Qiskit Aer para transformar canales de ruido cuántico en un canal de ruido cuántico más adecuado.

Nuestro ejemplo guía es la simulación de Clifford. Un simulador de Clifford puede simular eficientemente cálculos cuánticos que incluyen compuertas solo de un conjunto limitado, no universal (las compuertas de Clifford). No todos los ruidos cuánticos pueden ser agregados a dichas simulaciones, por lo tanto, nuestro objetivo es encontrar un canal de ruido suficientemente «parecido» que pueda ser simulado en un simulador de Clifford.

Comenzamos importando las funciones de transformación desde las utilidades del proveedor Aer

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

El nombre «approximate» sugiere que estas funciones generan el error más parecido posible (en la métrica Hilbert-Schmidt) al error dado.

Demostramos la aproximación usando varios canales de errores estándar definidos en 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

Descripción general

Un canal cuántico de 1 qubit es una función \(\mathcal{C}:\mathbb{C}^{2\times2}\to\mathbb{C}^{2\times2}\) que mapea operadores de densidad a operadores de densidad (para asegurar que la imagen sea un operador de densidad se requiere que \(\mathcal{C}\) sea completamente positivo y que preserve la traza, completely positive and trace preserving CPTP).

Dados los canales cuánticos \(\mathcal{E}_{1},\dots,\mathcal{E}_{r}\) y las probabilidades \(p_1, p_2, \dots, p_r\) tales que \(0\le p_i \le 1\) y \(p_1+\dots +p_r = 1\), un nuevo canal cuántico \(\mathcal{C}_\mathcal{E}\) puede ser construido tal que \(\mathcal{C}_\mathcal{E}(\rho)\) tiene el efecto de escoger el canal \(\mathcal{E}_i\) con probabilidad \(p_i\) y aplicarlo a \(\rho\).

La función de transformación de ruido resuelve el siguiente problema de optimización: Dado el canal \(\mathcal{C}\) («objetivo») y una lista de canales \(\mathcal{E}_{1},\dots,\mathcal{E}_{r}\) encontrar las probabilidades \(p_1, p_2, \dots, p_r\) minimizando \(D(\mathcal{C}, \mathcal{C}_\mathcal{E})\) acorde con alguna métrica de distancia \(D\) (la métrica Hilbert-Schmidt es usada actualmente).

Para asegurar que la aproximación es honesta, en el sentido de que un canal de error aproximado sirve como un «limite superior» para el canal de error actual, añadimos la restricción de honestidad adicional:

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

Donde \(\text{F}\) es una medida de fidelidad e \(I\) es un canal de identidad.

Ejemplo: Aproximar el ruido de amortiguación de amplitud con ruido de restablecimiento.

El ruido de Amortiguamiento de amplitud es descrito por un único parámetro \(0\le \gamma \le 1\) y dado por los operadores 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}\]

El error de Restablecimiento es descrito por las probabilidades \(0\le p, q\le 1\) tal que \(p+q\le 1\) y dados por los operadores de 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}\]

Esto se puede pensar como «restablecer» el estado cuántico del qubit afectado a \(\left|0\right\rangle\) con una probabilidad \(p\), a \(\left|1\right\rangle\) con probabilidad \(q\), y no hacer nada con probabilidad \(1-(p+q)\).

No es muy difícil determinar de manera analítica los mejores valores de \(p,q\) para aproximar un canal de amortiguamiento de amplitud \(\gamma\), ve los detalles aquí. La mejor aproximación es:

\[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")

Sólo necesitábamos el código anterior para realizar la aproximación real.

[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

Obtuvimos los resultados predichos analíticamente.

Diferentes tipos de entrada

La función de aproximación recibe dos entradas: el canal de error a aproximar, y un conjunto de canales de error que pueden ser utilizados en la construcción de la aproximación.

El canal de error a aproximar se puede dar como cualquier entrada que se pueda convertir al objeto QuantumError.

Como ejemplo, construimos explícitamente las matrices de Kraus de amortiguación de amplitud y las pasamos a la misma función de aproximación que antes:

[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 ├
        └───┘

Los operadores de error que se utilizan para construir el canal de aproximación se pueden dar como una lista, un diccionario o una cadena que indique los canales codificados de forma fija (hard-coded).

Cualquier canal puede ser una lista de operadores de Kraus o de objetos “QuantumError”.

No es necesario que el canal de identidad se pase directamente; siempre se usa implícitamente.

Por ejemplo, aproximamos la amortiguación de amplitud utilizando una representación explícita de Kraus para los ruidos de restablecimiento:

[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 ├
   └───────┘

Observa la diferencia en el canal de salida: Las probabilidades son las mismas, pero los operadores de Kraus de entrada se han convertido en canales de Kraus generales, que no pueden ser utilizados en un simulador de Clifford. Por lo tanto, siempre es mejor pasar un objeto QuantumError en lugar de las matrices de Kraus, cuando sea posible.

[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.

[ ]: