Коли використовувати DAG (спрямовану ациклічну графіку) в програмуванні?


37

Нещодавно я знайшов рамку під назвою ecto .

У цьому рамках базовий компонент під назвою "плазма" - це ecto Directed Acyclic Graph. В екто плазмою можна керувати планувальник ecto.

Мене цікавить, у чому перевага цього механізму, і в яких інших ситуаціях ми можемо використовувати концепцію DAG?


6
Більшість систем управління джерелами управління реалізують зміни як DAG.
Одід

1
Планування є цілою галуззю проблем , які розглядаються DAG багато .
TC1

1
Багато речей, які представлені у вигляді дерев, справді повинні бути представлені як DAG, якщо мати на увазі дивні, але все ще дещо поширені випадки краю.
Йоахім Зауер

@JoachimSauer, наприклад, файлові системи із жорсткими посиланнями
jk.

Відповіді:


29

Приємне запитання.

  • Код може бути представлений DAG, що описує входи та виходи кожної з арифметичних операцій, що виконуються в коді; таке представлення дозволяє компілятору ефективно виконувати загальне усунення підвыражения.
  • Більшість систем управління джерелами управління реалізують зміни як DAG.
  • Кілька мов програмування описують системи значень, які пов'язані один з одним направленим ациклічним графіком. Коли одна величина змінюється, її наступники перераховуються; кожне значення оцінюється як функція своїх попередників у DAG.
  • DAG зручно виявляти тупикові місця, оскільки вони ілюструють залежності між набором процесів та ресурсів.
  • У багатьох рандомізованих алгоритмах обчислювальної геометрії алгоритм підтримує DAG історії, що представляє особливості деякої геометричної побудови, які були замінені пізнішими функціями більш тонкого масштабу; На запити розташування точок можна відповісти, як і на дві вищезгадані структури даних, шляхом слідування шляхів у цій DAG.
  • Як тільки у нас є DAG в пам'яті, ми можемо записати алгоритми для обчислення максимального часу виконання всього набору.
  • Під час програмування систем електронних таблиць графік залежності, який з'єднує одну клітинку до іншої, якщо перша комірка зберігає формулу, яка використовує значення у другій комірці, повинна бути спрямованим ациклічним графіком. Цикли залежностей заборонені, оскільки вони призводять до того, що клітини, що беруть участь у циклі, не мають чітко визначеного значення. Крім того, вимагати ациклічності залежностей дозволяє використовувати топологічний порядок для планування перерахунку значень комірок при зміні електронної таблиці.
  • За допомогою DAG ми можемо записати алгоритми для оцінки обчислень у правильному порядку.

Редагувати:

  • Упорядкування оцінки комірок формули при перерахунку значень формули в електронних таблицях може здійснюватися за допомогою DAG
  • Git використовує DAG для зберігання вмісту, опорних покажчиків для головок, представлення об'єктної моделі та віддаленого протоколу.
  • DAG використовуються при плануванні трасування: перший практичний підхід для глобального планування, планування трасування намагається оптимізувати шлях управління потоком, який виконується найчастіше.
  • Ecto є рамкою обробки, і вона використовує DAG для моделювання обробки графіків, щоб графіки виконували впорядкований синхронний варіант виконання. Плазма в Ecto - це DAG, і планувальник працює на ньому.
  • DAG використовуються в програмному трубопроводі, який є технікою, що використовується для оптимізації циклів, таким чином, що паралельно апаратному конвеєрному конвеєрній установці.

Хороші ресурси:


1
Ніяких петель? Я думаю, що поки цикл закінчується, він повинен кваліфікуватися. Замість того, щоб бути A -> B -> C, це може йти A -> B -> A1 -> B1 -> A2 -> B2 -> C. Циклічно в одному сенсі, а не в іншому. Більше схожа на спіраль, ніж коло.
GlenPeterson

@GlenPeterson, так, ти маєш рацію. Я відредагував свою відповідь. Дякуємо за коментар :)
Md Mahbubur Rahman

Все ще не думаю, що "Пряма лінія" необхідна. "G" у DAG означає "Графік". Перевірте мою відповідь нижче. Вибачте, що я недостатньо уважно прочитав Вашу, перш ніж відповісти, але я поставив +1 Вашій відповіді за Вашу повноту та всебічний рівень просвітлення.
GlenPeterson

@GlenPeterson, Вибачте за помилку. Я оновив свою відповідь. Мені також подобається ваша відповідь. Тому зробив +1 до вашої відповіді.
Md Mahbubur Rahman

3
Дякуємо за ваш +1. Я все ще думаю, що весь код є DAG, не обмежуючись арифметичними виразами. Введення / виведення, винятки, багатопроцесові взаємодії та апаратні переривання - це все лише інші початкові або кінцеві вузли в спрямованому (тому що вони починаються або закінчуються), ациклічному (без нескінченних циклів) графіку (обмежений набір упорядкованих пар вузлів) . Цікавим наступним запитанням Ріккі може бути: "Чи є правильний та робочий код, який не є DAG". Я думаю, що відповідь - «Ні», але був би радий, щоб хтось довів мене неправильно.
GlenPeterson

12

Відповідь полягає в тому, що це не має нічого спільного з програмуванням. Це стосується вирішення проблем.

Так само, як пов'язані списки - це структури даних, що використовуються для певних класів проблем, графіки корисні для представлення певних взаємозв'язків. Пов'язані списки, дерева, графіки та інші абстрактні структури мають підключення до програмування лише тим, що ви можете реалізувати їх у коді. Вони існують на більш високому рівні абстракції. Справа не в програмуванні, а в застосуванні структур даних для вирішення проблем.

Якщо ви все ще хочете мати певні стосунки з програмуванням, то врахуйте наступні моменти:

  • DAG (відомий як Wait-For-Graphs - більше технічних деталей ) є зручним у виявленні тупикових ситуацій, оскільки вони ілюструють залежності між набором процесів та ресурсів (обидва - це вузли в DAG). Тупик трапиться, коли буде виявлено цикл.
  • Коли у вас є DAG в пам'яті, ви можете написати алгоритми для:
    • переконайтесь, що обчислення оцінені у правильному порядку ( топологічне сортування )
    • якщо обчислення можна проводити паралельно, але кожен обчислення має максимальний час виконання, ви можете обчислити максимальний час виконання всього набору

1
Щоб ще раз показати, як це виходить за рамки програмування, подумайте про те, як ви дошці таблиць у реляційній базі даних подумки аналізують довжину шляху від 1 таблиці до іншої, це еквівалент розумового використання DAG для визначення продуктивності ваша модель даних
Джиммі Хоффа

6

Інші люди застосували DAG до даних, але я думаю, що це принаймні так само застосовно (якщо не більше) до коду. Про це згадує Махбубур Р Ааман, тож насправді це більше доповнення до його відповіді, ніж повна відповідь самостійно.

Мені це трапляється, ніж будь-яка імперативна комп'ютерна програма, яка не містить нескінченних циклів (дякую @AndresF.) - це спрямований ациклічний графік (DAG). Мається на увазі, що можливі шляхи виконання коду спрямовані (спочатку це, потім те) і ациклічні (не утворюючи нескінченних циклів). Вони є графіком, оскільки шлях через будь-який значний код рідко буває таким простим, як список або дерево.

Я працював у XSLT, можливо, 4 роки. Мені було страшно, намагаючись пояснити, чому це не дуже хороша мова програмування загального призначення, але DAG - це причина. Зокрема, XSLT - це мова, керована даними. Ви визначаєте функції (так, у сенсі функціонального програмування), але не обов'язково викликати ці функції зі свого коду. Швидше, XSLT встановлює комбінацію вибору та ітерації через вузли вхідного XML-документа. Це дозволяє структурі вхідних даних визначати, які функції викликаються та в якому порядку.

Це було дуже цікаво і дуже круто, поки ваша програма не зіткнулася з умовами даних, які ви не тестували о 2:30 ранку, і вам довелося прокинутися і виправити це. Коли ви дозволяєте даним визначати DAG, то визначення DAG стає всіма можливими умовами введення - які для будь-якого нетривіального ділового додатку виходять за межі незрівнянних; вони немислимі.

Спочатку я подумав, що функціональне програмування може не бути DAG, тому що порядок виконання іноді не зрозумілий, або навіть продуманий програмістом. Але функціональна програма визначає залежності. Насправді декларативний характер функціонального програмування можна вважати таким, що визначає лише залежності (a ^ 2 = b ^ 2 + c ^ 2), не вказуючи порядок виконання (не має значення, чи спочатку квадрат "b" чи "c" , до тих пір, поки вони обидва будуть квадратними, перш ніж їх додавати разом).

Але хоча функціональне програмування може бути свідомо розпливчастим щодо порядку операцій на детальному рівні, це виразно ясно про залежності. Це ті самі особливості, які роблять його таким прихильним до одночасності. У будь-якому випадку, все ще є графік шляхів через код, і цей графік все ще спрямований (залежності потрібно оцінювати перед залежними завданнями), тому я думаю, що DAG застосовується і там.

Приємне запитання - дякую за публікацію!


1
На вашу думку, ця імперативна програма є DAG while (true) { print("hi"); }:? Можливо, ви хочете виключити незакінчені програми?
Андрес Ф.

5

В даний час DAG недооцінюється в програмуванні. Історично багато речей, пов'язаних з розвитком, були зроблені з деревами та ієрархіями, оскільки переміщення чогось у коробці зручно для нашого мозку, щоб зробити складні речі простішими в управлінні. Але якщо ви подивитесь на події та на те, як вони залежать від інших подій та станів, то ви отримаєте DAG, тому що все в нашому житті та в програмі може залежати від будь-чого в минулому, але не в майбутньому, тож ви отримаєте ідеально "ациклічну" відносини, застосовні до концепції DAG. Хоча це рідко використовується явно в розробці, маючи це на увазі, це допоможе зрозуміти речі краще


2

Мені цікаво, у чому перевага плазми в Ecto ...

DAG можна використовувати для моделювання колекції завдань у послідовності з обмеженням, що певні завдання потрібно виконувати перед іншими. Ecto є рамкою обробки, і вона використовує DAG для моделювання обробки графіків, щоб графіки виконували впорядкований синхронний варіант виконання. Plasm в Ecto є DAG і планувальник працює на ньому.

в яких інших ситуаціях ми можемо використовувати концепцію DAG?

  • DAWG - це структура даних, яка представляє набір рядків і дозволяє здійснювати операцію запиту, яка перевіряє, чи належить дана рядок набору, пропорційному його довжині.
  • Git використовує DAG для зберігання вмісту, опорних покажчиків для головок, представлення об'єктної моделі та віддаленого протоколу.

Хоча минуло давно ... але я думаю, що ця відповідь справді допомагає мені зрозуміти дух екто. Треба вказати на це. Спасибі!
Po-Jen Lai

0

Як приклад із реального світу, наше програмне забезпечення схоже на IDE, де кінцевий користувач може визначити низку операцій, які слід виконати на зображенні (машинне огляд зору). Ці інспекції можуть залежати від інших інспекцій або можуть мати залежність від них. Оскільки це все налаштовано кінцевим користувачем, ми не можемо оптимізувати паралельну обробку під час проектування. Представляючи ці перевірки та залежності як DAG, ми можемо оптимізувати паралельність загальної перевірки для досягнення максимальної продуктивності під час виконання.


-1

Ще для іншого прикладу, правила управління пам'яттю в додатках какао зроблені так, що всі чіткі посилання утворюють спрямований ациклічний графік, що робиться для того, щоб гарантувати відсутність протікань.


-2

Додаючи ще одну відповідь, оскільки не бачили посилання на побудову систем, таких як makeDAG, щоб з'ясувати залежності для побудови.

Детальніше тут


Чи сказав я щось не так, чому це було знято
dlmeetei

Ви відскочили досить старе питання з досить поганою відповіддю. Якщо ви спокусилися написати відповідь, яка "додає це тому, що ніхто більше не згадав про це ..." і маєте лише одне речення, відповідь це не так добре. Спробуйте повністю відповісти на запитання та пояснити, як програма використовує DAG, і як працює цей дизайн, і чому це було обрано в інших варіантах. В ідеалі зміст вартує кількох абзаців.

Гаразд, дозвольте це детальніше
розглянути

Ок, замість повторення, Щойно оновлено посиланням, яке детально описує, як він використовується в таких інструментах, якmake
dlmeetei

Посилання мають неприємну звичку зависати або не працювати. Якщо це трапиться, ви повертаєтесь туди, з чого почали - коротка однорядкова відповідь, яка не дуже допомагає. Чи можете ви підсумувати вміст посилання, щоб ця відповідь могла стояти самостійно? (Тримайте посилання, просто переконайтеся, що відповідь хороша навіть без посилання).
Ден Пішельман
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.