Mol (Math Object Library) for .Net の特徴

Mol (Math Object Library) for .Net Microsoft .NET Framework に特化した数値計算用の汎用クラスライブラリーです。

等、様々な計算をオブジェクトとしてカプセル化、 C# 等のプログラミング言語から簡単・自由に利用(リファレンス例題)できます。
大規模計算(行列・連立方程式・固有値・FFT等々)では、ネイティブな インテル® MKL を直接利用することで圧倒的パフォーマンスを実現しています。 その際、特有で複雑なデータ構造等を隠蔽共通なユーザーインターフェースを提供しています。

※連立常微分方程式の解法はDsl(Digital Simulation Library)for .Net で提供されます 。

[サポートされる行列]

行列は計算速度とメモリーサイズを考慮して複雑で様々な内部データ構造を持っています。 当然、そのままでは簡単にアクセスすることはできません。 Mol は、 .Net のインデクサ機能を活用して、どの行列でも A[i,j] と書けば行列 A の [i,j] 要素にアクセスできます。 そして、データ構造を意識せずに四則演算が可能です(例:行列 A とベクトル x がどんなタイプであれ y = A*x; と書くだけです)。

行列タイプ説明doubleComplex
一般行列 最も基本的な行列で、2次元の配列と考えて差し支えありません。 以下の全ての行列タイプの要素を格納できます。
対称行列 A[i,j]==A[j,i] という性質をもつ行列です。 対称ですので対角要素を含む上三角部分のみを保存します。
エルミート行列 複素数(Complex)専用の行列で A[i,j]==A[j,i]*という性質を持ちます。 対称行列と同様に対角要素を含む上三角部分のみを保存します。 A[j,i]*は A[j,i] の複素共役を意味します。
帯行列 対角要素周辺にのみ非ゼロ要素が存在する行列です。対角要素から一定の距離(上、下)以上の要素はゼロなので格納しません。
上三角行列 対角要素を含む上三角部分にのみ非ゼロ要素が存在する行列です。対角要素を含まない下三角部分の要素はゼロなので格納しません。
下三角行列 対角要素を含む下三角部分にのみ非ゼロ要素が存在する行列です。対角要素を含まない上三角部分の要素はゼロなので格納しません。
✓参照:Let's 'C# で数値計算'

  • 「密」な行列は宣言時に全てのメモリー領域が確保され、要素は決められた場所に格納されます。
  • 「疎」な行列は代入操作が実行された時点で要素の領域が都度確保されます。
  • 「疎」な行列要素のアクセスは遅くなりますが、メモリー効率が良くなるため、問題によっては計算時間を大幅に縮小することができます。
  • ベクトルにも「密」と「疎」の構造はサポートされています。

 プログラミング概説

行列は [行列のタイプ数] * [double か Complex] * [密か疎] 通りの組み合わせがあります。
以下の例では同じ答えを得るのに3種類の行列(行列要素は3重対角)を使用して、連立方程式 A*x = b を解いています。

※実質的な違いは行列宣言部分だけで他は同じことに注目してください。
The Matrix Market にある巨大データ等の計算例は 行列データとベンチマーク (Let's 'C# で数値計算') を参照してください。

[5000元の線形連立方程式解法例]

    int n = 5000;                                     // 行列のサイズ
    VectorDenseDouble b = new VectorDenseDouble(n);   // 定数ベクトル
    for (int i = 1; i <= n; ++i) b[i] = 1.0;          // 値は全て 1.0 

    // 密な一般行列で A*x = b を解く
    using (MatrixDenseGeneralDouble A = new MatrixDenseGeneralDouble(n, n))
    {
        for (int i = 1; i <= n; ++i)
        {
            A[i, i] = 2;
            if (i > 1) A[i - 1, i] = -1;
            if (i < n) A[i, i + 1] = -1;
        }
        DateTime time = DateTime.Now;
        LuSolver lu = LuSolver.Create(A);   // 行列 A を因子分解する。
        VectorDenseDouble x = lu.Solve(b);  // 因子分解の結果を用いて A*x = b を解く
        Console.WriteLine("MatrixDenseGeneralDouble : " + (DateTime.Now - time));
        Debug.Assert(_Mol.EQ(A * x, b));    // (A * x)==b を確認
        lu.Dispose(); // lu は A と同サイズの因子分解結果行列を保持するので、積極的に破棄する。
    }

    // 疎な一般行列で A*x = b を解く
    using (MatrixSparseGeneralDouble A = new MatrixSparseGeneralDouble(n,n))
    {
       for (int i = 1; i <= n; ++i)
       {
           A[i, i] = 2;
           if (i > 1) A[i - 1, i] = -1;
           if (i < n) A[i, i + 1] = -1;
       }
       DateTime time = DateTime.Now;
       LuSolver lu = LuSolver.Create(A);
       VectorDenseDouble x = lu.Solve(b);
       Console.WriteLine("MatrixSparseGeneralDouble: " + (DateTime.Now - time));
       Debug.Assert(_Mol.EQ(A * x, b));
       lu.Dispose();
    }

    // 帯行列(3重対角行列)で A*x = b を解く
    using (MatrixDenseBandDouble A = new MatrixDenseBandDouble(n, n, 1, 1))
    {
       for (int i = 1; i <= n; ++i)
       {  // 対角要素(を含む)の上下1要素(3重対角要素)以外に値を設定しようとするとエラー。
          // 3重対角要素以外の要素を参照すると、値ゼロが返ります。
          A[i, i] = 2;
          if (i > 1) A[i - 1, i] = -1;
          if (i < n) A[i, i + 1] = -1;
       }
       DateTime time = DateTime.Now;
       LuSolver lu = LuSolver.Create(A);
       VectorDenseDouble x = lu.Solve(b);
       Console.WriteLine("MatrixDenseBandDouble    : " + (DateTime.Now - time));
       Debug.Assert(_Mol.EQ(A * x, b));
       lu.Dispose();
    }
結果は以下のようになります(Intel CORE i7-2600S 2.8GHz 8GBメモリ)。

   MatrixDenseGeneralDouble : 00:00:01.5350878
   MatrixSparseGeneralDouble: 00:00:00.1160067
   MatrixDenseBandDouble    : 00:00:00.0020001
行列の構造によって計算時間が極端に異なってきます。
詳細はリファレンスプログラム例(C#)と解説はこちらを参照してください。
上記例では行列やベクトルの添え字(インデックス)は 1 から開始しています(デフォルト)。これは Mkl のベースが FORTRAN で記述されていることによります。 多くの数値計算関係の文献も 1 から開始するインデックスを採用しています。しかし、 _Array.IndexBase プロパティを設定することで C や C# と同じに 0 をインデックスの最初に指定することができます。


 バイナリーモジュール

 以下のバイナリーモジュールが圧縮されています。
  1. Mol モジュール
    Mol モジュール説明 
    Mol.Net.Dll 各種数値計算用クラスライブラリー
    Mol.C++D32.Dll (32ビットOS用)
    Mol.C++D64.Dll (64ビットOS用)
    ソルバーモジュール、実際の計算を実行します。
    連立方程式解法などの場合は、インテル® MKLを直接呼び出します。
    • 上記 ソルバーモジュール を使用する場合は、別途 インテル® MKL をダウンロードする必要があります。
    • インテル® MKLをダウンロードする前に試したい場合は、以下の ソルバーモジュール(MklスタティックリンクDLL版) をご使用ください。 ※スタティックリンク版は インテル® MKL の制限により計算速度が劣る場合があります。また、最新 MKL に追随していません。

    ※動作する環境に応じて一つが Mol.C++.Dll としてコピーされます(コピーされない場合、手動でコピーしてください)。

  2. Dsl モジュール(Mol モジュールが利用することはありません。)
    Dsl 本体モジュール 説明 
    Dsl.dllグラフ処理エンジン、各種Dslオブジェクトの管理や計算順序の決定と計算の実行
    DslSerializer.dllアプリケーション内容をファイル等に書き込んだり、逆に読み込むためのモジュール
    DslDialog.dll計算結果情報や折れ線グラフを表示・印刷するツールモジュール

  3. 例題実行モジュール
    例題 説明 
    MolExamples32.ExeMol の例題実行モジュール(32ビット)
    DslExamples32.Exe、DslExamples64.ExeDsl の例題実行モジュール(32/64ビット)

Dsl/Mol を利用する環境やインストール等はこちらを参照してください。

※Dll は全てアプリケーション(*.Exe)と同じ場所に置いてください。「Program Files」等のシステムフォルダは避けてください。
※上記DLLをダウンロードすれば、直ちに「評価版」として利用できます。
※評価版に変数の数や連立方程式のサイズ等の制限はありません。


 ドキュメント

 以下のドキュメント類が圧縮されています。

ヘルプファイル説明 
Mol.chm Microsoft Compiled HTML Help形式。Windows 98時代から使用されています。Viewer は Windows に付属しています。
Mol.mshc/Mol.msha Microsoft Help 3 や Microsoft Help Viewer 1.x とも呼ばれている最新形式です。  Mol.mshcはヘルプ内容の複数ファイルを標準の zip 形式に圧縮した形式です。  内容自体は任意の Web ブラウザで表示することができます。

※関係するドキュメントは全て「ヘルプファイル」の形式で提供されます。
※MSHC 形式のヘルプは Visual Studio のヘルプコンテンツに登録できます。

 方法は

  • 同梱の Install_Mol.bat を実行する(HelpLibraryManagerLauncher.exe が登録処理を代行してくれます。逆は Remove_Mol.bat を実行します。)。
  • Visual Studio 2010 のメニューで [ヘルプ]-[ヘルプ設定の管理]から「ディスクからコンテンツをインストール」を選択して登録します。 事前に Mol.msha を HelpContentSetup.msha という名前のファイルにコピーしてから、HelpContentSetup.msha を「Manifest file」に指定してください。

 C# による例題集

 C# による簡単なソースプログラムとソリューションファイルです(解説)。
  • ダウンロードしたらフォルダ付きで解凍してください。
  • Dll 等のバイナリーファイルは別途ダウンロードしてから Program.cs と同じ場所に全てコピーしてください。
  • Dll は Visual Studio が実行環境(Debug/Release等)にコピーするように設定してありますので確認してください。
  • 解説と実行結果(抜粋)はこちらを参照してください。
※例題は今後追加変更される可能性があります。
※各例題の内容はソースプログラムとコメント等を参照してください。


 ライセンス設定

Mol はクラスライブラリーです。利用者は開発ソフトウェア(EXEやDLL)から Mol の機能を利用できます。
Mol の正式利用にはライセンスを購入(購入方法)し、正しく設定する必要があります。

ライセンスはシリアル番号とライセンスキーからなります。
ライセンスの設定例はメールで通知されますのでそのままの形で設定してください。
設定はプログラムの開始時、Mol または Dsl を使用する前に以下のように設定してください。


      // ライセンスのセット(以下の1行)例
      _Mol.SetLicense("小林 茂雄(xxxx@zzzzzzzz.jp)", "Sxxxxxxxxx877700001", "Syyyyyyyy978053B26B4C704");
  • ライセンスが設定されてない、または誤ったライセンスを設定した場合は評価版とみなされます。
  • 評価版は「評価版」である旨のメッセージが表示されます。
  • 評価版に解く問題のサイズ等の制限はありません。
※重要※
ライセンス購入前に、必ずソフトウェア使用許諾契約書をお読みください。
ライセンスキーは代金入金確認後直ちに電子メール等でお知らせします。お客様は代金振り込みをもって「ソフトウェア使用許諾契約書」に同意したものとみなします。