科学计算工作流:输入模型、求解器与复现¶
English · 简体中文
本章串联 QHAM、Carleman、LCHS 和 CBMD 的完整示例,解释每一步产生的对象、 仍然开放的接口,以及结果能够支持的结论。论文保留机制与代表性实验;完整 用法、输入变体和逐步讲解在这里继续维护。
先区分三个层次¶
层次 |
决定什么 |
典型对象 |
|---|---|---|
数学输入与近似 |
PDE、离散化、截断阶、初态范数、物理输出窗口 |
|
量子算法生成 |
选哪个求解器及内部模拟核,生成哪些模块调用 |
|
实现绑定与执行 |
用门表、QRAM 或算术实现开放槽,提供运行期数据 |
替换求解器通常需要重新生成程序;给既有槽换一个兼容实现可以使用 bind。
改变公开位宽或已用于组装的 alpha 不能只替换标签。数学条件相同与接口兼容
也是两件事:一个生成元能提供 BE,并不意味着它满足所有 QODE 方法的条件。
QHAM:从方程到提升后的线性输入¶
先阅读最小 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
)
按对象的生命周期理解这段代码:
Field与Known构造未知场及按名字引用的强迫项。表达式描述待求场, 不是把一个普通数值函数直接作用到量子振幅上。QHAMPlan(pde, order=2)确定有限 HAM 截断与量子适配线性化规则。 计划可保存、恢复和按行查询,不会立即物化完整提升矩阵。Grid与Discretization决定周期网格、导数和已知数据。边界条件属于 这一层,不由求解器猜测。structured_fd_bindings用移位、局部系数和多线性收缩构造端口 BE;qham_input_model再组装提升生成元和初态。提升初态各张量块的相对范数 必须保留,不能逐块独立归一化。linear_qode选择线性演化方法;partial(taylor_hamiltonian, degree=1)显式指定本例的近似模拟核。solve生成带信号和恢复信息的态 oracle, 并不直接返回一个已认证收敛的经典 PDE 解。dissipative_shift显式改变生成元以满足另一种方法的前提。相应增长 恢复因子不能丢弃,也不能把这个步骤当成免费提高成功率的方法。
原始方法见 Xue 等的 QHAM 论文。 有限闭包、张量块权重与物理输出的推导见QHAM 数学说明, 一般多项式、强迫与离散化限制见完整实现文档。
Carleman:开放系数端口与可替换线性求解器¶
Carleman 路径从多项式 ODE 的系数端口出发,按所选 cutoff 构造张量提升。 它与 QHAM 的截断对象不同,不能把两个截断阶当作同一精度参数。
# 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 输入,但显式处理耗散前提¶
# ---- 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 文法 |
|
开放声明、分批绑定、资源捕获 |
|
数学函数的中间表示与序列化 |
|
Toffoli/旋转/QRAM 计数、通用规模扫描 |
|
QFVM 的输入、Roe 算术和恢复链 |
|
更广的算法清单与验证状态 |
|
类、函数、参数名与返回对象 |
这些页面承接完整实现与教程细节。非核心算法仍在库中维护,但它们的数量不被
用作论文中框架优越性的证据。跨框架代码量实验的脚本仍保留在
tools/expressiveness/,不属于论文保留的实验依据。