跳转至

从结果中提取数据与诊断

先保存 ResultIR,再用它生成表格或报告。图表是结果的展示方式;修改图表不会重新运行实验,也不会改变原来的采样。

你要读什么 检查方式
测量统计 读取 counts,先求总数,再结合位序解释每个字符串
状态概率 读取可选的 probabilities;没有请求或结果空间不适用时可能为 None
期望值 读取对应观测量结果,不能把采样频率直接当作任意 Observable 的期望值
位序 读取本次结果的顺序记录;不要由 Bell 态的对称计数猜顺序
警告和错误 按 diagnostics 的 severity、code、object_path 与 suggestion 定位
数值设置与成本 查看实际执行配置、求解器记录和资源用量,而非只看请求值

结果、视图和报告怎样对应

这个例子保存源结果摘要,建立只读视图,再生成报告对象。它检查源结果是否保持不变,以及视图的计数和结果标识是否对应。

"""对照 Result、Diagnostics、ResultView 和标准报告。

``ResultIR`` 保存原始结果;ResultView 和 visualization report 都从它派生,用于查询
或展示。创建这些视图不会重跑 Job,也不会产生另一份权威结果。
"""

from __future__ import annotations

import json

from cascaqit import Circuit, build_result_view, visualize


def main() -> None:
    """创建一个结果,并检查它的源表示和派生表示。"""
    result = (
        Circuit(1, program_id="lesson.platform.result")
        .h(0)
        .measure_all()
        .run(shots=16, seed=402, return_probabilities=True)
    )
    source_hash = result.stable_hash()
    view = build_result_view(result)
    report = visualize(result, profile="digital")

    payload = {
        "track": "sdk_platform_engineer",
        "level": "foundation",
        "lesson": "result_diagnostics",
        "facts": {
            "result_id": result.result_id,
            "source_unchanged": source_hash == result.stable_hash(),
            "view_counts_match": view.counts == result.counts,
            "view_backend_called": view.backend_called,
            "probabilities": result.probabilities,
            "diagnostic_severities": [item.severity for item in result.diagnostics],
            "diagnostic_codes": [item.code for item in result.diagnostics],
            "view_metadata_only": view.metadata_only,
            "view_source_matches": view.result_id == result.result_id,
            "report_profile": report.profile,
            "report_sections": [section.section_id for section in report.sections],
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()

下载完整脚本

python examples/user/tracks/sdk_platform_engineer/02_foundation_result_diagnostics_zh.py
{
  "boundaries": {
    "cloud_execution": false,
    "credentials_loaded": false,
    "hardware_execution": false,
    "network_accessed": false
  },
  "facts": {
    "diagnostic_codes": [
      "DIGITAL_SIMULATION_COMPLETED",
      "DIGITAL_RESULT_ALIGNMENT_VALID"
    ],
    "diagnostic_severities": [
      "info",
      "info"
    ],
    "probabilities": {
      "0": 0.5,
      "1": 0.5
    },
    "report_profile": "digital",
    "report_sections": [
      "experiment.design",
      "experiment.validate",
      "experiment.plan",
      "experiment.execute",
      "experiment.state",
      "experiment.measure",
      "experiment.analyze"
    ],
    "result_id": "result.lesson.platform.result",
    "source_unchanged": true,
    "view_backend_called": false,
    "view_counts_match": true,
    "view_metadata_only": true,
    "view_source_matches": true
  },
  "lesson": "result_diagnostics",
  "level": "foundation",
  "track": "sdk_platform_engineer"
}

source_unchanged、view_counts_match 和 view_source_matches 应为 true,view_backend_called 为 false。诊断中出现 info 并不等于失败;反过来,没有 error 也不能证明你的实验假设正确。

保存与复查

result.to_json() 返回 JSON 文本,不自动写文件。保存时同时记录程序、绑定值、seed、SDK 提交、方法和采样预算。需要图形展示时,用 visualize 指定 HTML 输出,并保留原始结果。

遇到结果缺字段,先确认本次请求和后端是否会提供它。原子丢失的结果可能含擦除状态,普通二进制概率分布不一定适用。扫描结果则应先逐点判断成功与失败,再读取各点 ResultIR。

字段细节见 ResultIR,图形输出见实验报告,入门解释见读懂第一份结果。

English

SDK 1.0.8a · `6eff6362`