保留每个扫描点的状态与结果¶
通过一个扫描任务提交两个 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.1,再尝试continue_on_error,能得到第一个点的成功结果吗?
零角度对应有效的 P(1)=0 结果,应保留。倒序后按新的输入顺序返回,bind_set.values 标识角度。越界的 1.1 会在子任务执行前以 LOCAL_HYBRID_SCAN_INVALID 拒绝整个提交,这次请求不会产生第一个点的测量。运行失败策略处理的是更晚阶段的问题。