core の設計

このページでは、core ファサードが存在する理由と、それが Dual[T] の環レベルの語彙をちょうど含む理由を説明します。

設計目標

双対数の代数だけを必要とするコードに対して、最小のインポートを提供します。すなわち環演算、単位元、整数定数であり、arithmetic の解析的トレイトやエラー型は含みません。

数学的背景

微分可能なプログラムの多くは多項式的です。すなわち ++、−-、×\times と整数定数だけを使います。そのようなプログラムについては、dual の設計 の恒等式

p(a+bε)=p(a)+p′(a) b εp(a + b\varepsilon) = p(a) + p'(a)\,b\,\varepsilon

がすべての可換環で成り立つので、そうしたコードに必要なのはトレイト Zero、One、AddMonoid、AddGroup、MulMonoid、Semiring、Ring と標準的な写像 Z→T\mathbb Z \to T(IntegralHomomorphism)だけです。ファサードはまさにこれらを再エクスポートし、次の階層を反映しています。

AddMonoid⊂AddGroup,AddMonoid+MulMonoid⊂Semiring⊂Ring\texttt{AddMonoid} \subset \texttt{AddGroup},\quad \texttt{AddMonoid} + \texttt{MulMonoid} \subset \texttt{Semiring} \subset \texttt{Ring}

その T[ε]T[\varepsilon] 上のインスタンスは dual の設計 で導出しています。

設計上の判断

代数のための独立したファサード

問題。 ルートパッケージは解析的トレイトやチェック付きのエラー型も再エクスポートしますが、これらはエコシステムの別のレイヤーに属します。

選択。 core は Dual と luna-generic の構造トレイトだけを再エクスポートします。その moon.pkg は dual と luna-generic だけをインポートするので、インポートの一覧を読めばコードが純粋に代数的であることがわかります。

再定義せずに再エクスポートする

autodiff の設計 と同様に、名前は元のトレイトの pub using エイリアスなので、インスタンスは Luna Flow の他の部分と共有されます。

正しさと不変条件

  • core は項目を定義しません。そのインターフェースファイルには pub using の行だけが含まれます。
  • autodiff/dual と luna-generic に依存し、それ以外には依存しません。
  • 再エクスポートされる各トレイトは、T に対する対応する境界のもとで Dual[T] 上のインスタンスを持ちます。

却下した代替案

  • core をルートパッケージに統合する。 ルートパッケージは arithmetic も含んでいます。代数を分けておくことで、そのレイヤー構造が見えるままになります。
  • Field や Inverse を再エクスポートする。 Dual[T] はそれらを実装しないので、満たせない境界を招くだけです。

境界

  • 解析的トレイト、チェック付き演算、ドライバーは含みません。
  • Field、MulGroup、Inverse、NatHomomorphism は含みません。