web-dev-qa-db-ja.com

プログラミングでDAG(有向非巡回グラフ)を使用する場合

ecto という名前のフレームワークを最近見つけました。

このフレームワークでは、基本コンポーネント "plasm" が、ecto有向非巡回グラフです。ectoでは、プラズマはectoスケジューラーで操作できます。

このメカニズムの利点は何ですか?また、DAGの概念を他のどのような状況で活用できますか?

38
Po-Jen Lai

良い質問です

  • コードは、コード内で実行される各算術演算の入力と出力を記述するDAGで表すことができます。この表現により、コンパイラは一般的な部分式の削除を効率的に実行できます。
  • ほとんどのソース管理システムは、DAGとしてリビジョンを実装します。
  • いくつかのプログラミング言語は、有向非循環グラフによって相互に関連する値のシステムを記述します。 1つの値が変更されると、その後続が再計算されます。各値は、DAG内の以前の値の関数として評価されます。
  • DAGは、一連のプロセスとリソース間の依存関係を示すため、デッドロックの検出に役立ちます。
  • 計算ジオメトリの多くのランダム化されたアルゴリズムでは、アルゴリズムはいくつかのジオメトリ構築のフィーチャを表す履歴DAGを維持しますが、これは後で細かいスケールのフィーチャに置き換えられます。上記の2つのデータ構造については、このDAGのパスをたどることにより、ポイントの場所のクエリに応答できます。
  • DAGをメモリに格納したら、アルゴリズムを記述して、セット全体の最大実行時間を計算できます。
  • スプレッドシートシステムのプログラミング中、最初のセルが2番目のセルの値を使用する数式を格納する場合、1つのセルを別のセルに接続する依存関係グラフは、有向非循環グラフでなければなりません。依存関係のサイクルは、サイクルに含まれるセルの値が明確に定義されないため、許可されません。さらに、依存関係が非循環であることを要求すると、トポロジーの順序を使用して、スプレッドシートが変更されたときにセル値の再計算をスケジュールできます。
  • DAGを使用して、正しい順序で計算を評価するアルゴリズムを作成できます。

EDIT:

  • スプレッドシートの数式値を再計算するときの数式セル評価の順序付けは、DAGを使用して実行できます
  • Gitは、コンテンツストレージ、ヘッドの参照ポインター、オブジェクトモデル表現、およびリモートプロトコルにDAGを使用します。
  • DAGはトレーススケジューリングで使用されます。グローバルスケジューリングの最初の実用的なアプローチであるトレーススケジューリングは、最も頻繁に実行される制御フローパスを最適化しようとします。
  • Ectoは処理フレームワークであり、DAGを使用して処理グラフをモデル化することで、グラフが順序付けされた同期実行を行うようにします。 EctoのPlasmはDAGであり、Schedulerが動作します。
  • DAGは、ソフトウェアパイプラインで使用されます。これは、ハードウェアパイプラインと同等の方法でループを最適化するために使用される手法です。

良いリソース:

30

答えは、プログラミングとはほとんど関係がないということです。それは問題解決と関係があります。

リンクリストが特定のクラスの問題に使用されるデータ構造であるように、グラフは特定の関係を表すのに役立ちます。リンクされたリスト、ツリー、グラフ、およびその他の抽象的な構造は、それらをコードで実装できるという点でプログラミングにのみ関連しています。それらは抽象化のより高いレベルで存在します。それはプログラミングではなく、問題の解決にデータ構造を適用することです。

それでもプログラミングとの関係が必要な場合は、次の点を考慮してください。

  • DAG( Wait-For-Graphs -more technical details )は、プロセスとリソースのセット間の依存関係を示すため、デッドロックの検出に役立ちます(両方ともノードです) DAG)。サイクルが検出されるとデッドロックが発生します。
  • DAGをメモリに格納したら、アルゴリズムを次のように記述できます。
    • 計算が正しい順序で評価されていることを確認してください( トポロジカルソート
    • 計算を並行して実行できるが、各計算に最大実行時間がある場合、セット全体の最大実行時間を計算できます
13
Vaibhav Agarwal

他の人々はDAGをデータに適用しましたが、私はそれが少なくともコードに適用可能であると考えています(そうでない場合でも)。 Mahbubur R Aamanがこれについて言及しているので、実際には、これはそれ自体での完全な回答というよりは、彼の回答への補遺です。

これは、命令型コンピュータプログラムよりも発生しますこれは無限ループがありません(@AndresFに感謝します)は有向非巡回グラフ(DAG)です。つまり、コードの実行の可能なパスが方向付けられ(最初にこれ、次にそれ)、非循環(無限ループを形成しない)であることを意味します。重要なコードのパスがリストやツリーほど単純ではないため、これらはグラフです。

XSLTで4年間働いたことがあります。なぜそれが優れた汎用プログラミング言語ではなかったのかを説明するのに大変な時間を費やしましたが、DAGがその理由です。具体的には、XSLTはデータ駆動型言語です。関数を定義します(機能プログラミングの意味でそうです)が、必ずしもこれらの関数をコードから呼び出す必要はありません。むしろ、XSLTは、入力XMLドキュメントのノードの選択と反復の組み合わせをセットアップします。これにより、入力データの構造によって、呼び出される関数と呼び出される順序が決まります。

これは非常に興味深く、非常にクールで、午前2時30分にテストしていないデータ条件がプログラムで発生し、ウェイクアップして修正する必要がありました。データにDAGを定義させると、DAGの定義がすべての可能な入力条件になります。これは、重要なビジネスアプリケーションの場合、計算不可能です。彼らは想像を絶する。

最初は、関数型プログラミングはDAGではないかもしれないと思っていました。実行順序が時々明確でないか、プログラマーによって考えられていないためです。しかし、関数型プログラムは依存関係を定義します。実際、関数型プログラミングの宣言的な性質は、実行順序を指定せずに、依存関係(a ^ 2 = b ^ 2 + c ^ 2)のみを定義するものと考えることができます( 'b'と 'c'のどちらが最初に平方されるかは関係ありません) 、それらが一緒に追加される前に両方が二乗される限り)。

しかし、関数型プログラミングは、詳細なレベルでの操作の順序について意図的にあいまいな場合がありますが、依存関係については非常に明確です。これらは、同時実行性に非常に適しているまさにその機能です。いずれの場合でも、コードを通るパスのグラフがまだあり、そのグラフはまだ指示されている(依存関係は依存タスクの前に評価する必要がある)ので、DAGもそこに適用されると思います。

いい質問-投稿してくれてありがとう!

7
GlenPeterson

現在、DAGはプログラミングにおいて過小評価されています。歴史的に、開発に関連する多くのものがツリーと階層で作成されました。ボックス内で何かを移動すると、私たちの脳が複雑なものを管理しやすくするために便利だからです。しかし、イベントを見て、それらが他のイベントや状態にどのように依存しているかを見ると、DAGを取得します。これは、私たちの生活やプログラムのすべてが過去のものに依存し、将来のものには依存しないため、完全に「非循環」になるためです。 DAGコンセプトに適用される関係。これが開発で明示的に使用されることはめったにありませんが、これを念頭に置くと、物事をよりよく理解するのに役立ちます

6
Maksee

EctoでのPlasmの利点は何でしょうか。

DAGを使用すると、特定のタスクを他のタスクより先に実行する必要があるという制約のあるタスクのコレクションをシーケンスでモデル化できます。 Ectoは処理フレームワークであり、DAGを使用して処理グラフをモデル化し、グラフが順序付けされた同期実行を行うようにします。 PlasminEctoはDAGであり、Schedulerがそれを操作します。

他にどのような状況でDAGの概念を活用できますか?

  • [〜#〜] dawg [〜#〜]は、文字列のセットを表すデータ構造であり、指定された文字列がその長さに比例する時間内のセットに属するかどうかをテストするクエリ操作。
  • Gitは、コンテンツストレージ、ヘッドの参照ポインター、オブジェクトモデル表現、およびリモートプロトコルにDAGを使用します。
3
theD

実際の例として、私たちのソフトウェアはIDEに似ています。ここで、エンドユーザーは画像に対して実行する一連の操作を定義できます(マシンビジョン検査)。これらの検査は、その他の検査または検査に依存する検査があります。これはすべてエンドユーザーが構成できるため、設計時に並列処理の最適化を行うことはできません。これらの検査と依存関係をDAGとして表すことにより、検査全体の並列処理を最適化できます。実行時のパフォーマンスを最大化します。

0
Dave Nay