正确性

oCAS 包含自动化正确性交叉验证框架,将结果与三个参考系统进行对比:SymPy、SageMath 和 Symbolica。 本章介绍该框架、如何运行及其当前已知限制。


框架概述

正确性套件位于 ocas-tests/tests/correctness/,包含 201 项 #[test] 测试,覆盖 19 个数学模块(截至 0.24.0;其中 35 项标记 #[ignore] 记录已知差距)。每项测试:

  1. 生成输入(表达式、多项式、方程组等)
  2. 使用 oCAS 计算结果
  3. 使用参考系统计算等价结果
  4. 断言两者语义相等

模块覆盖 oCAS 的全部功能:

模块测试数覆盖
calculus16微分、Taylor、积分(SymPy 对比)
evaluation6数值求值
finite_field5有限域运算
groebner24Gröbner 基计算
integral_risch15Risch 符号积分
integral_rules1规则表 100 例抽样(SymPy 对比)
integral_verify3数值错案护栏(独立 oracle;0.27.1 的 C14/D7b 与 √(p/q) 两类,以及 0.27.3 的精确平方折叠/特殊函数族/半幂仿射变元机制)
linear_solve5线性求解器
matrix5矩阵运算
normalize8表达式规范化
ntheory11数论(与 SymPy ntheory 交叉验证)
ode34ODE 求解
parse12表达式解析与输出(含一元负号/省略空格减法)
partial_fraction8部分分式分解
poly_arithmetic6稠密/稀疏多项式运算
poly_factor12无平方与完全因式分解
poly_factor_anf21代数数域因式分解
poly_gcd5多项式 GCD
resultant8结式
rewrite8重写与化简
root_isolation4实根隔离

正确性套件共 217 项测试(另有 ocas-calc、ocas-parse、ocas-atom、 ocas-poly 等 crate 的单元测试)。


忽略的测试(已知差距)

部分测试标记 #[ignore](当前 34 项),用于记录已知差距——它们预期失败, 仅在需要复现/推进时手动运行(cargo test -p ocas-tests --test correctness -- --ignored)。Wilkinson n=10 实根隔离差距已闭合:精确二进分数 Sturm 求值(0.27.x)找齐全部 10 个根。

自 0.27.2 起,积分正确性套件增加了一条独立判据:integral_verify 用 ocas-tests/src/integral_eval.rs 的数值 oracle(在确定性哑参数下的采样点上 做 5 点中心差分)复核积分结果,因此「形式像但实际错误」的原函数会使套件失败。 同一 oracle 也驱动 Rubi 1892 题覆盖率 harness 的 verified_solved / verify_mismatches 字段。


运行测试

# 运行全部正确性测试
cargo test -p ocas-tests --test correctness

# 运行特定模块(如 ODE 求解)
cargo test -p ocas-tests --test correctness ode

# 运行被忽略的测试(已知差距)
cargo test -p ocas-tests --test correctness -- --ignored

# 详细输出以检查失败
cargo test -p ocas-tests --test correctness -- --nocapture

测试无需外部依赖 —— 所有参考计算通过 uv 管理的 Python 子进程使用 SymPy,子进程自动自举。


对比工具

独立脚本提供针对 SageMath 和 Symbolica 的手动交叉检查,用于深入调查:

# SageMath(需本地安装 `sage`)
cd ocas-tests
sage scripts/bench_sage.py factor "x^30 - 1" 100

# Symbolica(需 Symbolica 源码检出)
cd ../symbolica
cargo run --release --example factorization

这些工具在开发期间用于验证自动化测试套件,并维护用于手动回归测试。


审计报告

ocas-tests/scripts/generate_audit_report.py 会运行全部测试(含 --ignored 部分)并生成审计报告:

cd ocas-tests
python scripts/generate_audit_report.py

报告写入 docs/planning/correctness/audit-<日期>.md,包含:

  • 普通测试与被忽略测试的通过/失败/忽略计数摘要
  • 失败测试列表
  • 与 Symbolica 的因式分解计时对比

已知限制

问题模块状态
sin(x)^2 + cos(x)^2 → 1 需要 egg featurerewrite启用 egg feature 后可化简
Bernoulli forcing y^n 使线性系数提取混淆ode已知限制(#[ignore])
积分器缺 tan/sec 表项ode计划中(#[ignore])

参见