Quando usar o DAG (gráfico acíclico direcionado) na programação?

37

Recentemente eu encontrei um framework chamado ecto .

Nesta estrutura, um componente básico denominado "plasma" , que é o gráfico acíclico direcionado ecto. No ecto, o plasma pode ser operado pelo ecto scheduler.

Pergunto-me qual é a vantagem desse mecanismo e em que outras situações podemos explorar o conceito de DAG?

Po-Jen Lai
fonte
6
A maioria dos sistemas de gerenciamento de controle de fonte implementa as revisões como um DAG.
Oded
11
Planejamento é um ramo inteiro de problemas que lida com DAG um monte .
TC1
11
Muitas coisas que são representadas como árvores devem realmente ser representadas como DAGs, tendo em mente os casos extremos estranhos, mas ainda assim um tanto comuns.
Joachim Sauer
@JoachimSauer, por exemplo, sistemas de arquivos com links físicos
jk.

Respostas:

29

Boa pergunta.

  • O código pode ser representado por um DAG descrevendo as entradas e saídas de cada uma das operações aritméticas realizadas dentro do código; essa representação permite que o compilador execute a eliminação comum de subexpressão com eficiência.
  • A maioria dos sistemas de gerenciamento de controle de fonte implementa as revisões como um DAG.
  • Várias linguagens de programação descrevem sistemas de valores que são relacionados entre si por um gráfico acíclico direcionado. Quando um valor muda, seus sucessores são recalculados; cada valor é avaliado em função de seus antecessores no DAG.
  • O DAG é útil na detecção de impasses, pois ilustra as dependências entre um conjunto de processos e recursos.
  • Em muitos algoritmos aleatórios em geometria computacional, o algoritmo mantém um DAG histórico representando recursos de alguma construção geométrica que foram substituídos por recursos posteriores em escala mais fina; as consultas de localização de pontos podem ser respondidas, como nas duas estruturas de dados acima, seguindo os caminhos deste DAG.
  • Depois de termos o DAG na memória, podemos escrever algoritmos para calcular o tempo máximo de execução de todo o conjunto.
  • Ao programar sistemas de planilhas, o gráfico de dependência que conecta uma célula a outra se a primeira célula armazena uma fórmula que usa o valor na segunda célula deve ser um gráfico acíclico direcionado. Ciclos de dependências não são permitidos porque fazem com que as células envolvidas no ciclo não tenham um valor bem definido. Além disso, exigir que as dependências sejam acíclicas permite que uma ordem topológica seja usada para agendar os recálculos dos valores das células quando a planilha é alterada.
  • Usando o DAG, podemos escrever algoritmos para avaliar os cálculos na ordem correta.

EDIT:

  • A ordem da avaliação das células da fórmula ao recalcular os valores da fórmula nas planilhas pode ser feita usando DAGs
  • O Git usa DAGs para armazenamento de conteúdo, ponteiros de referência para cabeças, representação de modelo de objeto e protocolo remoto.
  • Os DAGs são usados ​​no planejamento de rastreamento: a primeira abordagem prática para planejamento global, o planejamento de rastreamento tenta otimizar o caminho do fluxo de controle que é executado com mais freqüência.
  • Ecto é uma estrutura de processamento e usa o DAG para modelar gráficos de processamento, para que os gráficos executem a execução síncrona ordenada. Plasm em Ecto é o DAG e o Scheduler opera nele.
  • Os DAGs são usados ​​no pipelining de software, que é uma técnica usada para otimizar loops, de maneira semelhante ao pipelining de hardware.

Bons recursos:

Md Mahbubur Rahman
fonte
11
Sem loops? Eu pensaria que, enquanto um loop terminar, ele deve se qualificar. Em vez de ser A -> B -> C, pode ir A -> B -> A1 -> B1 -> A2 -> B2 -> C. Cíclico em um sentido, mas não em outro. Mais como uma espiral do que um círculo.
GlenPeterson
@GlenPeterson, sim, você está certo. Eu editei minha resposta. Obrigado por comentar. :)
Md Mahbubur Rahman
Ainda não pense que "Linha Reta" é necessário. O 'G' no DAG significa Graph. Confira minha resposta abaixo. Desculpe por não ter lido a sua com bastante atenção antes de responder, mas marquei sua resposta com +1 por sua abrangência e nível geral de iluminação.
GlenPeterson
@GlenPeterson, desculpe por erro. Eu atualizei minha resposta. Eu também gosto da sua resposta. Então, marquei +1 na sua resposta.
Md Mahbubur Rahman
3
Obrigado pelo seu +1. Eu ainda acho que todo o código é DAG, não limitado a expressões aritméticas. E / S, exceções, interações de processo múltiplo e interrupções de hardware são apenas outros nós de início ou fim de um gráfico direcionado (porque são de início ou fim), acíclico (sem loops infinitos) (conjunto finito de pares de nós ordenados) . Um acompanhamento interessante da pergunta de Ricky pode ser: "Existe algum código correto e funcional que não seja um DAG"? Eu acho que a resposta é "Não", mas ficaria feliz em ter alguém que me prove estar errado.
GlenPeterson
12

A resposta é que isso não tem muito a ver com programação. Tem a ver com resolução de problemas.

Assim como as listas vinculadas são estruturas de dados usadas para determinadas classes de problemas, os gráficos são úteis para representar certos relacionamentos. Listas, árvores, gráficos e outras estruturas abstratas vinculadas têm apenas uma conexão com a programação, na qual você pode implementá-las no código. Eles existem em um nível mais alto de abstração. Não se trata de programação, é de aplicar estruturas de dados na solução de problemas.

Se você ainda deseja alguma relação com a programação, considere os seguintes pontos:

  • O DAG (conhecido como espera por gráficos - detalhes mais técnicos ) é útil na detecção de conflitos, pois ilustra as dependências entre um conjunto de processos e recursos (ambos são nós no DAG). O conflito aconteceria quando um ciclo fosse detectado.
  • Depois de ter o DAG na memória, você pode escrever algoritmos para:
    • verifique se os cálculos são avaliados na ordem correta ( classificação topológica )
    • se os cálculos puderem ser feitos em paralelo, mas cada cálculo tiver um tempo máximo de execução, você poderá calcular o tempo máximo de execução de todo o conjunto
Vaibhav Agarwal
fonte
11
Para mostrar novamente como isso está além do escopo da programação, pense em como você quadro as tabelas em um banco de dados relacional para analisar mentalmente o comprimento do caminho de uma tabela para outra, isso é o equivalente a usar mentalmente um DAG para determinar o desempenho de o seu modelo de dados
Jimmy Hoffa
6

Outras pessoas aplicaram o DAG aos dados, mas acho que é pelo menos tão aplicável (se não mais) ao código. Mahbubur R Aaman menciona isso, então realmente isso é mais um adendo à sua resposta do que uma resposta completa por si só.

Ocorre-me que qualquer programa de computador obrigatório que esteja livre de loops infinitos (obrigado @AndresF.) É um gráfico acíclico direcionado (DAG). Significando que os possíveis caminhos de execução do código são direcionados (primeiro isso, depois aquilo) e acíclicos (não formando loops infinitos). Eles são um gráfico porque o caminho através de qualquer código significativo raramente é tão simples quanto uma lista ou uma árvore.

Trabalhei em XSLT por talvez 4 anos. Eu tive um tempo terrível tentando explicar por que não era uma boa linguagem de programação de uso geral, mas o DAG é o motivo. Especificamente, XSLT é uma linguagem orientada a dados. Você define funções (sim, no sentido de programação funcional), mas não necessariamente as chama no seu código. Em vez disso, o XSLT configura uma combinação de seleção e iteração através dos nós de um documento XML de entrada. Isso permite que a estrutura dos dados de entrada determine quais funções são chamadas e em que ordem.

Isso foi muito interessante e interessante até que seu programa encontrou uma condição de dados que você não testou às 2:30 da manhã e teve que acordar e corrigi-lo. Quando você deixa os dados definirem o DAG, a definição do DAG se torna todas as condições de entrada possíveis - o que para qualquer aplicativo de negócios não trivial está além de incalculável; eles são inimagináveis.

No começo, eu pensei que a programação funcional pode não ser um DAG, porque a ordem de execução às vezes não é clara ou até é pensada pelo programador. Mas um programa funcional define dependências. De fato, a natureza declarativa da programação funcional pode ser considerada como definindo apenas dependências (a ^ 2 = b ^ 2 + c ^ 2) sem especificar a ordem de execução (não importa se 'b' ou 'c' é quadrado primeiro , desde que os dois sejam ao quadrado antes de serem adicionados juntos).

Mas, embora a programação funcional possa ser deliberadamente vaga sobre a ordem das operações em um nível detalhado, é extremamente clara sobre as dependências. Esses são os próprios recursos que o tornam tão favorável à concorrência. De qualquer forma, ainda existe um gráfico de caminhos através do código, e esse gráfico ainda é direcionado (as dependências devem ser avaliadas antes das tarefas dependentes), então acho que o DAG se aplica a ele também.

Boa pergunta - obrigado por postar!

GlenPeterson
fonte
11
Este programa imperativo é um DAG na sua opinião while (true) { print("hi"); }:? Talvez você queira excluir programas que não terminam?
18713 Andres F.
5

Atualmente, o DAG é subestimado na programação. Historicamente, muitas coisas relacionadas ao desenvolvimento foram feitas com árvores e hierarquias, porque mover algo em uma caixa é conveniente para o nosso cérebro tornar coisas complexas mais fáceis de gerenciar. Mas se você observar os eventos e como eles dependem de outros eventos e estados, receberá o DAG porque qualquer coisa em nossa vida e no programa pode depender de qualquer coisa no passado, mas não no futuro, para que você fique perfeitamente "acíclico" relações a serem aplicáveis ​​ao conceito DAG. Embora isso raramente seja usado explicitamente no desenvolvimento, ter isso em mente ajudaria a entender melhor as coisas

Maksee
fonte
2

Gostaria de saber qual é a vantagem do Plasm no Ecto ...

O DAG pode ser usado para modelar uma coleção de tarefas em uma sequência com a restrição de que determinadas tarefas devem ser realizadas antes das outras. Ecto é uma estrutura de processamento e usa o DAG para modelar gráficos de processamento, para que os gráficos executem a execução síncrona ordenada. Plasm in Ecto é o DAG e o Scheduler opera nele.

em que outras situações podemos explorar o conceito de DAG?

  • O DAWG é uma estrutura de dados que representa um conjunto de cadeias e permite uma operação de consulta que testa se uma determinada cadeia pertence ao conjunto no tempo proporcional ao seu comprimento.
  • O Git usa DAGs para armazenamento de conteúdo, ponteiros de referência para cabeças, representação de modelo de objeto e protocolo remoto.
theD
fonte
Embora tenha sido um longo tempo ... mas acho que essa resposta realmente me ajuda a entender o espírito do ecto. Tem que apontar isso. Obrigado!
Po-Jen Lai
0

Como um exemplo do mundo real, nosso software é semelhante a um IDE, no qual o usuário final pode definir uma série de operações a serem executadas em uma imagem (inspeção da visão por máquina). Essas inspeções podem ter dependências de outras inspeções ou podem ter inspeções dependentes delas. Como tudo isso é configurável pelo usuário final, não podemos fazer otimizações para o processamento paralelo em tempo de design. Ao representar essas inspeções e dependências como um DAG, podemos otimizar o paralelismo da inspeção geral para obter o máximo desempenho em tempo de execução.

Dave Nay
fonte
-1

Apenas para outro exemplo, as regras de gerenciamento de memória nos aplicativos Cocoa são feitas para que todas as referências fortes formem um gráfico acíclico direcionado, o que é feito para garantir a ausência de vazamentos.

millenomi
fonte
-2

Adicionando outra resposta, como não vi uma referência para criar sistemas como o makeque usa o DAG para descobrir dependências para construção.

Mais detalhes aqui

dlmeetei
fonte
Eu disse alguma coisa errada, por que foi
rebaixada
Você respondeu uma pergunta bastante antiga com uma resposta bastante ruim. Se você está tentado a escrever uma resposta que é "adicionar isso porque ninguém mais a mencionou ..." e tem apenas uma única frase, essa não é uma resposta boa. Tente responder totalmente à pergunta e explicar como o aplicativo usa um DAG, como esse design funciona e por que isso foi escolhido em relação a outras opções. Idealmente, vários parágrafos valem conteúdo.
Ok, deixe-me elaborar mais tarde.
dlmeetei 02/02
Ok, em vez de repetir, apenas atualizado com um link que detalha como ele está sendo usado em ferramentas comomake
dlmeetei
Os links têm o hábito desagradável de ficar obsoleto ou falhar. Se isso acontecer, você estará de volta onde começou - uma resposta curta de uma linha que não ajuda muito. Você pode resumir o conteúdo do link para que esta resposta possa ser autônoma? (Mantenha o link, apenas verifique se a resposta é boa mesmo sem o link).
Dan Pichelman 04/02