consistency 设计
设计目标
luna-poly 承诺其两层及各种表示描述的是同一套数学。consistency 把这一承诺变成随 moon test 运行的测试,放在一个同时依赖两个门面包的包中,这样两层各自的测试都无需了解对方。
数学背景
每种表示 (dense、term、sparse、context;不可变或可变)都带有一个到多项式环的解释 。一致性是指每个操作都与解释可交换:
并且表示之间的转换保持解释不变。测试在具体输入上检查这些等式的实例。
设计决策
独立的白盒包
这些检查同时需要 immut 和 mutable,而 mutable 已经依赖 immut;把它们放在任何一层都会反转或缠绕依赖关系。一个带白盒测试(core_wbtest.mbt)的专用包仅在测试中导入 Luna-Flow/arithmetic、immut 和 mutable,对公开 API 没有任何贡献。
检查内容
- 稠密多项式的层间一致性:系数、乘积、复合和求值在
immut与mutable中相等。 - 自然数幂:
PowNatChecked::pow_nat_checked(p, 0, ctx)在两层中都是一,且pow(5)结果一致。 - 隔离性:在
to_immut之后修改可变多项式不会改变快照。 - 多变量一致性:项存储与稀疏存储,无论不可变还是可变,求值结果相同,并产生相同的幂。
- 能力接口:以
UnivariatePolynomial、MultivariatePolynomial、Zero、One为约束的函数以及ops()记录在两个门面包中都能工作;形状报告预期的元数、项数和相容性。 - 带检查的契约:
*_checked方法在负下标和过短的求值点上返回None,而不是中止(abort)。 - 可变上下文的委托:部分求值及其失败情形与不可变行为一致。
单一表示的代数定律(规范化的幂等性、加法单位元、Karatsuba 与教科书乘法的对照、最小系数界)位于 immut/laws_wbtest.mbt,紧挨着它们所检查的代码。
正确性 / 不变量
该包没有运行时代码。它的不变量是 moon test 通过:上面的每个等式在所测试的输入上都成立。
被否决的替代方案
- 把测试放在
mutable内部会让可变层的测试悄悄依赖不可变层的内部实现,而且无法复用于其他层。 - 对所有表示两两组合做穷举性质测试会成倍增加测试时间;本包只检查有代表性的操作,性质测试仍留在各个定律中。
边界
- 测试是有限的样本,而不是证明。
- 没有公开 API;这里没有任何内容是供导入的。