Langkau ke kandungan utama

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:

Image illustrating the following circuit

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()
nota

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: a+8+a+8+a+8=100=3βˆ—a+24a + 8 + a + 8 + a + 8 = 100 = 3*a + 24

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'])
nota

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.

The output from the draw_circuit_schedule_timing command is shown.

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.

    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 q0
  • Kawasan yang dikelilingi oleh set halangan dipanggil kawasan halangan. Pemboleh ubah stretch tidak boleh digunakan dalam beberapa kawasan halangan.

    # 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))

    Illustration of the previous code output

  • Ungkapan stretch terhad kepada bentuk X*stretch + Y di mana X dan Y adalah pemalar titik apung atau integer.

    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)
  • Ungkapan stretch hanya boleh mengandungi satu pemboleh ubah stretch.

    a = circuit.add_stretch("a")
    b = circuit.add_stretch("b")
    circuit.delay(expr.add(a, b), 0)
  • Ungkapan stretch tidak boleh diselesaikan kepada nilai kelewatan negatif. Penyelesai semasa tidak membuat kesimpulan kekangan bukan negatif.

    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))
Source: IBM Quantum docs β€” updated 25 Mac 2026
English version on doQumentation β€” updated 7 Mei 2026
This translation based on the English version of 11 Mac 2026