あなたはすべての点で正しいです。現在、ILNumerics で利用できる最適化パッケージはありません。ただし、ご存知のように、.NET の大きな利点の 1 つは、外部パッケージを簡単に組み込むことができることです。ここにはいくつかのオプションがあります。
PInvoke (ネイティブ モジュール)
ほとんどの既存の最適化パッケージはネイティブ モジュールとして存在するため、PInvoke はあなたの味方です。自動 DLLImport 署名生成用のツールがいくつかあります。個人的には、これらの署名を手動で作成することを好みます。特に、ほとんどの科学パッケージは単純な署名を公開しているため、.NET に非常に簡単に組み込むことができます。ただし、ネイティブ コードからマネージ コードへのコールバックや、複雑な構造体のマーシャリングでは問題が発生する可能性があります。(だから、私たちはあなたがそれらすべてを解決するのを手伝います...
.NET モジュール
既存の .NET 最適化モジュールが見つかる場合があります。この投稿 ( C# の無料最適化ライブラリ) を参照するか、Microsoft Solver Foundation を試してください。より良いモジュールが既に存在する可能性があります - 私はしばらく探していませんでした。実装が非常に慎重に行われない限り、メモリ管理が不十分な (なし) ためにパフォーマンスが低下する場合と、影響を受けない場合があります。(私の知る限り、ILNumerics ほど効率的にメモリを追跡するプロジェクトは他にありませんか?)。ただし、これらのライブラリとのインターフェイスは簡単です。DLLImport 署名は必要ありません。しかし、ILNumerics メモリ管理から利益を得るには、「ILNumerics」側で配列メモリを管理する必要があります。したがって、System.Array を他の .NET 関数に渡すパターンは次のようになります。
.... inside ILNumerics function
using (ILScope.Enter(inparameter1,inparameter2)) {
....
ILArray<double> A = zeros(1000,1000); // allocate memory for external use
var aArray = A.GetArrayForWrite(); // fetch reference to underlying System.Array
callOtherLib(aArray); // let other lib use and fill the array
// proceed normally with A...
return A + 1 * 2 ... ;
}
他のライブラリが指定された配列のみから読み取っている場合、A.GetArrayForRead() を使用するとパフォーマンスが向上する可能性があります。そのスキームを使用することで、少なくとも実装の ILNumerics 側で、最も効率的なメモリ使用が保証されます。
両側のデータ構造を混在させても害はありませんが、通常はあまり利点もありません。混合行列の実装には結合演算子がないため、便利な構文が失われることがよくあります。また、パフォーマンスの低いソリューションにつながる可能性のある要素ごとの操作への行列アクセスを分解することを余儀なくされることがよくあります。したがって、API を明確に分離したモジュール設計をお勧めします。
上記のメモリ スキームは、ネイティブ ライブラリとのインターフェイスにも適用できます (推奨されます)。
ILNumerics のみを使用する
もちろん、もう 1 つの方法は、ILNumerics の組み込み関数と配列機能を使用して、一部のモジュールを独自に再実装することです。パッケージが公式の ILNumerics ディストリビューションに組み込まれるためには、この方法が必須です。これにはいくつかの利点があります。便利な ILNumerics 構文を利用でき、効率的な ILNumerics メモリ管理から自動的に利益を得ることができ、最終的にコードは完全にプラットフォームに依存しなくなります。また、これにより、アルゴリズムに必要な機能に関して最も柔軟になります。