アーキテクチャ

このガイドでは、linear-algebra のパッケージ同士がどのように依存し合うか、どの層がどの判断を受け持つか、そしてテストとドキュメントがどのようにつながっているかを示します。各パッケージの内部については、それぞれの設計ページで説明しています。

依存グラフ

次の表は、各パッケージがインポートするものを示します(テスト専用のインポートは省略)。接頭辞のない luna-generic と arithmetic は、上流モジュール Luna-Flow/luna-generic と Luna-Flow/arithmetic です。

パッケージインポート
algebraなし
arithmetic上流の arithmetic、luna-generic
error上流の arithmetic
internalerror
immuterror、internal、luna-generic、core の immut/vector
mutableerror、internal、luna-generic、上流の arithmetic
backends/defaultalgebra, immut, mutable, luna-generic
containererror
container/adapterscontainer, error, immut, mutable, backends/default
consistencyimmut、mutable(テストのみ)
perf_supportmutable, luna-generic, moonbitlang/x/fs
perfperf_support
perf_runnerperf_support, moonbitlang/x/fs

ここから 3 つの規則が導かれます。

  1. 具体的なパッケージは実験的な層に依存しません。 immut と mutable がインポートするのは error、internal、上流のスカラーパッケージだけです。algebra や container を知らないため、それらの層を変更しても具体的な API が壊れることはありません。
  2. ブリッジは末端です。 backends/default は algebra と具体的な型を、container/adapters は container と具体的な型をつなぎます。これらのブリッジをインポートするパッケージは他にありません。
  3. 能力は実装より下で定義されます。 algebra と container は具体的な型を一切インポートせずに trait とレコードを定義するため、外部ライブラリは immut や mutable に依存せずにそれらを実装できます。

層

層パッケージ担うもの
スカラー演算arithmeticスカラー演算の名前。法則は含まない
エラーerror検査付き API の失敗を表す語彙
具体的なストレージimmut, mutable, internal表現、アルゴリズム、範囲外の扱い
構造algebra型がサポートするオブジェクト全体の操作と、その法則
ブリッジbackends/default, container/adapters具体的な型が能力を満たすことの根拠
相互変換container要素単位の読み取り・構築・編集、汎用的な変換
ツールconsistency, perf, perf_runner, perf_supportテストとベンチマーク

バックエンドの選択は型の選択です。密な可変バックエンドを使いたいプログラムは @default.DenseMatrix または @mutable.Matrix を使います。行列型の内部に実行時のセレクタはありません。

ターゲット

mutable は、行列・LU・ビュー・転置のコードについてターゲットごとに 1 つのソースファイル(*_native.mbt、*_js.mbt、*_wasm.mbt、*_wasm_gc.mbt)を持ち、moon.pkg の options(targets: ...) で選択します。これらのファイルは同じ仕様を異なるループ構造で実装しています。テストゲートは mutable、container、backends/default、およびドキュメントのパッケージを 4 つのターゲットすべてで実行します。

ドキュメントとテスト

  • このマニュアルの各ページは、.mbt.md ファイルとして src/doc_en_us からリンクされています。moonbit check で囲まれたコードブロックは、そのパッケージのテストとしてコンパイル・実行されます。moonbit nocheck で囲まれたブロックは説明用です。
  • 翻訳は doc/locale にある gettext カタログで、lunadoc を使って英語のページから生成されます。
  • run_test.sh は既定のゲートを実行します。対象は immut、consistency、そしてすべてのターゲット上の container、container/adapters、backends/default、mutable、doc_en_us です。LINEAR_ALGEBRA_TEST_BENCH=1 を指定するとベンチマークパッケージも加わります。
  • CORRECTNESS_CHECKLIST.md には、数値ルーチンの監査状況が記録されています。

モジュールの外

contrib/openblas_backend には、取り下げられたネイティブ OpenBLAS バックエンドが、独自のドキュメントと再有効化の手順とともに保存されています。これはモジュールのパッケージではなく、ビルドもされず、このマニュアルの対象でもありません。

下流のライブラリはこれらの層の上に構築されます。たとえば geometry3d は linear-algebra を使っています。