架构
本指南展示 autodiff 的各个包之间以及它们与 Luna Flow 其余部分之间的依赖关系,以及哪些不变量使各层保持分离。
分层
Dual[T] 只在 dual 中定义一次,这样它的方法和 trait 实例都与类型放在一起。其他所有包要么重新导出它,要么使用它:
luna-generic arithmetic
\ /
+-- dual --+
|
+-- forward -- autodiff (root facade, also re-exports dual)
+-- core
+-- elementary
+-- checked
+-- linalg (+ linear-algebra/immut)
+-- poly (+ luna-poly/immut/dense, sparse)
| 包 | 依赖于 | 类别 |
|---|---|---|
dual | luna-generic, arithmetic | 实现 |
forward | dual, luna-generic | 实现 |
core | dual, luna-generic | 门面包 |
elementary | dual, arithmetic | 门面包 |
checked | dual, arithmetic | 门面包 |
autodiff | dual, forward, luna-generic, arithmetic | 门面包 |
linalg | dual, luna-generic, linear-algebra/immut | 桥接 |
poly | dual, luna-generic, luna-poly/immut/{dense,sparse} | 桥接 |
examples | dual, linalg, poly, linear-algebra, luna-poly | 示例 |
tests | 以上全部(仅测试导入) | 测试 |
不变量
- 在轻量包中,只有
dual和forward包含行为;门面包只包含pub using语句。 - 任何轻量包(
dual、forward、core、elementary、checked以及根包)都不导入linear-algebra、luna-poly、floating或type_theory。只需要标量导数的用户不会引入容器库。 - 桥接包依赖于轻量包,反之则绝不成立。
- trait 名称只重新导出、从不重新定义,因此实例在整个生态中共享。
Dual[T]只实现环层面的结构 trait;见 dual 设计。