拼接上升段与保持段¶
设计一个从零上升、保持最终幅度后结束的脉冲。先查看时间网格,再运行单原子实验,用脉冲面积核对激发概率。先完成全局驱动和物理单位,在安装好的环境中从仓库根目录运行。
上升段在 0.2 us 内从 0 升到 1.2 rad/us,随后保持 0.1 us。失谐和相位为零时,Hamiltonian 始终正比于 X。脉冲面积为 1.2 × 0.2 / 2 + 1.2 × 0.1 = 0.24 rad。从基态开始,运行前先预测 P(1) = sin²(0.24/2)。
拼接兼容的片段¶
"""组合一条 pulse,并检查降低后的 waveform sample。
``Waveform.concat`` 把 ramp 和 hold 串接起来,结果仍明确列出采样 grid 和总时长。
它只负责波形片段组合,不提供生产 channel scheduler。
"""
from __future__ import annotations
import json
from cascaqit import AHSProgram, AtomRegister, MockNeutralAtomTarget, Waveform
def main() -> None:
"""组合、lower、校验并执行一个双片段 pulse。"""
ramp = Waveform.linear(0.0, 1.2, duration=0.2, waveform_id="ramp")
hold = Waveform.linear(1.2, 1.2, duration=0.1, waveform_id="hold")
rabi = ramp.concat(hold, waveform_id="rabi.composed")
program = (
AHSProgram(
AtomRegister.line(count=1, spacing=5.0),
program_id="lesson.experimentalist.waveform",
)
.drive(
rabi=rabi,
detuning=Waveform.constant(0.0, duration=0.3),
phase=0.0,
)
.measure()
)
target = MockNeutralAtomTarget.v0_1()
validated = program.validate(target, shots=16)
result = program.run(shots=0, seed=302, target=target, time_steps=120)
waveform_ir = program.to_ir().hamiltonian.rabi
payload = {
"track": "quantum_experimentalist",
"level": "foundation",
"lesson": "waveform_design",
"facts": {
"waveform_kind": waveform_ir.kind,
"times": waveform_ir.times,
"values": waveform_ir.values,
"duration": waveform_ir.times[-1],
"validation_errors": [
item.code for item in validated.diagnostics if item.severity == "error"
],
"probability_sum": round(sum((result.probabilities or {}).values()), 12),
},
"boundaries": {
"hardware_execution": False,
"cloud_execution": False,
"network_accessed": False,
"credentials_loaded": False,
},
}
print(json.dumps(payload, sort_keys=True))
if __name__ == "__main__":
main()
python3 examples/user/tracks/quantum_experimentalist/02_foundation_waveform_design_zh.py
保持段写成 Waveform.linear(1.2, 1.2, duration=0.1),使两段都属于线性波形族。concat() 将后续片段的时间平移到整个脉冲的时间轴上,返回新波形,原片段保持不变。
{
"boundaries": {
"cloud_execution": false,
"credentials_loaded": false,
"hardware_execution": false,
"network_accessed": false
},
"facts": {
"duration": 0.30000000000000004,
"probability_sum": 1.0,
"times": [
0.0,
0.2,
0.30000000000000004
],
"validation_errors": [],
"values": [
0.0,
1.2,
1.2
],
"waveform_kind": "piecewise_linear"
},
"lesson": "waveform_design",
"level": "foundation",
"track": "quantum_experimentalist"
}
结果为分段线性波形,采样点接近 (0, 0)、(0.2, 1.2)、(0.3, 1.2)。打印出的 0.30000000000000004 是浮点加法的常见表示,不代表多设计了一小段脉冲。
脚本默认输出归一化检查。在本地副本中加入 print(result.probabilities),核对物理预测 P(1) ≈ 0.014331。本次执行使用 120 个时间步、零 shots,返回概率而不做有限次采样。校验调用中的 16 shots 用于检查目标约束,不会产生样本,也不会覆盖后面单独执行时的设置。
选择符合控制含义的表示¶
| 表示 | 给定时刻之间的含义 |
|---|---|
| 常量或分段常量 | 保持一个值,片段之间可以有阶跃 |
| 线性或分段线性 | 用直线连接相邻采样值 |
| 插值波形 | 使用保形 PCHIP 穿过给定采样点 |
这个拼接接口支持常量族内部或线性族内部的组合,线性片段接缝处的数值必须相等。即使数学上的保持段可以用两种方式表示,也不能直接混拼常量族和线性族。插值片段重新拟合后可能改变形状,因此不能这样拼接;应在整个时间范围上定义一条插值波形。插值控制指南介绍了对应接口。
检查设计修改¶
- 将保持段延长到
0.2 us,同时把失谐波形时长改为新的总时长。计算新脉冲面积与激发概率。 - 将保持段换成
Waveform.constant(1.2, duration=0.1),阅读报错,再恢复为兼容的线性表示。 - 保持线性表示,但把第二段起点从
1.2改成0.7。解释接缝为何被拒绝;如果真的需要阶跃,应使用怎样的波形表示?
核对思路
延长后的面积为 0.36 rad,P(1) = sin²(0.18) ≈ 0.032052。混合波形族会报 AHS_WAVEFORM_CONCAT_FAMILY_MISMATCH;不连续的线性接缝会报 AHS_WAVEFORM_CONCAT_LINEAR_SEAM_MISMATCH。阶跃应使用明确允许不连续的表示,并继续通过目标约束校验。总时长一致、采样值有限是必要条件,但不能单独证明物理控制器能产生这条脉冲。
脉冲面积的简便公式依赖单一旋转轴和零失谐。控制项不对易时,时间形状也会影响结果。下一课局域失谐将区分波形随时间的变化和它在空间上的权重。