アーキテクチャ
このガイドでは、linear-algebra のパッケージ同士がどのように依存し合うか、どの層がどの判断を受け持つか、そしてテストとドキュメントがどのようにつながっているかを示します。各パッケージの内部については、それぞれの設計ページで説明しています。
依存グラフ
次の表は、各パッケージがインポートするものを示します(テスト専用のインポートは省略)。接頭辞のない luna-generic と arithmetic は、上流モジュール Luna-Flow/luna-generic と Luna-Flow/arithmetic です。
| パッケージ | インポート |
|---|---|
algebra | なし |
arithmetic | 上流の arithmetic、luna-generic |
error | 上流の arithmetic |
internal | error |
immut | error、internal、luna-generic、core の immut/vector |
mutable | error、internal、luna-generic、上流の arithmetic |
backends/default | algebra, immut, mutable, luna-generic |
container | error |
container/adapters | container, error, immut, mutable, backends/default |
consistency | immut、mutable(テストのみ) |
perf_support | mutable, luna-generic, moonbitlang/x/fs |
perf | perf_support |
perf_runner | perf_support, moonbitlang/x/fs |
ここから 3 つの規則が導かれます。
- 具体的なパッケージは実験的な層に依存しません。
immutとmutableがインポートするのはerror、internal、上流のスカラーパッケージだけです。algebraやcontainerを知らないため、それらの層を変更しても具体的な API が壊れることはありません。 - ブリッジは末端です。
backends/defaultはalgebraと具体的な型を、container/adaptersはcontainerと具体的な型をつなぎます。これらのブリッジをインポートするパッケージは他にありません。 - 能力は実装より下で定義されます。
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 を使っています。