区分有序计划与可执行程序内容¶
创建类型明确的 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 就绪表示声明的步骤已绑定有效程序内容,具体使用者仍可提出额外要求,例如采样前必须有末端测量。
执行前先观察改动¶
- 将 Analog 幅度从
0.3改为0.6 rad/us,比较图顺序、具体程序内容和程序哈希。 - 将 Bundle 的采样次数从 8 改为 32,装配时会产生 32 个测量样本吗?
- 移除末端
measure_all(),查看计划和 Bundle,再尝试交给LocalBackend获取采样结果。Bundle 就绪能保证这次提交有效吗?
第一项保持当前串行顺序,但程序和数值内容发生变化。采样次数是未来执行的设置,装配不会产生样本。没有测量时,两个演化步骤仍能组成计划和 Bundle,但用于采样的 LocalBackend 路径会报 SCALABLE_HYBRID_MEASUREMENT_BOUNDARY_INVALID。它要求一个末端测量,这不是 Bundle 就绪能够保证的。不应自行补上猜测的读出方式。
运行接口见本地 Hybrid 模拟。下一课介绍参数投影,区分更新计划参数与绑定数值程序。