Lewati ke konten utama

Atur level optimasi 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

Perangkat kuantum nyata rentan terhadap noise dan error gate, sehingga mengoptimalkan sirkuit untuk mengurangi kedalaman dan jumlah gate-nya bisa secara signifikan meningkatkan hasil yang diperoleh dari eksekusi sirkuit tersebut. Fungsi generate_preset_pass_manager memiliki satu argumen posisional yang wajib, optimization_level, yang mengontrol seberapa besar usaha yang dikeluarkan transpiler untuk mengoptimalkan sirkuit. Argumen ini bisa berupa integer dengan nilai 0, 1, 2, atau 3. Level optimasi yang lebih tinggi menghasilkan sirkuit yang lebih optimal dengan konsekuensi waktu kompilasi yang lebih lama. Tabel berikut menjelaskan optimasi yang dilakukan pada setiap pengaturan.

Level OptimasiDeskripsi
0

Tanpa optimasi: biasanya digunakan untuk karakterisasi hardware

  • Translasi dasar
  • Layout/Routing: TrivialLayout, di mana ia memilih nomor qubit fisik yang sama dengan virtual dan menyisipkan SWAP agar berfungsi (menggunakan SabreSwap)
1

Optimasi ringan:

  • Layout/Routing: Layout pertama kali dicoba dengan TrivialLayout. Jika SWAP tambahan diperlukan, layout dengan jumlah SWAP minimum ditemukan menggunakan SabreSwap, lalu menggunakan VF2LayoutPostLayout untuk mencoba memilih qubit terbaik dalam grafik.
  • InverseCancellation
  • Optimasi gate 1Q
2

Optimasi menengah:

  • Layout/Routing: Level optimasi 1 (tanpa trivial) + heuristik yang dioptimalkan dengan kedalaman pencarian dan percobaan fungsi optimasi yang lebih besar. Karena TrivialLayout tidak digunakan, tidak ada upaya untuk menggunakan nomor qubit fisik dan virtual yang sama.
  • CommutativeCancellation
3

Optimasi tinggi:

  • Level optimasi 2 + heuristik yang dioptimalkan lebih lanjut pada layout/routing dengan usaha/percobaan yang lebih besar
  • Sintesis ulang blok dua-qubit menggunakan Dekomposisi KAK Cartan.
  • Pass yang memutus unitaritas:
    • OptimizeSwapBeforeMeasure: Memindahkan pengukuran untuk menghindari SWAP
    • RemoveDiagonalGatesBeforeMeasure: Menghapus gate sebelum pengukuran yang tidak akan memengaruhi hasil pengukuran

Level optimasi dalam aksi​

Karena gate dua-qubit biasanya menjadi sumber error yang paling signifikan, kita bisa mengukur "efisiensi hardware" dari transpilasi secara kasar dengan menghitung jumlah gate dua-qubit dalam sirkuit yang dihasilkan. Di sini, kita akan mencoba berbagai level optimasi pada sirkuit input yang terdiri dari unitary acak diikuti oleh gate SWAP.

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime
from qiskit import QuantumCircuit
from qiskit.circuit.library import UnitaryGate
from qiskit.quantum_info import Operator, random_unitary

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

qc = QuantumCircuit(2)
qc.append(rand_U, range(2))
qc.swap(0, 1)
qc.draw("mpl", style="iqp")

Output of the previous code cell

Kita akan menggunakan backend tiruan FakeSherbrooke dalam contoh-contoh ini. Pertama, mari transpilasi menggunakan level optimasi 0.

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

backend = FakeSherbrooke()

pass_manager = generate_preset_pass_manager(
optimization_level=0, backend=backend, seed_transpiler=12345
)
qc_t1_exact = pass_manager.run(qc)
qc_t1_exact.draw("mpl", idle_wires=False)

Output of the previous code cell

Sirkuit hasil transpilasi memiliki enam gate ECR dua-qubit.

Ulangi untuk level optimasi 1:

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

backend = FakeSherbrooke()

pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend, seed_transpiler=12345
)
qc_t1_exact = pass_manager.run(qc)
qc_t1_exact.draw("mpl", idle_wires=False)

Output of the previous code cell

Sirkuit hasil transpilasi masih memiliki enam gate ECR, tapi jumlah gate single-qubit sudah berkurang.

Ulangi untuk level optimasi 2:

pass_manager = generate_preset_pass_manager(
optimization_level=2, backend=backend, seed_transpiler=12345
)
qc_t2_exact = pass_manager.run(qc)
qc_t2_exact.draw("mpl", idle_wires=False)

Output of the previous code cell

Ini menghasilkan hasil yang sama dengan level optimasi 1. Perlu dicatat bahwa meningkatkan level optimasi tidak selalu membuat perbedaan.

Ulangi lagi, dengan level optimasi 3:

pass_manager = generate_preset_pass_manager(
optimization_level=3, backend=backend, seed_transpiler=12345
)
qc_t3_exact = pass_manager.run(qc)
qc_t3_exact.draw("mpl", idle_wires=False)

Output of the previous code cell

Sekarang, hanya ada tiga gate ECR. Kita mendapatkan hasil ini karena pada level optimasi 3, Qiskit mencoba mensintesis ulang blok gate dua-qubit, dan gate dua-qubit manapun bisa diimplementasikan menggunakan paling banyak tiga gate ECR. Kita bisa mendapatkan lebih sedikit gate ECR lagi jika kita mengatur approximation_degree ke nilai kurang dari 1, yang memungkinkan transpiler membuat aproksimasi yang mungkin menimbulkan sedikit error dalam dekomposisi gate (lihat Parameter yang umum digunakan untuk transpilasi):

pass_manager = generate_preset_pass_manager(
optimization_level=3,
approximation_degree=0.99,
backend=backend,
seed_transpiler=12345,
)
qc_t3_approx = pass_manager.run(qc)
qc_t3_approx.draw("mpl", idle_wires=False)

Output of the previous code cell

Sirkuit ini hanya memiliki dua gate ECR, tapi ini adalah sirkuit aproksimasi. Untuk memahami seberapa berbeda efeknya dari sirkuit eksak, kita bisa menghitung fidelitas antara operator unitary yang diimplementasikan sirkuit ini dengan unitary eksak. Sebelum melakukan komputasi, kita terlebih dahulu mereduksi sirkuit hasil transpilasi yang berisi 127 qubit menjadi sirkuit yang hanya berisi qubit aktif, yaitu dua qubit.

import numpy as np

def trace_to_fidelity_2q(trace: float) -> float:
return (4.0 + trace * trace.conjugate()) / 20.0

# Reduce circuits down to 2 qubits so they are easy to simulate
qc_t3_exact_small = QuantumCircuit.from_instructions(qc_t3_exact)
qc_t3_approx_small = QuantumCircuit.from_instructions(qc_t3_approx)

# Compute the fidelity
exact_fid = trace_to_fidelity_2q(
np.trace(np.dot(Operator(qc_t3_exact_small).adjoint().data, UU))
)
approx_fid = trace_to_fidelity_2q(
np.trace(np.dot(Operator(qc_t3_approx_small).adjoint().data, UU))
)
print(
f"Synthesis fidelity\nExact: {exact_fid:.3f}\nApproximate: {approx_fid:.3f}"
)
Synthesis fidelity
Exact: 1.000+0.000j
Approximate: 0.992+0.000j

Mengatur level optimasi juga bisa mengubah aspek lain dari sirkuit, tidak hanya jumlah gate ECR. Untuk contoh bagaimana pengaturan level optimasi mengubah layout, lihat Merepresentasikan komputer kuantum.

Langkah selanjutnya​

Rekomendasi
Source: IBM Quantum docs — updated 27 Apr 2026
English version on doQumentation — updated 7 Mei 2026
This translation based on the English version of 11 Mar 2026