Перейти до основного вмісту
Цей проєкт у бета-версії. Знайшов(-ла) помилку? Відкрити issue на GitHub. Є запитання чи ідея? Запитати в Discussions — будемо раді твоєму відгуку!
Яка якість перекладу на цій сторінці?

Навчання моделі шуму гейта

Цей навчальний посібник демонструє навчання моделі шуму для унітарного гейта за стандартним протоколом навчання, доступним через високорівневі функції протоколу prepare_vanilla_program() і process_vanilla_result().

  1. Визнач гейт

  2. Налаштуй локальну симуляцію

  3. Підготуй квантову програму

  4. Запусти квантову програму

  5. Прочитай результати

Запуск на реальному обладнанні

Наведені нижче схеми симулюються локально, тому цей покроковий приклад не потребує облікових даних IBM Quantum®. Щоб натомість запустити його на реальному пристрої:

  • Крок 1: заміни FakeMarrakesh на реальний бекенд.

  • Крок 2: передай цей бекенд як режим виконавця й прибери параметри симулятора.

1. Визнач гейт​

Гейт — це BoxOp, що містить твірлований шар із шести неперетинних гейтів 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)
Запуск на реальному обладнанні
from qiskit_ibm_runtime import QiskitRuntimeService

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

2. Налаштування локальної симуляції​

Індекси Паулі всередині кожної мапи локальні для гейта й розташовані у зростальному порядку фізичних кубітів:

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}

Визнач шум із корельованим членом ZZ та слабшим членом XX на кожній парі CZ, а також однокубітним членом Z скрізь; вимірювання отримує член бітового переворту для кожного кубіта.

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
)

Побудуй box для вимірювання, який потрібно вивчити.

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)

Кожен елемент layer_noise_model зіставляє один із цих boxes із мапою, яку до нього слід застосувати. Використай метод симуляції стабілізаторів і встанови seed_simulator, щоб змоделювані дані були відтворюваними.

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. Підготуй квантову програму​

Використай prepare_vanilla_program(), щоб побудувати квантову програму з експериментами навчання.

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. Запусти квантову програму​

Надішли квантову програму. Цей крок однаковий незалежно від того, чи executor вказує на симулятор, чи на реальний пристрій.

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

5. Прочитай результати​

Обміркуй результат за допомогою process_vanilla_result().

from qiskit_noise_learning.protocols import process_vanilla_result

noise_maps, gate_names, fit = process_vanilla_result(result)

Побудуй графіки спадів точності для кожної пари кубітів: і дані, і експоненційну апроксимацію.

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