跳转至

区分有序计划与可执行程序内容

创建类型明确的 Hybrid 程序,查看依赖图,再将具体程序内容装配成本地执行 Bundle。请先完成语法与 HIR和共享状态实验,使用安装好的环境。

声明顺序是 Digital 制备、Analog 演化、末端测量。先预测:依赖图和计划应保留这个顺序;仅编译有序计划不会运行实验,也不会产生计数。

先检查计划,再装配 Bundle

"""把带类型的 Hybrid 程序编译为确定的依赖图和本地执行计划。

Graph 给出 block 的依赖顺序,plan 给出本地执行所需的 payload 与资源。
两者都只是描述性产物,便于在 Backend 启动前检查顺序和诊断信息。
"""

from __future__ import annotations

import json

from cascaqit import AHSProgram, AtomRegister, Circuit, HybridProgram, Waveform


def main() -> None:
    """构建 typed 程序并检查它的编译产物。"""
    digital = Circuit(1, program_id="lesson.compiler.graph.digital").h(0)
    analog = AHSProgram(
        AtomRegister.line(count=1, spacing=5.0),
        program_id="lesson.compiler.graph.analog",
    ).drive(
        rabi=Waveform.constant(0.3, duration=0.1),
        detuning=Waveform.constant(0.0, duration=0.1),
        phase=0.0,
    )
    program = (
        HybridProgram("lesson.compiler.graph")
        .digital("prepare", digital)
        .analog("evolve", analog)
        .measure_all()
    )
    compiled = program.compile()
    if compiled.graph is None or compiled.plan is None:
        raise RuntimeError([item.to_dict() for item in compiled.diagnostics])

    binding = program.execution_builder(shots=8, seed=7).build()
    if binding.bundle is None:
        raise RuntimeError([item.to_dict() for item in binding.diagnostics])

    payload = {
        "track": "compiler_engineer",
        "level": "foundation",
        "lesson": "hybrid_graph_plan",
        "facts": {
            "topological_order": list(compiled.graph.topological_order),
            "dependency_types": sorted(
                {edge.dependency_type for edge in compiled.graph.edges}
            ),
            "plan_steps": [step.kernel_kind for step in compiled.plan.steps],
            "bundle_ready": binding.bundle.execution_ready,
            "payload_kinds": [item.payload_kind for item in binding.bundle.payloads],
            "execution_ready": compiled.plan.execution_ready,
            "diagnostic_codes": [item.code for item in compiled.diagnostics],
        },
        "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/compiler_engineer/02_foundation_hybrid_graph_plan_zh.py

program.compile() 返回依赖图和本地计划。边记录共享量子态、资源使用、时序等要求,拓扑顺序满足这些依赖。但这些边的类别不等于物理脉冲调度,也不能证明独立操作实际会并发运行。

{
  "boundaries": {
    "cloud_execution": false,
    "credentials_loaded": false,
    "hardware_execution": false,
    "network_accessed": false
  },
  "facts": {
    "bundle_ready": true,
    "dependency_types": [
      "quantum_state",
      "resource",
      "timing"
    ],
    "diagnostic_codes": [
      "HYBRID_PLAN_PAYLOAD_REQUIRED"
    ],
    "execution_ready": false,
    "payload_kinds": [
      "digital",
      "analog",
      "measurement"
    ],
    "plan_steps": [
      "digital",
      "analog",
      "measurement"
    ],
    "topological_order": [
      "block.0000.prepare",
      "block.0001.evolve",
      "block.0002.measure"
    ]
  },
  "lesson": "hybrid_graph_plan",
  "level": "foundation",
  "track": "compiler_engineer"
}

计划中的步骤应为 digital、analog、measurement。它的 execution_ready 仍为 false,诊断中包含 HYBRID_PLAN_PAYLOAD_REQUIRED。计划描述本地执行需要什么,并不是一份自足的数值输入。

类型化 HybridProgram 还持有具体的 Circuit 和 AHSProgram。program.execution_builder(shots=8, seed=7) 将这些内容和末端测量设置接到计划上。随后 build() 返回检查过的 Bundle,其 bundle_ready 应为 true,程序内容的类别与三个步骤一致。

两个就绪值属于不同产物,所以不可执行的计划与可执行的 Bundle 可以同时存在,并不矛盾。装配 Bundle 仍不进行状态演化,调用运行器或 Backend 是之后的动作;本课在那之前结束。

为下一阶段保留足够的内容

产物 下一阶段如何使用
依赖图 检查和验证操作顺序约束。
本地计划 确认有序步骤、逻辑映射及所需程序内容。
绑定后的 Bundle 提供具体数值程序和末端测量设置。
执行结果 运行之后记录测量和状态转换。

只保存图或计划,并没有保存全部可执行内容。装配完成也不能证明物理参数选择正确;Bundle 就绪表示声明的步骤已绑定有效程序内容,具体使用者仍可提出额外要求,例如采样前必须有末端测量。

执行前先观察改动

  1. 将 Analog 幅度从 0.3 改为 0.6 rad/us,比较图顺序、具体程序内容和程序哈希。
  2. 将 Bundle 的采样次数从 8 改为 32,装配时会产生 32 个测量样本吗?
  3. 移除末端 measure_all(),查看计划和 Bundle,再尝试交给 LocalBackend 获取采样结果。Bundle 就绪能保证这次提交有效吗?

第一项保持当前串行顺序,但程序和数值内容发生变化。采样次数是未来执行的设置,装配不会产生样本。没有测量时,两个演化步骤仍能组成计划和 Bundle,但用于采样的 LocalBackend 路径会报 SCALABLE_HYBRID_MEASUREMENT_BOUNDARY_INVALID。它要求一个末端测量,这不是 Bundle 就绪能够保证的。不应自行补上猜测的读出方式。

运行接口见本地 Hybrid 模拟。下一课介绍参数投影,区分更新计划参数与绑定数值程序。

English version

SDK 1.0.8a · `6eff6362`