Přeskočit na hlavní obsah
Tento projekt je v betě. Našel jsi chybu? Otevřít issue na GitHubu. Máš otázku nebo nápad? Zeptej se v Discussions — rádi si poslechneme tvou zpětnou vazbu!
Jaká je kvalita překladu na této stránce?

Naučit se šumový model hradla

Tento tutoriál ukazuje učení šumového modelu pro unitární hradlo pomocí standardního učícího protokolu dostupného přes vysokoúrovňové protokolové funkce prepare_vanilla_program() a process_vanilla_result().

  1. Definuj hradlo

  2. Nastav lokální simulaci

  3. Připrav kvantový program

  4. Spusť kvantový program

  5. Přečti výsledky

Spuštění na skutečném hardwaru

Obvody níže jsou simulovány lokálně, takže tento postup nevyžaduje přihlašovací údaje IBM Quantum®. Chceš-li jej místo toho spustit na skutečném zařízení:

  • Krok 1: nahraď FakeMarrakesh skutečným backendem.

  • Krok 2: předej tento backend jako režim exekutoru a vypusť možnosti simulátoru.

1. Definuj hradlo​

Hradlo je BoxOp obsahující twirlovanou vrstvu šesti disjunktních hradel CZ.

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)
Spuštění na skutečném hardwaru
from qiskit_ibm_runtime import QiskitRuntimeService

backend = QiskitRuntimeService().backend("ibm_marrakesh")

2. Nastavení lokální simulace​

Indexy Paulioových operátorů uvnitř každé mapy jsou lokální vzhledem k hradlu, ve vzestupném pořadí fyzických qubitů:

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}

Definuj šum s korelovaným členem ZZ a slabším členem XX na každém páru CZ, plus jednoqubitový člen Z všude; měření dostane člen překlopení bitu pro každý 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
)

Sestav box, který se bude učit měření.

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)

Každý záznam layer_noise_model spáruje jeden z těchto boxů s mapou, která se na něj aplikuje. Použij metodu simulace stabilizátorů a nastav seed_simulator, aby byla simulovaná data reprodukovatelná.

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,
}
},
)
Spuštění na skutečném hardwaru
executor = Executor(mode=backend)

3. Příprava kvantového programu​

Pomocí prepare_vanilla_program() sestav kvantový program obsahující učicí experimenty.

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. Spuštění kvantového programu​

Odešli kvantový program. Tento krok je stejný bez ohledu na to, zda executor míří na simulátor, nebo na skutečné zařízení.

result = executor.run(program).result()

5. Přečtení výsledků​

Zpracuj výsledek pomocí process_vanilla_result().

from qiskit_noise_learning.protocols import process_vanilla_result

noise_maps, gate_names, fit = process_vanilla_result(result)

Vykresli poklesy fidelity pro každý pár qubitů: data i exponenciální fit.

fit.plot_qubit_pair_decays(
pairs=cz_pairs,
observable_type="means",
exponential_fit=True,
)