French
Languages
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

Note

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

Application du bruit aux portes unitaires personnalisées

Introduction

Ce bloc-notes montre comment ajouter des portes unitaires personnalisées à un circuit quantique et les utiliser pour des simulations de bruit dans Qiskit Aer.

[1]:
from qiskit import transpile, QuantumCircuit
import qiskit.quantum_info as qi

from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel, amplitude_damping_error

from qiskit.tools.visualization import plot_histogram

Création d’opérateurs de matrice

Nous pouvons utiliser la classe Operator dans qiskit.quantum_info pour représenter arbitrairement des opérateurs de tableau. Si l’opérateur est unitaire, il peut être ajouté à un circuit quantique et utilisé pour la simulation dans Qiskit Aer.

Créons deux opérateurs ci-dessous pour une porte CNOT et une porte iSWAP :

\[\begin{split}\mbox{CNOT} = \left(\begin{array} & 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \end{array}\right), \quad \mbox{iSWAP} = \left(\begin{array} & 1 & 0 & 0 & 0 \\ 0 & 0 & i & 0 \\ 0 & i & 0 & 0 \\ 0 & 0 & 0 & 1 \end{array}\right)\end{split}\]
[2]:
# CNOT matrix operator with qubit-0 as control and qubit-1 as target
cx_op = qi.Operator([[1, 0, 0, 0],
                     [0, 0, 0, 1],
                     [0, 0, 1, 0],
                     [0, 1, 0, 0]])

# iSWAP matrix operator
iswap_op = qi.Operator([[1, 0, 0, 0],
                        [0, 0, 1j, 0],
                        [0, 1j, 0, 0],
                        [0, 0, 0, 1]])

Remarque : La matrice est spécifiée par rapport au produit tensoriel \(U_{b}\otimes U_{a}\) pour les qubits spécifiés par la liste [a,b].

Utilisation d’opérateurs dans les circuits

Montrons comment ceux-ci peuvent être utilisés dans un circuit. Nous allons considérer un exemple d’implémentation d’une porte CNOT décomposée en termes de portes à un seul qubit et de la porte iSWAP comme suit.

[3]:
# CNOT in terms of iSWAP and single-qubit gates
cx_circ = QuantumCircuit(2, name='cx<iSWAP>')

# Add gates
cx_circ.sdg(1)
cx_circ.h(1)
cx_circ.sdg(0)
cx_circ.unitary(iswap_op, [0, 1], label='iswap')
cx_circ.sdg(0)
cx_circ.h(0)
cx_circ.sdg(0)
cx_circ.unitary(iswap_op, [0, 1], label='iswap')
cx_circ.s(1)

print(cx_circ)
     ┌─────┐     ┌────────┐┌─────┐┌───┐┌─────┐┌────────┐
q_0: ┤ SDG ├─────┤0       ├┤ SDG ├┤ H ├┤ SDG ├┤0       ├─────
     ├─────┤┌───┐│  iswap │└─────┘└───┘└─────┘│  iswap │┌───┐
q_1: ┤ SDG ├┤ H ├┤1       ├───────────────────┤1       ├┤ S ├
     └─────┘└───┘└────────┘                   └────────┘└───┘

Notez que nous avons attribué un label optionnel de "iswap" à l’unité lorsqu’il est inséré. Cela nous permet d’identifier cet unitaire dans un Qiskit Aer NoiseModel afin que nous puissions ajouter des erreurs à ces portes unitaires personnalisées dans les simulations de circuits bruités.

Nous pouvons confirmer que ce circuit retourne la sortie correcte en utilisant la classe Operator en tant que simulateur pour le circuit :

[4]:
# Simulate the unitary for the circuit using Operator:
unitary = qi.Operator(cx_circ)
print(unitary)
Operator([[1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
          [0.+0.j, 0.+0.j, 0.+0.j, 1.+0.j],
          [0.+0.j, 0.+0.j, 1.+0.j, 0.+0.j],
          [0.+0.j, 1.+0.j, 0.+0.j, 0.+0.j]],
         input_dims=(2, 2), output_dims=(2, 2))

Et pour confirmer que la sortie est correcte, on peut calculer la fidélité moyenne de la porte :

[5]:
f_ave = qi.average_gate_fidelity(cx_op, unitary)
print("Average Gate Fidelity: F = {:f}".format(f_ave))
Average Gate Fidelity: F = 1.000000

Création d’une unité personnalisée dans un modèle de bruit

Le Qiskit Aer AerSimulator supporte la simulation d’opérateurs unitaires arbitraires directement comme spécifié par le "unitary" dans les portes de base.

[6]:
'unitary' in AerSimulator().configuration().basis_gates
[6]:
True

Cela nous permet d’ajouter des modèles de bruit à des unités arbitraires dans notre simulation lorsque nous les identifions en utilisant l’argument optionnel label de QuantumCircuit.unitary.

Nous allons maintenant le faire en créant un NoiseModel qui inclut un canal d’erreur quantique sur notre portail iSWAP personnalisé. Pour notre exemple, nous allons créer une erreur 2-qubit composée de deux canaux d’amortissement d’amplitude simple avec des paramètres d’amortissement différents. Pour l’instant, nous supposons que toutes les autres instructions de circuit sont idéales.

[7]:
# Error parameters
param_q0 = 0.05  # damping parameter for qubit-0
param_q1 = 0.1   # damping parameter for qubit-1

# Construct the error
qerror_q0 = amplitude_damping_error(param_q0)
qerror_q1 = amplitude_damping_error(param_q1)
iswap_error = qerror_q1.tensor(qerror_q0)

# Build the noise model by adding the error to the "iswap" gate
noise_model = NoiseModel()
noise_model.add_all_qubit_quantum_error(iswap_error, 'iswap')

Notez que lorsque nous ajoutons une erreur à un label personnalisé tel que "iswap", le NoiseModel ne sait pas à quelle porte ce label est censé s’appliquer, donc nous devons ajouter manuellement la chaîne de porte désirée au modèle de bruit basis_gates. Cela garantit que le compilateur se déplace vers les portes de base correctes pour la simulation du modèle de bruit. Cela peut être fait en utilisant la fonction NoiseModel.add_basis_gates :

[8]:
noise_model.add_basis_gates(['unitary'])
print(noise_model.basis_gates)
['cx', 'id', 'u3', 'unitary']

Par défaut, les portes de base d’un modèle de bruit sont ['cx','id','u3'] plus toutes les portes de base standard AerSimulator qui sont ajoutées au modèle de bruit.

Simuler un modèle de bruit unitaire personnalisé

Commençons par prendre notre circuit CX précédent et ajouter une porte Hadamard initiale et une mesure finale pour créer un circuit de préparation d’état Bell-que nous pouvons simuler sur le AerSimulator pour le cas idéal et bruyant:

[9]:
# Bell state circuit where iSWAPS should be inserted at barrier locations
bell_circ = QuantumCircuit(2, 2, name='bell')
bell_circ.h(0)
bell_circ.append(cx_circ, [0, 1])
bell_circ.measure([0,1], [0,1])
print(bell_circ)
     ┌───┐┌────────────┐┌─┐
q_0: ┤ H ├┤0           ├┤M├───
     └───┘│  cx<iSWAP> │└╥┘┌─┐
q_1: ─────┤1           ├─╫─┤M├
          └────────────┘ ║ └╥┘
c: 2/════════════════════╩══╩═
                         0  1

Sortie idéale

Voyons d’abord la sortie idéale, puisque cela génère un état de Bell, nous attendons deux pics pour 00 et 11.

[10]:
# Create ideal simulator backend and transpile circuit
sim_ideal = AerSimulator()
tbell_circ = transpile(bell_circ, sim_ideal)

ideal_result = sim_ideal.run(tbell_circ).result()
ideal_counts = ideal_result.get_counts(0)
plot_histogram(ideal_counts,
               title='Ideal output for iSWAP bell-state preparation')
[10]:
../../_images/tutorials_simulators_4_custom_gate_noise_24_0.png

Exécution du circuit bruité

Enfin, nous allons maintenant le simuler avec notre modèle de bruit personnalisé. Comme il y a une petite erreur d’amortissement d’amplitude sur les portes à deux qubits, nous nous attendons à de petits pics supplémentaires pour les probabilités de résultat 01 et 10.

[11]:
# Create noisy simulator and transpile circuit
sim_noise = AerSimulator(noise_model=noise_model)
tbell_circ_noise = transpile(bell_circ, sim_noise)

# Run on the simulator without noise
noise_result = sim_noise.run(tbell_circ_noise).result()
noise_counts = noise_result.get_counts(bell_circ)
plot_histogram(noise_counts,
               title='Noisy output for iSWAP bell-state preparation')
[11]:
../../_images/tutorials_simulators_4_custom_gate_noise_26_0.png
[12]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
Qiskit0.25.0
Terra0.17.0
Aer0.8.0
Ignis0.6.0
Aqua0.9.0
IBM Q Provider0.12.2
System information
Python3.7.7 (default, May 6 2020, 04:59:01) [Clang 4.0.1 (tags/RELEASE_401/final)]
OSDarwin
CPUs6
Memory (Gb)32.0
Fri Apr 02 12:12:41 2021 EDT

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

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.

[ ]: