Langkau ke kandungan utama

Laksanakan litar dinamik

Versi pakej

Kod di halaman ini dibangunkan menggunakan keperluan berikut. Kami syorkan menggunakan versi ini atau yang lebih baru.

qiskit[all]~=2.4.0
qiskit-ibm-runtime~=0.46.1

Litar dinamik adalah alatan berkuasa yang membolehkan anda mengukur qubit di tengah-tengah pelaksanaan litar kuantum dan kemudian melakukan operasi logik klasikal dalam litar, berdasarkan hasil ukuran pertengahan litar tersebut. Proses ini juga dikenali sebagai suapan balik klasikal. Walaupun ini adalah hari-hari awal untuk memahami cara terbaik memanfaatkan litar dinamik, komuniti penyelidikan kuantum telah pun mengenal pasti beberapa kes penggunaan, seperti berikut:

Walau bagaimanapun, penambahbaikan yang dibawa oleh litar dinamik ini datang dengan pertukaran. Ukuran pertengahan litar dan operasi klasikal biasanya mempunyai masa pelaksanaan yang lebih lama berbanding Gate dua-Qubit, dan peningkatan masa ini mungkin mengatasi manfaat kedalaman litar yang dikurangkan. Oleh itu, mengurangkan panjang ukuran pertengahan litar adalah bidang tumpuan penambahbaikan apabila IBM Quantumยฎ mengeluarkan versi baru litar dinamik. Untuk sekatan lain apabila menggunakan litar dinamik, lihat jadual Keserasian Ciri Estimator atau Sampler.

Spesifikasi OpenQASM 3 mentakrifkan beberapa struktur aliran kawalan, tetapi Qiskit Runtime kini hanya menyokong pernyataan if bersyarat. Dalam Qiskit SDK, ini sepadan dengan kaedah if_test pada QuantumCircuit. Kaedah ini mengembalikan pengurus konteks dan biasanya digunakan dalam pernyataan with. Panduan ini menerangkan cara menggunakan pernyataan bersyarat ini.

nota

Contoh kod dalam panduan ini menggunakan arahan ukuran standard untuk ukuran pertengahan litar. Walau bagaimanapun, adalah disyorkan untuk menggunakan arahan MidCircuitMeasure sebaliknya, jika Backend menyokongnya. Lihat bahagian Ukuran pertengahan litar untuk butiran.

Cari Backend yang menyokong litar dinamikโ€‹

Untuk mencari semua Backend yang boleh diakses oleh akaun anda dan menyokong litar dinamik, jalankan kod seperti berikut. Contoh ini mengandaikan bahawa anda telah menyimpan kelayakan log masuk anda. Anda juga boleh menentukan kelayakan secara eksplisit apabila memulakan akaun perkhidmatan Qiskit Runtime anda. Ini membolehkan anda melihat Backend yang tersedia pada instans atau jenis pelan tertentu, misalnya.

Nota
  • Backend yang tersedia untuk akaun bergantung pada instans yang ditentukan dalam kelayakan.
  • Versi baru litar dinamik kini tersedia untuk semua pengguna pada semua Backend. Lihat pengumuman untuk butiran lanjut.
# Added by doQumentation โ€” required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
# This cell is hidden from users. It hides all those "...instance was not set..." warnings.
import warnings

warnings.filterwarnings("ignore", message=".*Instance was not set*")
from qiskit_ibm_runtime import QiskitRuntimeService

service = QiskitRuntimeService()
dc_backends = service.backends(dynamic_circuits=True)
print(dc_backends)
[<IBMBackend('ibm_pittsburgh')>, <IBMBackend('ibm_kingston')>, <IBMBackend('ibm_marrakesh')>, <IBMBackend('ibm_fez')>, <IBMBackend('ibm_boston')>]

Ukuran pertengahan litarโ€‹

Sebelum qiskit-ibm-runtime v0.43.0, measure adalah satu-satunya arahan ukuran dalam Qiskit. Walau bagaimanapun, ukuran pertengahan litar mempunyai keperluan penalaan yang berbeza daripada ukuran terminal (ukuran yang berlaku di penghujung litar). Sebagai contoh, anda perlu mempertimbangkan tempoh arahan apabila menala ukuran pertengahan litar kerana arahan yang lebih lama menyebabkan litar yang lebih berhingar. Anda tidak perlu mempertimbangkan tempoh arahan untuk ukuran terminal kerana tiada arahan selepas ukuran terminal.

nota

Arahan MidCircuitMeasure dipetakan kepada arahan measure_2 yang dilaporkan dalam supported_instructions Backend. Walau bagaimanapun, measure_2 tidak disokong pada semua Backend. Gunakan service.backends(filters=lambda b: "measure_2" in b.supported_instructions) untuk mencari Backend yang menyokongnya. Ukuran baru mungkin ditambahkan pada masa depan, tetapi ini tidak dijamin.

Kaedah MidCircuitMeasureโ€‹

Dalam qiskit-ibm-runtime v0.43.0, arahan MidCircuitMeasure telah diperkenalkan. Seperti namanya, ia adalah arahan ukuran baru yang dioptimumkan untuk pertengahan litar pada QPU IBMยฎ. Walaupun anda boleh menggunakan QuantumCircuit.measure untuk ukuran pertengahan litar, kerana reka bentuknya, MidCircuitMeasure biasanya merupakan pilihan yang lebih baik. Sebagai contoh, ia menambahkan lebih sedikit overhed kepada litar anda berbanding menggunakan QuantumCircuit.measure.

from qiskit import QuantumCircuit
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime.circuit import MidCircuitMeasure

service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, dynamic_circuits=True
)

circ = QuantumCircuit(2, 2)
circ.x(0)
circ.append(MidCircuitMeasure(), [0], [0])
# circ.measure([0], [0])
# circ.measure_all()
print(circ.draw(cregbundle=False))
โ”Œโ”€โ”€โ”€โ”โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
q_0: โ”ค X โ”œโ”ค0 โ”œ
โ””โ”€โ”€โ”€โ”˜โ”‚ โ”‚
q_1: โ”€โ”€โ”€โ”€โ”€โ”ค Measure_2 โ”œ
โ”‚ โ”‚
c_0: โ•โ•โ•โ•โ•โ•ก0 โ•ž
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
c_1: โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
Nota penting
  • Mesti ada sekurang-kurangnya satu daftar klasikal untuk menggunakan ukuran.
  • Primitif Sampler memerlukan ukuran litar. Anda boleh menambah ukuran litar dengan primitif Estimator, tetapi ia diabaikan.

Storeโ€‹

Dengan qiskit-ibm-runtime versi 0.47.0 atau lebih baru, anda boleh menggunakan arahan store untuk menyimpan hasil ungkapan klasikal, jika ungkapan tersebut akan digunakan berulang kali. Operasi diparalelkan secara automatik, menjadikan kod anda jauh lebih cekap semasa masa jalan.

Untuk maklumat lanjut, lihat panduan Suapan balik klasikal dan aliran kawalan.

nota

Apabila anda menggunakan store untuk menyimpan nilai ke daftar klasikal pada Backend sebenar, nilai tersebut hanya disimpan dalam memori semasa pelaksanaan dan tidak disalin atau dikembalikan dalam keputusan kerja.

Sebagai contoh, dalam kod berikut, temp mempunyai nilai yang sama dengan creg semasa pelaksanaan, dan if_test berfungsi seperti yang dijangkakan. Tetapi selepas kerja selesai, temp BitArray yang dikembalikan dalam keputusan kerja tidak mengandungi nilai creg. Iaitu, job.result()[0].data.temp adalah 0.

creg = ClassicalRegister(3, "c")
temp = ClassicalRegister(3, "temp")
...
qc.store(temp, creg)
with circuit.if_test((temp, 0b001)):
...

Contoh penuhโ€‹

Kod berikut mencipta dan menjalankan litar dinamik pada perkakasan IBMยฎ.

from qiskit_ibm_runtime import SamplerV2, QiskitRuntimeService
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.transpiler import generate_preset_pass_manager

service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, dynamic_circuits=True
)

# Create a dynamic circuit

qubits = QuantumRegister(1)
clbits = ClassicalRegister(1)
qc = QuantumCircuit(qubits, clbits)
(q0,) = qubits
(c0,) = clbits

qc.h(q0)
qc.measure(q0, c0)
with qc.if_test((c0, 1)):
qc.x(q0)
qc.measure(q0, c0)

# Convert to an ISA circuit for the given backend

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)

# Generate samplers for backend targets
sampler = SamplerV2(backend)

# Submit jobs
sampler_job = sampler.run([isa_circuit])
result = sampler_job.result()

print(
f">>> {' Job ID:':<10} {sampler_job.job_id()} ({sampler_job.status()})"
)
>>> Job ID: d88cakp789is7391vq0g (DONE)

Had Qiskit Runtimeโ€‹

Sedar tentang kekangan berikut apabila menjalankan litar dinamik dalam Qiskit Runtime.

  • Disebabkan memori fizikal yang terhad pada elektronik kawalan, terdapat juga had pada bilangan pernyataan if dan saiz operannya. Had ini adalah fungsi bilangan siaran dan bilangan bit yang disiarkan dalam kerja (bukan litar).

    Apabila memproses syarat if, data ukuran perlu dipindahkan kepada logik kawalan untuk membuat penilaian tersebut. Siaran adalah pemindahan data klasikal yang unik, dan bit yang disiarkan adalah bilangan bit klasikal yang dipindahkan. Pertimbangkan yang berikut:

    c0 = ClassicalRegister(3)
    c1 = ClassicalRegister(5)
    ...
    with circuit.if_test((c0, 1)) ...
    with circuit.if_test((c0, 3)) ...
    with circuit.if_test((c1[2], 1)) ...

    Dalam contoh kod sebelumnya, dua objek if_test pertama pada c0 dianggap satu siaran kerana kandungan c0 tidak berubah, dan oleh itu tidak perlu disiarkan semula. if_test pada c1 adalah siaran kedua. Yang pertama menyiarkan semua tiga bit dalam c0 dan yang kedua menyiarkan hanya satu bit, menjadikan jumlah empat bit yang disiarkan.

    Kini, jika anda menyiarkan 60 bit setiap kali, maka kerja boleh mempunyai kira-kira 300 siaran. Walau bagaimanapun, jika anda hanya menyiarkan satu bit setiap kali, maka kerja boleh mempunyai 2400 siaran.

  • Operan yang digunakan dalam pernyataan if_test mestilah 32 bit atau kurang. Oleh itu, jika anda membandingkan keseluruhan ClassicalRegister, saiz ClassicalRegister tersebut mestilah 32 bit atau kurang. Walau bagaimanapun, jika anda hanya membandingkan satu bit dari ClassicalRegister, ClassicalRegister tersebut boleh berukuran apa-apa (kerana operannya hanya satu bit).

    Sebagai contoh, blok kod "Tidak sah" tidak berfungsi kerana cr mempunyai lebih daripada 32 bit. Walau bagaimanapun, anda boleh menggunakan daftar klasikal yang lebih lebar daripada 32 bit jika anda menguji hanya satu bit, seperti yang ditunjukkan dalam blok kod "Sah".

    cr = ClassicalRegister(50)
    qr = QuantumRegister(50)
    circuit = QuantumCircuit(qr, cr)
    ...
    circ.measure(qr, cr)
    with circ.if_test((cr, 15)):
    ...
  • Kondisional bersarang tidak dibenarkan. Sebagai contoh, blok kod berikut tidak akan berfungsi kerana ia mempunyai if_test di dalam if_test yang lain:

    c1 = ClassicalRegister(1, "c1")
    c2 = ClassicalRegister(2, "c2")
    ...
    with circ.if_test((c1, 1)):
    with circ.if_test(c2, 1)):
    ...
  • Mempunyai reset atau ukuran di dalam kondisional tidak disokong.

  • Operasi aritmetik tidak disokong.

  • Lihat jadual ciri OpenQASM 3 untuk menentukan ciri OpenQASM 3 yang disokong pada Qiskit dan Qiskit Runtime.

  • Apabila OpenQASM 3 (bukan QuantumCircuit) digunakan sebagai format input untuk menghantar litar kepada primitif Qiskit Runtime, hanya arahan yang boleh dimuatkan ke dalam Qiskit yang disokong. Operasi klasikal, misalnya, tidak disokong kerana ia tidak boleh dimuatkan ke dalam Qiskit. Lihat Import program OpenQASM 3 ke dalam Qiskit untuk maklumat lanjut.

  • Arahan for, while, dan switch tidak disokong.

Gunakan litar dinamik dengan Estimatorโ€‹

Oleh kerana Estimator tidak menyokong litar dinamik, anda boleh menggunakan Sampler dan membina litar ukuran sendiri.

Untuk meniru tingkah laku Estimator, ikuti proses ini:

  1. Kumpulkan sebutan semua boleh pantau ke dalam partisi. Ini boleh dilakukan menggunakan API PauliList, misalnya.
    nota

    Anda boleh menggunakan atribut primitif BitArray untuk mengira nilai jangkaan boleh pantau yang disediakan.

  2. Laksanakan satu Circuit perubahan asas per partisi (perubahan asas mana yang perlu dilakukan untuk setiap partisi). Lihat utiliti tambahan Ukuran Asas modul measurement_bases untuk maklumat lanjut. Untuk maklumat lanjut, lihat dokumentasi untuk pakej utiliti tambahan Qiskit.
  3. Tambahkan semula keputusan untuk setiap partisi.

Sekatanโ€‹

Semak mana-mana jadual Keserasian Ciri untuk memahami sekatan apabila menggunakan litar dinamik. Perhatikan bahawa keserasian ciri tidak bergantung pada primitif.

Langkah seterusnyaโ€‹

Cadangan