Resolusi pemasaan tertangguh menggunakan stretch
Spesifikasi bahasa OpenQASM 3 mengandungi jenis stretch yang membolehkan anda menentukan pemasaan relatif operasi berbanding pemasaan mutlak. Sokongan untuk stretch sebagai tempoh untuk arahan Delay telah ditambah dalam Qiskit v2.0.0. Nilai konkrit tempoh stretch diselesaikan pada masa kompilasi, selepas tempoh tepat Gate yang ditentukur diketahui. Pengkompil cuba meminimumkan tempoh stretch, tertakluk pada kekangan pemasaan pada satu atau lebih Qubit. Anda kemudiannya boleh menyatakan reka bentuk Gate seperti meruangkan Gate secara sama rata (contohnya, untuk melaksanakan urutan penyahgandingan echo berperingkat tinggi), menjajarkan kiri urutan Gate, atau menggunakan Gate untuk tempoh sub-litar tertentu, tanpa mengetahui pemasaan tepat.
Contohβ
Penyahgandingan dinamikβ
Satu kes penggunaan biasa stretch adalah untuk menggunakan penyahgandingan dinamik pada Qubit yang melahu sementara Qubit lain sedang menjalani operasi bersyarat.
Contohnya, kita boleh menggunakan stretch untuk menggunakan urutan penyahgandingan dinamik XX pada Qubit 1, untuk tempoh blok bersyarat yang digunakan pada Qubit 0, seperti yang diilustrasikan dalam gambar rajah berikut:
Litar yang bersesuaian akan kelihatan seperti berikut. Perhatikan bahawa sepasang halangan diperlukan untuk menentukan sempadan pemasaan relatif ini.
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister
from qiskit.circuit.classical import expr
qubits = QuantumRegister(2)
clbits = ClassicalRegister(2)
circuit = QuantumCircuit(qubits, clbits)
(q0, q1) = qubits
(c0, c1) = clbits
# Add barriers to define the boundaries
circuit.barrier()
circuit.h(q0)
circuit.measure(q0, c0)
with circuit.if_test((c0, 1)) as else_:
circuit.h(q0)
with else_:
circuit.x(q0)
# Apply an XX DD sequence with stretch on qubit 1
s = circuit.add_stretch("s")
circuit.delay(s, q1)
circuit.x(q1)
circuit.delay(expr.mul(s, 2), q1)
circuit.x(q1)
circuit.delay(s, q1)
circuit.barrier()
Penjajaran penjadualanβ
Contoh ini menggunakan stretch untuk memastikan urutan Gate antara dua halangan disejajarkan kiri, apapun tempoh sebenar mereka:
from qiskit import QuantumCircuit
from numpy import pi
qc = QuantumCircuit(5)
qc.barrier()
qc.cx(0, 1)
qc.u(pi/4, 0, pi/2, 2)
qc.cx(3, 4)
a = qc.add_stretch("a")
b = qc.add_stretch("b")
c = qc.add_stretch("c")
# Use the stretches as Delay duration.
qc.delay(a, [0, 1])
qc.delay(b, 2)
qc.delay(c, [3, 4])
qc.barrier()
Apabila menggunakan stretch dengan Qiskit Runtime, sebarang baki yang terhasil daripada resolusi stretch ditambahkan kepada kelewatan pertama yang menggunakan stretch itu.
Contoh:
a = circuit.add_stretch("a")
circuit.barrier(q0, q1)
circuit.delay(100, q0)
circuit.delay(a, q1) # resolve to 26
circuit.x(q1) # duration: 8
circuit.delay(a, q1) # resolve to 25
circuit.x(q1) # duration: 8
circuit.delay(a, q1) # resolve to 25
circuit.x(q1) # duration: 8
circuit.barrier(q0, q1)
Kod di atas diselesaikan kepada nilai 25 dengan baki 1. Kelewatan pertama [a] akan ditambah bakinya.
Persamaan resolusi stretch:
Lihat nilai stretch dalam Qiskit Runtimeβ
Nilai sebenar tempoh stretch diselesaikan pada masa kompilasi, selepas litar dijadualkan. Apabila menjalankan kerja Sampler dalam Qiskit Runtime, anda boleh melihat nilai stretch yang diselesaikan dalam metadata keputusan kerja. Sokongan untuk stretch dalam Qiskit Runtime masih eksperimental, jadi anda perlu menetapkan opsyen eksperimental dahulu untuk mendayakan pengambilannya, kemudian akses data terus daripada metadata seperti berikut:
# Enable stretch value retrieval.
sampler.options.experimental = {
"execution": {
"stretch_values": True,
"scheduler_timing": True,
},
}
# Access the stretch values from the metadata.
job_result = job.result()
circuit_stretch_values = job_result[0].metadata["compilation"]["stretch_values"]
# Visualize the timing.
# Use the sliders at the bottom, the controls at the top, and the legend on the side
# of the output to customize the view.
draw_circuit_schedule_timing(ob.result()[0].metadata['compilation']['scheduler_timing']['timing'])
Walaupun jumlah masa litar dikembalikan dalam metadata "compilation", ini BUKAN masa yang digunakan untuk pengebilan (masa kuantum).
Fahami output metadataβ
Metadata stretch_values mengembalikan maklumat berikut:
- Nama: Nama stretch yang digunakan.
- Nilai: Nilai matlamat yang diminta.
- Baki: Baki daripada menyelesaikan stretch, yang ditambahkan kepada kelewatan pertama yang menggunakan stretch itu.
- Nilai yang dikembangkan: Set nilai yang menentukan permulaan stretch dan tempohnya.
Contohβ
# Define the circuit
circuit = QuantumCircuit(4)
foo = circuit.add_stretch("foo")
bar = circuit.add_stretch("bar")
circuit.barrier()
circuit.cz(0, 1)
circuit.cz(0, 1)
circuit.cz(0, 1)
circuit.cz(0, 1)
circuit.delay(foo, 2)
circuit.x(2)
# 3*foo
circuit.delay(expr.mul(3, foo), 2)
circuit.x(2)
# 2*foo
circuit.delay(expr.mul(2, foo), 2)
circuit.delay(bar, 3)
circuit.x(3)
circuit.delay(bar, 3)
circuit.measure_all()
Output metadataβ
[{'name': 'bar',
'value': 29,
'remainder': 1,
'expanded_values': [[1365, 30], [1404, 29]]},
{'name': 'foo',
'value': 8,
'remainder': 2,
'expanded_values': [[1365, 10], [1384, 24], [1417, 16]]}
]
Nilai yang dikembalikan untuk tempoh bergantung pada nilai matlamat dan baki yang dikira. Contohnya, ini adalah tempoh yang dikembalikan untuk foo:
nilai foo+baki(8+2 = 10)nilai foo* 3 (8 x 3 = 24)nilai foo* 2 (8 x 2 = 16)
Anda boleh menggunakan visualisasi untuk membantu memahami dan mengesahkan pemasaan.
draw_circuit_schedule_timing(job.result()[0].metadata['compilation']['scheduler_timing']['timing'])
Dalam imej berikut, berdasarkan output contoh, foo bersesuaian dengan stretch pada Qubit 2. Kelewatan stretch pertama yang menggunakan foo bermula di penghujung init_play (1365). Tempoh stretch ialah 10, jadi kelewatan itu berakhir apabila Gate x bermula (1365+10=1375). Anda boleh mentafsir stretch kedua dan ketiga dengan cara yang sama.

Gunakan gelangsar di bahagian bawah, kawalan di bahagian atas (tuding ke atas imej output anda untuk mendedahkannya), dan legenda di sisi output untuk menyesuaikan paparan. Tuding ke atas imej untuk melihat data tepat.
Untuk butiran penuh, lihat topik Visualisasi pemasaan litar.
Had Qiskit Runtimeβ
Sokongan untuk stretch dalam Qiskit Runtime masih eksperimental dan mempunyai kekangan berikut:
-
Paling banyak satu pemboleh ubah stretch per set Qubit antara halangan (tersirat dan eksplisit). Set Qubit ialah satu atau lebih Qubit; set-set ini mesti saling eksklusif.
- Tidak sah
- Sah
a = circuit.add_stretch("a")
b = circuit.add_stretch("b")
circuit.delay(a, (q0, q1))
circuit.delay(b, q0) # Invalid because 2 stretches are applied on q0a = circuit.add_stretch("a")
b = circuit.add_stretch("b")
circuit.delay(a, (q0, q1))
circuit.delay(b, q2) -
Kawasan yang dikelilingi oleh set halangan dipanggil kawasan halangan. Pemboleh ubah stretch tidak boleh digunakan dalam beberapa kawasan halangan.
- Tidak sah
- Sah
# Stretch a is used in two barrier regions
a = circuit.add_stretch("a")
circuit.barrier((q0, q1))
circuit.delay(a, q0)
circuit.barrier((q0, q1))
circuit.delay(a, q0)
circuit.barrier((q0, q1))
# Stretch a is used inside a barrier region that is on q0 and q1
a = circuit.add_stretch("a")
circuit.barrier((q0, q1))
circuit.delay(a, q0)
circuit.barrier(q2)
circuit.delay(a, q0)
circuit.barrier((q0, q1))
-
Ungkapan stretch terhad kepada bentuk
X*stretch + Ydi manaXdanYadalah pemalar titik apung atau integer.- Tidak sah
- Sah
a = circuit.add_stretch("a")
b = circuit.add_stretch("b")
c = circuit.add_stretch("c")
# (a / b) * c is not supported
circuit.delay(expr.mul(expr.div(a, b), c), q1)from qiskit.circuit import Duration
a = circuit.add_stretch("a")
circuit.delay(expr.add(expr.mul(a, 2), Duration.dt(3)), 0) -
Ungkapan stretch hanya boleh mengandungi satu pemboleh ubah stretch.
- Tidak sah
- Sah
a = circuit.add_stretch("a")
b = circuit.add_stretch("b")
circuit.delay(expr.add(a, b), 0)a = circuit.add_stretch("a")
circuit.delay(expr.add(a, a), 0) -
Ungkapan stretch tidak boleh diselesaikan kepada nilai kelewatan negatif. Penyelesai semasa tidak membuat kesimpulan kekangan bukan negatif.
- Tidak sah
- Sah
from qiskit.circuit import Duration
circuit.barrier((q0, q1))
circuit.delay(20, q1)
# The length of this barrier region is 20dt, meaning the
# equation for solving stretch 'a' is a + 40dt = 20dt, giving a = -20dt.
circuit.delay(expr.add(a, Duration.dt(40)), q0)
circuit.barrier((q0, q1))circuit.barrier((q0, q1))
circuit.delay(20, q1)
circuit.delay(a, q0)
circuit.barrier((q0, q1))