架构

本指南说明 linear-algebra 的各个包如何相互依赖、哪一层负责哪类决策,以及测试和文档如何组织。各包自身的设计页面解释其内部实现。

依赖图

下表列出每个包导入的内容(省略仅用于测试的导入)。不带前缀的 luna-generic 和 arithmetic 指上游模块 Luna-Flow/luna-generic 与 Luna-Flow/arithmetic。

包导入
algebra无
arithmetic上游 arithmetic、luna-generic
error上游 arithmetic
internalerror
immuterror、internal、luna-generic、core immut/vector
mutableerror、internal、luna-generic、上游 arithmetic
backends/defaultalgebra, immut, mutable, luna-generic
containererror
container/adapterscontainer, error, immut, mutable, backends/default
consistencyimmut、mutable(仅测试)
perf_supportmutable, luna-generic, moonbitlang/x/fs
perfperf_support
perf_runnerperf_support, moonbitlang/x/fs

由此得出三条规则:

  1. 具体包不依赖实验层。 immut 和 mutable 只导入 error、internal 以及上游标量包。它们不知道 algebra 或 container 的存在,因此这些层的变化不会破坏具体 API。
  2. 桥接包是叶子。 backends/default 将 algebra 与具体类型连接起来,container/adapters 将 container 与具体类型连接起来。没有其他包导入这些桥接包。
  3. 能力定义在实现之下。 algebra 和 container 定义 trait 与记录,而不导入任何具体类型,因此外部库可以在不依赖 immut 或 mutable 的情况下实现它们。

层次

层包负责
标量运算arithmetic标量运算的名称;不含定律
错误error受检 API 的失败词汇
具体存储immut, mutable, internal表示、算法、边界行为
结构algebra类型支持哪些整体运算,及其定律
桥接backends/default, container/adapters证明具体类型满足这些能力
互操作container元素级读取、构造与编辑,泛型转换
工具consistency, perf, perf_runner, perf_support测试与基准测试

选择后端就是选择类型:想用稠密可变后端的程序使用 @default.DenseMatrix 或 @mutable.Matrix;矩阵类型内部没有运行时选择器。

目标平台

mutable 为矩阵、LU、视图和转置代码在每个目标上各保留一个源文件(*_native.mbt、*_js.mbt、*_wasm.mbt、*_wasm_gc.mbt),由其 moon.pkg 中的 options(targets: ...) 选择。这些文件以不同的循环结构实现同一规范;测试关卡会在全部四个目标上运行 mutable、container、backends/default 以及文档包。

文档与测试

  • 本手册的每个页面都以 .mbt.md 文件的形式链接到 src/doc_en_us 中。以 moonbit check 围起的代码块会作为该包的测试编译并运行;以 moonbit nocheck 围起的代码块仅作示意。
  • 译文是 doc/locale 中的 gettext 目录,用 lunadoc 从英文页面生成。
  • run_test.sh 运行默认关卡:immut、consistency,并在每个目标上运行 container、container/adapters、backends/default、mutable 和 doc_en_us。设置 LINEAR_ALGEBRA_TEST_BENCH=1 会加入基准测试包。
  • CORRECTNESS_CHECKLIST.md 记录数值例程的审计状态。

模块之外

contrib/openblas_backend 保留了已撤下的原生 OpenBLAS 后端,附带其自身的文档和重新启用步骤。它不是本模块的包,不参与构建,也不属于本手册。

下游库构建在这些层之上;例如 geometry3d 使用了 linear-algebra。