gda_expr_cli 设计

设计目标

为 frontend/gda_expr 提供一个精简、可脚本化的进程接口:读取文件、透传选项、打印可由 Python 工具跨分片累加的计数器,并将判定结果编码到退出状态中。

数学背景

一次运行是复合 files→sortdocuments→filter, shardrows→executesummary\text{files} \xrightarrow{\text{sort}} \text{documents} \xrightarrow{\text{filter, shard}} \text{rows} \xrightarrow{\text{execute}} \text{summary}。行的选择以及计数器在分片上的可加性已在 gda_expr 设计和 internal/conformance 设计中证明;本运行器只增加了确定性的文件顺序,使行序号有明确定义。

设计决策

所有文件构成一次运行

分片应用于所有文件拼接并过滤后的行,而不是按文件进行。因此工具可以给每个分片相同的文件列表,即使某个文件占据了语料的大部分,也能得到均衡的分片。

在进程边界处严格化

--strict-supported 在这里求值:当汇总中有失败的行,或者在严格模式下有任何 legacy 或 unsupported 行时,退出状态为 1。前端的汇总本身保持中立,因此进程内调用者可以应用自己的策略。

稳定的 JSON 键

JSON 对象使用固定的 camelCase 键,并将执行计数器与分片一起放在嵌套的 execution 对象中,与 tools/run_dectest_interpreter.py 所汇总的内容一致。supportedCases 是可执行行的数量。

在第一个解析错误处停止

语料是固定版本的,并且应当能完整解析;解析错误是基础设施故障(退出码 2),会连同其位置一起报告,而不是测试结果。

正确性 / 不变式

  • 退出码 0 意味着 failed_cases() == 0,在严格模式下还意味着没有 legacy 或 unsupported 行。
  • 对于固定的参数向量和文件内容,输出是确定的。
  • totalCases 在一次运行的每个分片中都相同,因此汇总总数是这个共同值,而不是其和。

被否决的替代方案

  • 按文件分片。 不均衡:一个大文件就会决定总耗时。
  • 报告每个解析诊断。 在编辑语料时有用,但本运行器面向固定版本的语料;前端 API 会为需要的工具返回所有诊断。

边界

  • 不负责语料下载或阶段规划(由 Python 工具负责)。
  • 不递归进入子目录。
  • 仅通过 decimal_gda 支持 GDA .decTest 语义;IEEE 十进制测试向量使用另一个运行器。