Přesná a zašuměná simulace s primitivy Qiskit Aer
Verze balíčků
Kód na této stránce byl vyvinut s použitím následujících požadavků. Doporučujeme používat tyto verze nebo novější.
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.
- Je vyžadován
qiskit-aerv0.14 nebo novější. - Přestože primitivy Qiskit Aer implementují rozhraní primitiv, neposkytují stejné možnosti jako primitivy IBM Quantum. Například úroveň odolnosti (resilience level) není u primitiv Qiskit Aer dostupná.
- Podrobnosti o možnostech simulační metody, které Aer podporuje, najdeš v dokumentaci AerSimulator.
Pro prozkoumání přesné a zašuměné simulace vytvoř ukázkový Circuit na osmi Qubitech:
# 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")
Tento Circuit obsahuje parametry reprezentující rotační úhly pro Gate a . Při simulaci tohoto obvod musíme zadat explicitní hodnoty těchto parametrů. V další buňce zadáme hodnoty těchto parametrů a použijeme primitiv Estimator z Qiskit Aer k výpočtu přesné střední hodnoty observablu .
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
Nyní inicializujeme model šumu, který zahrnuje depolarizační chybu 2 % na každém Gate CX. V praxi jsou chyby pocházející z dvoQubitových Gate, v tomto případě Gate CX, dominantním zdrojem chyb při spouštění Circuit. Přehled vytváření modelů šumu v Qiskit Aer najdeš v části Sestavení modelů šumu.
V další buňce sestavíme Estimator zahrnující tento model šumu a použijeme ho k výpočtu střední hodnoty observablu.
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
Jak vidíš, střední hodnota v přítomnosti šumu je poměrně daleko od správné hodnoty. V praxi můžeš využít různé techniky potlačení chyb k boji proti efektům šumu, ale diskuze o těchto technikách je nad rámec tohoto článku.
Abychom získali hrubou představu o tom, jak šum ovlivňuje konečný výsledek, uvažujme náš model šumu, který přidává depolarizační chybu 2 % ke každému Gate CX. Depolarizační chyba s pravděpodobností je definována jako kvantový kanál , který má následující působení na matici hustoty :
kde je počet Qubitů, v tomto případě 2. To znamená, že s pravděpodobností je stav nahrazen zcela smíšeným stavem a stav je zachován s pravděpodobností . Po aplikacích depolarizačního kanálu by pravděpodobnost zachování stavu byla . Proto očekáváme, že pravděpodobnost zachování správného stavu na konci simulace klesá exponenciálně s počtem Gate CX v našem Circuit.
Spočítejme počet Gate CX v našem Circuit a vypočítejme . Zavoláme count_ops, abychom získali slovník mapující názvy Gate na počty, a načteme záznam pro Gate CX.
cx_count = circuit.count_ops()["cx"]
(1 - cx_depolarizing_prob) ** cx_count
0.6542558123199923
Tato hodnota, 65 %, poskytuje hrubý odhad pravděpodobnosti, že náš konečný stav je správný. Jde o konzervativní odhad, protože nebere v úvahu počáteční stav simulace.
Následující buňka kódu ukazuje, jak použít primitiv Sampler z Qiskit Aer k vzorkování ze zašuměného Circuit. Před spuštěním s primitivem Sampler musíme do obvod přidat měření.
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}
Další kroky
- Pro simulaci malých, jednoduchých Circuit si prohlédni Přesnou simulaci s primitivy Qiskit SDK.
- Prostuduj si dokumentaci Qiskit Aer.