純粋なデータフロースタイルで「増分更新」関数を構成するためのパラダイムはありますか?


10

この質問をするための正しい用語がわからないので、代わりにたくさんの言葉で説明します。

背景、同じページにいるだけです。プログラムにはキャッシュが含まれていることが多く、時間とメモリのトレードオフです。プログラマーのよくある間違いは、上流のソース/前例の1つを変更した後、キャッシュされた値を更新するのを忘れることです。しかし、データフローまたはFRPプログラミングパラダイムは、そのような間違いの影響を受けません。純粋な関数がいくつかあり、それらを有向ディペンデンシーグラフで接続している場合、ノードは出力値をキャッシュし、関数の入力が変更されるまで再利用できます。このシステムアーキテクチャは、Dataflowベースの環境でのキャッシングペーパーで説明されており、命令型言語では、メモ化とほぼ同じです。

問題:関数への入力の1つが変化しても、関数全体を実行し、キャッシュされた出力を破棄して、最初から再計算する必要があります。多くの場合、これは私にとって無駄に思えます。「トップ5なんでも」リストを生成する簡単な例を考えてみましょう。入力データは、何も並べ替えられていないリストです。ソートされたリストを出力する関数への入力として渡されます。これは、最初の5項目のみを受け取る関数に入力されます。疑似コード:

input = [5, 20, 7, 2, 4, 9, 6, 13, 1, 45]
intermediate = sort(input)
final_output = substring(intermediate, 0, 5)

ソート関数の複雑さはO(N log N)です。ただし、このフローは、1つの要素を追加することで、入力が一度に少しだけ変化するアプリケーションで使用されることを考慮してください。毎回最初から再ソートするよりも、実際にはO(N)の方が、新しい要素を正しい位置に挿入することにより、古いキャッシュソートリストを更新する関数を使用する方が高速です。これはほんの一例にすぎません-多くの「最初から」の関数には、そのような「増分更新」の対応物があります。また、新しく追加された要素は5番目の位置にあるため、final_outputにも表示されない場合があります。

私の直感は、このような「増分更新」関数を、既存の「最初から」関数と並べて、データフローシステムに何らかの方法で追加できる可能性があることを示唆しています。もちろん、すべてを最初から再計算すると、常に一連の増分更新を実行した場合と同じ結果が得られます。システムは、その性質を持っている必要がある場合は、個々のプリミティブFromScratch-インクリメンタルペアのそれぞれが常に同じ結果が得られ、その後、彼らから構築された大規模複合機能も自動的に同じ結果を与える必要があります。

質問:FromScratch関数とそのインクリメンタル関数の両方をサポートし、効率を高めるために協力し、大きなフローに構成できるシステム/アーキテクチャ/パラダイム/メタアルゴリズムを使用することは可能ですか?そうでない場合、なぜですか?誰かがこのパラダイムをすでに研究して公開している場合、それは何と呼ばれ、どのように機能するかの簡単な要約を入手できますか?


O(logn)kO(klogn)

回答:


7

このフィールドは何度も発明されており、次のような多くの名前で呼ばれています。

(そして多分もっと。)それらは同じではありませんが、関連しています。

Cai et al(1)の言い換え:一般的にオンラインアルゴリズムを実装するには、2つの中心的な方法があります(つまり、特定のアルゴリズムの問​​題を参照しません)。

  • 静的増分。静的アプローチでは、コンパイル時にプログラムを分析し、変化する入力に応じて元のプログラムの出力を効率的に更新する増分バージョンを生成します。実行時の簿記が必要ないため、静的アプローチは動的アプローチよりも効率的である可能性があります。また、計算されたインクリメンタルバージョンは、定数の折りたたみやインライン化などの標準コンパイラテクニックを使用して最適化できることがよくあります。これは(1)で調査したアプローチです。

  • 動的増分。動的アプローチは、プログラムの実行中に動的依存関係グラフを作成し、これらのグラフに沿って変更を伝達します。最もよく知られているアプローチは、Acarの自動調整計算です。重要なアイデアは単純です。プログラムは、動的依存関係グラフの値間の依存関係を追跡する拡張ランタイム環境の元の入力で実行されます。中間結果はキャッシュされます。(ご想像のとおり、これは多くのメモリを使用する傾向があり、このフィールドの多くの研究はメモリ使用量を制限する方法に関するものです。)後で、入力への変更は依存関係グラフを通じて変更された入力から結果に伝播し、中間と更新の両方を更新します最終結果; 多くの場合、この処理は再計算よりも効率的です。ただし、動的依存グラフを作成すると、実行時に大きな定数係数のオーバーヘッドが発生します。報告された実験では、2〜30の範囲です。

さらに、特定のアルゴリズムのオンラインバージョンをいつでも「手動」で試すことができます。これは難しい場合があります。


(1)Y. Cai、PG Giarrusso、T。Rendel、K。Ostermann、高次言語の変更の理論:静的微分によるλ計算の増分


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.