Buat pengurus pass untuk dynamical decoupling
Package versions
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan menggunakan versi ini atau yang lebih baharu.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Halaman ini menunjukkan cara menggunakan pass PadDynamicalDecoupling untuk menambah teknik penindasan ralat yang disebut dynamical decoupling pada litar.
Dynamical decoupling berfungsi dengan menambah urutan nadi (dikenali sebagai urutan dynamical decoupling) pada qubit yang melahu untuk membalikkannya mengelilingi sfera Bloch, yang membatalkan kesan saluran hingar, dengan itu menindas dekoherensi. Urutan nadi ini serupa dengan nadi refokus yang digunakan dalam resonans magnet nuklear. Untuk penerangan lengkap, lihat A Quantum Engineer's Guide to Superconducting Qubits.
Oleh kerana pass PadDynamicalDecoupling hanya beroperasi pada litar yang dijadualkan dan melibatkan gate yang tidak semestinya gate asas sasaran kami, anda juga memerlukan pass ALAPScheduleAnalysis dan BasisTranslator.
Contoh ini menggunakan ibm_fez, yang telah dimulakan sebelum ini. Dapatkan maklumat target dari backend dan simpan nama operasi sebagai basis_gates kerana target perlu diubah suai untuk menambah maklumat masa untuk gate yang digunakan dalam dynamical decoupling.
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.backend("ibm_fez")
target = backend.target
basis_gates = list(target.operation_names)
Buat litar efficient_su2 sebagai contoh. Pertama, transpil litar ke backend kerana nadi dynamical decoupling perlu ditambah selepas litar telah ditranspil dan dijadualkan. Dynamical decoupling sering berfungsi paling baik apabila terdapat banyak masa melahu dalam litar kuantum - iaitu, terdapat qubit yang tidak digunakan sementara yang lain aktif. Ini berlaku dalam litar ini kerana gate ecr dua qubit diterapkan secara berurutan dalam ansatz ini.
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.circuit.library import efficient_su2
qc = efficient_su2(12, entanglement="circular", reps=1)
pm = generate_preset_pass_manager(1, target=target, seed_transpiler=12345)
qc_t = pm.run(qc)
qc_t.draw("mpl", fold=-1, idle_wires=False)
Urutan dynamical decoupling adalah siri gate yang bergabung menjadi identiti dan dijarakkan secara tetap dalam masa. Contohnya, mulakan dengan membuat urutan mudah yang dipanggil XY4 yang terdiri daripada empat gate.
from qiskit.circuit.library import XGate, YGate
X = XGate()
Y = YGate()
dd_sequence = [X, Y, X, Y]
Oleh kerana masa dynamical decoupling yang tetap, maklumat tentang YGate perlu ditambah ke target kerana ia bukan gate asas, sedangkan XGate adalah. Walau bagaimanapun, kami tahu a priori bahawa YGate mempunyai tempoh dan ralat yang sama dengan XGate, jadi kami boleh mendapatkan sifat-sifat tersebut dari target dan menambahnya semula untuk objek YGate. Inilah juga sebabnya basis_gates disimpan secara berasingan, kerana kami menambah arahan YGate ke target walaupun ia bukan gate asas sebenar ibm_fez.
from qiskit.transpiler import InstructionProperties
y_gate_properties = {}
for qubit in range(target.num_qubits):
y_gate_properties.update(
{
(qubit,): InstructionProperties(
duration=target["x"][(qubit,)].duration,
error=target["x"][(qubit,)].error,
)
}
)
target.add_instruction(YGate(), y_gate_properties)
Litar ansatz seperti efficient_su2 adalah berparameter, jadi nilainya mesti diikat sebelum dihantar ke backend. Di sini, tetapkan parameter rawak.
import numpy as np
rng = np.random.default_rng(1234)
qc_t.assign_parameters(
rng.uniform(-np.pi, np.pi, qc_t.num_parameters), inplace=True
)
Seterusnya, laksanakan pass tersuai. Mulakan PassManager dengan ALAPScheduleAnalysis dan PadDynamicalDecoupling. Jalankan ALAPScheduleAnalysis dahulu untuk menambah maklumat masa tentang litar kuantum sebelum urutan dynamical decoupling yang dijarakkan secara tetap boleh ditambah. Pass-pass ini dijalankan pada litar dengan .run().
from qiskit.transpiler import PassManager
from qiskit.transpiler.passes.scheduling import (
ALAPScheduleAnalysis,
PadDynamicalDecoupling,
)
dd_pm = PassManager(
[
ALAPScheduleAnalysis(target=target),
PadDynamicalDecoupling(target=target, dd_sequence=dd_sequence),
]
)
qc_dd = dd_pm.run(qc_t)
Gunakan alat visualisasi timeline_drawer untuk melihat masa litar dan mengesahkan bahawa urutan objek XGate dan YGate yang dijarakkan secara tetap muncul dalam litar.
from qiskit.visualization import timeline_drawer
timeline_drawer(qc_dd, idle_wires=False, target=target)
Akhirnya, kerana YGate bukan gate asas sebenar backend kami, terapkan pass BasisTranslator secara manual (ini adalah pass lalai, tetapi ia dilaksanakan sebelum penjadualan, jadi perlu diterapkan semula). Pustaka kesetaraan sesi adalah pustaka kesetaraan litar yang membolehkan transpiler menguraikan litar ke dalam gate asas, seperti yang juga ditentukan sebagai argumen.
from qiskit.circuit.equivalence_library import (
SessionEquivalenceLibrary as sel,
)
from qiskit.transpiler.passes import BasisTranslator
qc_dd = BasisTranslator(sel, basis_gates)(qc_dd)
qc_dd.draw("mpl", fold=-1, idle_wires=False)
Kini, objek YGate tiada dalam litar kami, dan terdapat maklumat masa eksplisit dalam bentuk gate Delay. Litar yang telah ditranspil dengan dynamical decoupling ini kini sedia untuk dihantar ke backend.
Langkah seterusnya​
- Untuk mempelajari cara menggunakan fungsi
generate_preset_passmanagerdan bukannya menulis pass sendiri, mulakan dengan topik Tetapan lalai transpilasi dan pilihan konfigurasi. - Cuba panduan Bandingkan tetapan transpiler.
- Lihat dokumentasi API Transpil.