Kapan menggunakan DAG (Directed Acyclic Graph) dalam pemrograman?

37

Saya baru-baru ini menemukan kerangka kerja yang disebut ecto .

Dalam kerangka kerja ini, komponen dasar bernama "plasm" , yang merupakan ecto Directed Acyclic Graph. Dalam ecto, plasm dapat dioperasikan oleh ecto scheduler.

Saya bertanya-tanya apa keuntungan dari mekanisme ini, dan dalam situasi apa lagi kita dapat mengeksploitasi konsep DAG?

Po-Jen Lai
sumber
6
Sebagian besar Sistem Manajemen Kontrol Sumber menerapkan revisi sebagai DAG.
Oded
1
Perencanaan adalah cabang seluruh masalah yang berkaitan dengan DAG banyak .
TC1
1
Banyak hal yang diwakili sebagai pohon, harus benar - benar diwakili sebagai DAG ketika mengingat kasus tepi aneh-namun-masih-agak-umum.
Joachim Sauer
@ JoachimSauer misalnya sistem file dengan tautan keras
jk.

Jawaban:

29

Pertanyaan yang bagus

  • Kode dapat diwakili oleh DAG yang menggambarkan input dan output dari masing-masing operasi aritmatika yang dilakukan dalam kode; representasi ini memungkinkan kompiler untuk melakukan eliminasi subekspresi umum secara efisien.
  • Sebagian besar Sistem Manajemen Kontrol Sumber menerapkan revisi sebagai DAG.
  • Beberapa bahasa Pemrograman menjelaskan sistem nilai yang terkait satu sama lain oleh grafik asiklik terarah. Ketika satu nilai berubah, penggantinya dihitung ulang; setiap nilai dievaluasi sebagai fungsi pendahulunya dalam DAG.
  • DAG berguna dalam mendeteksi kebuntuan karena mereka menggambarkan ketergantungan antara serangkaian proses dan sumber daya.
  • Dalam banyak algoritma acak dalam geometri komputasi, algoritma mempertahankan DAG sejarah yang mewakili fitur dari beberapa konstruksi geometrik yang telah digantikan oleh fitur skala selanjutnya; kueri lokasi titik dapat dijawab, seperti untuk dua struktur data di atas, dengan mengikuti jalur dalam DAG ini.
  • Setelah kami memiliki DAG dalam memori, kami dapat menulis algoritma untuk menghitung waktu eksekusi maksimum dari seluruh rangkaian.
  • Saat memprogram sistem spreadsheet, grafik dependensi yang menghubungkan satu sel ke sel lain jika sel pertama menyimpan rumus yang menggunakan nilai dalam sel kedua harus berupa grafik asiklik terarah. Siklus ketergantungan tidak diizinkan karena menyebabkan sel yang terlibat dalam siklus tidak memiliki nilai yang terdefinisi dengan baik. Selain itu, membutuhkan dependensi asiklik memungkinkan urutan topologi digunakan untuk menjadwalkan penghitungan ulang nilai sel ketika spreadsheet diubah.
  • Menggunakan DAG kita dapat menulis algoritma untuk mengevaluasi perhitungan dalam urutan yang benar.

EDIT:

  • Pemesanan evaluasi sel rumus saat menghitung ulang nilai rumus dalam spreadsheet dapat dilakukan menggunakan DAG
  • Git menggunakan DAG untuk penyimpanan konten, pointer referensi untuk kepala, representasi model objek, dan protokol jarak jauh.
  • DAG digunakan pada penjadwalan Jejak: pendekatan praktis pertama untuk penjadwalan global, penjadwalan jejak mencoba untuk mengoptimalkan jalur aliran kontrol yang paling sering dijalankan.
  • Ecto adalah kerangka kerja pemrosesan dan menggunakan DAG untuk memodelkan grafik pemrosesan sehingga grafik melakukan eksekusi sinkron. Plasm di Ecto adalah DAG dan Penjadwal beroperasi di atasnya.
  • DAG digunakan pada pipelining perangkat lunak, yang merupakan teknik yang digunakan untuk mengoptimalkan loop, dengan cara yang paralel dengan pipelining perangkat keras.

Sumber Daya yang Baik:

Md Mahbubur Rahman
sumber
1
Tidak ada loop? Saya akan berpikir bahwa selama loop berakhir, itu harus memenuhi syarat. Alih-alih menjadi A -> B -> C, ia mungkin menjadi A -> B -> A1 -> B1 -> A2 -> B2 -> C. Bersiklus dalam satu hal, tetapi tidak dalam hal lain. Lebih seperti spiral daripada lingkaran.
GlenPeterson
@GlenPeterson, Ya Anda benar. Saya telah mengedit jawaban saya. Terima kasih atas komentarnya. :)
Md Mahbubur Rahman
Masih tidak berpikir "Garis Lurus" itu perlu. 'G' dalam DAG adalah singkatan dari Graph. Lihatlah jawaban saya di bawah ini. Maaf saya tidak membaca dengan seksama sebelum menjawab, tetapi saya memberi +1 pada jawaban Anda untuk kelengkapan dan tingkat pencerahan Anda secara keseluruhan.
GlenPeterson
@GlenPeterson, Maaf atas kesalahan. Saya telah memperbarui jawaban saya. Saya juga suka jawaban Anda. Jadi buat +1 untuk jawaban Anda.
Md Mahbubur Rahman
3
Terima kasih untuk +1 Anda. Saya masih berpikir semua kode adalah DAG, tidak terbatas pada ekspresi aritmatika. I / O, perkecualian, interaksi multi-proses, dan interupsi perangkat keras semuanya hanyalah titik awal atau akhir lainnya dalam sebuah Sutradara (karena mereka memulai atau berakhir), Grafik Asiklik (tanpa loop tak terbatas) Grafik (kumpulan pasangan node terurut yang terbatas) . Tindak lanjut yang menarik untuk pertanyaan Ricky mungkin, "Apakah ada kode yang benar dan berfungsi yang bukan DAG." Saya pikir jawabannya adalah "Tidak," tetapi akan senang memiliki seseorang yang membuktikan saya salah.
GlenPeterson
12

Jawabannya adalah tidak ada hubungannya dengan pemrograman. Ini ada hubungannya dengan pemecahan masalah.

Sama seperti linked-list adalah struktur data yang digunakan untuk kelas masalah tertentu, grafik berguna untuk mewakili hubungan tertentu. Daftar yang ditautkan, pohon, grafik, dan struktur abstrak lainnya hanya memiliki koneksi ke pemrograman karena Anda dapat mengimplementasikannya dalam kode. Mereka ada di tingkat abstraksi yang lebih tinggi. Ini bukan tentang pemrograman, ini tentang menerapkan struktur data dalam solusi masalah.

Jika Anda masih menginginkan hubungan dengan pemrograman, harap pertimbangkan hal-hal berikut:

  • DAG (dikenal sebagai Wait-For-Graphs - lebih detail teknis ) berguna dalam mendeteksi kebuntuan karena mereka menggambarkan ketergantungan di antara serangkaian proses dan sumber daya (keduanya adalah node dalam DAG). Kebuntuan akan terjadi ketika sebuah siklus terdeteksi.
  • Setelah Anda memiliki DAG dalam memori, Anda dapat menulis algoritme ke:
    • pastikan perhitungan dievaluasi dalam urutan yang benar ( jenis topologi )
    • jika perhitungan dapat dilakukan secara paralel tetapi setiap perhitungan memiliki waktu eksekusi maksimum, Anda dapat menghitung waktu eksekusi maksimum seluruh rangkaian
Vaibhav Agarwal
sumber
1
Untuk sekali lagi menunjukkan bagaimana hal itu di luar lingkup pemrograman saja, pikirkan tentang bagaimana Anda menulis papan tulis tabel dalam database relasional untuk mem-parsing panjang lintasan dari 1 tabel ke yang lain secara mental, ini setara dengan mental menggunakan DAG untuk menentukan kinerja model data Anda
Jimmy Hoffa
6

Orang lain telah menerapkan DAG ke data, tapi saya pikir itu setidaknya berlaku (jika tidak lebih) ke kode. Mahbubur R Aaman menyebutkan ini, jadi sebenarnya ini lebih merupakan tambahan untuk jawabannya daripada jawaban lengkap sendiri.

Itu terjadi kepada saya daripada program komputer penting yang bebas dari loop tak terbatas (terima kasih @AndresF.) Adalah Grafik Acyclic Diarah (DAG). Berarti bahwa kemungkinan jalur eksekusi kode diarahkan (pertama ini, lalu itu), dan asiklik (tidak membentuk loop tak terbatas). Mereka adalah grafik karena jalur melalui kode signifikan jarang jarang sesederhana daftar atau pohon.

Saya bekerja di XSLT selama mungkin 4 tahun. Saya mengalami kesulitan untuk menjelaskan mengapa itu bukan bahasa pemrograman tujuan umum yang baik, tetapi DAG adalah alasannya. Secara khusus, XSLT adalah bahasa yang digerakkan oleh data. Anda mendefinisikan fungsi (ya, dalam arti pemrograman fungsional) tetapi Anda tidak perlu memanggil fungsi-fungsi ini dari kode Anda. Sebaliknya, XSLT mengatur kombinasi pemilihan, dan iterasi melalui, simpul-simpul dari dokumen input XML. Ini memungkinkan struktur data input menentukan fungsi mana yang dipanggil dan dalam urutan apa.

Ini sangat menarik dan sangat keren sampai program Anda menemukan kondisi data yang tidak Anda uji pada pukul 2:30 pagi dan Anda harus bangun dan memperbaikinya. Ketika Anda membiarkan data menentukan DAG, maka definisi DAG menjadi semua kondisi input yang mungkin - yang untuk aplikasi bisnis non-sepele tidak dapat dihitung; mereka tak terbayangkan.

Pada awalnya saya berpikir bahwa pemrograman fungsional mungkin bukan DAG karena urutan eksekusi terkadang tidak jelas, atau bahkan dipikirkan oleh programmer. Tetapi program fungsional mendefinisikan dependensi. Bahkan, sifat deklaratif pemrograman fungsional dapat dianggap sebagai mendefinisikan hanya dependensi (a ^ 2 = b ^ 2 + c ^ 2) tanpa menentukan urutan eksekusi (tidak masalah apakah 'b' atau 'c' dikuadratkan terlebih dahulu , asalkan keduanya dikuadratkan sebelum ditambahkan bersama).

Tetapi sementara pemrograman Fungsional mungkin secara sengaja tidak jelas tentang urutan operasi pada tingkat terperinci, sangat jelas tentang ketergantungan. Ini adalah fitur-fitur yang membuatnya bisa menerima konkurensi. Bagaimanapun, masih ada grafik jalur melalui kode, dan grafik itu masih diarahkan (dependensi harus dievaluasi sebelum tugas tergantung), jadi saya pikir DAG berlaku di sana juga.

Pertanyaan yang bagus - terima kasih telah memposting!

GlenPeterson
sumber
1
Apakah Program penting ini DAG menurut pendapat Anda: while (true) { print("hi"); }? Mungkin Anda ingin mengecualikan program yang tidak berhenti?
Andres F.
5

Saat ini DAG diremehkan dalam pemrograman. Secara historis banyak hal yang berkaitan dengan pengembangan dibuat dengan pohon dan hierarki karena memindahkan sesuatu di dalam kotak adalah nyaman bagi otak kita untuk membuat hal-hal rumit lebih mudah untuk dikelola. Tetapi jika Anda melihat acara dan bagaimana mereka bergantung pada acara dan negara lain maka Anda akan mendapatkan DAG karena apa pun dalam hidup kita dan dalam program ini dapat bergantung pada apa pun di masa lalu tetapi tidak di masa depan, sehingga Anda akan mendapatkan "asiklik" yang sempurna hubungan untuk diterapkan pada konsep DAG. Meskipun ini jarang digunakan secara eksplisit dalam pengembangan, mengingat hal ini akan membantu untuk memahami hal-hal yang lebih baik

Maksee
sumber
2

Saya bertanya-tanya apa manfaat Plasm di Ecto ...

DAG dapat digunakan untuk memodelkan kumpulan tugas secara berurutan dengan batasan bahwa tugas tertentu harus dilakukan sebelum yang lain. Ecto adalah kerangka kerja pemrosesan dan menggunakan DAG untuk memodelkan grafik pemrosesan sehingga grafik melakukan eksekusi sinkron. Plasm di Ecto adalah DAG dan Penjadwal beroperasi di atasnya.

dalam situasi apa lagi kita dapat mengeksploitasi konsep DAG?

  • DAWG adalah struktur data yang mewakili satu set string dan memungkinkan untuk operasi kueri yang menguji apakah string yang diberikan milik set dalam waktu sebanding dengan panjangnya.
  • Git menggunakan DAG untuk penyimpanan konten, pointer referensi untuk kepala, representasi model objek, dan protokol jarak jauh.
theD
sumber
Meskipun sudah lama ... tapi saya pikir jawaban ini sangat membantu saya memahami semangat ecto. Harus tunjukkan. Terima kasih!
Po-Jen Lai
0

Sebagai contoh dunia nyata, perangkat lunak kami mirip dengan IDE di mana pengguna akhir dapat menentukan serangkaian operasi yang harus dilakukan pada gambar (inspeksi visi mesin). Inspeksi ini dapat memiliki ketergantungan pada inspeksi lain atau mungkin tergantung pada inspeksi tersebut. Karena ini semua dapat dikonfigurasi oleh pengguna akhir, kami tidak dapat membuat optimasi untuk pemrosesan paralel pada waktu desain. Dengan mewakili inspeksi dan dependensi ini sebagai DAG, kami dapat mengoptimalkan paralelisme inspeksi keseluruhan untuk kinerja maksimum pada waktu berjalan.

Dave Nay
sumber
-1

Sebagai contoh lain, aturan manajemen memori dalam aplikasi Kakao dibuat sehingga semua referensi yang kuat membentuk grafik asiklik terarah, yang dilakukan untuk menjamin tidak adanya kebocoran.

millenomi
sumber
-2

Menambahkan jawaban lain karena belum melihat referensi untuk membangun sistem seperti makeyang menggunakan DAG untuk mengetahui dependensi untuk membangun.

Lebih detail di sini

dlmeetei
sumber
Apakah saya mengatakan sesuatu yang salah, Mengapa Itu
diturunkan
Anda memunculkan pertanyaan yang agak lama dengan jawaban yang agak buruk. Jika Anda tergoda untuk menulis jawaban yang "menambahkan ini karena tidak ada orang lain yang menyebutkannya ..." dan hanya memiliki satu kalimat, itu bukan jawaban yang bagus. Cobalah untuk sepenuhnya menjawab pertanyaan dan menjelaskan bagaimana aplikasi menggunakan DAG, dan bagaimana desain ini bekerja, dan mengapa itu dipilih daripada pilihan lain. Idealnya, beberapa paragraf bernilai konten.
Baiklah, saya akan
uraikan
Ok, alih-alih mengulangi, Baru saja diperbarui dengan tautan yang merinci bagaimana itu digunakan dalam alat-alat sepertimake
dlmeetei
Tautan memiliki kebiasaan buruk menjadi basi atau gagal. Jika itu terjadi, Anda langsung kembali ke tempat Anda mulai - jawaban satu baris pendek yang tidak banyak membantu. Bisakah Anda meringkas isi tautan sehingga jawaban ini bisa berdiri sendiri? (Simpan tautannya, pastikan jawabannya bagus, bahkan tanpa tautannya).
Dan Pichelman