Когда использовать DAG (направленный ациклический граф) в программировании?

37

Я недавно нашел структуру под названием Ecto .

В этом контексте базовый компонент, называемый «плазмой» , является экто направленным ациклическим графом. В эктоплазме может работать планировщик экто.

Мне интересно, в чем преимущество этого механизма, и в каких других ситуациях мы можем использовать концепцию DAG?

По-Джен Лай
источник
6
Большинство систем управления исходным кодом внедряют изменения в качестве DAG.
Одед
1
Планирование является целой отраслью проблем , которые рассматриваются DAG много .
TC1
1
Многие вещи, которые представляются в виде деревьев, действительно должны быть представлены в виде DAG, если иметь в виду странные, но все еще несколько общие случаи с краями.
Йоахим Зауэр
@JoachimSauer, например, файловые системы с жесткими ссылками
jk.

Ответы:

29

Хороший вопрос

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

РЕДАКТИРОВАТЬ :

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

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

Md Mahbubur Rahman
источник
1
Петель нет? Я думаю, что пока цикл завершается, он должен соответствовать требованиям. Вместо того, чтобы быть A -> B -> C, он мог бы пойти A -> B -> A1 -> B1 -> A2 -> B2 -> C. Циклический в одном смысле, но не в другом. Больше похоже на спираль, чем на круг.
ГленПетерсон
@GlenPeterson, да, ты прав. Я отредактировал свой ответ. Спасибо за комментарий. :)
Md Mahbubur Rahman
До сих пор не думаю, что «Прямая линия» необходима. 'G' в DAG обозначает График. Проверьте мой ответ ниже. Извините, я недостаточно внимательно прочитал ваш, прежде чем ответить, но я сделал +1 ваш ответ за вашу полноту и общий уровень просветления.
ГленПетерсон
@GlenPeterson, извините за ошибку. Я обновил свой ответ. Мне также нравится ваш ответ. Так сделал +1 к вашему ответу.
Г-н Махбубур Рахман
3
Спасибо за ваш +1. Я все еще думаю, что весь код DAG, а не только арифметические выражения. Ввод / вывод, исключения, многопроцессорные взаимодействия и аппаратные прерывания - это просто другие начальные или конечные узлы в направленном (потому что они являются начальным или конечным) графике, ациклическом (без бесконечных циклов) (конечный набор упорядоченных пар узлов) , Интересным продолжением вопроса Рики может быть: «Есть ли правильный и работающий код, который не является DAG». Я думаю, что ответ «Нет», но был бы рад, если бы кто-то доказал, что я не прав.
ГленПетерсон
12

Ответ в том, что это не имеет ничего общего с программированием. Это связано с решением проблем.

Так же, как связанные списки являются структурами данных, используемыми для определенных классов задач, графики полезны для представления определенных отношений. Связанные списки, деревья, графики и другие абстрактные структуры имеют связь только с программированием, поскольку вы можете реализовать их в коде. Они существуют на более высоком уровне абстракции. Речь идет не о программировании, а о применении структур данных для решения проблем.

Если вы все же хотите иметь какое-то отношение к программированию, пожалуйста, обратите внимание на следующие моменты:

  • DAG (известная как Wait-For-Graphs - больше технических деталей ) удобна для обнаружения взаимоблокировок, поскольку они иллюстрируют зависимости между набором процессов и ресурсов (оба являются узлами в DAG). Тупиковая ситуация может возникнуть при обнаружении цикла.
  • Когда у вас есть DAG в памяти, вы можете написать алгоритмы для:
    • убедитесь, что вычисления выполнены в правильном порядке ( топологическая сортировка )
    • если вычисления могут выполняться параллельно, но каждое вычисление имеет максимальное время выполнения, вы можете рассчитать максимальное время выполнения всего набора
Вайбхав Агарвал
источник
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 также применяется и там.

Хороший вопрос - спасибо за публикацию!

GlenPeterson
источник
1
Является ли это необходимо запрограммируйте DAG по вашему мнению: while (true) { print("hi"); }? Может быть, вы хотите исключить не завершающие программы?
Андрес Ф.
5

В настоящее время DAG недооценивается в программировании. Исторически многие вещи, связанные с разработкой, были сделаны с помощью деревьев и иерархий, потому что перемещение чего-либо в коробке удобно для нашего мозга, чтобы упростить управление сложными вещами. Но если вы посмотрите на события и то, как они зависят от других событий и состояний, вы получите DAG, потому что все в нашей жизни и в программе может зависеть от чего-либо в прошлом, но не в будущем, так что вы получите совершенно «ациклический» отношения должны быть применимы к концепции DAG. Хотя это редко используется явно в процессе разработки, это поможет понять вещи лучше

Maksee
источник
2

Мне интересно, в чем преимущество Плазмы в Экто ...

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

в каких других ситуациях мы можем использовать концепцию DAG?

  • DAWG - это структура данных, которая представляет собой набор строк и допускает операцию запроса, которая проверяет, принадлежит ли данная строка к набору времени, пропорциональному его длине.
  • Git использует DAG для хранения контента, ссылочные указатели для заголовков, представление объектной модели и удаленный протокол.
Тед
источник
Хотя это было давно ... но я думаю, что этот ответ действительно помогает мне понять дух экто. Должен указать на это. Благодарность!
По-Джен Лай
0

В качестве примера из реальной жизни наше программное обеспечение похоже на IDE, где конечный пользователь может определить серию операций, выполняемых над изображением (проверка машинного зрения). Эти проверки могут зависеть от других проверок или могут зависеть от них. Поскольку все это настраивается конечным пользователем, мы не можем оптимизировать параллельную обработку во время разработки. Представляя эти проверки и зависимости в качестве группы обеспечения доступности баз данных, мы можем оптимизировать параллельность всей проверки для обеспечения максимальной производительности во время выполнения.

Дэйв Най
источник
-1

Просто для другого примера, правила управления памятью в приложениях Какао сделаны так, что все сильные ссылки формируют направленный ациклический граф, который сделан, чтобы гарантировать отсутствие утечек.

millenomi
источник
-2

Добавив еще один ответ, вы еще не видели ссылки на системы сборки, в makeкоторых используется DAG для определения зависимостей для сборки.

Подробнее здесь

dlmeetei
источник
Разве я сказал что-то не так, почему за него проголосовали
dlmeetei
Вы отклонили довольно старый вопрос с довольно плохим ответом. Если у вас возникает соблазн написать ответ, который «добавляет это, потому что никто другой не упомянул об этом ...» и имеет только одно предложение, это не очень хороший ответ. Пожалуйста, постарайтесь полностью ответить на вопрос и объяснить, как приложение использует группу обеспечения доступности баз данных, как работает этот дизайн и почему он был выбран среди других вариантов. В идеале, стоит несколько параграфов контента.
Хорошо, позвольте мне уточнить это позже
dlmeetei
Хорошо, вместо того, чтобы повторять, Просто обновлено со ссылкой, которая подробно описывает, как он используется в таких инструментах, какmake
dlmeetei
У ссылок есть неприятная привычка устаревать или терпеть неудачу. Если это произойдет, вы вернетесь к тому, с чего начали - короткий однострочный ответ, который мало чем поможет. Можете ли вы обобщить содержание ссылки, чтобы этот ответ мог стоять сам по себе? (Сохраните ссылку, просто убедитесь, что ответ хороший даже без ссылки).
Дэн Пичельман,