Langkau ke kandungan utama

Simulasi tepat dan berbising dengan primitif Qiskit Aer

Versi pakej

Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.

qiskit[all]~=2.5.2
qiskit-aer~=0.17

Exact simulation with Qiskit SDK primitives demonstrates how to use the reference primitives included with Qiskit to perform exact simulation of quantum circuits. Currently existing quantum processors suffer from errors, or noise, so the results of an exact simulation do not necessarily reflect the results you would expect when running circuits on real hardware. While the reference primitives in Qiskit do not support modeling noise, Qiskit Aer includes implementations of the primitives that do support modeling noise. Qiskit Aer is a high-performance quantum circuit simulator that you can use in place of the reference primitives for better performance and more features. It is part of the Qiskit Ecosystem. In this article, we demonstrate the use of Qiskit Aer primitives for exact and noisy simulation.

Nota
  • qiskit-aer v0.14 atau lebih baharu diperlukan.
  • Walaupun primitif Qiskit Aer melaksanakan antara muka primitif, ia tidak menyediakan pilihan yang sama seperti primitif IBM Quantum. Tahap ketahanan, sebagai contoh, tidak tersedia dengan primitif Qiskit Aer.
  • Lihat dokumentasi AerSimulator untuk butiran tentang pilihan kaedah simulasi yang disokong Aer.

Untuk meneroka simulasi tepat dan berbising, cipta Circuit contoh pada lapan qubit:

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-aer
from qiskit.circuit.library import efficient_su2

n_qubits = 8
circuit = efficient_su2(n_qubits)
circuit.draw("mpl")

Output of the previous code cell

Circuit ini mengandungi parameter untuk mewakili sudut putaran bagi gate RyR_y dan RzR_z. Apabila mensimulasikan Circuit ini, kita perlu menentukan nilai eksplisit untuk parameter-parameter ini. Dalam sel seterusnya, kami menentukan beberapa nilai untuk parameter ini dan menggunakan primitif Estimator daripada Qiskit Aer untuk mengira nilai jangkaan tepat bagi boleh cerapan ZZZZZ \cdots Z.

from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_aer import AerSimulator
from qiskit_aer.primitives import EstimatorV2 as Estimator

observable = SparsePauliOp("Z" * n_qubits)
params = [0.1] * circuit.num_parameters

exact_estimator = Estimator()
# The circuit needs to be transpiled to the AerSimulator target
pass_manager = generate_preset_pass_manager(3, AerSimulator())
isa_circuit = pass_manager.run(circuit)
pub = (isa_circuit, observable, params)
job = exact_estimator.run([pub])
result = job.result()
pub_result = result[0]
exact_value = float(pub_result.data.evs)
exact_value
0.8870140234256602

Sekarang, mari inisialisasi model hingar yang menyertakan ralat depolarizing sebanyak 2% pada setiap gate CX. Dalam praktiknya, ralat yang timbul daripada gate dua qubit, yang merupakan gate CX di sini, adalah sumber ralat dominan apabila menjalankan Circuit. Lihat Bina model hingar untuk gambaran keseluruhan tentang membina model hingar dalam Qiskit Aer.

Dalam sel seterusnya, kami membina Estimator yang menggabungkan model hingar ini dan menggunakannya untuk mengira nilai jangkaan bagi boleh cerapan.

from qiskit_aer.noise import NoiseModel, depolarizing_error

noise_model = NoiseModel()
cx_depolarizing_prob = 0.02
noise_model.add_all_qubit_quantum_error(
depolarizing_error(cx_depolarizing_prob, 2), ["cx"]
)

noisy_estimator = Estimator(
options=dict(backend_options=dict(noise_model=noise_model))
)
job = noisy_estimator.run([pub])
result = job.result()
pub_result = result[0]
noisy_value = float(pub_result.data.evs)
noisy_value
0.7247404214143528

Seperti yang dapat dilihat, nilai jangkaan dengan kehadiran hingar adalah jauh daripada nilai yang betul. Dalam praktiknya, anda boleh menggunakan pelbagai teknik pengurangan ralat untuk mengatasi kesan hingar, tetapi perbincangan tentang teknik-teknik ini adalah di luar skop artikel ini.

Untuk mendapat gambaran kasar tentang bagaimana hingar mempengaruhi keputusan akhir, pertimbangkan model hingar kita, yang menambahkan ralat depolarizing sebanyak 2% kepada setiap gate CX. Ralat depolarizing dengan kebarangkalian pp ditakrifkan sebagai saluran kuantum EE yang mempunyai tindakan berikut pada matriks ketumpatan ρ\rho:

E(ρ)=(1p)ρ+pI2nE(\rho) = (1 - p) \rho + p\frac{I}{2^n}

di mana nn adalah bilangan qubit, dalam kes ini, 2. Iaitu, dengan kebarangkalian pp, keadaan digantikan dengan keadaan campuran sepenuhnya, dan keadaan dipelihara dengan kebarangkalian 1p1 - p. Selepas mm penggunaan saluran depolarizing, kebarangkalian keadaan dipelihara adalah (1p)m(1 - p)^m. Oleh itu, kita jangkakan kebarangkalian mengekalkan keadaan yang betul pada akhir simulasi akan menurun secara eksponen dengan bilangan gate CX dalam Circuit kita.

Mari hitung bilangan gate CX dalam Circuit kita dan kira (1p)m(1 - p)^m. Kita panggil count_ops untuk mendapatkan kamus yang memetakan nama gate kepada kiraan, dan dapatkan semula entri untuk gate CX.

cx_count = circuit.count_ops()["cx"]
(1 - cx_depolarizing_prob) ** cx_count
0.6542558123199923

Nilai ini, 65%, memberikan anggaran kasar tentang kebarangkalian keadaan akhir kita adalah betul. Ia adalah anggaran konservatif kerana ia tidak mengambil kira keadaan awal simulasi.

Sel kod berikut menunjukkan cara menggunakan primitif Sampler daripada Qiskit Aer untuk mengambil sampel daripada Circuit berbising. Kita perlu menambah pengukuran kepada Circuit sebelum menjalankannya dengan primitif Sampler.

from qiskit_aer.primitives import SamplerV2 as Sampler

measured_circuit = circuit.copy()
measured_circuit.measure_all()

noisy_sampler = Sampler(
options=dict(backend_options=dict(noise_model=noise_model))
)
# The circuit needs to be transpiled to the AerSimulator target
pass_manager = generate_preset_pass_manager(3, AerSimulator())
isa_circuit = pass_manager.run(measured_circuit)
pub = (isa_circuit, params, 100)
job = noisy_sampler.run([pub])
result = job.result()
pub_result = result[0]
pub_result.data.meas.get_counts()
{'00000110': 1,
'11100000': 1,
'00000000': 59,
'11000000': 3,
'11110000': 1,
'00010100': 1,
'00100000': 2,
'00000011': 3,
'00110010': 1,
'00110101': 1,
'00000101': 1,
'11000010': 1,
'10000000': 4,
'00110000': 1,
'01000000': 2,
'00010000': 2,
'00000100': 2,
'01010000': 1,
'00001000': 2,
'00011110': 1,
'00001010': 1,
'01111000': 1,
'10100000': 1,
'01100000': 1,
'00001100': 2,
'00010110': 1,
'01001000': 1,
'00101000': 1,
'00000010': 1}

Langkah seterusnya

Cadangan