Gate pecahan
Versi pakej
Kod pada halaman ini dibangunkan menggunakan keperluan berikut. Kami mengesyorkan penggunaan versi ini atau lebih baharu.
qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1
Halaman ini memperkenalkan dua jenis Gate yang baru disokong pada keluarga QPU IBM Quantum®. Gate pecahan ini disokong pada QPU Heron dalam bentuk:
- untuk
- untuk sebarang
Halaman ini membincangkan kes penggunaan di mana penggunaan gate pecahan boleh meningkatkan kecekapan aliran kerja anda, serta cara menggunakan gate ini pada QPU IBM Quantum.
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
Cara menggunakan gate pecahan​
Secara dalaman, gate pecahan ini berfungsi dengan melaksanakan putaran dan secara langsung untuk sudut sembarang. Penggunaan gate boleh mengurangkan tempoh dan ralat untuk putaran Qubit tunggal dengan sudut sembarang sehingga faktor dua. Pelaksanaan langsung putaran gate mengelakkan penguraian kepada pelbagai objek CZGate, sekali gus mengurangkan tempoh dan ralat Circuit. Ini amat berguna untuk Circuit yang mengandungi banyak putaran satu dan dua Qubit, seperti ketika mensimulasikan dinamik sistem kuantum atau ketika menggunakan ansatz variasi dengan banyak parameter.
Walaupun jenis gate ini terdapat dalam perpustakaan gate standard yang boleh dimiliki oleh QuantumCircuit, ia hanya boleh digunakan pada QPU IBM Quantum tertentu, dan mesti dimuatkan dengan bendera use_fractional_gates ditetapkan kepada True (ditunjukkan di bawah). Bendera ini akan memastikan gate pecahan dimasukkan dalam Target Backend untuk Transpiler.
service = QiskitRuntimeService()
backend = service.backend('ibm_torino', use_fractional_gates=True)
Contoh kod ini menunjukkan cara menggunakan gate pecahan dalam konteks aliran kerja yang mensimulasikan dinamik rantaian Ising menggunakan gate pecahan. Tempoh Circuit kemudiannya dibandingkan dengan Backend yang tidak menggunakan gate pecahan.
Nilai ralat yang dilaporkan dalam Target bagi Backend dengan gate pecahan diaktifkan hanyalah salinan daripada gate bukan pecahan yang bersamaan (yang mungkin tidak sama). Ini kerana pelaporan kadar ralat untuk gate pecahan belum lagi disokong.
Walau bagaimanapun, kerana masa gate pecahan berbanding bukan pecahan adalah sama, adalah munasabah untuk menganggap kadar ralat mereka setanding -- terutamanya apabila sumber ralat dominan dalam Circuit adalah disebabkan oleh pelonggaran.
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 gate pecahan diaktifkan, dan satu lagi dengan gate pecahan dinyahaktifkan, kemudian transpil kedua-duanya.
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)
Paparkan garis masa 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(),
)
Kekangan sudut​
Untuk gate dua Qubit , hanya sudut antara dan yang boleh dilaksanakan pada perkakasan IBM Quantum. Jika Circuit mengandungi sebarang gate dengan sudut di luar julat ini, saluran paip transpilasi standard secara amnya akan membetulkan ini dengan transformasi Circuit yang sesuai (melalui laluan FoldRzzAngle). Walau bagaimanapun, untuk sebarang gate yang mengandungi satu atau lebih Parameter, Transpiler akan menganggap parameter ini akan diberikan sudut dalam julat ini semasa runtime. Kerja akan gagal jika mana-mana nilai parameter yang ditentukan dalam PUB yang dihantar ke Qiskit Runtime berada di luar julat ini.
Di mana untuk menggunakan gate pecahan​
Secara sejarah, gate asas yang tersedia pada QPU IBM Quantum adalah CZ, X, RZ, SX, dan ID, yang tidak dapat mewakili Circuit dengan putaran satu dan dua Qubit yang bukan gandaan dengan cekap. Sebagai contoh, gate , apabila ditranspil, mesti diurai kepada siri gate dan , yang mencipta Circuit dengan dua gate berdurasi terhingga berbanding satu.
Begitu juga, apabila putaran dua Qubit seperti gate ditranspil, penguraian memerlukan dua gate CZ dan beberapa gate Qubit tunggal, yang meningkatkan kedalaman Circuit. Penguraian ini ditunjukkan dalam kod 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 aliran kerja yang memerlukan banyak putaran Qubit tunggal atau putaran dua Qubit (seperti dalam ansatz variasi atau ketika mensimulasikan evolusi masa sistem kuantum), kekangan ini menyebabkan kedalaman Circuit berkembang dengan cepat. Namun, gate pecahan menghapuskan keperluan ini, kerana putaran satu dan dua Qubit dilaksanakan secara langsung, menghasilkan Circuit kuantum yang lebih cekap (dan dengan itu mengurangkan ralat).
Bila tidak menggunakan gate pecahan​
Penting untuk diingat bahawa gate pecahan adalah ciri eksperimental dan tingkah laku bendera use_fractional_gates mungkin berubah pada masa hadapan. Lihat nota keluaran untuk versi baharu Qiskit Runtime bagi maklumat lanjut. Lihat juga dokumentasi rujukan API untuk QiskitRuntimeService.backend, yang menerangkan use_fractional_gates.
Selain itu, Transpiler Qiskit mempunyai keupayaan terhad untuk menggunakan dalam laluan pengoptimuman. Ini memerlukan anda lebih berhati-hati dalam merangka dan mengoptimumkan Circuit yang mengandungi arahan ini.
Akhirnya, penggunaan gate pecahan tidak disokong untuk:
- Circuit dinamik
- Pauli twirling - namun, pengukuran twirling dengan TREX disokong.
- Pembatalan ralat kebarangkalian
- Ekstrapolasi sifar hingar (menggunakan amplifikasi ralat kebarangkalian)
Baca panduan tentang pilihan primitif untuk mengetahui lebih lanjut tentang menyesuaikan teknik mitigasi dan penindasan ralat untuk beban kerja kuantum tertentu.
Langkah seterusnya​
- Untuk mengetahui lebih lanjut tentang transpilasi, lihat halaman pengenalan kepada transpilasi.
- Baca tentang menulis laluan Transpiler tersuai.
- Fahami cara mengkonfigurasi mitigasi ralat untuk Qiskit Runtime.