Fractional gates
Versi paket
Kode di halaman ini dikembangkan menggunakan persyaratan berikut. Kami merekomendasikan penggunaan versi ini atau yang lebih baru.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Halaman ini memperkenalkan dua jenis Gate yang baru didukung pada armada QPU IBM Quantum®. Gate fraksional ini didukung pada Heron QPU dalam bentuk:
- untuk
- untuk semua nilai
Halaman ini membahas kasus penggunaan di mana penerapan fractional gates dapat meningkatkan efisiensi workflow kamu, serta cara menggunakan gate-gate ini pada QPU IBM Quantum.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
Cara menggunakan fractional gates​
Secara internal, fractional gates ini bekerja dengan langsung menjalankan rotasi dan untuk sudut yang sewenang-wenang. Penggunaan Gate dapat mengurangi durasi dan error untuk rotasi satu-Qubit dengan sudut sewenang-wenang hingga dua kali lipat. Eksekusi langsung dari rotasi Gate menghindari dekomposisi menjadi beberapa objek CZGate, yang juga mengurangi durasi dan error Circuit. Ini sangat berguna untuk Circuit yang mengandung banyak rotasi satu- dan dua-Qubit, seperti saat mensimulasikan dinamika sistem kuantum atau saat menggunakan variational ansatz dengan banyak parameter.
Meski jenis gate ini ada di library gate standar yang bisa dimiliki QuantumCircuit, gate tersebut hanya bisa digunakan pada QPU IBM Quantum tertentu, dan harus dimuat dengan flag use_fractional_gates yang disetel ke True (ditampilkan di bawah). Flag ini akan memastikan bahwa fractional gates dimasukkan ke dalam Target Backend untuk Transpiler.
service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)
Contoh kode ini mendemonstrasikan cara menggunakan fractional gates dalam konteks workflow yang mensimulasikan dinamika rantai Ising menggunakan fractional gates. Durasi Circuit kemudian dibandingkan dengan Backend yang tidak menggunakan fractional gates.
Nilai error yang dilaporkan dalam Target sebuah Backend dengan fractional gates yang diaktifkan hanyalah salinan dari padanan gate non-fraksional (yang mungkin tidak sama). Ini karena pelaporan tingkat error pada fractional gates belum didukung.
Namun, karena waktu gate antara gate fraksional dan non-fraksional adalah sama, wajar untuk mengasumsikan bahwa tingkat error mereka sebanding — terutama ketika sumber error dominan dalam sebuah Circuit disebabkan oleh relaksasi.
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization.timeline import draw as draw_timeline, IQXSimple
from qiskit_ibm_runtime import QiskitRuntimeService
num_qubits = 5
num_time_steps = 3
rx_angle = 0.1
rzz_angle = 0.1
ising_circuit = QuantumCircuit(num_qubits)
for i in range(num_time_steps):
# rx layer
for q in range(num_qubits):
ising_circuit.rx(rx_angle, q)
for q in range(1, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
# 2nd rzz layer
for q in range(0, num_qubits - 1, 2):
ising_circuit.rzz(rzz_angle, q, q + 1)
ising_circuit.barrier()
ising_circuit.draw("mpl")
Tentukan dua objek Backend: satu dengan fractional gates yang diaktifkan, dan satu lagi dengan fractional gates yang dinonaktifkan, lalu transpilasi keduanya.
service = QiskitRuntimeService()
backend_fractional = service.backend("ibm_torino", use_fractional_gates=True)
backend_conventional = service.backend(
"ibm_torino", use_fractional_gates=False
)
pm_fractional = generate_preset_pass_manager(
optimization_level=3, backend=backend_fractional, scheduling_method="alap"
)
pm_conventional = generate_preset_pass_manager(
optimization_level=3,
backend=backend_conventional,
scheduling_method="alap",
)
ising_circuit_fractional = pm_fractional.run(ising_circuit)
ising_circuit_conventional = pm_conventional.run(ising_circuit)
Tampilkan timeline Circuit menggunakan dua jenis gate.
# Draw timeline of circuit with conventional gates
draw_timeline(
ising_circuit_conventional,
idle_wires=False,
target=backend_conventional.target,
time_range=(0, 500),
style=IQXSimple(),
)
# Draw timeline of circuit with fractional gates
draw_timeline(
ising_circuit_fractional,
idle_wires=False,
target=backend_fractional.target,
time_range=(0, 500),
style=IQXSimple(),
)
Batasan sudut​
Untuk Gate dua-Qubit, hanya sudut antara dan yang dapat dieksekusi pada hardware IBM Quantum. Jika sebuah Circuit mengandung Gate dengan sudut di luar rentang ini, maka pipeline transpilasi standar umumnya akan memperbaikinya dengan transformasi Circuit yang sesuai (melalui pass FoldRzzAngle). Namun, untuk Gate yang mengandung satu atau lebih Parameter, Transpiler akan mengasumsikan bahwa parameter ini akan diberi sudut dalam rentang ini saat runtime. Job akan gagal jika ada nilai parameter yang ditentukan dalam PUB yang dikirimkan ke Qiskit Runtime berada di luar rentang ini.
Di mana menggunakan fractional gates​
Secara historis, basis gate yang tersedia pada QPU IBM Quantum adalah CZ, X, RZ, SX, dan ID, yang tidak dapat merepresentasikan Circuit dengan rotasi satu- dan dua-Qubit yang bukan kelipatan secara efisien. Misalnya, Gate , ketika ditranspilasi, harus diuraikan menjadi serangkaian gate dan , yang menciptakan Circuit dengan dua gate berdurasi terbatas alih-alih satu.
Demikian pula, ketika rotasi dua-Qubit seperti Gate ditranspilasi, dekomposisinya membutuhkan dua gate CZ dan beberapa gate satu-Qubit, yang meningkatkan kedalaman Circuit. Dekomposisi ini ditampilkan dalam kode berikut.
qc = QuantumCircuit(1)
param = Parameter("θ")
qc.rx(param, 0)
qc.draw("mpl")
# Decomposition of an RX(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
qc = QuantumCircuit(2)
param = Parameter("θ")
qc.rzz(param, 0, 1)
qc.draw("mpl")
# Decomposition of an RZZ(θ) gate using the IBM Quantum QPU basis
service = QiskitRuntimeService()
backend = service.backend("ibm_torino")
optimization_level = 3
pm = generate_preset_pass_manager(optimization_level, backend=backend)
transpiled_circuit = pm.run(qc)
transpiled_circuit.draw("mpl", idle_wires=False)
Untuk workflow yang membutuhkan banyak rotasi satu-Qubit atau rotasi dua-Qubit (seperti dalam variational ansatz atau saat mensimulasikan evolusi waktu sistem kuantum), batasan ini menyebabkan kedalaman Circuit tumbuh dengan cepat. Namun, fractional gates menghilangkan persyaratan ini, karena rotasi satu- dan dua-Qubit dieksekusi secara langsung, dan menciptakan Circuit kuantum yang lebih efisien (dan dengan demikian lebih tahan error).
Kapan tidak menggunakan fractional gates​
Penting untuk dicatat bahwa fractional gates adalah fitur eksperimental dan perilaku flag use_fractional_gates mungkin berubah di masa depan. Lihat catatan rilis untuk versi baru Qiskit Runtime untuk informasi lebih lanjut. Lihat juga dokumentasi referensi API untuk QiskitRuntimeService.backend, yang mendeskripsikan use_fractional_gates.
Selain itu, Transpiler Qiskit memiliki kemampuan terbatas untuk menggunakan dalam pass optimasinya. Ini mengharuskan kamu untuk lebih berhati-hati dalam merancang dan mengoptimalkan Circuit yang mengandung instruksi ini.
Terakhir, penggunaan fractional gates tidak didukung untuk:
- Circuit dinamis
- Pauli twirling - namun, measurement twirling dengan TREX didukung.
- Probabilistic error cancellation
- Zero-noise extrapolation (menggunakan probabilistic error amplification)
Baca panduan tentang opsi primitive untuk mempelajari lebih lanjut tentang penyesuaian teknik mitigasi dan penekanan error untuk workload kuantum tertentu.
Langkah berikutnya​
- Untuk mempelajari lebih lanjut tentang transpilasi, lihat halaman pengenalan transpilasi.
- Baca tentang menulis custom transpiler pass.
- Pahami cara mengonfigurasi mitigasi error untuk Qiskit Runtime.