アーキテクチャ
このガイドでは、luna-poly のパッケージがどのように組み合わさっているかを説明します。層、依存グラフ、各不変条件がどこで保証されるか、そしてイミュータブル層とミュータブル層がアルゴリズムをどのように共有しているかです。
層
luna-poly には 3 つの層があります:
- 語彙:
coreは単項式 (ExponentVector)、名前付き変数 (Variable、VariableContext)、形状、能力トレイト、演算レコードを定義します。多項式は格納しません。 - 表現: 4 つのイミュータブルなパッケージ (
immut/dense、immut/term、immut/sparse、immut/context) と、それに対応する 4 つのミュータブルなパッケージが、多項式の格納とアルゴリズムを実装します。 - ファサード:
immutとmutableは、語彙、luna-genericの代数トレイト、およびそれぞれの層の表現を再エクスポートします。
internal はモジュール内部専用のヘルパーを持ち、consistency はテストだけを持ちます。
依存グラフ
luna-generic arithmetic type_theory/core
\ | /
\ | /
core <--+----------+
/ | \
internal / | \
| / | \
immut/dense immut/term immut/sparse
| \ /
| immut/context
| |
mutable/dense mutable/term mutable/sparse
\ \ /
\ mutable/context
\ |
immut (facade) mutable (facade)
\ /
consistency (tests only)
言葉で述べると、次のとおりです。すべての表現は core に依存します。イミュータブルな表現と、ミュータブルな項・疎のパッケージは累乗のために internal を使います。immut/context は immut/term と immut/sparse の上に構築されています。各ミュータブルなパッケージは対応するイミュータブルなパッケージに依存します。mutable/context はさらに変換のためにミュータブルな項・疎のパッケージを使います。各ファサードは自分の層のパッケージに依存します。consistency はテストでのみ両方のファサードに依存します。arithmetic は PowNatChecked のために、type_theory/core は Name のために必要です。
不変条件の所在
| 不変条件 | 保証する場所 |
|---|---|
| 指数ベクトルは末尾にゼロを持たない。次数はキャッシュされる | core (ExponentVector::from_array, with_exponent, *) |
| 単項式順序は次数付き単項式順序である | core (ExponentVector::compare) |
| コンテキストの名前は互いに異なる。インデックス = 位置 | core (VariableContext::extend_checked) |
| 密な係数は末尾にゼロを持たない | immut/dense、mutable/dense(すべてのコンストラクタと変更操作) |
| 項の配列は狭義降順で、マージ済みで、ゼロを含まない | immut/term(from_terms による正規化)、mutable/term で再利用 |
| 疎なマップはゼロの値を保持しない | immut/sparse、mutable/sparse(すべての挿入) |
| コンテキスト演算は変数、重複、コンテキストを検証する | immut/context、mutable/context で再利用 |
層間のコード共有
ミュータブル層はその場での更新を自身の格納形式上で直接実装し、自明でないアルゴリズムはすべて to_immut / from_immut を通じてイミュータブル層に委譲します。mutable/context はイミュータブルなコンテキスト多項式を包むミュータブルなセルです。これにより、Karatsuba 法、合成、導関数、多変数の積、およびすべてのコンテキスト処理の実装は 1 つに保たれ、consistency のテストが両者の一致を検査します。
代入のデータフロー
ContextPolynomial::substitute_names はすべての層を一度に示します:
- 各
type_theoryのNameがVariableContext::variable_by_type_theory_nameによってVariableに解決されます (core)。 - 代入リストが
immut/contextで検証されます(所属、重複、コンテキストの等価性)。 - 各項が、項または疎の算術と
internal.pow_natを使って、置き換え先の累乗の積として書き直されます。 - 部分的な結果が疎な表現によって加算され、正規化されます。
ミュータブル版はペイロードをイミュータブルなものに変換し、同じ手順を実行して、結果をラップします。
テスト
- 各実装の隣にあるインラインの
testブロックは、表現固有の振る舞いを検査します。これにはcoreにおけるtype_theoryの名前検索や、両方のコンテキストパッケージにおける名前付き代入のテストが含まれます。 src/immut/laws_wbtest.mbtはmoonbitlang/quickcheckを使って代数法則を検査します。src/consistency/core_wbtest.mbtは層と表現の間の一致を検査します。
すべてを moon test で実行します。PR 前の一連の手順は コントリビューションガイド を参照してください。