跳转至

保留每个扫描点的状态与结果

通过一个扫描任务提交两个 RX 角度,再整理一张同时保留参数、状态和测量值的结果表。请先完成结果与诊断及 Hybrid 参数扫描,使用安装好的环境。

角度为 0.1 和 0.7 rad。从 |0⟩ 出发,RX 给出 P(1)=sin²(θ/2),分别约为 0.002498 和 0.117579。每点只采样八次,都可能一次 1 也测不到。这与任务失败、没有产生结果不同。

先读汇总状态,再读各点状态

"""分别查看本地 Sweep Job 的 aggregate 和 child 生命周期。

Aggregate Job 保存按参数顺序排列的 child outcome 和局部失败策略。每个 child 都有
自己的绑定值与 result;判断成功或失败时不能只看 aggregate counts。
"""

from __future__ import annotations

import json

from cascaqit import Circuit, HybridProgram, LocalBackend
from cascaqit.parameters import ParameterScan


def main() -> None:
    """提交两个 scan point,并检查 aggregate 生命周期字段。"""
    circuit = Circuit(1, program_id="lesson.platform.sweep.digital")
    theta = circuit.parameter("theta", lower_bound=0.0, upper_bound=1.0)
    circuit.rx(theta, 0)
    program = (
        HybridProgram("lesson.platform.sweep").digital("rotate", circuit).measure_all()
    )
    scan = ParameterScan.explicit(
        scan_id="lesson.platform.sweep.points",
        points=({"theta": 0.1}, {"theta": 0.7}),
    )
    job = LocalBackend(seed=403).run(program, sweep=scan, shots=8)
    queued = job.status()
    result = job.result()
    completed = job.status()

    if completed.state != "completed" or any(
        item.state != "completed" or item.result is None for item in result.items
    ):
        raise RuntimeError("The platform scan did not complete every point.")

    payload = {
        "track": "sdk_platform_engineer",
        "level": "applied",
        "lesson": "sweep_job",
        "facts": {
            "queued_state": queued.state,
            "completed_state": completed.state,
            "total_items": completed.total_items,
            "item_states": [item.state for item in result.items],
            "theta_values": [item.bind_set.values["theta"] for item in result.items],
            "probabilities": [
                item.result.probabilities for item in result.items if item.result
            ],
            "bind_hashes_valid": all(
                item.bind_set.verify_hash() for item in result.items
            ),
            "counts_totals": [
                sum((item.result.counts if item.result else {}).values())
                for item in result.items
            ],
        },
        "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/sdk_platform_engineer/03_applied_sweep_job_zh.py

这个 Hybrid 程序只包含 Digital 操作,无需 Analog 积分器。与单个本地 Job 一样,扫描最初处于排队状态,请求 result() 后开始执行。

{
  "boundaries": {
    "cloud_execution": false,
    "credentials_loaded": false,
    "hardware_execution": false,
    "network_accessed": false
  },
  "facts": {
    "bind_hashes_valid": true,
    "completed_state": "completed",
    "counts_totals": [
      8,
      8
    ],
    "item_states": [
      "completed",
      "completed"
    ],
    "probabilities": [
      {
        "0": 0.997502082639013,
        "1": 0.002497917360987117
      },
      {
        "0": 0.8824210936422442,
        "1": 0.11757890635775578
      }
    ],
    "queued_state": "queued",
    "theta_values": [
      0.1,
      0.7
    ],
    "total_items": 2
  },
  "lesson": "sweep_job",
  "level": "applied",
  "track": "sdk_platform_engineer"
}

示例要求汇总任务完成,且两个子任务都完成并返回结果,否则直接报错。各点计数之和应为 [8, 8],整个扫描共 16 次采样。total_items=2 表示有两个参数点,本身既不是采样次数,也不能证明执行成功。

整理每一行时,保留 scan_index、bind_set、state、结果引用和诊断。绑定哈希校验通过,说明绑定记录内部一致;概率预测则另行检查绑定是否产生了预期的数值效果。

参数点的情况 应如何呈现
已完成,但没有测得 1 有效的零频率测量,同时保留采样次数。
失败,没有结果 缺失测量值,并附上失败诊断。
前面失败后标为 not_run 尚未尝试的工作,不能记作零,也不能记作执行失败。
部分点成功、部分点失败 保留成功结果,同时注明汇总任务只完成了一部分。

continue_on_error 保留运行中的失败,并允许其他点继续执行;fail_fast 则在首次失败后不再启动后续点。两种策略都不会绕过执行前对整个扫描的绑定检查。导出表格或绘图时,应保留部分完成的信息;静默删去失败行可能使分析产生偏差。

练习处理不同数据情况

  1. 把第一个角度改为零。这个成功完成、全为零的样本应该从图上消失吗?
  2. 将参数点倒序,依靠哪个字段确定结果对应的角度?
  3. 把第二个角度改为越界值 1.1,再尝试 continue_on_error,能得到第一个点的成功结果吗?

零角度对应有效的 P(1)=0 结果,应保留。倒序后按新的输入顺序返回,bind_set.values 标识角度。越界的 1.1 会在子任务执行前以 LOCAL_HYBRID_SCAN_INVALID 拒绝整个提交,这次请求不会产生第一个点的测量。运行失败策略处理的是更晚阶段的问题。

公共状态定义见任务生命周期。下一课介绍本地恢复,让任务定义与结果不再依赖当前 Python 对象。

English version

SDK 1.0.8a · `8b227bff`