- 按文件哈希区分当前八路工程和历史 Amesim 基准,修复测试与清单中的旧路径。 - 四路审计从 JSON 按需生成 XML,八路新增只核对模式,并显式使用 UTF-8 与 LF。 - 将缺失高刚度夹具的测试替换为当前八路完整 BDF 运行,明确未恢复原 RK45 专项覆盖。 - 更新前端大型工程测试、历史活动回放入口、数据说明、现行规范和相关报告。 验证:全量后台 374 项通过、1 项条件跳过;前端 11 项通过、历史独立服务用例 1 项跳过;四路八路 AME 审计通过。 环境、缓存和运行产物保持忽略;本次未实施工程 JSON 字段精简。
7.6 KiB
C 计算依赖排序验证(2026-09-10)
路径复核 / 2026-09-12:本文引用的旧
tests/data/test-mql-8.json已删除,保留当时实验与耗时;后续验证使用tests/data/test-mql-8-corrected.json,不得把换了输入后的耗时直接与本文计算优化比例。 详见 路径修复记录。
在 system-optimization 分支完成已知来源识别、依赖排序和局部循环划分,接入默认 C 编译入口使用的扩展生成路径。未修改管路内部求根、积分器、雅可比策略或用户模型接线。
本轮实现
| 原有处理 | 当前处理 |
|---|---|
| 对非储气端口先填默认焓,靠全网循环传递已知量 | 记录当前状态/已准备信号和物性的来源,参考量按依赖传递;初始猜测不作为已知来源 |
| 全网流量与端口焓反复更新 | 将流量、连接方程和焓传递拆为计算条目,按实际输入输出关系排序 |
| 一个未知量试算会刷新全网流量 | 自动划分局部循环;压力试算只刷新本块残差所需的关系 |
| 压力范围和焓初值使用全网信息 | 局部块使用自身已有压力边界和外部已知焓来源 |
图算法不依赖模型名称、组件实例顺序、画布方向或固定气体流向。节点参考别名与能量返回计算分离;常系数流量约束消元得到的表达式也参加排序。构建清单新增 evaluationSchedule,列出来源、计算条目和循环块,便于核查。
当前机械、信号、容积与气体物性准备阶段继续执行原有确定顺序;新图处理的是扩展生成器原先需要全网闭合的气动计算。紧凑储气拓扑原本已顺序计算,继续保留。没有恢复旧 Python 数值实现或旧 IR。
修正参考口模型
输入使用已有独立副本 test/amesim-order-study/reference-port-experiment.json。正式 tests/data/test-mql-8.json 和浏览器工程均未覆盖。对照 EXE 是上一轮已经包含管流精确输入缓存与粗糙度常量预计算的版本,因此本轮比较隔离了计算排序的影响。
- 132 个状态、1784 个输出;编译后形成 484 条气动计算关系,系统代数循环块为 0。
- 使用原有 14 组初始/扰动/反向状态,再逆序重访并重复前两组,共 30 次求值。两版全部成功,每次的全部导数与输出逐值一致。
- 独立插入执行计数后,30 次求值中每条计算关系均执行一次;计数不进入生产代码或计时版本。
相同时段的 BDF 对照
两版均使用 CVODE BDF、相对误差限 1e-7、最大积分步长 1e30 s。保持已有绝对误差策略,不绘图、不调用网页端。
| 指标 | 排序前 | 排序后 |
|---|---|---|
| 完成的仿真时段 | 0~0.02 s | 0~0.02 s |
| 采样间隔 | 0.002 s | 0.002 s |
| 纯求解耗时(单次验证) | 2.368098 s | 1.645752 s |
| 求值次数 | 5123 | 5123 |
| 接受步数 | 169 | 169 |
| 拒绝步数 | 5 | 5 |
两版最终状态和完整采样序列逐值一致,单次耗时减少约 30.5%。这是相同时段的功能与耗时对照;当时另有回归验证任务运行,因此另用下述独立微基准检查提速幅度。
更短的 0~0.002 s 对照同样逐值一致,均为 304 次求值、25 个接受步和 1 个拒绝步。
独立 C 状态求值计时
使用同一批 14 组状态,在 C 内重复 200 次,共 2800 次系统求值;输入读取、进程启动、编译与输出写出不在计时内。两版各预热一次,交替计时 5 轮,取中位数:
| 排序前 | 排序后 | 加速倍数 |
|---|---|---|
| 1.686816 s | 1.156371 s | 1.459 |
计时版本不含诊断计数,校验和一致。这是状态求值的局部基准,不能直接代表任何模型的完整仿真倍数。
长时段验证的边界
尝试仿真到 10 s,每版限制执行 30 s:排序前推进到 0.0741618 s,排序后推进到 1.8645395 s,两版均返回执行超时。共同的 0、0.02、0.04、0.06 s 采样点逐值一致,但本轮没有取得完整 10 s 曲线对照。
另一次仿真终点为 0.06 s、采样间隔 0.002 s 的检查中,排序前在 30 s 限额内推进到 0.0487527 s,排序后用 25.022361 s 完成。共同的 25 个采样点逐值一致;将排序后该段全部 31 个采样状态分别送入两版 EXE,全部导数与输出也逐值一致。该次两版完成范围不同,不作为整段加速倍数。
上述不同采样/终点设置会影响积分运行,不能把两次计时直接混用,也不能用相同执行时间推进的仿真时长之比宣称提速。管流内部迭代及刚性积分的成本仍在,本轮未处理这两项。
通用性验证
- 2000 层逆序输入的依赖链正确排序并追溯到状态来源,不使用 Python 递归。
- 缺失来源、重复提供者、无来源的纯别名环均拒绝编译。
- 两个独立串联阻力压力循环与一个直算支路组合后,循环内各流量计算次数与独立运行相同;直算支路每次只执行一次。正反流及状态重访的结果均逐值一致。
- 打乱四通节点模型的组件和连接顺序后,仍无系统循环,各条目仅执行一次。常系数消元的求和顺序变化只产生浮点舍入级差异,使用远严于冻结基准的容差验证。
- 三支路的压力与混合焓耦合模型保留一个局部块;正反流、零压差与状态重访均通过质量/能量守恒检查。
- 现有 50 个冻结网络通过 C 数值对照;管流缓存、两种积分器、接口供需及编译入口的定向回归通过。
tests/data/native-skill-test.xml的skill-test回归完整完成 10 s,RK45 最大步长 0.001 s、rtol 1e-7,预热后单次纯求解 0.450283 s。它走原有紧凑路径,作为兼容性检查,不用于声称排序收益。
定向回归共 29 项通过。后端全量运行 276 项:首次 274 项通过、1 项锁定环境检查跳过、1 项因编译器版本查询返回空输出出错。重跑冻结网络时又有一次 EXE 初始化返回空输出;这两次均未触发数值不一致断言。受影响的网络 5 和 40 随后使用原冻结期望值单独复核通过。没有为此改动生产进程处理、冻结基准或数值容差;本次全量运行不能表述为一次全部通过,原始限制在此保留。
源文件与模型接入要求见 C 求值排序规范。本轮条件表达式按所有可能分支保守记录依赖,尚未进行运行时流向特化;局部压力/焓求解保留既有方法,未宣称支持任意新非线性方程。
复现材料
test/dependency-schedule-study/ 按仓库约定被 Git 忽略,包含:
baseline-build.json、scheduled-build.json:两版 EXE 与构建清单。schedule.json、model.c:正式生成器输出的依赖清单与 C 源码。verification.json、*-probes.jsonl:30 次逐值验证。benchmark.json:5 轮交替计时及校验和。integration-comparison*.json、bdf-*/result.json:积分统计与原始序列,包括未完成的超时运行。trajectory-probe-check.json:长段共同采样及采样状态的求值对照。skill-test/summary.json:完整skill-test回归结果。study.py:verify、benchmark、integrate(0.002 s)、short(0.02 s)、matched(0.06 s)、full(10 s)模式;积分复现需选择新的输出目录,不能覆盖已有运行结果。
自动回归位于 tests/test_native_schedule.py,不依赖上述临时材料;纯依赖图测试已加入 Linux 合同检查,完整 C 执行测试由 Windows 数值回归自动发现。