Lewati ke konten utama
Proyek ini masih dalam tahap beta. Menemukan bug? Buat isu GitHub. Punya pertanyaan atau ide? Tanya di Discussions — kami sangat menghargai masukan kamu!
Bagaimana kualitas terjemahan di halaman ini?

Parameter yang umum digunakan untuk transpilasi

Versi paket

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

qiskit[all]~=2.5.2
qiskit-ibm-runtime~=0.49.0

Halaman ini menjelaskan beberapa parameter yang paling umum digunakan untuk transpilasi lokal. Parameter-parameter ini dikonfigurasi menggunakan argumen ke generate_preset_pass_manager atau transpile.

Tingkat aproksimasi​

Kamu bisa menggunakan tingkat aproksimasi untuk menentukan seberapa dekat kamu ingin Circuit hasil transpilasi cocok dengan Circuit yang diinginkan (input). Ini adalah nilai float dalam rentang (0.0 - 1.0), di mana 0.0 adalah aproksimasi maksimum dan 1.0 (default) berarti tidak ada aproksimasi. Nilai yang lebih kecil menukar akurasi output dengan kemudahan eksekusi (yaitu, lebih sedikit Gate). Nilai defaultnya adalah 1.0.

Dalam sintesis uniter dua-Qubit (digunakan pada tahap awal semua level dan untuk tahap optimasi dengan optimization level 3), nilai ini menentukan target fidelitas dari output dekomposisi. Artinya, seberapa besar kesalahan yang ditimbulkan ketika representasi matriks sebuah Circuit dikonversi menjadi Gate diskrit. Jika tingkat aproksimasi memiliki nilai lebih rendah (lebih banyak aproksimasi), Circuit output dari sintesis akan lebih berbeda dari matriks input, tetapi kemungkinan juga memiliki lebih sedikit Gate (karena sembarang operasi dua-Qubit dapat didekomposisi secara sempurna dengan paling banyak tiga CX Gate) dan lebih mudah dijalankan.

Ketika tingkat aproksimasi kurang dari 1.0, Circuit dengan satu atau dua CX Gate mungkin akan disintesis, yang menghasilkan lebih sedikit kesalahan dari hardware, tetapi lebih banyak dari aproksimasi. Karena CX adalah Gate yang paling mahal dalam hal kesalahan, mungkin menguntungkan untuk mengurangi jumlahnya dengan mengorbankan fidelitas dalam sintesis (teknik ini digunakan untuk meningkatkan quantum volume pada perangkat IBM®: Validating quantum computers using randomized model circuits).

Sebagai contoh, kita membuat UnitaryGate dua-Qubit acak yang akan disintesis pada tahap awal. Mengatur approximation_degree kurang dari 1.0 mungkin menghasilkan Circuit aproksimasi. Kita juga harus menentukan basis_gates untuk memberi tahu metode sintesis Gate mana yang dapat digunakan untuk sintesis aproksimasi.

# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util

_needed = {"qiskit": "qiskit", "qiskit_ibm_runtime": "qiskit-ibm-runtime"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import random_unitary
from qiskit.transpiler import generate_preset_pass_manager

UU = random_unitary(4, seed=12345)
rand_U = UnitaryGate(UU)

qubits = QuantumRegister(2, name="q")
qc = QuantumCircuit(qubits)
qc.append(rand_U, qubits)
pass_manager = generate_preset_pass_manager(
optimization_level=1,
approximation_degree=0.85,
basis_gates=["sx", "rz", "cx"],
)
approx_qc = pass_manager.run(qc)
print(approx_qc.count_ops()["cx"])
2

Ini menghasilkan output 2 karena aproksimasi membutuhkan lebih sedikit CX Gate.

Seed generator angka acak​

Beberapa bagian dari Transpiler bersifat stokastik, sehingga transpilasi yang diulang mungkin menghasilkan hasil yang berbeda. Untuk mendapatkan hasil yang dapat direproduksi, kamu bisa mengatur seed untuk generator angka pseudoacak menggunakan argumen seed_transpiler. Eksekusi berulang menggunakan seed yang sama akan menghasilkan hasil yang sama.

Contoh:

pass_manager = generate_preset_pass_manager(
optimization_level=1, seed_transpiler=11, basis_gates=["sx", "rz", "cx"]
)
optimized_1 = pass_manager.run(qc)
optimized_1.draw("mpl")

Output of the previous code cell

Layout awal​

Sebelum transpilasi, qubit yang terdapat dalam Circuit kamu adalah qubit virtual yang tidak selalu berkorespondensi dengan qubit fisik pada Backend target. Kamu bisa menentukan pemetaan awal qubit virtual ke qubit fisik menggunakan argumen initial_layout. Perlu diingat bahwa layout qubit akhir mungkin berbeda dari layout awal karena Transpiler mungkin mengubah urutan (mempermutasi) qubit menggunakan swap gate atau cara lain.

Dalam contoh di bawah ini, kita membuat layout awal untuk Backend mock FakeSherbrooke dengan membuat objek Layout. Layout kita memetakan qubit pertama Circuit ke qubit 5 Sherbrooke, dan memetakan qubit kedua Circuit ke qubit 6 Sherbrooke. Perlu diingat bahwa qubit fisik selalu direpresentasikan dengan bilangan bulat.

catatan

Backend mock FakeSherbrooke dari qiskit_ibm_runtime digunakan dalam contoh-contoh ini, tetapi kamu bisa mencobanya pada Backend nyata atau palsu apa pun yang kompatibel dengan Qiskit. Hasilmu mungkin berbeda.

from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
from qiskit.transpiler import Layout

backend = FakeSherbrooke()

a, b = qubits
initial_layout = Layout({a: 5, b: 6})

pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)

transpiled_circ.draw("mpl", idle_wires=False)

Output of the previous code cell

Selain menentukan objek Layout, kamu juga bisa memberikan daftar bilangan bulat, di mana elemen ke-ii dari daftar berisi qubit fisik tempat qubit ke-ii harus dipetakan. Misalnya:

initial_layout = [5, 6]

pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, initial_layout=initial_layout
)
transpiled_circ = pass_manager.run(qc)

transpiled_circ.draw("mpl", idle_wires=False)

Output of the previous code cell

Kamu bisa menggunakan fungsi plot_error_map untuk membuat diagram graf perangkat dengan informasi kesalahan dan dengan label qubit fisik. Kamu juga bisa melihat diagram serupa di halaman Compute resources.

from qiskit.visualization import plot_error_map

plot_error_map(backend, figsize=(30, 24))

Output of the previous code cell

Opsi tahap dan plugin Transpiler​

Opsi-opsi ini memiliki akhiran _method. Opsi-opsi ini memengaruhi cara kerja Transpiler dan digunakan untuk mencoba mendapatkan output yang lebih baik, berbeda, atau spesifik dari Transpiler.

  • init_method (str) - Plugin yang digunakan untuk tahap inisialisasi.

  • layout_method (str) - Pass pemilihan layout (trivial, dense, sabre). Ini juga bisa menjadi nama plugin eksternal yang digunakan untuk tahap layout.

  • optimization_method (str) - Plugin yang digunakan untuk tahap optimasi.

  • routing_method (str) - Nama pass routing (basic, lookahead, default, sabre, none). Ini juga bisa menjadi nama plugin eksternal yang digunakan untuk tahap routing.

  • scheduling_method (str) - Nama pass penjadwalan. Ini juga bisa menjadi nama plugin eksternal yang digunakan untuk tahap penjadwalan.

    • as_soon_as_possible: Jadwalkan instruksi secara greedy: sesegera mungkin pada sumber daya qubit (alias: asap).

    • as_late_as_possible: Jadwalkan instruksi selambat mungkin. Artinya, pertahankan qubit dalam ground state bila memungkinkan (alias: alap).

  • translation_method (str) - Nama pass translasi (unroller, translator, synthesis). Ini juga bisa menjadi nama plugin eksternal yang digunakan untuk tahap translasi.

  • unitary_synthesis_method (str) - Nama metode sintesis uniter yang digunakan. Secara default default digunakan.

catatan

Untuk melihat daftar semua plugin yang terinstal untuk tahap tertentu, jalankan list_stage_plugins("stage_name"). Misalnya, jika kamu ingin melihat daftar semua plugin yang terinstal untuk tahap routing, jalankan list_stage_plugins(routing).

Langkah selanjutnya​