プログラミングでDAG(Directed Acyclic Graph)を使用する場合


37

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

このフレームワークでは、「plasm」という名前の基本コンポーネントは、ecto Directed Acyclic Graphです。ectoでは、plasmはectoスケジューラーで操作できます。

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


6
ほとんどのソース管理システムは、リビジョンをDAGとして実装します。
-Oded

1
計画は、DAG を多く扱う問題のブランチ全体です。
TC1

1
木として表現される多くのものは、奇妙な、まだまだやや一般的なエッジケースを念頭に置いて、実際にDAGとして表現する必要があります。
ヨアヒムザウアー

@JoachimSauer例:ハードリンクを持つファイルシステム
jk。

回答:


29

いい質問です。

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

編集:

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

良いリソース:


1
ループはありませんか?ループが終了する限り、ループを修飾する必要があると思います。A-> B-> Cの代わりに、A-> B-> A1-> B1-> A2-> B2-> Cのようになります。ある意味では周期的ですが、別の意味ではそうではありません。円というより螺旋のようです。
グレンペターソン

@GlenPeterson、はい、そうです。回答を編集しました。コメントありがとうございます。:)
Md Mahbubur Ra​​hman

それでも「直線」が必要だとは思わないでください。DAGの「G」はグラフの略です。以下の私の答えをご覧ください。申し訳ありませんが、回答する前に十分に読みませんでしたが、完全性と全体的な啓発のために回答を+1しました。
グレンペターソン

@GlenPeterson、間違えてすみません。回答を更新しました。私もあなたの答えが好きです。あなたの答えに+1を付けました。
メリーランドマババー・ラーマン

3
+1をありがとう。私はまだすべてのコードがDAGであり、算術式に限定されないと思います。I / O、例外、マルチプロセスインタラクション、ハードウェア割り込みはすべて、Directedのその他の開始ノードまたは終了ノード(開始または終了であるため)、非循環(無限ループなし)グラフ(ノードの順序付きペアの有限セット) 。Rickyの質問に対する興味深いフォローアップは、「DAGではない、正しく機能するコードはありますか」です。答えは「いいえ」だと思いますが、誰かが間違っていることを証明してくれるとうれしいです。
グレンペターソン

12

答えは、プログラミングとはあまり関係がないということです。問題解決に関係しています。

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

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

  • DAG(Wait-For-Graphs-より技術的な詳細)は、一連のプロセスとリソース(両方ともDAGのノード)間の依存関係を示すため、デッドロックの検出に役立ちます。サイクルが検出されると、デッドロックが発生します。
  • DAGをメモリに格納したら、次のアルゴリズムを作成できます。
    • 計算が正しい順序で評価されることを確認します(トポロジカルソート
    • 計算を並列に実行できるが、各計算に最大実行時間がある場合、セット全体の最大実行時間を計算できます

1
プログラミングだけの範囲を超えていることをもう一度示すために、リレーショナルデータベースのテーブルをホワイトボードして、1つのテーブルから別のテーブルへのパスの長さを精神的に解析する方法を考えてください。これは、DAGを使用してデータモデル
ジミー・ホッファ

6

他の人々はデータにDAGを適用しましたが、少なくともコードには(それ以上ではないにしても)適用できると思います。Mahbubur R Aamanがこれに言及しているので、これは実際には完全な回答というよりも、彼の回答への補遺です。

無限ループのない命令型コンピュータープログラム(@AndresFに感謝)は、有向非巡回グラフ(DAG)です。コードの実行の可能なパスが指示されていることを意味し(最初にこれ、次にそれ)、非周期的(無限ループを形成しない)。重要なコードを通るパスがリストやツリーほど単純ではないため、これらはグラフです。

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

午前2時30分にテストしなかったデータ条件にプログラムが遭遇し、目を覚まして修正するまで、これは非常に興味深く、とてもクールでした。データにDAGを定義させると、DAGの定義はすべての可能な入力条件になります。これは、重要なビジネスアプリケーションにとっては計り知れません。彼らは想像できません。

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

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

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


1
この命令プログラムはあなたの意見ではDAG while (true) { print("hi"); }ですか?たぶん、終了しないプログラムを除外したいですか?
アンドレスF。13年

5

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


2

EctoのPlasmの利点は何ですか?

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

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

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

それは長い時間でしたが...しかし、この答えは私がエクトの精神を理解するのに本当に役立つと思います。それを指摘する必要があります。ありがとう!
ポージェンライ

0

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


-1

別の例として、Cocoaアプリのメモリ管理ルールは、すべての強参照が有向非循環グラフを形成するように作成されています。これは、リークがないことを保証するために行われます。


-2

makeDAGを使用してビルドの依存関係を見つけるなどのビルドシステムへの参照を見たことがない別の答えを追加します。

詳細はこちら


これは、downvotedされたのはなぜ私は、何も間違って言った
dlmeetei

かなり古い質問を返して、回答がかなり貧弱だった。「誰も言及していないのでこれを追加する...」という答えを書きたがり、1つの文しかない場合、それはあまり良い答えではありません。質問に完全に答え、アプリケーションがDAGをどのように使用するか、この設計がどのように機能するか、なぜそれが他のオプションよりも選択されたかを説明してください。理想的には、いくつかの段落に相当するコンテンツ。

[OK]を、私はそれを後で詳しく説明してみましょう
dlmeetei

OK、繰り返しの代わりに、次のようなツールでの使用方法の詳細を記載したリンクで更新されましたmake
-dlmeetei

リンクには、古くなったり失敗したりするという厄介な習慣があります。それが起こった場合、あなたは始めたところに戻ってきます-あまり役に立たない短い一行の答え。リンクの内容を要約して、この答えが自立できるようにできますか?(リンクを維持し、リンクがなくても答えが良いものであることを確認してください)。
ダンピチェルマン16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.