web-dev-qa-db-fra.com

Quand utiliser DAG (Directed Acyclic Graph) dans la programmation?

J'ai récemment trouvé un framework nommé ecto .

Dans ce cadre, un composant de base nommé "plasm" , qui est le graphique acyclique dirigé ecto. Dans ecto, le plasma peut être exploité par l'ecto scheduler.

Je me demande quel est l'avantage de ce mécanisme, et dans quelles autres situations peut-on exploiter le concept de DAG?

38
Po-Jen Lai

Belle question.

  • Le code peut être représenté par un DAG décrivant les entrées et sorties de chacune des opérations arithmétiques effectuées dans le code; cette représentation permet au compilateur d'effectuer efficacement l'élimination de la sous-expression commune.
  • La plupart des systèmes de gestion du contrôle des sources implémentent les révisions en tant que DAG.
  • Plusieurs langages de programmation décrivent des systèmes de valeurs qui sont liés les uns aux autres par un graphe acyclique dirigé. Lorsqu'une valeur change, ses successeurs sont recalculés; chaque valeur est évaluée en fonction de ses prédécesseurs dans le DAG.
  • Les DAG sont pratiques pour détecter les blocages car ils illustrent les dépendances entre un ensemble de processus et de ressources.
  • Dans de nombreux algorithmes randomisés en géométrie de calcul, l'algorithme conserve un historique DAG représentant les caractéristiques de certaines constructions géométriques qui ont été remplacées par des caractéristiques plus fines à une échelle ultérieure; les questions de localisation de points peuvent être répondues, comme pour les deux structures de données ci-dessus, en suivant les chemins dans ce DAG.
  • Une fois que nous avons le DAG en mémoire, nous pouvons écrire des algorithmes pour calculer le temps d'exécution maximum de l'ensemble entier.
  • Lors de la programmation de systèmes de feuille de calcul, le graphique de dépendance qui connecte une cellule à une autre si la première cellule stocke une formule qui utilise la valeur dans la deuxième cellule doit être un graphique acyclique dirigé. Les cycles de dépendances sont interdits car ils empêchent les cellules impliquées dans le cycle d'avoir une valeur bien définie. De plus, exiger que les dépendances soient acycliques permet d'utiliser un ordre topologique pour planifier les recalculs des valeurs des cellules lorsque la feuille de calcul est modifiée.
  • En utilisant DAG, nous pouvons écrire des algorithmes pour évaluer les calculs dans le bon ordre.

MODIFIER:

  • L'ordre de l'évaluation des cellules de formule lors du recalcul des valeurs de formule dans les feuilles de calcul peut être effectué à l'aide de DAG
  • Git utilise des DAG pour le stockage de contenu, des pointeurs de référence pour les têtes, la représentation du modèle d'objet et le protocole distant.
  • DAGs est utilisé lors de la planification de trace: la première approche pratique pour la planification globale, la planification de trace tente d'optimiser le chemin de flux de contrôle qui est exécuté le plus souvent.
  • Ecto est un framework de traitement et il utilise DAG pour modéliser les graphiques de traitement afin que les graphiques exécutent une exécution synchrone. Plasm in Ecto est le DAG et le planificateur fonctionne dessus.
  • Les DAG sont utilisés pour le pipelining logiciel, qui est une technique utilisée pour optimiser les boucles, d'une manière qui est parallèle au pipelining matériel.

Bonnes ressources:

30
Md Mahbubur Rahman

La réponse est que cela n'a pas grand-chose à voir avec la programmation. Cela a à voir avec la résolution de problèmes.

Tout comme les listes chaînées sont des structures de données utilisées pour certaines classes de problèmes, les graphiques sont utiles pour représenter certaines relations. Les listes, arborescences, graphiques et autres structures abstraites liées ont uniquement une connexion à la programmation dans la mesure où vous pouvez les implémenter dans du code. Ils existent à un niveau d'abstraction plus élevé. Il ne s'agit pas de programmation, il s'agit d'appliquer des structures de données pour résoudre des problèmes.

Si vous voulez toujours une relation avec la programmation, veuillez considérer les points suivants:

  • DAG (connu sous le nom de Wait-For-Graphs - plus détails techniques ) sont pratiques pour détecter les blocages car ils illustrent les dépendances entre un ensemble de processus et de ressources (les deux sont des nœuds dans le DAG). Un blocage se produirait lorsqu'un cycle est détecté.
  • Une fois le DAG en mémoire, vous pouvez écrire des algorithmes dans:
    • assurez-vous que les calculs sont évalués dans le bon ordre ( tri topologique )
    • si les calculs peuvent être effectués en parallèle mais que chaque calcul a un temps d'exécution maximum, vous pouvez calculer le temps d'exécution maximum de l'ensemble entier
13
Vaibhav Agarwal

D'autres personnes ont appliqué le DAG aux données, mais je pense qu'il est au moins aussi applicable (sinon plus) au code. Mahbubur R Aaman le mentionne, il s'agit donc plus d'un addendum à sa réponse que d'une réponse complète à elle seule.

Il me vient à l'esprit que tout programme informatique impératif qui est exempt de boucles infinies (merci @AndresF.) Est un graphique acyclique dirigé (DAG). Cela signifie que les chemins possibles d'exécution du code sont dirigés (d'abord ceci, puis cela), et acycliques (ne formant pas de boucles infinies). Ils sont un graphique car le chemin à travers un code significatif est rarement aussi simple qu'une liste ou un arbre.

J'ai travaillé dans XSLT pendant peut-être 4 ans. J'ai eu beaucoup de mal à expliquer pourquoi ce n'était pas un bon langage de programmation à usage général, mais DAG en est la raison. Plus précisément, XSLT est un langage piloté par les données. Vous définissez des fonctions (oui, au sens de la programmation fonctionnelle) mais vous n'appelez pas nécessairement ces fonctions à partir de votre code. XSLT définit plutôt une combinaison de sélection et d'itération dans les nœuds d'un document XML d'entrée. Cela permet à la structure des données d'entrée de déterminer quelles fonctions sont appelées et dans quel ordre.

C'était très intéressant et très cool jusqu'à ce que votre programme rencontre une condition de données que vous n'avez pas testée à 2h30 et que vous deviez vous réveiller et la réparer. Lorsque vous laissez les données définir le DAG, la définition du DAG devient toutes les conditions d'entrée possibles - qui, pour toute application métier non triviale, sont incalculables; ils sont inimaginables.

Au début, je pensais que la programmation fonctionnelle n'était peut-être pas un DAG car l'ordre d'exécution n'était parfois pas clair pour le programmeur, ni même envisagé par lui. Mais un programme fonctionnel définit des dépendances. En fait, la nature déclarative de la programmation fonctionnelle pourrait être considérée comme définissant uniquement les dépendances (a ^ 2 = b ^ 2 + c ^ 2) sans spécifier l'ordre d'exécution (peu importe si 'b' ou 'c' est au premier carré , tant qu'ils sont tous les deux au carré avant d'être additionnés).

Mais alors que la programmation fonctionnelle peut être délibérément vague sur l'ordre des opérations à un niveau détaillé, elle est extrêmement claire sur les dépendances. Ce sont ces mêmes caractéristiques qui le rendent si accessible à la concurrence. Dans tous les cas, il y a toujours un graphe de chemins à travers le code, et ce graphe est toujours dirigé (les dépendances doivent être évaluées avant les tâches dépendantes), donc je pense que DAG s'applique là aussi.

Belle question - merci d'avoir posté!

7
GlenPeterson

Actuellement, DAG est sous-estimé dans la programmation. Historiquement, beaucoup de choses liées au développement ont été faites avec des arbres et des hiérarchies parce que déplacer quelque chose dans une boîte est pratique pour notre cerveau pour rendre les choses complexes plus faciles à gérer. Mais si vous regardez les événements et comment ils dépendent d'autres événements et états, vous obtiendrez DAG parce que tout dans notre vie et dans le programme peut dépendre de tout dans le passé mais pas dans le futur, vous obtiendrez donc parfaitement "acyclique" relations à appliquer au concept DAG. Bien que cela soit rarement utilisé explicitement dans le développement, avoir cela à l'esprit aiderait à mieux comprendre les choses

6
Maksee

Je me demande quel est l'avantage de Plasm dans Ecto ...

DAG peut être utilisé pour modéliser une collection de tâches dans une séquence avec la contrainte que certaines tâches doivent être effectuées avant les autres. Ecto est un framework de traitement et il utilise DAG pour modéliser les graphes de traitement afin que les graphes ordonnent une exécution synchrone. Plasm in Ecto est le DAG et Scheduler fonctionne dessus.

dans quelles autres situations peut-on exploiter le concept de DAG?

  • DAWG est une structure de données qui représente un ensemble de chaînes et permet une opération de requête qui teste si une chaîne donnée appartient à l'ensemble en temps proportionnel à sa longueur.
  • Git utilise des DAG pour le stockage de contenu, des pointeurs de référence pour les têtes, la représentation du modèle d'objet et le protocole distant.
3
theD

À titre d'exemple réel, notre logiciel est similaire à un IDE où l'utilisateur final peut définir une série d'opérations à effectuer sur une image (inspection de vision industrielle). Ces inspections peuvent avoir des dépendances sur d'autres inspections ou dont les inspections peuvent dépendre. Étant donné que tout cela est configurable par l'utilisateur final, nous ne pouvons pas optimiser le traitement parallèle au moment de la conception. En représentant ces inspections et dépendances en tant que DAG, nous pouvons optimiser le parallélisme de l'inspection globale. pour des performances maximales au moment de l'exécution.

0
Dave Nay