アーキテクチャ

このガイドでは、luna-poly のパッケージがどのように組み合わさっているかを説明します。層、依存グラフ、各不変条件がどこで保証されるか、そしてイミュータブル層とミュータブル層がアルゴリズムをどのように共有しているかです。

層

luna-poly には 3 つの層があります:

  1. 語彙: core は単項式 (ExponentVector)、名前付き変数 (Variable、VariableContext)、形状、能力トレイト、演算レコードを定義します。多項式は格納しません。
  2. 表現: 4 つのイミュータブルなパッケージ (immut/dense、immut/term、immut/sparse、immut/context) と、それに対応する 4 つのミュータブルなパッケージが、多項式の格納とアルゴリズムを実装します。
  3. ファサード: 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 はすべての層を一度に示します:

  1. 各 type_theory の Name が VariableContext::variable_by_type_theory_name によって Variable に解決されます (core)。
  2. 代入リストが immut/context で検証されます(所属、重複、コンテキストの等価性)。
  3. 各項が、項または疎の算術と internal.pow_nat を使って、置き換え先の累乗の積として書き直されます。
  4. 部分的な結果が疎な表現によって加算され、正規化されます。

ミュータブル版はペイロードをイミュータブルなものに変換し、同じ手順を実行して、結果をラップします。

テスト

  • 各実装の隣にあるインラインの test ブロックは、表現固有の振る舞いを検査します。これには core における type_theory の名前検索や、両方のコンテキストパッケージにおける名前付き代入のテストが含まれます。
  • src/immut/laws_wbtest.mbt は moonbitlang/quickcheck を使って代数法則を検査します。
  • src/consistency/core_wbtest.mbt は層と表現の間の一致を検査します。

すべてを moon test で実行します。PR 前の一連の手順は コントリビューションガイド を参照してください。