Langkau ke kandungan utama
Projek ini dalam fasa beta. Jumpa pepijat? Buat isu GitHub. Ada soalan atau idea? Tanya dalam Discussions — kami suka dengar maklum balas anda!
Bagaimana kualiti terjemahan pada halaman ini?

Tetapkan tahap pengoptimuman Transpiler

Versi pakej

Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau yang lebih baharu.

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

Peranti kuantum sebenar terdedah kepada hingar dan ralat gate, jadi mengoptimumkan Circuit untuk mengurangkan kedalaman dan bilangan gate boleh meningkatkan keputusan yang diperoleh daripada pelaksanaan Circuit tersebut dengan ketara. Fungsi generate_preset_pass_manager mempunyai satu argumen kedudukan yang diperlukan, optimization_level, yang mengawal sejauh mana usaha yang dihabiskan Transpiler untuk mengoptimumkan Circuit. Argumen ini boleh berupa integer yang mengambil salah satu nilai 0, 1, 2, atau 3. Tahap pengoptimuman yang lebih tinggi menghasilkan Circuit yang lebih dioptimumkan dengan kos masa kompilasi yang lebih lama. Jadual berikut menerangkan pengoptimuman yang dilakukan dengan setiap tetapan.

Tahap PengoptimumanPenerangan
0

Tiada pengoptimuman: biasanya digunakan untuk pencirian perkakasan

  • Terjemahan asas
  • Susun atur/Penghalaan: TrivialLayout, di mana ia memilih nombor qubit fizikal yang sama seperti maya dan memasukkan SWAP untuk membuatnya berfungsi (menggunakan SabreSwap)
1

Pengoptimuman ringan:

  • Susun atur/Penghalaan: Susun atur mula-mula dicuba dengan TrivialLayout. Jika SWAP tambahan diperlukan, susun atur dengan bilangan SWAP minimum ditemui dengan menggunakan SabreSwap, kemudian menggunakan VF2LayoutPostLayout untuk cuba memilih qubit terbaik dalam graf.
  • InverseCancellation
  • Pengoptimuman gate 1Q
2

Pengoptimuman sederhana:

  • Susun atur/Penghalaan: Tahap pengoptimuman 1 (tanpa trivial) + heuristik dioptimumkan dengan kedalaman carian dan percubaan fungsi pengoptimuman yang lebih besar. Memandangkan TrivialLayout tidak digunakan, tiada percubaan untuk menggunakan nombor qubit fizikal dan maya yang sama.
  • CommutativeCancellation
3

Pengoptimuman tinggi:

  • Tahap pengoptimuman 2 + heuristik dioptimumkan pada susun atur/penghalaan dengan lebih banyak usaha/percubaan
  • Sintesis semula blok dua qubit menggunakan Penguraian KAK Cartan.
  • Laluan (pass) yang melanggar keunitarian:
    • OptimizeSwapBeforeMeasure: Menggerakkan pengukuran untuk mengelakkan SWAP
    • RemoveDiagonalGatesBeforeMeasure: Membuang gate sebelum pengukuran yang tidak akan mempengaruhi pengukuran

Contoh penggunaan tahap pengoptimuman​

Memandangkan gate dua qubit biasanya merupakan sumber ralat yang paling ketara, kita boleh menganggarkan "kecekapan perkakasan" transpilasi secara kasar dengan mengira bilangan gate dua qubit dalam Circuit yang dihasilkan. Di sini, kita akan mencuba tahap pengoptimuman yang berbeza pada Circuit input yang terdiri daripada unitari rawak diikuti oleh gate SWAP.

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

_needed = {"numpy": "numpy", "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
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

nota

Backend tiruan FakeSherbrooke daripada qiskit_ibm_runtime digunakan dalam contoh ini, tetapi anda boleh mencubanya pada mana-mana Backend sebenar atau tiruan yang serasi dengan Qiskit. Keputusan anda mungkin berbeza.

Pertama, mari transpil menggunakan tahap pengoptimuman 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

Circuit yang ditranspil mempunyai enam gate ECR dua qubit.

Ulang untuk tahap pengoptimuman 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

Circuit yang ditranspil masih mempunyai enam gate ECR, tetapi bilangan gate satu qubit telah berkurangan.

Ulang untuk tahap pengoptimuman 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 keputusan yang sama seperti tahap pengoptimuman 1. Perhatikan bahawa meningkatkan tahap pengoptimuman tidak selalu membuat perbezaan.

Ulang semula, dengan tahap pengoptimuman 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

Kini, hanya ada tiga gate ECR. Kita memperoleh keputusan ini kerana pada tahap pengoptimuman 3, Qiskit cuba mensintesis semula blok gate dua qubit, dan mana-mana gate dua qubit boleh dilaksanakan menggunakan paling banyak tiga gate ECR. Kita boleh mendapatkan lebih sedikit gate ECR jika kita menetapkan approximation_degree kepada nilai kurang daripada 1, membenarkan Transpiler membuat anggaran yang mungkin memperkenalkan beberapa ralat dalam penguraian gate (lihat Parameter yang kerap 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

Circuit ini hanya mempunyai dua gate ECR, tetapi ia adalah Circuit anggaran. Untuk memahami bagaimana kesannya berbeza daripada Circuit tepat, kita boleh mengira fideliti antara operator unitari yang dilaksanakan oleh Circuit ini, dan unitari tepat. Sebelum melakukan pengiraan, kita terlebih dahulu mengurangkan Circuit yang ditranspil, yang mengandungi 127 qubit, kepada Circuit yang hanya mengandungi qubit aktif, iaitu dua.

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

Melaraskan tahap pengoptimuman juga boleh mengubah aspek lain Circuit, bukan sekadar bilangan gate ECR. Untuk contoh bagaimana menetapkan tahap pengoptimuman mengubah susun atur, lihat Mewakili komputer kuantum.

Langkah seterusnya​

Cadangan