Bina model hingar
Versi pakej
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.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 Gate CPTP. Ralat ini boleh digunakan:- Selepas arahan gate 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:
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.backend("ibm_fez")
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 gate , 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', 'u2', 'u1']
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 gate 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', 'u2', 'u1']
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 Circuit 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 gate asas simulator, mengikut gate 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 Gate satu-Qubit, balikkan keadaan Qubit dengan kebarangkalian
p_gate1. - Apabila menerapkan Gate 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: ['u3', 'u2', 'measure', 'cx', 'reset', '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 Gate 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: ['u3', 'u2', 'measure', 'cx', 'reset']
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.