アーキテクチャ

このガイドでは、autodiff のパッケージが互いに、また Luna Flow の他の部分にどのように依存しているか、そしてどの不変条件がレイヤーを分離しているかを示します。

レイヤー

Dual[T] は dual で一度だけ定義されるので、そのメソッドとトレイトインスタンスは型とともに置かれます。それ以外はすべて、これを再エクスポートするか利用します:

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 をインポートしません。スカラーの導関数だけが必要なユーザーがコンテナを取り込むことはありません。
  • ブリッジは軽量パッケージに依存し、その逆はありません。
  • トレイト名は再エクスポートされるだけで再定義されないため、インスタンスはエコシステム全体で共有されます。
  • Dual[T] は環レベルの構造トレイトのみを実装します。dual の設計 を参照してください。

追加する場所

  • 新しい微分規則は src/dual/dual.mbt に追加し、規則を dual API に記載し、回帰テストを src/tests に追加します。
  • Dual[T] に新しいトレイトインスタンスを追加する場合は、その法則の導出を dual の設計 に記載する必要があります。
  • 他の Luna Flow ライブラリへの新しいブリッジは、linalg や poly と並ぶ新しいパッケージとして追加します。
  • MoonBit 0.10 向けのメソッド昇格は src/dual/extends.mbt に置かれています。