Lewati ke konten utama

Merepresentasikan komputer kuantum untuk transpiler

Versi paket

Kode di halaman ini dikembangkan menggunakan persyaratan berikut. Kami merekomendasikan menggunakan versi ini atau yang lebih baru.

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

Untuk mengonversi Circuit abstrak menjadi ISA circuit yang bisa dijalankan di QPU (unit pemrosesan kuantum) tertentu, transpiler membutuhkan informasi tertentu tentang QPU tersebut. Informasi ini ditemukan di dua tempat: objek BackendV2 (atau BackendV1 yang lebih lama) yang akan kamu gunakan untuk mengirim job, dan atribut Target dari backend.

  • Target berisi semua batasan yang relevan dari sebuah perangkat, seperti basis Gate native-nya, konektivitas Qubit, dan informasi pulse atau timing.
  • Backend memiliki Target secara default, berisi informasi tambahan -- seperti InstructionScheduleMap, dan menyediakan antarmuka untuk mengirimkan job Circuit kuantum.

Kamu juga bisa secara eksplisit memberikan informasi untuk digunakan transpiler, misalnya jika kamu punya kasus penggunaan tertentu, atau jika kamu yakin informasi ini akan membantu transpiler menghasilkan Circuit yang lebih optimal.

Ketepatan transpiler dalam menghasilkan Circuit yang paling sesuai untuk hardware tertentu bergantung pada seberapa banyak informasi yang dimiliki Target atau Backend tentang batasannya.

catatan

Karena banyak algoritma transpilasi yang bersifat stokastik, tidak ada jaminan bahwa Circuit yang lebih baik akan ditemukan.

Halaman ini menunjukkan beberapa contoh pengiriman informasi QPU ke transpiler. Contoh-contoh ini menggunakan target dari backend mock FakeSherbrooke.

Konfigurasi default​

Penggunaan transpiler yang paling sederhana adalah memberikan semua informasi QPU dengan menyediakan Backend atau Target. Untuk lebih memahami cara kerja transpiler, buat sebuah Circuit dan transpilasikan dengan informasi yang berbeda, seperti berikut.

Impor pustaka yang diperlukan dan buat instansi QPU: Untuk mengonversi Circuit abstrak menjadi ISA circuit yang bisa dijalankan di prosesor tertentu, transpiler membutuhkan informasi tertentu tentang prosesor tersebut. Biasanya, informasi ini disimpan di Backend atau Target yang diberikan ke transpiler, dan tidak diperlukan informasi lebih lanjut. Namun, kamu juga bisa secara eksplisit memberikan informasi untuk digunakan transpiler, misalnya jika kamu punya kasus penggunaan tertentu, atau jika kamu yakin informasi ini akan membantu transpiler menghasilkan Circuit yang lebih optimal.

Topik ini menunjukkan beberapa contoh pengiriman informasi ke transpiler. Contoh-contoh ini menggunakan target dari backend mock FakeSherbrooke.

# Added by doQumentation β€” required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke

backend = FakeSherbrooke()
target = backend.target

Circuit contoh menggunakan instansi dari efficient_su2 dari pustaka Circuit Qiskit.

from qiskit.circuit.library import efficient_su2

qc = efficient_su2(12, entanglement="circular", reps=1)

qc.draw("mpl")

Output of the previous code cell

Contoh ini menggunakan pengaturan default untuk mentranspilasi ke target dari backend, yang menyediakan semua informasi yang diperlukan untuk mengonversi Circuit menjadi Circuit yang bisa dijalankan di backend.

from qiskit.transpiler import generate_preset_pass_manager

pass_manager = generate_preset_pass_manager(
optimization_level=1, target=target, seed_transpiler=12345
)
qc_t_target = pass_manager.run(qc)
qc_t_target.draw("mpl", idle_wires=False, fold=-1)

Output of the previous code cell

Contoh ini digunakan di bagian-bagian selanjutnya dari topik ini untuk mengilustrasikan bahwa coupling map dan basis Gate adalah informasi esensial yang perlu diberikan ke transpiler untuk konstruksi Circuit yang optimal. QPU biasanya bisa memilih pengaturan default untuk informasi lain yang tidak diberikan, seperti timing dan scheduling.

Coupling map​

Coupling map adalah graf yang menunjukkan Qubit mana yang terhubung dan karenanya memiliki Gate dua Qubit di antara mereka. Terkadang graf ini bersifat terarah, artinya Gate dua Qubit hanya bisa berjalan dalam satu arah. Namun, transpiler selalu bisa membalik arah Gate dengan menambahkan Gate satu Qubit tambahan. Circuit kuantum abstrak selalu bisa direpresentasikan pada graf ini, meskipun konektivitasnya terbatas, dengan memperkenalkan Gate SWAP untuk memindahkan informasi kuantum.

Qubit dari Circuit abstrak kita disebut Qubit virtual dan yang ada di coupling map disebut Qubit fisik. Transpiler menyediakan pemetaan antara Qubit virtual dan fisik. Salah satu langkah pertama dalam transpilasi, tahap layout, melakukan pemetaan ini.

catatan

Meskipun tahap routing saling terkait dengan tahap layout β€” yang memilih Qubit yang sebenarnya β€” secara default, topik ini memperlakukannya sebagai tahap terpisah untuk kesederhanaan. Kombinasi routing dan layout disebut pemetaan Qubit. Pelajari lebih lanjut tentang tahap-tahap ini di topik Tahap Transpiler.

Berikan argumen kata kunci coupling_map untuk melihat efeknya pada transpiler:

coupling_map = target.build_coupling_map()

pass_manager = generate_preset_pass_manager(
optimization_level=0, coupling_map=coupling_map, seed_transpiler=12345
)
qc_t_cm_lv0 = pass_manager.run(qc)
qc_t_cm_lv0.draw("mpl", idle_wires=False, fold=-1)

Output of the previous code cell

Seperti yang ditunjukkan di atas, beberapa Gate SWAP dimasukkan (masing-masing terdiri dari tiga Gate CX), yang akan menyebabkan banyak error di perangkat saat ini. Untuk melihat Qubit mana yang dipilih pada topologi Qubit yang sebenarnya, gunakan plot_circuit_layout dari Visualisasi Qiskit:

from qiskit.visualization import plot_circuit_layout

plot_circuit_layout(qc_t_cm_lv0, backend, view="physical")

Output of the previous code cell

Ini menunjukkan bahwa Qubit virtual 0-11 kita dipetakan secara trivial ke baris Qubit fisik 0-11. Mari kita kembali ke default (optimization_level=1), yang menggunakan VF2Layout jika diperlukan routing.

pass_manager = generate_preset_pass_manager(
optimization_level=1, coupling_map=coupling_map, seed_transpiler=12345
)
qc_t_cm_lv1 = pass_manager.run(qc)
qc_t_cm_lv1.draw("mpl", idle_wires=False, fold=-1)

Output of the previous code cell

Sekarang tidak ada Gate SWAP yang dimasukkan dan Qubit fisik yang dipilih sama seperti saat menggunakan kelas target.

from qiskit.visualization import plot_circuit_layout

plot_circuit_layout(qc_t_cm_lv1, backend, view="physical")

Output of the previous code cell

Sekarang layoutnya berbentuk cincin. Karena layout ini menghormati konektivitas Circuit, tidak ada Gate SWAP, menghasilkan Circuit yang jauh lebih baik untuk eksekusi.

Basis Gate​

Setiap komputer kuantum mendukung set instruksi terbatas, yang disebut basis Gate-nya. Setiap Gate dalam Circuit harus diterjemahkan ke elemen-elemen set ini. Set ini harus terdiri dari Gate satu dan dua Qubit yang menyediakan set Gate universal, artinya operasi kuantum apa pun bisa didekomposisi menjadi Gate-Gate tersebut. Ini dilakukan oleh BasisTranslator, dan basis Gate bisa ditentukan sebagai argumen kata kunci ke transpiler untuk memberikan informasi ini.

basis_gates = list(target.operation_names)
print(basis_gates)
['sx', 'switch_case', 'x', 'if_else', 'measure', 'for_loop', 'delay', 'ecr', 'id', 'reset', 'rz']

Gate satu Qubit default di ibm_sherbrooke adalah rz, x, dan sx, dan Gate dua Qubit default adalah ecr (echoed cross-resonance). Gate CX dibangun dari Gate ecr, jadi di beberapa QPU ecr ditentukan sebagai basis Gate dua Qubit, sementara di QPU lain cx adalah defaultnya. Gate ecr adalah bagian entangling dari Gate cx. Selain Gate kontrol, ada juga instruksi delay dan measurement.

catatan

QPU memiliki basis Gate default, tapi kamu bisa memilih Gate apa pun yang kamu mau, selama kamu menyediakan instruksi atau menambahkan pulse Gate (lihat Membuat transpiler pass.) Basis Gate default adalah yang kalibrasinya telah dilakukan di QPU, sehingga tidak perlu memberikan instruksi/pulse Gate lebih lanjut. Misalnya, di beberapa QPU cx adalah Gate dua Qubit default dan ecr di QPU lainnya. Lihat daftar Gate dan operasi native yang mungkin untuk detail lebih lanjut.

pass_manager = generate_preset_pass_manager(
optimization_level=1,
coupling_map=coupling_map,
basis_gates=basis_gates,
seed_transpiler=12345,
)
qc_t_cm_bg = pass_manager.run(qc)
qc_t_cm_bg.draw("mpl", idle_wires=False, fold=-1)

Output of the previous code cell

Perhatikan bahwa objek CXGate telah didekomposisi menjadi Gate ecr dan basis Gate satu Qubit.

Tingkat error perangkat​

Kelas Target bisa berisi informasi tentang tingkat error untuk operasi di perangkat. Misalnya, kode berikut mengambil properti untuk Gate echoed cross-resonance (ECR) antara Qubit 1 dan 0 (perhatikan bahwa Gate ECR bersifat terarah):

target["ecr"][(1, 0)]
InstructionProperties(duration=5.333333333333332e-07, error=0.007494257741828603)

Output menampilkan durasi Gate (dalam detik) dan tingkat error-nya. Untuk mengungkapkan informasi error ke transpiler, buat model target dengan basis_gates dan coupling_map dari atas dan isi dengan nilai error dari backend FakeSherbrooke.

from qiskit.transpiler import Target
from qiskit.circuit.controlflow import IfElseOp, SwitchCaseOp, ForLoopOp

err_targ = Target.from_configuration(
basis_gates=basis_gates,
coupling_map=coupling_map,
num_qubits=target.num_qubits,
custom_name_mapping={
"if_else": IfElseOp,
"switch_case": SwitchCaseOp,
"for_loop": ForLoopOp,
},
)

for i, (op, qargs) in enumerate(target.instructions):
if op.name in basis_gates:
err_targ[op.name][qargs] = target.instruction_properties(i)

Transpilasi dengan target baru kita err_targ sebagai targetnya:

pass_manager = generate_preset_pass_manager(
optimization_level=1, target=err_targ, seed_transpiler=12345
)
qc_t_cm_bg_et = pass_manager.run(qc)
qc_t_cm_bg_et.draw("mpl", idle_wires=False, fold=-1)

Output of the previous code cell

Karena target menyertakan informasi error, pass VF2PostLayout mencoba menemukan Qubit optimal yang akan digunakan, menghasilkan Circuit yang sama yang awalnya ditemukan dengan Qubit fisik yang sama.

Langkah berikutnya​

Source: IBM Quantum docs β€” updated 1 Apr 2026
English version on doQumentation β€” updated 7 Mei 2026
This translation based on the English version of 11 Mar 2026