跳转至

本地 Hybrid 模拟

先运行覆盖理想态、物理噪声和参数扫描的完整示例:

python3 examples/user/complete_physical_hybrid_demo.py \
  --output artifacts/complete_physical_hybrid_report.html

HybridProgram 直接持有 typed Digital 和 Analog payload,LocalBackend.run() 是普通用户唯一的提交入口:

from cascaqit import HybridProgram, LocalBackend, SimulationOptions

program = (
    HybridProgram("demo")
    .digital("prepare", circuit)
    .analog("evolve", ahs_program)
    .digital("correct", correction)
    .measure_all()
)

job = LocalBackend(seed=7).run(
    program,
    shots=32,
    options=SimulationOptions(method="auto", max_memory_bytes=2_000_000_000),
)
result = job.result()
print(result.counts)
print(result.metadata["simulation_resource_estimate"])

payload 在加入程序时会被快照;之后修改原始 Builder 不会改变 HybridProgram。高级用户仍可从同一对象访问 analyze()、compile()、parameters、execution_builder() 和 to_ir()。

参数与扫描

Circuit 和 AHSProgram 声明的参数会自动汇总。同名且定义相同的参数共享一份声明;定义冲突会在执行前失败。每个持有参数的 block 都会自动生成 target。

from cascaqit import ParameterScan

single = backend.run(program, params={"theta": 0.2}, shots=32)

scan = ParameterScan.explicit(
    scan_id="scan.theta",
    points=({"theta": 0.1}, {"theta": 0.4}),
)
sweep_job = backend.run(program, sweep=scan, shots=32)
sweep_result = sweep_job.result()
print(sweep_result.counts)

params 与 sweep 互斥。scan 没有固定点数上限,由内存预算决定可执行规模。continue_on_error 使用内存受限 worker pool,严格 fail_fast 保持串行,确保标记为 not_run 的点从未启动;两种策略都按 scan index 稳定返回结果,并从 root seed 为每个点派生独立 seed。只有自定义初态或直接控制 Bundle 时才需要 execution_builder(parameterized=True)。

自适应精度与状态溯源

先运行求解器对照示例:

python3 examples/user/adaptive_solver_and_lineage.py

Analog 或 Hybrid 使用 state-vector、subspace、density-matrix 时,integrator="auto" 会选择 DOP853 自适应积分器。实验需要固定数值策略时,可以显式设置:

result = backend.run(
    program,
    shots=32,
    options=SimulationOptions(
        integrator="adaptive_dop853",
        rtol=1e-9,
        atol=1e-11,
        max_steps=10_000,
    ),
).result()

print(result.execution_config())
print(result.solver_evidence())
print(result.state_transitions())

求解器会在 waveform knot 和 site-addressing frame time 精确结束当前分段,再继续积分。solver_evidence() 返回 accepted steps、函数求值次数、分段数、步长范围、终止原因,以及容差是否真的参与计算。SciPy 不公开 DOP853 内部 rejection count,因此 CASCAQit 将它标记为不可用,不做推算。

state_transitions() 为每个量子 block 返回一条规范记录。Digital block 不推进逻辑时间,Analog block 按 duration 推进;相邻 transition 的输出/输入 state hash 必须相等,首尾 hash 还要与顶层 initial/final reference 一致。终端测量只记录为 trace event,不伪造量子态 transition。

纯 Digital gate 执行不需要时间积分。Trajectory 的 jump probability 仍依赖固定时间片,因此当前只支持固定步长;显式请求 adaptive trajectory 会在规划阶段失败。fixed_step_krylov 可用于受控对照,并明确记录 tolerance_applied=False。

物理噪声

可执行噪声 API 已纳入精简根 API:

from cascaqit import NoiseChannel, NoiseModel, SimulationOptions

noise = NoiseModel(
    "noise.demo",
    (
        NoiseChannel.preparation(0.01),
        NoiseChannel.dephasing(0.2),
        NoiseChannel.gate(0.01),
        NoiseChannel.atom_loss(0.02, targets=("q1",)),
        NoiseChannel.readout(0.02, p10=0.03),
    ),
)
result = backend.run(
    program,
    params={"theta": 0.2},
    noise=noise,
    shots=256,
    options=SimulationOptions(trajectories=256, seed=7),
).result()
print(result.counts)
print(result.observables)
print(result.metadata["noise_report"])

没有 atom loss 时,method="auto" 会在资源预算允许时优先选择 exact density-matrix,否则使用 trajectory;atom loss 必须使用 trajectory,因为 density state 没有真空占据轴。按执行顺序记录的 NoiseReport 会区分物理态演化与只修改测量结果的 readout noise。同一个 canonical noise model 也可以与 sweep=... 一起提交:每个参数点使用独立派生 seed,并返回自己的 noise report、state chain、counts、Observable 和置信区间。Sweep concurrency 统一管理 worker 预算,因此 trajectory item 各自只使用一个内部 worker,不会嵌套创建 worker pool。

当前边界

SimulationPlanner 不声明固定产品 site 上限。它根据程序语义和默认 80% 主机内存预算选择 state representation 与 integrator,并在分配大数组或创建 scan Job 前拒绝不支持或超预算的任务;DOP853 workspace 也计入估算。并行 scan 的 aggregate 归属 scan concurrency 和 root seed,每个 item 记录一个 kernel worker 和与调度顺序无关的派生 seed。result.resource_usage() 记录 wall time、进程 peak RSS、baseline、增量、规划估算和可计算时的估算误差。

可扩展 engine 通过 tensor axis 执行 Digital gate;Analog block 的同一个 matrix-free Hamiltonian 可由自适应 DOP853 或固定步长 Krylov 消费。D-A-D Hybrid block 共享同一 state,并公开规范的 transition/reference chain。Apple M4 已验证参考运行覆盖 24-qubit Digital、18-site 理想 Analog/Hybrid、10-site exact density 和 16-site/256-trajectory 带噪 Hybrid;这些数字是参考规模,不是固定上限。

HybridProgramIR 和 LocalExecutionPlan 是序列化与规划产物,不能直接传给 Backend.run()。本地路径不会访问硬件、云服务、凭证或网络。

SDK 1.0.8a · `6eff6362`