Bina model hingar
Package versions
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.
qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1
qiskit-aer~=0.17
Halaman ini menunjukkan cara menggunakan modul noise Qiskit Aer untuk membina model hingar bagi mensimulasikan litar kuantum dalam kehadiran ralat. Ini berguna untuk meniru pemproses kuantum yang berbising dan untuk mengkaji kesan hingar terhadap pelaksanaan algoritma kuantum.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
import numpy as np
from qiskit import QuantumCircuit
from qiskit.quantum_info import Kraus, SuperOp
from qiskit.visualization import plot_histogram
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_aer import AerSimulator
# Import from Qiskit Aer noise module
from qiskit_aer.noise import (
NoiseModel,
QuantumError,
ReadoutError,
depolarizing_error,
pauli_error,
thermal_relaxation_error,
)
Modul noise Qiskit Aer
Modul noise Qiskit Aer mengandungi kelas Python untuk membina model hingar tersuai bagi simulasi. Terdapat tiga kelas utama:
-
Kelas
NoiseModelyang menyimpan model hingar untuk simulasi berbising. -
Kelas
QuantumErroryang menerangkan ralat get CPTP. Ralat ini boleh digunakan:- Selepas arahan get atau reset
- Sebelum arahan measure.
-
Kelas
ReadoutErroryang menerangkan ralat bacaan klasikal.
Memulakan model hingar daripada backend
Anda boleh memulakan model hingar dengan parameter yang ditetapkan daripada data penentukuran terkini untuk backend fizikal.
Backend tiruan FakeSherbrooke daripada qiskit_ibm_runtime digunakan dalam contoh-contoh ini, tetapi anda boleh mencubanya pada mana-mana backend nyata atau tiruan yang serasi dengan Qiskit.
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
backend = FakeSherbrooke()
noise_model = NoiseModel.from_backend(backend)
Ini akan menghasilkan model hingar yang lebih kurang menghampiri ralat yang akan ditemui semasa menggunakan backend tersebut. Jika anda mahukan kawalan yang lebih terperinci ke atas parameter model hingar, anda perlu mencipta model hingar sendiri, seperti yang diterangkan dalam bahagian selebihnya pada halaman ini.
Ralat kuantum
Daripada berurusan terus dengan objek QuantumError, terdapat banyak fungsi pembantu yang boleh menjana jenis ralat kuantum berparameter tertentu secara automatik. Fungsi-fungsi ini terkandung dalam modul noise dan merangkumi pelbagai jenis ralat biasa yang digunakan dalam penyelidikan pengkomputeran kuantum. Nama fungsi dan jenis ralat yang dikembalikannya adalah:
| Fungsi ralat piawai | Butiran |
|---|---|
kraus_error | saluran ralat CPTP n-qubit am yang diberikan sebagai senarai matriks Kraus . |
mixed_unitary_error | ralat unitar bercampur n-qubit yang diberikan sebagai senarai matriks unitar dan kebarangkalian . |
coherent_unitary_error | ralat unitar koheren n-qubit yang diberikan sebagai satu matriks unitar . |
pauli_error | saluran ralat Pauli n-qubit (unitar bercampur) yang diberikan sebagai senarai Pauli dan kebarangkalian |
depolarizing_error | saluran ralat depolarisasi n-qubit yang diparameterpakan oleh kebarangkalian depolarisasi . |
reset_error | ralat set semula satu qubit yang diparameterpakan oleh kebarangkalian untuk set semula ke keadaan , . |
thermal_relaxation_error | saluran kelonggaran terma satu qubit yang diparameterpakan oleh pemalar masa kelonggaran , , masa get , dan populasi terma keadaan teruja . |
phase_amplitude_damping_error | saluran ralat redaman fasa dan amplitud gabungan teritlak satu qubit yang diberikan oleh parameter redaman amplitud , parameter redaman fasa , dan populasi terma keadaan teruja . |
amplitude_damping_error | saluran ralat redaman amplitud teritlak satu qubit yang diberikan oleh parameter redaman amplitud , dan populasi terma keadaan teruja . |
phase_damping_error | saluran ralat redaman fasa satu qubit yang diberikan oleh parameter redaman fasa . |
Menggabungkan ralat kuantum
Contoh QuantumError boleh digabungkan menggunakan komposisi, hasil darab tensor, dan pengembangan tensor (hasil darab tensor terterbalik) untuk menghasilkan QuantumError baharu seperti berikut:
- Komposisi: sebagai
error = error1.compose(error2) - Hasil darab tensor: sebagai
error = error1.tensor(error2) - Hasil darab kembang: sebagai
error = error1.expand(error2)
Contoh
Untuk membina ralat balik bit satu qubit sebanyak 5%:
# Construct a 1-qubit bit-flip and phase-flip errors
p_error = 0.05
bit_flip = pauli_error([("X", p_error), ("I", 1 - p_error)])
phase_flip = pauli_error([("Z", p_error), ("I", 1 - p_error)])
print(bit_flip)
print(phase_flip)
QuantumError on 1 qubits. Noise circuits:
P(0) = 0.05, Circuit =
┌───┐
q: ┤ X ├
└───┘
P(1) = 0.95, Circuit =
┌───┐
q: ┤ I ├
└───┘
QuantumError on 1 qubits. Noise circuits:
P(0) = 0.05, Circuit =
┌───┐
q: ┤ Z ├
└───┘
P(1) = 0.95, Circuit =
┌───┐
q: ┤ I ├
└───┘
# Compose two bit-flip and phase-flip errors
bitphase_flip = bit_flip.compose(phase_flip)
print(bitphase_flip)
QuantumError on 1 qubits. Noise circuits:
P(0) = 0.0025000000000000005, Circuit =
┌───┐┌───┐
q: ┤ X ├┤ Z ├
└───┘└───┘
P(1) = 0.0475, Circuit =
┌───┐┌───┐
q: ┤ X ├┤ I ├
└───┘└───┘
P(2) = 0.0475, Circuit =
┌───┐┌───┐
q: ┤ I ├┤ Z ├
└───┘└───┘
P(3) = 0.9025, Circuit =
┌───┐┌───┐
q: ┤ I ├┤ I ├
└───┘└───┘
# Tensor product two bit-flip and phase-flip errors with
# bit-flip on qubit-0, phase-flip on qubit-1
error2 = phase_flip.tensor(bit_flip)
print(error2)
QuantumError on 2 qubits. Noise circuits:
P(0) = 0.0025000000000000005, Circuit =
┌───┐
q_0: ┤ X ├
├───┤
q_1: ┤ Z ├
└───┘
P(1) = 0.0475, Circuit =
┌───┐
q_0: ┤ I ├
├───┤
q_1: ┤ Z ├
└───┘
P(2) = 0.0475, Circuit =
┌───┐
q_0: ┤ X ├
├───┤
q_1: ┤ I ├
└───┘
P(3) = 0.9025, Circuit =
┌───┐
q_0: ┤ I ├
├───┤
q_1: ┤ I ├
└───┘
Menukar ke dan daripada operator QuantumChannel
Kita juga boleh menukar antara objek QuantumError dalam Qiskit Aer dan objek QuantumChannel dalam Qiskit.
# Convert to Kraus operator
bit_flip_kraus = Kraus(bit_flip)
print(bit_flip_kraus)
Kraus([[[-9.74679434e-01+0.j, 0.00000000e+00+0.j],
[ 0.00000000e+00+0.j, -9.74679434e-01+0.j]],
[[ 0.00000000e+00+0.j, 2.23606798e-01+0.j],
[ 2.23606798e-01+0.j, -4.96506831e-17+0.j]]],
input_dims=(2,), output_dims=(2,))
# Convert to Superoperator
phase_flip_sop = SuperOp(phase_flip)
print(phase_flip_sop)
SuperOp([[1. +0.j, 0. +0.j, 0. +0.j, 0. +0.j],
[0. +0.j, 0.9+0.j, 0. +0.j, 0. +0.j],
[0. +0.j, 0. +0.j, 0.9+0.j, 0. +0.j],
[0. +0.j, 0. +0.j, 0. +0.j, 1. +0.j]],
input_dims=(2,), output_dims=(2,))
# Convert back to a quantum error
print(QuantumError(bit_flip_kraus))
# Check conversion is equivalent to original error
QuantumError(bit_flip_kraus) == bit_flip
QuantumError on 1 qubits. Noise circuits:
P(0) = 1.0, Circuit =
┌───────┐
q: ┤ kraus ├
└───────┘
True
Ralat bacaan
Ralat bacaan klasikal ditentukan oleh senarai vektor kebarangkalian tugasan :
- ialah nilai bit klasikal yang direkod
- ialah nilai bit sebenar yang dikembalikan daripada pengukuran
Contohnya, untuk satu qubit: .
# Measurement misassignment probabilities
p0given1 = 0.1
p1given0 = 0.05
ReadoutError([[1 - p1given0, p1given0], [p0given1, 1 - p0given1]])
ReadoutError([[0.95 0.05]
[0.1 0.9 ]])
Ralat bacaan juga boleh digabungkan menggunakan compose, tensor dan expand, sama seperti ralat kuantum.
Tambah ralat pada model hingar
Apabila menambah ralat kuantum pada model hingar, kita perlu menentukan jenis arahan yang ia bertindak ke atasnya dan qubit mana yang hendak digunakan. Terdapat dua kes ralat kuantum:
- Ralat kuantum semua qubit
- Ralat kuantum qubit tertentu
1. Ralat kuantum semua qubit
Ini menerapkan ralat yang sama pada setiap kemunculan sesuatu arahan, tanpa mengira qubit mana yang ia bertindak ke atasnya.
Ia ditambah sebagai noise_model.add_all_qubit_quantum_error(error, instructions):
# Create an empty noise model
noise_model = NoiseModel()
# Add depolarizing error to all single qubit u1, u2, u3 gates
error = depolarizing_error(0.05, 1)
noise_model.add_all_qubit_quantum_error(error, ["u1", "u2", "u3"])
# Print noise model info
print(noise_model)
NoiseModel:
Basis gates: ['cx', 'id', 'rz', 'sx', 'u1', 'u2', 'u3']
Instructions with noise: ['u3', 'u1', 'u2']
All-qubits errors: ['u1', 'u2', 'u3']
2. Ralat kuantum qubit tertentu
Ini menerapkan ralat pada setiap kemunculan arahan yang bertindak ke atas senarai qubit yang ditetapkan. Perlu diambil perhatian bahawa susunan qubit adalah penting: sebagai contoh, ralat yang digunakan pada qubit [0, 1] untuk get dua-qubit adalah berbeza dengan ralat pada qubit [1, 0].
Ia ditambah sebagai noise_model.add_quantum_error(error, instructions, qubits):
# Create an empty noise model
noise_model = NoiseModel()
# Add depolarizing error to all single qubit u1, u2, u3 gates on qubit 0 only
error = depolarizing_error(0.05, 1)
noise_model.add_quantum_error(error, ["u1", "u2", "u3"], [0])
# Print noise model info
print(noise_model)
NoiseModel:
Basis gates: ['cx', 'id', 'rz', 'sx', 'u1', 'u2', 'u3']
Instructions with noise: ['u3', 'u1', 'u2']
Qubits with noise: [0]
Specific qubit errors: [('u1', (0,)), ('u2', (0,)), ('u3', (0,))]
Nota mengenai ralat kuantum qubit bukan setempat
NoiseModel tidak menyokong penambahan ralat kuantum qubit bukan setempat. Ralat-ralat ini perlu dikendalikan di luar NoiseModel. Ini bermakna anda perlu menulis laluan transpiler anda sendiri (TransformationPass) dan menjalankan laluan tersebut sejurus sebelum menjalankan simulator jika anda perlu memasukkan ralat kuantum ke dalam litar anda mengikut syarat-syarat anda sendiri.
Laksanakan simulasi berbising dengan model hingar
Arahan AerSimulator(noise_model=noise_model) mengembalikan simulator yang dikonfigurasikan mengikut model hingar yang diberikan. Selain menetapkan model hingar simulator, ia juga mengatasi get-get asas simulator, mengikut get-get dalam model hingar.
Contoh model hingar
Sekarang kita akan lihat beberapa contoh model hingar. Untuk demonstrasi ini, kita gunakan litar ujian mudah yang menjana keadaan GHZ n-qubit:
# System Specification
n_qubits = 4
circ = QuantumCircuit(n_qubits)
# Test Circuit
circ.h(0)
for qubit in range(n_qubits - 1):
circ.cx(qubit, qubit + 1)
circ.measure_all()
print(circ)
┌───┐ ░ ┌─┐
q_0: ┤ H ├──■─────────────░─┤M├─────────
└───┘┌─┴─┐ ░ └╥┘┌─┐
q_1: ─────┤ X ├──■────────░──╫─┤M├──────
└───┘┌─┴─┐ ░ ║ └╥┘┌─┐
q_2: ──────────┤ X ├──■───░──╫──╫─┤M├───
└───┘┌─┴─┐ ░ ║ ║ └╥┘┌─┐
q_3: ───────────────┤ X ├─░──╫──╫──╫─┤M├
└───┘ ░ ║ ║ ║ └╥┘
meas: 4/════════════════════════╩══╩══╩══╩═
0 1 2 3
Simulasi ideal
# Ideal simulator and execution
sim_ideal = AerSimulator()
result_ideal = sim_ideal.run(circ).result()
plot_histogram(result_ideal.get_counts(0))
Contoh hingar 1: Model hingar ralat bit-flip asas
Mari kita tengok satu contoh model hingar mainan mudah yang lazim dalam penyelidikan teori maklumat kuantum:
- Apabila menerapkan get satu-qubit, balikkan keadaan qubit dengan kebarangkalian
p_gate1. - Apabila menerapkan get dua-qubit, kenakan ralat satu-qubit pada setiap qubit.
- Apabila menetapkan semula qubit, tetapkan semula ke 1 bukannya 0 dengan kebarangkalian
p_reset. - Apabila mengukur qubit, balikkan keadaan qubit dengan kebarangkalian
p_meas.
# Example error probabilities
p_reset = 0.03
p_meas = 0.1
p_gate1 = 0.05
# QuantumError objects
error_reset = pauli_error([("X", p_reset), ("I", 1 - p_reset)])
error_meas = pauli_error([("X", p_meas), ("I", 1 - p_meas)])
error_gate1 = pauli_error([("X", p_gate1), ("I", 1 - p_gate1)])
error_gate2 = error_gate1.tensor(error_gate1)
# Add errors to noise model
noise_bit_flip = NoiseModel()
noise_bit_flip.add_all_qubit_quantum_error(error_reset, "reset")
noise_bit_flip.add_all_qubit_quantum_error(error_meas, "measure")
noise_bit_flip.add_all_qubit_quantum_error(error_gate1, ["u1", "u2", "u3"])
noise_bit_flip.add_all_qubit_quantum_error(error_gate2, ["cx"])
print(noise_bit_flip)
NoiseModel:
Basis gates: ['cx', 'id', 'rz', 'sx', 'u1', 'u2', 'u3']
Instructions with noise: ['measure', 'cx', 'reset', 'u2', 'u3', 'u1']
All-qubits errors: ['reset', 'measure', 'u1', 'u2', 'u3', 'cx']
Jalankan simulasi beringar
# Create noisy simulator backend
sim_noise = AerSimulator(noise_model=noise_bit_flip)
# Transpile circuit for noisy basis gates
passmanager = generate_preset_pass_manager(
optimization_level=3, backend=sim_noise
)
circ_tnoise = passmanager.run(circ)
# Run and get counts
result_bit_flip = sim_noise.run(circ_tnoise).result()
counts_bit_flip = result_bit_flip.get_counts(0)
# Plot noisy output
plot_histogram(counts_bit_flip)
Contoh 2: Kelonggaran terma T1/T2
Sekarang mari kita pertimbangkan model ralat yang lebih realistik berdasarkan kelonggaran terma dengan persekitaran qubit:
- Setiap qubit diparameterkan dengan pemalar masa kelonggaran terma dan pemalar masa dephasing .
- Perlu diingat bahawa kita mesti ada .
- Kadar ralat pada arahan ditentukan oleh masa get dan nilai , qubit.
# T1 and T2 values for qubits 0-3
T1s = np.random.normal(
50e3, 10e3, 4
) # Sampled from normal distribution mean 50 microsec
T2s = np.random.normal(
70e3, 10e3, 4
) # Sampled from normal distribution mean 50 microsec
# Truncate random T2s <= T1s
T2s = np.array([min(T2s[j], 2 * T1s[j]) for j in range(4)])
# Instruction times (in nanoseconds)
time_u1 = 0 # virtual gate
time_u2 = 50 # (single X90 pulse)
time_u3 = 100 # (two X90 pulses)
time_cx = 300
time_reset = 1000 # 1 microsecond
time_measure = 1000 # 1 microsecond
# QuantumError objects
errors_reset = [
thermal_relaxation_error(t1, t2, time_reset) for t1, t2 in zip(T1s, T2s)
]
errors_measure = [
thermal_relaxation_error(t1, t2, time_measure) for t1, t2 in zip(T1s, T2s)
]
errors_u1 = [
thermal_relaxation_error(t1, t2, time_u1) for t1, t2 in zip(T1s, T2s)
]
errors_u2 = [
thermal_relaxation_error(t1, t2, time_u2) for t1, t2 in zip(T1s, T2s)
]
errors_u3 = [
thermal_relaxation_error(t1, t2, time_u3) for t1, t2 in zip(T1s, T2s)
]
errors_cx = [
[
thermal_relaxation_error(t1a, t2a, time_cx).expand(
thermal_relaxation_error(t1b, t2b, time_cx)
)
for t1a, t2a in zip(T1s, T2s)
]
for t1b, t2b in zip(T1s, T2s)
]
# Add errors to noise model
noise_thermal = NoiseModel()
for j in range(4):
noise_thermal.add_quantum_error(errors_reset[j], "reset", [j])
noise_thermal.add_quantum_error(errors_measure[j], "measure", [j])
noise_thermal.add_quantum_error(errors_u1[j], "u1", [j])
noise_thermal.add_quantum_error(errors_u2[j], "u2", [j])
noise_thermal.add_quantum_error(errors_u3[j], "u3", [j])
for k in range(4):
noise_thermal.add_quantum_error(errors_cx[j][k], "cx", [j, k])
print(noise_thermal)
NoiseModel:
Basis gates: ['cx', 'id', 'rz', 'sx', 'u2', 'u3']
Instructions with noise: ['cx', 'measure', 'reset', 'u2', 'u3']
Qubits with noise: [0, 1, 2, 3]
Specific qubit errors: [('reset', (0,)), ('reset', (1,)), ('reset', (2,)), ('reset', (3,)), ('measure', (0,)), ('measure', (1,)), ('measure', (2,)), ('measure', (3,)), ('u2', (0,)), ('u2', (1,)), ('u2', (2,)), ('u2', (3,)), ('u3', (0,)), ('u3', (1,)), ('u3', (2,)), ('u3', (3,)), ('cx', (0, 0)), ('cx', (0, 1)), ('cx', (0, 2)), ('cx', (0, 3)), ('cx', (1, 0)), ('cx', (1, 1)), ('cx', (1, 2)), ('cx', (1, 3)), ('cx', (2, 0)), ('cx', (2, 1)), ('cx', (2, 2)), ('cx', (2, 3)), ('cx', (3, 0)), ('cx', (3, 1)), ('cx', (3, 2)), ('cx', (3, 3))]
Jalankan simulasi beringar
# Run the noisy simulation
sim_thermal = AerSimulator(noise_model=noise_thermal)
# Transpile circuit for noisy basis gates
passmanager = generate_preset_pass_manager(
optimization_level=3, backend=sim_thermal
)
circ_tthermal = passmanager.run(circ)
# Run and get counts
result_thermal = sim_thermal.run(circ_tthermal).result()
counts_thermal = result_thermal.get_counts(0)
# Plot noisy output
plot_histogram(counts_thermal)
Langkah seterusnya
- Untuk mensimulasikan litar beringar, lihat Simulasi tepat dan beringar dengan Qiskit Aer primitives.
- Semak rujukan modul hingar Qiskit Aer.