私はシミュレーションを書いていますが、デザインに関するヒントが必要です。基本的な考え方は、与えられた確率過程のデータが生成され、後でさまざまな計算のために消費されるということです。たとえば、1回の反復の場合:
- プロセス1->ソース1のデータを生成します:x1
- プロセス2->ソース1のデータを生成します:x2
- 等々
後で、たとえばソース2の出力にいくつかの変換を適用したいので、結果はx2a、x2b、x2cになります。したがって、最終的には次のベクトルになります:[x1、x2a、x2b、x2c]。
N多変量確率過程(たとえば、複数の相関現象を表す)に関しては、問題があります。一度にN次元のサンプルを生成する必要があります。
- プロセス1->ソース1...Nのデータを生成します:x1 ... xN
シミュレーションコードを構造化し、パフォーマンスを損なうことなく柔軟性を提供できるシンプルなアーキテクチャについて考えています。
私はこれらの線に沿って何かを考えていました(擬似コード):
class random_process
{
// concrete processes would generate and store last data
virtual data_ptr operator()() const = 0;
};
class source_proxy
{
container_type<process> processes;
container_type<data_ptr> data; // pointers to the process data storage
data operator[](size_type number) const { return *(data[number]);}
void next() const {/* update the processes */}
};
どういうわけか私はこのデザインについて確信が持てません。たとえば、単一の反復ではなくサンプルのベクトルを使用する場合は、上記の設計を変更する必要があります(たとえば、渡されたプロキシ行列の部分行列をデータで埋めるプロセスを使用できますが、これが良いアイデアかどうかはわかりません。そうであれば、単一の反復の場合にもうまく適合します)。コメント、提案、批評は大歓迎です。
編集:
重要なポイントを要約し、状況を明確にするための上記のテキストの短い要約:
random_processes
一部のデータを生成するロジックが含まれています。たとえば、与えられた平均と相関行列を使用して、多変量ランダムガウス分布からサンプルを抽出できます。たとえば、コレスキー分解を使用できます。その結果、サンプルのセットを取得します[x1 x2 ... xN]- 次元とパラメーターが異なる複数のrandom_processesを持つことができます
- によって生成された個々の要素に対していくつかの変換を行いたい
random_processes
これがデータフロー図です
random_processes出力 x1 --------------------------> x1 ----> x2a p1x2------------変換|---->x2b ----> x2c x3 --------------------------> x3 p2y1------------変換|---->y1a ----> y1b
出力は、いくつかの計算を行うために使用されています。