只翻转选定的原子¶
给 q0 施加 π 脉冲,让 q1 留在基态。再改变寻址位点和相位,区分空间选择与相干旋转。先完成局域失谐和物理单位。
本例两个原子相距 20 um,全局 Rabi 驱动和失谐均为零。局域幅度为 π rad/us,持续 1 us,因此选中原子的旋转角为 π。初态为 |00⟩、相位为零,运行前预测最终位串。
指定稀疏掩码¶
"""用相干 local Rabi term 驱动一个选定的 site。
``SiteMask.constant`` 用稀疏形式选择 site,降低后得到与 register 对齐的二进制
权重。理想演化会实际使用 amplitude 和 phase;动态形式使用
``SiteMask.piecewise``。
"""
from __future__ import annotations
import json
import math
from cascaqit import AHSProgram, AtomRegister, LocalBackend, Waveform
from cascaqit.analog import SiteMask
def main() -> None:
"""对 q0 施加 pi pulse,同时保持 q1 不被寻址。"""
program = (
AHSProgram(
AtomRegister.line(count=2, spacing=20.0),
program_id="lesson.experimentalist.local_rabi",
)
.drive(
rabi=Waveform.constant(0.0, duration=1.0),
detuning=Waveform.constant(0.0, duration=1.0),
phase=0.0,
)
.local_rabi(
rabi=Waveform.constant(math.pi, duration=1.0),
phase=0.0,
pattern=SiteMask.constant(("q0",), duration=1.0),
)
.measure()
)
result = (
LocalBackend(analog_time_steps=16).run(program, shots=32, seed=304).result()
)
term = program.to_ir().hamiltonian.local_rabi_terms[0]
payload = {
"track": "quantum_experimentalist",
"level": "advanced",
"lesson": "local_rabi",
"facts": {
"site_ids": list(term.addressing.site_ids),
"weights": list(term.addressing.weights[0]),
"phase": term.phase,
"counts": result.counts,
"selected_simulator": result.metadata["selected_simulator"],
"addressing_frame_count": term.addressing.frame_count,
},
"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/04_advanced_local_rabi_zh.py
SiteMask.constant(("q0",), duration=1.0) 在整个脉冲内选择一个位点,再按寄存器顺序展开为二值权重。全局驱动虽然取零,仍定义了共同的时长;局域项在选定原子上加入相干驱动。
{
"boundaries": {
"cloud_execution": false,
"credentials_loaded": false,
"hardware_execution": false,
"network_accessed": false
},
"facts": {
"addressing_frame_count": 1,
"counts": {
"10": 32
},
"phase": 0.0,
"selected_simulator": "ScalableIdealEngine",
"site_ids": [
"q0",
"q1"
],
"weights": [
1.0,
0.0
]
},
"lesson": "local_rabi",
"level": "advanced",
"track": "quantum_experimentalist"
}
[q0, q1] 对应权重 [1, 0],32 个理想样本全部为 10。这个非对称结果适合检查位序。当前间距超过模拟目标的阻塞半径,也没有配置有限相互作用。如果改变几何、加入非零失谐或额外驱动,就需要重新预测。
后端使用 16 个 Analog 时间步。扰动脉冲后,不只看 counts,也要查看概率,因为 32 次采样可能漏掉很小的残余占据。selected_simulator 表示选中的本地实现,不是真机设备编号。
区分相位与寻址¶
局域相位改变横向平面内的旋转轴,不是执行后随机附加的相位。同一位点的多个局域 Rabi 项按相干振幅相加,因此相对相位会影响总驱动。
- 将掩码改为
("q1",),预测输出并核对排列后的权重。 - 恢复
q0,把相位改为math.pi。仅凭最终 Z 基占据,能看出这个单 π 旋转的符号变化吗? - 恢复零相位,再在
q0上加入第二个局域 Rabi 项,幅度和时长相同,相位为math.pi。先预测合成驱动,再运行。
核对思路
选择 q1 得到权重 [0, 1],理想结果为 01。单个 π 脉冲的相位改成 π 后仍给出 10,这些末端占据看不到其相位效应。两个同时作用、幅度相同而相位相反的项会抵消横向驱动,在这个零失谐对照中留下 00。不能把它们的脉冲面积当作两个无符号正数相加;即使最后在 Z 基测量,也要按相干规则处理相对相位。
SiteMask 只能引用已知且填充的位点,未知或空位点会报错。SiteMask.piecewise() 可以在明确的数值帧时刻切换选中集合,使用阶跃插值;当前不支持连续掩码插值或参数化帧结构。更多位点相位偏移和支持范围见局域 Rabi 指南。
下一课校验与参考编译检查程序与目标的兼容关系。