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.3.0
qiskit-aer~=0.17
Přesná simulace s primitivy Qiskit ukazuje, jak používat referenční primitivy obsažené v Qiski k provádění přesné simulace kvantových Circuit. Stávající kvantové procesory trpí chybami, neboli šumem, takže výsledky přesné simulace nemusí nutně odpovídat výsledkům, které bys očekával(a) při spuštění Circuit na skutečném hardwaru. Zatímco referenční primitivy v Qiski modelování šumu nepodporují, Qiskit Aer obsahuje implementace primitiv, které modelování šumu podporují. Qiskit Aer je vysoce výkonný simulátor kvantových Circuit, který můžeš použít místo referenčních primitiv pro lepší výkon a více funkcí. Je součástí ekosystému Qiskit. V tomto článku ukážeme použití primitiv Qiskit Aer pro přesnou a zašuměnou simulaci.
- 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 Qiskit Runtime. 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 Circuit 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 Circuit 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()
{'00100000': 1,
'00000000': 65,
'10101000': 1,
'10000000': 5,
'00001000': 1,
'00000110': 2,
'11110010': 1,
'00000011': 3,
'01010000': 3,
'11000000': 3,
'01111000': 1,
'01000000': 2,
'00000010': 1,
'01100000': 1,
'00011000': 1,
'00111100': 1,
'00010100': 1,
'00001111': 1,
'00110000': 1,
'01100101': 1,
'00000100': 1,
'10100000': 1,
'00000001': 1,
'11010000': 1}
Další kroky
- Pro simulaci malých, jednoduchých Circuit si prohlédni Přesnou simulaci s primitivy Qiskit.
- Prostuduj si dokumentaci Qiskit Aer.