core の設計
このページでは、core ファサードが存在する理由と、それが Dual[T] の環レベルの語彙をちょうど含む理由を説明します。
設計目標
双対数の代数だけを必要とするコードに対して、最小のインポートを提供します。すなわち環演算、単位元、整数定数であり、arithmetic の解析的トレイトやエラー型は含みません。
数学的背景
微分可能なプログラムの多くは多項式的です。すなわち 、、 と整数定数だけを使います。そのようなプログラムについては、dual の設計 の恒等式
がすべての可換環で成り立つので、そうしたコードに必要なのはトレイト Zero、One、AddMonoid、AddGroup、MulMonoid、Semiring、Ring と標準的な写像 (IntegralHomomorphism)だけです。ファサードはまさにこれらを再エクスポートし、次の階層を反映しています。
その 上のインスタンスは 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は含みません。