科学计算工作流:输入模型、求解器与复现

English · 简体中文

本章串联 QHAM、Carleman、LCHS 和 CBMD 的完整示例,解释每一步产生的对象、 仍然开放的接口,以及结果能够支持的结论。论文保留机制与代表性实验;完整 用法、输入变体和逐步讲解在这里继续维护。

先区分三个层次

层次

决定什么

典型对象

数学输入与近似

PDE、离散化、截断阶、初态范数、物理输出窗口

PolynomialPDE、QHAMPlan、PolynomialODE

量子算法生成

选哪个求解器及内部模拟核,生成哪些模块调用

QODESolver、linear_qode、carleman_qode

实现绑定与执行

用门表、QRAM 或算术实现开放槽,提供运行期数据

RIR Program、Binding、内存快照

替换求解器通常需要重新生成程序;给既有槽换一个兼容实现可以使用 bind。 改变公开位宽或已用于组装的 alpha 不能只替换标签。数学条件相同与接口兼容 也是两件事:一个生成元能提供 BE,并不意味着它满足所有 QODE 方法的条件。

QHAM:从方程到提升后的线性输入

先阅读最小 QHAM 教程。下面直接包含实际示例源码,因此导入、 方程、数据与求解器配置始终和仓库脚本一致。

强迫 Burgers 方程的 QHAM 组装与两种求解器选择。
from functools import partial

from oracq.algorithms.common.hamiltonian import taylor_hamiltonian
from oracq.algorithms.qode.ode import linear_qode
from oracq.applications.qham import (
    Discretization,
    Field,
    Grid,
    Known,
    PolynomialPDE,
    QHAMPlan,
    qham_input_model,
    structured_fd_bindings,
)

u = Field("u")
pde = PolynomialPDE.from_equations(
    {"u": 0.1 * u.d("x", 2) - u * u.d("x") + Known("forcing")},
    label="forced_burgers",
)
plan = QHAMPlan(pde, order=2)
grid = Grid(("x",), (4,), (1.0,), boundary="periodic")
space = Discretization(pde, grid, {"forcing": [0.05, 0, -0.05, 0]})
initial = space.encode_fields({"u": [0.1, 0.2, 0, -0.1]})
bindings = structured_fd_bindings(space, initial)
qode_input = qham_input_model(plan, bindings, eta=-0.4)

# Schrödingerization accepts a general generator; the recovery interval and time approximation still need later validation.
solver = linear_qode(
    "schrodingerization", hamiltonian_function=partial(taylor_hamiltonian, degree=1)
)
solution = qode_input.solve(solver, 0.01)

# To switch to CBMD/LCHS instead, first apply an explicit global shift that makes the generator dissipative.
shifted = qode_input.dissipative_shift()
cbmd_solution = shifted.solve(
    linear_qode("cbmd", hamiltonian_function=partial(taylor_hamiltonian, degree=1)), 0.01
)

按对象的生命周期理解这段代码:

  1. Field 与 Known 构造未知场及按名字引用的强迫项。表达式描述待求场, 不是把一个普通数值函数直接作用到量子振幅上。

  2. QHAMPlan(pde, order=2) 确定有限 HAM 截断与量子适配线性化规则。 计划可保存、恢复和按行查询,不会立即物化完整提升矩阵。

  3. Grid 与 Discretization 决定周期网格、导数和已知数据。边界条件属于 这一层,不由求解器猜测。

  4. structured_fd_bindings 用移位、局部系数和多线性收缩构造端口 BE; qham_input_model 再组装提升生成元和初态。提升初态各张量块的相对范数 必须保留,不能逐块独立归一化。

  5. linear_qode 选择线性演化方法;partial(taylor_hamiltonian, degree=1) 显式指定本例的近似模拟核。solve 生成带信号和恢复信息的态 oracle, 并不直接返回一个已认证收敛的经典 PDE 解。

  6. dissipative_shift 显式改变生成元以满足另一种方法的前提。相应增长 恢复因子不能丢弃,也不能把这个步骤当成免费提高成功率的方法。

原始方法见 Xue 等的 QHAM 论文。 有限闭包、张量块权重与物理输出的推导见QHAM 数学说明, 一般多项式、强迫与离散化限制见完整实现文档。

Carleman:开放系数端口与可替换线性求解器

Carleman 路径从多项式 ODE 的系数端口出发,按所选 cutoff 构造张量提升。 它与 QHAM 的截断对象不同,不能把两个截断阶当作同一精度参数。

Carleman 示例片段;导入、网格和线性求解器配置见完整脚本。
# 6. Ordinary PDE -> F_p ports -> Carleman -> replaceable linear solver.
u = Field("u")
pde = PolynomialPDE.from_equations({"u": 0.1 * u.d("x", 2) - u * u.d("x")})
space = Discretization(pde, grid)
ports = structured_fd_bindings(space, space.encode_fields({"u": [0.1, 0.2, 0, -0.1]}))
concrete = polynomial_from_bindings(ports)
coefficient_slots, bindings = [], {}
for order, coefficient in concrete.coefficients:
    name = "BurgersF" + str(order)
    slot = abstract_block_encoding(
        name, coefficient.width, coefficient.signal_qubits, coefficient.alpha
    )
    coefficient_slots.append((order, slot))
    bindings[name] = coefficient.operation
initial_slot = abstract_state_prep(
    "BurgersInitial", concrete.width, concrete.initial.work_width
)
bindings["BurgersInitial"] = concrete.initial.operation
problem = PolynomialODE(
    concrete.width, tuple(coefficient_slots), initial_slot, concrete.initial_norm
)
recovery: dict[str, float] = {}
for method, solver in (
    ("schrodingerization", schrodinger),
    ("shifted_lchs", shifted_solver(lchs, recovery)),
):
    nonlinear_solver = partial(carleman_qode, linear_solver=solver, cutoff=2)
    state = qpde_solver(nonlinear_solver)(PDEInput(problem, "burgers"), time)
    records.append(
        write(
            "burgers_carleman_" + method,
            state,
            bindings,
            notes={
                "initial_norm": concrete.initial_norm,
                "cutoff": 2,
                **(recovery if method == "shifted_lchs" else {}),
            },
        )
    )

这里 concrete.coefficients 按非线性次数保存系数 BE。循环为每个系数建立 一个同宽、同信号布局、同 alpha 的开放声明,同时在 bindings 中保留对应 实现。BurgersInitial 同样是开放态制备槽,原始初态范数由宿主单独携带。

PolynomialODE 因此描述数学输入;carleman_qode 负责提升;传入的 linear_solver 负责提升后的线性问题。脚本分别使用 Schrödingerization 与显式移位后的 LCHS,并把恢复因子写入记录。运行两次生成器不意味着两种 方法的成功概率、截断误差或线路成本相同。

数学约定与接口见 Carleman 页面。 下载包含所有上下文的 完整输入模型脚本。

LCHS:同一个开放图的门表与 QRAM 绑定

LCHS 的配置包含求积计划与 Hermitian 分支的模拟核。示例中的 Cauchy 节点 和一阶 Taylor 核是具体的近似选择,不是语言默认保证的目标精度。

不改调用方,只改变角数据库和初态制备的绑定。
# 3. Same open graph, bound to gate / QRAM databases and state preparations respectively.
# The data is an integer encoding of rotation angles; A=diag(1, cos(pi/4)), G=-A.
angles = abstract_database("DiagonalAngles", 1, 2)
a = diagonal_block_encoding(angles, alpha=1.0)
state = lchs(scale(-1, a), initial, time)
records.append(
    write(
        "given_xor_gate_lchs",
        state,
        {
            "DiagonalAngles": gate_database(1, 2, [0, 1]).operation,
            "Initial": initial_gate.operation,
        },
    )
)
records.append(
    write(
        "given_xor_qram_lchs",
        state,
        {
            "DiagonalAngles": Binding(
                qram_database(1, 2).operation, {"table": "diagonal_angles"}
            ),
            "Initial": Binding(qram_state_prep(1, 2).operation, {"angles": "initial_angles"}),
        },
        memory={
            "diagonal_angles": [0, 1],
            "initial_angles": qram_state_angles([1, 1], 2),
        },
    )
)

DiagonalAngles 存储的是旋转角字,diagonal_block_encoding 把它解释为 矩阵系数。Initial 是独立的初态制备槽。两个 write 调用接收同一个开放 state,但分别选择门表与 QRAM 实现;后者还必须提供 memory 中的两个表。

脚本的 save_case 将开放、第一次部分绑定和最终闭合的 RIR 分别保存,并 生成模块化后端文本。中间资源捕获仍保留为显式参数,不会把内存内容塞进 RIR。 更小的独立示例见开放程序实现比较,方法配置与适用 条件见 LCHS 页面。

CBMD:复用 QHAM 输入,但显式处理耗散前提

已构造的 QHAM 端口通过显式适配交给 CBMD。
# ---- CBMD: QHAM open-coefficient input through a dissipative shift (input model reused across families) ------------
model = qham_input_model(plan, open_bindings, eta=-0.4)
state = model.dissipative_shift().solve(cbmd, 0.01)
records.append(
    write("cbmd_qham_coeff_qram", state, qram_dict, memory=qram_memory)
)

CBMD 的方法来源是 Wang 等的轮廓矩阵分解。 这段代码复用 QHAM 的计划和开放系数输入,而不是在 CBMD 内重新解释 PDE。 model.dissipative_shift() 产生的移位与恢复信息属于数学适配;最终的 qram_dict 和 qram_memory 才是实现及运行期数据绑定。

节点、留数、有限截断及未包含项见 CBMD 页面。 不要根据 check().ok 推断轮廓截断误差或物理恢复误差已经得到认证。

输入模型变体与复现

输入模型变体脚本 对四个家族提供 结构化端口、谱构造和 QRAM 数据路径。它是构造示例,不是跨方法准确率排行榜。

PYTHONPATH=src python examples/general_qham.py
PYTHONPATH=src python examples/ode_input_models.py
PYTHONPATH=src python examples/input_models.py
PYTHONPATH=src python examples/research_workflow.py
PYTHONPATH=src python tools/build_qlss_comparison.py

真实后端检查必须使用同时安装 pysparq 和 uniqc 的解释器:

PYTHONPATH=src /path/to/backend/python examples/research_workflow.py --native
PYTHONPATH=src /path/to/backend/python tools/run_verification.py \
  --group oracles --group blockencoding --group arithmetic \
  --group mathfunc --group qham_qfvm --group ode

数值报告应分别解释:线路相对独立有限精度参考的实现误差、有限精度或截断 相对原问题的方法误差,以及后选择成功率和物理范数恢复。程序可导出、后端 相互一致、方法对原 PDE 收敛是不同结论。完整边界见适用范围。

格式细节、资源数据与扩展功能

要查的细节

维护位置

RIR 节点、完整序列化文本与 OriginIR-ext 文法

RIR 规范

开放声明、分批绑定、资源捕获

开放 IR

数学函数的中间表示与序列化

数学 IR

Toffoli/旋转/QRAM 计数、通用规模扫描

资源估计

QFVM 的输入、Roe 算术和恢复链

QFVM 文档

更广的算法清单与验证状态

算法手册、验证覆盖

类、函数、参数名与返回对象

API 参考

这些页面承接完整实现与教程细节。非核心算法仍在库中维护,但它们的数量不被 用作论文中框架优越性的证据。跨框架代码量实验的脚本仍保留在 tools/expressiveness/,不属于论文保留的实验依据。