Pelajari model hingar bagi sesuatu gate
Tutorial ini menunjukkan pembelajaran model hingar bagi gate uniter dengan protokol pembelajaran piawai yang boleh diakses melalui fungsi protokol peringkat tinggi prepare_vanilla_program() dan process_vanilla_result().
-
Takrifkan gate
-
Sediakan simulasi setempat
-
Sediakan atur cara kuantum
-
Jalankan atur cara kuantum
-
Baca keputusan
Litar di bawah disimulasikan secara setempat, jadi panduan ini tidak memerlukan bukti kelayakan IBM Quantum®. Untuk menjalankannya pada peranti sebenar sebagai alternatif:
-
Langkah 1: gantikan
FakeMarrakeshdengan backend sebenar. -
Langkah 2: serahkan backend tersebut sebagai mod executor, dan buang pilihan simulator.
1. Takrifkan gate
Gate ini ialah BoxOp yang memegang satu lapisan twirled yang terdiri daripada enam gate CZ yang tidak bersilang.
from qiskit.circuit import QuantumCircuit
from qiskit_ibm_runtime.fake_provider import FakeMarrakesh
from samplomatic import InjectNoise, Tag, Twirl
backend = FakeMarrakesh()
cz_pairs = [(91, 92), (93, 94), (95, 99), (98, 111), (112, 113), (114, 115)]
circuit = QuantumCircuit(backend.num_qubits)
with circuit.box([Twirl(), Tag("cz_gate"), InjectNoise("cz_gate")]):
for pair in cz_pairs:
circuit.cz(*pair)
from qiskit_ibm_runtime import QiskitRuntimeService
backend = QiskitRuntimeService().backend("ibm_marrakesh")
2. Sediakan simulasi setempat
Indeks Pauli di dalam setiap peta adalah setempat kepada gate, mengikut tertib qubit fizikal menaik:
cz_qubits = sorted({qubit for pair in cz_pairs for qubit in pair})
local = {qubit: index for index, qubit in enumerate(cz_qubits)}
local
{91: 0,
92: 1,
93: 2,
94: 3,
95: 4,
98: 5,
99: 6,
111: 7,
112: 8,
113: 9,
114: 10,
115: 11}
Takrifkan hingar dengan sebutan ZZ berkorelasi dan sebutan XX yang lebih lemah pada setiap pasangan CZ, serta sebutan Z qubit tunggal di mana-mana; pengukuran mendapat sebutan bit-flip bagi setiap qubit.
from qiskit.quantum_info import PauliLindbladMap
num_qubits = len(cz_qubits)
cz_noise = PauliLindbladMap.from_sparse_list(
[("ZZ", [local[a], local[b]], 8e-4) for a, b in cz_pairs]
+ [("XX", [local[a], local[b]], 4e-4) for a, b in cz_pairs]
+ [("Z", [index], 3e-4) for index in range(num_qubits)],
num_qubits=num_qubits,
)
readout_noise = PauliLindbladMap.from_sparse_list(
[("X", [index], 5e-3) for index in range(num_qubits)], num_qubits=num_qubits
)
Bina kotak untuk dipelajari oleh pengukuran.
measurement = QuantumCircuit(backend.num_qubits, num_qubits)
with measurement.box([Twirl(), Tag("readout"), InjectNoise("readout")]):
for clbit, qubit in enumerate(cz_qubits):
measurement.measure(qubit, clbit)
Setiap entri layer_noise_model memasangkan salah satu kotak tersebut dengan peta yang akan dikenakan padanya. Gunakan kaedah simulasi penstabil, dan tetapkan seed_simulator untuk menjadikan data simulasi boleh dihasilkan semula.
from qiskit_aer import AerSimulator
from qiskit_ibm_runtime import Executor
executor = Executor(
mode=AerSimulator(method="stabilizer"),
options={
"simulator": {
"layer_noise_model": [
(circuit[0], cz_noise),
(measurement[0], readout_noise),
],
"seed_simulator": 1234,
}
},
)
executor = Executor(mode=backend)
3. Sediakan program kuantum
Gunakan prepare_vanilla_program() untuk membina program kuantum yang mengandungi eksperimen pembelajaran.
from qiskit_noise_learning.protocols import prepare_vanilla_program
program = prepare_vanilla_program(
backend,
[circuit[0], measurement[0]],
fragment_depths=[2, 16, 64, 128],
num_randomizations=50,
shots_per_randomization=20,
)
print(f"Number of template circuits: {len(program.items)}")
Number of template circuits: 5
4. Jalankan program kuantum
Hantar program kuantum. Langkah ini sama sama ada pelaksana diarahkan ke simulator atau ke peranti sebenar.
result = executor.run(program).result()
5. Baca keputusan
Proses keputusan dengan process_vanilla_result().
from qiskit_noise_learning.protocols import process_vanilla_result
noise_maps, gate_names, fit = process_vanilla_result(result)
Plotkan pereputan fidelity bagi setiap pasangan qubit: data dan penyuaian eksponen.
fit.plot_qubit_pair_decays(
pairs=cz_pairs,
observable_type="means",
exponential_fit=True,
)