¿Cuándo usar DAG (gráfico acíclico dirigido) en la programación?


37

Recientemente encontré un marco llamado ecto .

En este marco, un componente básico llamado "plasma" , que es el gráfico acíclico dirigido ecto. En ecto, el plasma puede ser operado por el programador ecto.

Me pregunto cuál es la ventaja de este mecanismo y en qué otras situaciones podemos explotar el concepto de DAG.


66
La mayoría de los sistemas de gestión de control de origen implementan las revisiones como un DAG.
Oded

1
La planificación es toda una rama de problemas que se ocupa mucho de DAG .
TC1

1
Muchas cosas que se representan como árboles, realmente deberían representarse como DAG cuando se tienen en cuenta los casos extremos extraños pero aún algo comunes.
Joachim Sauer

@JoachimSauer, por ejemplo, sistemas de archivos con enlaces duros
jk.

Respuestas:


29

Buena pregunta.

  • El código puede estar representado por un DAG que describe las entradas y salidas de cada una de las operaciones aritméticas realizadas dentro del código; Esta representación permite que el compilador realice la eliminación de subexpresiones comunes de manera eficiente.
  • La mayoría de los sistemas de gestión de control de origen implementan las revisiones como un DAG.
  • Varios lenguajes de programación describen sistemas de valores que están relacionados entre sí mediante un gráfico acíclico dirigido. Cuando un valor cambia, sus sucesores se recalculan; cada valor se evalúa en función de sus predecesores en el DAG.
  • Los DAG son útiles para detectar puntos muertos ya que ilustran las dependencias entre un conjunto de procesos y recursos.
  • En muchos algoritmos aleatorios en geometría computacional, el algoritmo mantiene un historial DAG que representa características de alguna construcción geométrica que han sido reemplazadas por características posteriores de escala más fina; Las consultas de ubicación de puntos se pueden responder, como para las dos estructuras de datos anteriores, siguiendo las rutas en este DAG.
  • Una vez que tenemos el DAG en la memoria, podemos escribir algoritmos para calcular el tiempo máximo de ejecución de todo el conjunto.
  • Al programar sistemas de hojas de cálculo, el gráfico de dependencia que conecta una celda a otra si la primera celda almacena una fórmula que usa el valor en la segunda celda debe ser un gráfico acíclico dirigido. Los ciclos de dependencias no se permiten porque hacen que las celdas involucradas en el ciclo no tengan un valor bien definido. Además, al requerir que las dependencias sean acíclicas, se puede usar un orden topológico para programar el recálculo de los valores de las celdas cuando se cambia la hoja de cálculo.
  • Usando DAG podemos escribir algoritmos para evaluar los cálculos en el orden correcto.

EDITAR:

  • El pedido de la evaluación de celda de fórmula cuando se vuelven a calcular los valores de fórmula en hojas de cálculo se puede hacer con DAG
  • Git usa DAG para el almacenamiento de contenido, punteros de referencia para cabezas, representación de modelo de objetos y protocolo remoto.
  • Los DAG se utilizan en la programación de seguimiento: el primer enfoque práctico para la programación global, la programación de seguimiento intenta optimizar la ruta de flujo de control que se ejecuta con mayor frecuencia.
  • Ecto es un marco de procesamiento y utiliza DAG para modelar gráficos de procesamiento para que los gráficos realicen una ejecución síncrona ordenada. El plasma en Ecto es el DAG y el Programador opera en él.
  • DAG se utiliza en la canalización de software, que es una técnica utilizada para optimizar los bucles, de manera paralela a la canalización de hardware.

Buenos recursos:


1
No hay bucles? Creo que mientras un ciclo finalice, debería calificar. En lugar de ser A -> B -> C, podría ir A -> B -> A1 -> B1 -> A2 -> B2 -> C. Cíclico en un sentido, pero no en otro. Más como una espiral que un círculo.
GlenPeterson

@GlenPeterson, sí, tienes razón. He editado mi respuesta. Gracias por comentar. :)
Md Mahbubur Rahman

Todavía no creo que sea necesaria una "línea recta". La 'G' en DAG significa Gráfico. Mira mi respuesta a continuación. Lo siento, no leí la tuya con suficiente atención antes de responder, pero hice +1 en tu respuesta por tu integridad y nivel general de iluminación.
GlenPeterson

@GlenPeterson, perdón por error. He actualizado mi respuesta. También me gusta tu respuesta. Entonces hizo +1 a su respuesta.
Md Mahbubur Rahman

3
Gracias por tu +1. Todavía creo que todo el código es DAG, no limitado a expresiones aritméticas. Las E / S, las excepciones, las interacciones multiproceso y las interrupciones de hardware son solo otros nodos de inicio o fin en un Gráfico Dirigido (porque son de inicio o fin), Acíclico (sin bucles infinitos) (conjunto finito de pares de nodos ordenados) . Un seguimiento interesante a la pregunta de Ricky podría ser: "¿Hay algún código correcto y que funcione que no sea un DAG"? Creo que la respuesta es "No", pero estaría encantado de que alguien demuestre que estoy equivocado.
GlenPeterson

12

La respuesta es que no tiene mucho que ver con la programación. Tiene que ver con la resolución de problemas.

Al igual que las listas enlazadas son estructuras de datos utilizadas para ciertas clases de problemas, los gráficos son útiles para representar ciertas relaciones. Las listas enlazadas, los árboles, los gráficos y otras estructuras abstractas solo tienen una conexión con la programación, ya que puede implementarlas en código. Existen en un nivel superior de abstracción. No se trata de programar, se trata de aplicar estructuras de datos en la solución de problemas.

Si aún desea alguna relación con la programación, considere los siguientes puntos:

  • DAG (conocido como Wait-For-Graphs - más detalles técnicos ) son útiles para detectar puntos muertos ya que ilustran las dependencias entre un conjunto de procesos y recursos (ambos son nodos en el DAG). El punto muerto ocurriría cuando se detecta un ciclo.
  • Una vez que tenga el DAG en la memoria, puede escribir algoritmos para:
    • asegúrese de que los cálculos se evalúen en el orden correcto ( clasificación topológica )
    • Si los cálculos se pueden hacer en paralelo, pero cada cálculo tiene un tiempo de ejecución máximo, puede calcular el tiempo de ejecución máximo de todo el conjunto

1
Para mostrar de nuevo cómo eso está más allá del alcance de la programación sola, piense en cómo coloca las tablas en una base de datos relacional para analizar mentalmente la longitud de la ruta de una tabla a otra, esto es el equivalente a usar mentalmente un DAG para determinar el rendimiento de su modelo de datos
Jimmy Hoffa

6

Otras personas han aplicado DAG a los datos, pero creo que es al menos tan aplicable (si no más) al código. Mahbubur R. Aaman menciona esto, así que realmente es más una adición a su respuesta que una respuesta completa por sí sola.

Se me ocurre que cualquier programa informático imperativo que esté libre de bucles infinitos (gracias @AndresF.) Es un Gráfico Acíclico Dirigido (DAG). Lo que significa que las posibles rutas de ejecución del código son dirigidas (primero esto, luego aquello) y acíclicas (sin formar bucles infinitos). Son un gráfico porque la ruta a través de cualquier código significativo rara vez es tan simple como una lista o un árbol.

Trabajé en XSLT por unos 4 años. Tuve un momento terrible tratando de explicar por qué no era un buen lenguaje de programación de propósito general, pero DAG es la razón. Específicamente, XSLT es un lenguaje basado en datos. Define funciones (sí, en el sentido de la programación funcional) pero no necesariamente llama a estas funciones desde su código. Por el contrario, XSLT establece una combinación de selección e iteración a través de los nodos de un documento XML de entrada. Esto permite que la estructura de los datos de entrada determine qué funciones se llaman y en qué orden.

Esto fue muy interesante y genial hasta que su programa encontró una condición de datos que no probó a las 2:30 a.m. y tuvo que despertarse y arreglarlo. Cuando deja que los datos definan el DAG, la definición del DAG se convierte en todas las condiciones de entrada posibles, que para cualquier aplicación comercial no trivial son más que incalculables; Son inimaginables.

Al principio, pensé que la programación funcional puede no ser un DAG porque el orden de ejecución a veces no es claro, ni siquiera pensado por el programador. Pero un programa funcional sí define dependencias. De hecho, la naturaleza declarativa de la programación funcional podría considerarse como la definición de solo dependencias (a ^ 2 = b ^ 2 + c ^ 2) sin especificar el orden de ejecución (no importa si 'b' o 'c' se cuadran primero , siempre que ambos estén al cuadrado antes de sumarlos).

Pero aunque la programación funcional puede ser deliberadamente vaga sobre el orden de las operaciones a un nivel detallado, es exquisitamente clara sobre las dependencias. Estas son las características que lo hacen tan susceptible a la concurrencia. En cualquier caso, todavía hay un gráfico de rutas a través del código, y ese gráfico todavía está dirigido (las dependencias deben evaluarse antes de las tareas dependientes), por lo que creo que DAG también se aplica allí.

Buena pregunta: ¡gracias por publicar!


1
¿Es este programa imperativo un DAG en su opinión while (true) { print("hi"); }? ¿Quizás quiera excluir los programas que no terminan?
Andres F.

5

Actualmente DAG está subestimado en la programación. Históricamente, muchas cosas relacionadas con el desarrollo se hicieron con árboles y jerarquías porque mover algo en una caja es conveniente para que nuestro cerebro haga que las cosas complejas sean más fáciles de manejar. Pero si observa los eventos y cómo dependen de otros eventos y estados, obtendrá DAG porque cualquier cosa en nuestra vida y en el programa puede depender de cualquier cosa en el pasado pero no en el futuro, por lo que sería perfectamente "acíclico". Las relaciones deben ser aplicables al concepto DAG. Aunque esto rara vez se usa explícitamente en el desarrollo, tener esto en mente ayudaría a comprender mejor las cosas


2

Me pregunto cuál es la ventaja de Plasm en Ecto ...

DAG se puede usar para modelar una colección de tareas en una secuencia con la restricción de que ciertas tareas deben realizarse antes que las demás. Ecto es un marco de procesamiento y utiliza DAG para modelar gráficos de procesamiento para que los gráficos realicen una ejecución síncrona ordenada. El plasma en Ecto es el DAG y el Programador opera en él.

¿En qué otras situaciones podemos explotar el concepto de DAG?

  • DAWG es una estructura de datos que representa un conjunto de cadenas y permite una operación de consulta que prueba si una cadena dada pertenece al conjunto en un tiempo proporcional a su longitud.
  • Git usa DAG para el almacenamiento de contenido, punteros de referencia para cabezas, representación de modelo de objetos y protocolo remoto.

Aunque ha pasado mucho tiempo ... pero creo que esta respuesta realmente me ayuda a comprender el espíritu de ecto. Tengo que señalarlo. ¡Gracias!
Po-Jen Lai

0

Como ejemplo del mundo real, nuestro software es similar a un IDE donde el usuario final puede definir una serie de operaciones que se realizarán en una imagen (inspección por visión artificial). Estas inspecciones pueden tener dependencias de otras inspecciones o pueden tener inspecciones que dependen de ellas. Como todo esto es configurable por el usuario final, no podemos hacer optimizaciones para el procesamiento paralelo en tiempo de diseño. Al representar estas inspecciones y dependencias como un DAG, podemos optimizar el paralelismo de la inspección general para obtener el máximo rendimiento en tiempo de ejecución.


-1

Solo por otro ejemplo, las reglas de administración de memoria en las aplicaciones de Cocoa están hechas para que todas las referencias fuertes formen un gráfico acíclico dirigido, que se hace para garantizar la ausencia de fugas.


-2

Agregando otra respuesta, ya que no he visto una referencia a los sistemas de compilación, como el makeque usa DAG para descubrir las dependencias para la construcción.

Más detalles aquí


¿Dije algo malo, por qué se
votó a favor

Rechazaste una pregunta bastante antigua con una respuesta bastante pobre. Si está tentado a escribir una respuesta que es "agregar esto porque nadie más lo mencionó ..." y tiene una sola oración, no es una buena respuesta. Intente responder completamente a la pregunta y explique cómo la aplicación usa un DAG, y cómo funciona este diseño, y por qué se eligió eso sobre otras opciones. Idealmente, varios párrafos de contenido.

Ok, déjame elaborarlo más tarde
dlmeetei

Ok, en lugar de repetir, acabo de actualizar con un enlace que detalla cómo se está utilizando en herramientas comomake
dlmeetei

Los enlaces tienen la mala costumbre de quedar obsoletos o fallar. Si eso sucede, está de vuelta donde comenzó: una respuesta breve de una línea que no ayuda mucho. ¿Puedes resumir el contenido del enlace para que esta respuesta pueda sostenerse por sí sola? (Mantenga el enlace, solo asegúrese de que la respuesta sea buena incluso sin el enlace).
Dan Pichelman
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.