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?
algorithms
data-structures
frameworks
graph
Po-Jen Lai
fonte
fonte
Respostas:
Boa pergunta.
EDIT:
Bons recursos:
fonte
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:
fonte
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!
fonte
while (true) { print("hi"); }
:? Talvez você queira excluir programas que não terminam?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
fonte
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.
fonte
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.
fonte
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.
fonte
Adicionando outra resposta, como não vi uma referência para criar sistemas como o
make
que usa o DAG para descobrir dependências para construção.Mais detalhes aqui
fonte
make