跳转至

只翻转选定的原子

给 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 项按相干振幅相加,因此相对相位会影响总驱动。

  1. 将掩码改为 ("q1",),预测输出并核对排列后的权重。
  2. 恢复 q0,把相位改为 math.pi。仅凭最终 Z 基占据,能看出这个单 π 旋转的符号变化吗?
  3. 恢复零相位,再在 q0 上加入第二个局域 Rabi 项,幅度和时长相同,相位为 math.pi。先预测合成驱动,再运行。
核对思路

选择 q1 得到权重 [0, 1],理想结果为 01。单个 π 脉冲的相位改成 π 后仍给出 10,这些末端占据看不到其相位效应。两个同时作用、幅度相同而相位相反的项会抵消横向驱动,在这个零失谐对照中留下 00。不能把它们的脉冲面积当作两个无符号正数相加;即使最后在 Z 基测量,也要按相干规则处理相对相位。

SiteMask 只能引用已知且填充的位点,未知或空位点会报错。SiteMask.piecewise() 可以在明确的数值帧时刻切换选中集合,使用阶跃插值;当前不支持连续掩码插值或参数化帧结构。更多位点相位偏移和支持范围见局域 Rabi 指南。

下一课校验与参考编译检查程序与目标的兼容关系。

English

SDK 1.0.8a · `6eff6362`