架构

本指南展示 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)
包依赖于类别
dualluna-generic, arithmetic实现
forwarddual, luna-generic实现
coredual, luna-generic门面包
elementarydual, arithmetic门面包
checkeddual, arithmetic门面包
autodiffdual, forward, luna-generic, arithmetic门面包
linalgdual, luna-generic, linear-algebra/immut桥接
polydual, luna-generic, luna-poly/immut/{dense,sparse}桥接
examplesdual, 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 设计。

在哪里添加新内容

  • 新的求导规则放在 src/dual/dual.mbt 中,同时在 dual API 中写明规则,并在 src/tests 中添加回归测试。
  • Dual[T] 上新的 trait 实例需要在 dual 设计 中推导其定律。
  • 连接其他 Luna Flow 库的新桥接,是与 linalg 和 poly 并列的一个新包。
  • 面向 MoonBit 0.10 的方法提升位于 src/dual/extends.mbt。