Quando utilizzare DAG (Directed Acyclic Graph) nella programmazione?


37

Di recente ho trovato un framework chiamato ecto .

In questo framework, un componente di base chiamato "plasm" , che è il grafico aciclico diretto ecto. In ecto, il plasma può essere gestito dal programmatore ecto.

Mi chiedo quale sia il vantaggio di questo meccanismo e in quali altre situazioni possiamo sfruttare il concetto di DAG?


6
La maggior parte dei sistemi di gestione del controllo del codice sorgente implementa le revisioni come un DAG.
Oded,

1
Planning è un intero ramo di problemi che si occupa di DAG un sacco .
TC1

1
Molte cose che vengono rappresentate come alberi, in realtà dovrebbero essere rappresentate come DAG quando si tiene conto degli strani casi ancora comuni.
Joachim Sauer,

@JoachimSauer ad es. File system con hard link
jk.

Risposte:


29

Bella domanda.

  • Il codice può essere rappresentato da un DAG che descrive gli input e gli output di ciascuna delle operazioni aritmetiche eseguite all'interno del codice; questa rappresentazione consente al compilatore di eseguire in modo efficiente l'eliminazione della sottoespressione comune.
  • La maggior parte dei sistemi di gestione del controllo del codice sorgente implementa le revisioni come un DAG.
  • Diversi linguaggi di programmazione descrivono sistemi di valori correlati tra loro da un grafico aciclico diretto. Quando un valore cambia, i suoi successori vengono ricalcolati; ogni valore viene valutato in funzione dei suoi predecessori nel DAG.
  • I DAG sono utili nel rilevare deadlock in quanto illustrano le dipendenze tra una serie di processi e risorse.
  • In molti algoritmi randomizzati nella geometria computazionale, l'algoritmo mantiene un DAG storico che rappresenta le caratteristiche di alcune costruzioni geometriche che sono state sostituite da caratteristiche di scala più fine; è possibile rispondere alle query relative alla posizione dei punti, come per le due strutture dati precedenti, seguendo i percorsi in questo DAG.
  • Una volta che abbiamo il DAG in memoria, possiamo scrivere algoritmi per calcolare il tempo massimo di esecuzione dell'intero set.
  • Durante la programmazione di sistemi di fogli di calcolo, il grafico delle dipendenze che collega una cella all'altra se la prima cella memorizza una formula che utilizza il valore nella seconda cella deve essere un grafico aciclico diretto. I cicli di dipendenze non sono consentiti perché fanno sì che le celle coinvolte nel ciclo non abbiano un valore ben definito. Inoltre, richiedere che le dipendenze siano acicliche consente di utilizzare un ordine topologico per pianificare i ricalcoli dei valori delle celle quando si modifica il foglio di calcolo.
  • Usando DAG possiamo scrivere algoritmi per valutare i calcoli nell'ordine corretto.

MODIFICARE :

  • L'ordinamento della valutazione della cella formula durante la ricalcolo dei valori della formula nei fogli di calcolo può essere eseguito utilizzando i DAG
  • Git utilizza DAG per l'archiviazione del contenuto, puntatori di riferimento per testine, rappresentazione del modello a oggetti e protocollo remoto.
  • I DAG vengono utilizzati nella pianificazione della traccia: il primo approccio pratico per la pianificazione globale, la pianificazione della traccia tenta di ottimizzare il percorso del flusso di controllo che viene eseguito più spesso.
  • Ecto è un framework di elaborazione e utilizza DAG per modellare i grafici di elaborazione in modo che i grafici eseguano l'esecuzione sincrona ordinata. Plasm in Ecto è il DAG e Scheduler vi opera.
  • I DAG vengono utilizzati per il pipelining del software, che è una tecnica utilizzata per ottimizzare i loop, in modo che sia parallelo alle pipeline dell'hardware.

Buone risorse:


1
Nessun loop? Penserei che fino a quando un ciclo termina, dovrebbe qualificarsi. Invece di essere A -> B -> C, potrebbe andare A -> B -> A1 -> B1 -> A2 -> B2 -> C. Ciclico in un senso, ma non in un altro. Più come una spirale che un cerchio.
GlenPeterson,

@GlenPeterson, Sì, hai ragione. Ho modificato la mia risposta. Grazie per il commento :)
Md Mahbubur Rahman,

Ancora non credo che "Straight Line" sia necessario. La "G" in DAG sta per Graph. Dai un'occhiata alla mia risposta qui sotto. Mi dispiace di non aver letto abbastanza attentamente la tua prima di rispondere, ma ho fatto +1 sulla tua risposta per la tua completezza e il tuo livello generale di illuminazione.
GlenPeterson,

@GlenPeterson, Ci scusiamo per l'errore. Ho aggiornato la mia risposta. Mi piace anche la tua risposta. Quindi ho fatto +1 per la tua risposta.
Md Mahbubur Rahman,

3
Grazie per il tuo +1. Penso ancora che tutto il codice sia DAG, non limitato alle espressioni aritmetiche. I / O, eccezioni, interazioni multi-processo e interruzioni hardware sono tutti solo altri nodi di inizio o fine in un Diretto (perché sono inizio o fine), Grafico Aciclico (senza loop infiniti) (insieme finito di coppie ordinate di nodi) . Un interessante seguito alla domanda di Ricky potrebbe essere "Esiste un codice corretto e funzionante che non sia un DAG". Penso che la risposta sia "No", ma sarei felice di avere qualcuno che mi smentisca.
GlenPeterson,

12

La risposta è che non ha molto a che fare con la programmazione. Ha a che fare con la risoluzione dei problemi.

Proprio come gli elenchi collegati sono strutture di dati utilizzate per determinate classi di problemi, i grafici sono utili per rappresentare determinate relazioni. Elenchi collegati, alberi, grafici e altre strutture astratte hanno solo una connessione alla programmazione in quanto è possibile implementarli in codice. Esistono a un livello superiore di astrazione. Non si tratta di programmazione, si tratta di applicare strutture di dati alla soluzione di problemi.

Se vuoi ancora qualche relazione con la programmazione, ti preghiamo di considerare i seguenti punti:

  • Il DAG (noto come Wait-For-Graphs - ulteriori dettagli tecnici ) sono utili per rilevare deadlock in quanto illustrano le dipendenze tra un insieme di processi e risorse (entrambi sono nodi nel DAG). Il deadlock si verificherebbe quando viene rilevato un ciclo.
  • Una volta che hai il DAG in memoria, puoi scrivere algoritmi su:
    • assicurarsi che i calcoli siano valutati nell'ordine corretto ( ordinamento topologico )
    • se i calcoli possono essere eseguiti in parallelo ma ogni calcolo ha un tempo di esecuzione massimo, è possibile calcolare il tempo di esecuzione massimo dell'intero set

1
Per mostrare di nuovo come ciò esuli dall'ambito della programmazione da solo, pensa a come si lavano le tabelle in un database relazionale per analizzare mentalmente la lunghezza del percorso da una tabella all'altra, questo è l'equivalente dell'uso mentale di un DAG per determinare le prestazioni di il tuo modello di dati
Jimmy Hoffa,

6

Altre persone hanno applicato il DAG ai dati, ma penso che sia almeno applicabile (se non di più) al codice. Mahbubur R Aaman menziona questo, quindi in realtà questo è più un addendum alla sua risposta che una risposta completa da sola.

Mi viene in mente che qualsiasi programma imperativo di computer privo di loop infiniti (grazie a @AndresF.) È un Directed Acyclic Graph (DAG). Significa che i possibili percorsi di esecuzione del codice sono diretti (prima questo, poi quello) e aciclici (non formano loop infiniti). Sono un grafico perché il percorso attraverso qualsiasi codice significativo è raramente semplice come un elenco o un albero.

Ho lavorato in XSLT per forse 4 anni. Ho avuto un periodo terribile nel tentativo di spiegare perché non fosse un buon linguaggio di programmazione per scopi generali, ma DAG è la ragione. In particolare, XSLT è un linguaggio basato sui dati. Definisci le funzioni (sì, nel senso della programmazione funzionale) ma non le chiami necessariamente dal tuo codice. Piuttosto, XSLT imposta una combinazione di selezione e iterazione attraverso i nodi di un documento XML di input. Ciò consente alla struttura dei dati di input di determinare quali funzioni vengono chiamate e in quale ordine.

Questo è stato molto interessante e interessante fino a quando il tuo programma ha riscontrato una condizione di dati che non hai verificato alle 2:30 del mattino e che hai dovuto svegliarti e risolverlo. Quando si lascia che i dati definiscano il DAG, la definizione del DAG diventa tutte le possibili condizioni di input - che per qualsiasi applicazione aziendale non banale sono al di là incalcolabili; sono inimmaginabili.

All'inizio ho pensato che la programmazione funzionale potrebbe non essere un DAG perché l'ordine di esecuzione a volte non è chiaro o addirittura pensato dal programmatore. Ma un programma funzionale definisce le dipendenze. In effetti, la natura dichiarativa della programmazione funzionale potrebbe essere pensata come definizione delle sole dipendenze (a ^ 2 = b ^ 2 + c ^ 2) senza specificare l'ordine di esecuzione (non importa se 'b' o 'c' sia al primo posto al quadrato , purché siano entrambi quadrati prima di essere sommati).

Ma mentre la programmazione funzionale può essere deliberatamente vaga sull'ordine delle operazioni a un livello dettagliato, è estremamente chiara sulle dipendenze. Queste sono le caratteristiche che lo rendono così suscettibile alla concorrenza. In ogni caso, esiste ancora un grafico dei percorsi attraverso il codice e quel grafico è ancora diretto (le dipendenze devono essere valutate prima delle attività dipendenti), quindi penso che DAG si applichi anche lì.

Bella domanda - grazie per la pubblicazione!


1
È questo programma indispensabile un DAG secondo te: while (true) { print("hi"); }? Forse vuoi escludere programmi non terminanti?
Andres F.

5

Attualmente il DAG è sottovalutato nella programmazione. Storicamente molte cose legate allo sviluppo sono state fatte con alberi e gerarchie perché spostare qualcosa in una scatola è conveniente per il nostro cervello per rendere le cose complesse più facili da gestire. Ma se guardi gli eventi e come dipendono da altri eventi e stati, otterrai DAG perché qualsiasi cosa nella nostra vita e nel programma può dipendere da qualsiasi cosa nel passato ma non nel futuro, quindi diventeresti perfettamente "aciclico" relazioni da applicare al concetto di DAG. Anche se raramente viene utilizzato esplicitamente nello sviluppo, tenere presente ciò aiuterebbe a capire meglio le cose


2

Mi chiedo quale sia il vantaggio di Plasm in Ecto ...

DAG può essere utilizzato per modellare una raccolta di attività in una sequenza con il vincolo che determinate attività devono essere eseguite prima delle altre. Ecto è un framework di elaborazione e utilizza DAG per modellare i grafici di elaborazione in modo che i grafici eseguano l'esecuzione sincrona ordinata. Plasm in Ecto è il DAG e Scheduler vi opera.

in quali altre situazioni possiamo sfruttare il concetto di DAG?

  • DAWG è una struttura di dati che rappresenta un insieme di stringhe e consente un'operazione di query che verifica se una determinata stringa appartiene all'insieme in un tempo proporzionale alla sua lunghezza.
  • Git utilizza DAG per l'archiviazione del contenuto, puntatori di riferimento per testine, rappresentazione del modello a oggetti e protocollo remoto.

Anche se è passato molto tempo ... ma penso che questa risposta mi aiuti davvero a capire lo spirito di ecto. Devo sottolineare. Grazie!
Po-Jen Lai,

0

Come esempio nel mondo reale, il nostro software è simile a un IDE in cui l'utente finale può definire una serie di operazioni da eseguire su un'immagine (ispezione della visione artificiale). Queste ispezioni possono avere dipendenze da altre ispezioni o possono avere ispezioni dipendenti da esse. Poiché tutto ciò è configurabile dall'utente finale, al momento della progettazione non possiamo effettuare ottimizzazioni per l'elaborazione parallela. Rappresentando queste ispezioni e dipendenze come DAG, possiamo ottimizzare il parallelismo dell'ispezione complessiva per ottenere le massime prestazioni in fase di esecuzione.


-1

Solo per un altro esempio, le regole di gestione della memoria nelle app Cocoa sono fatte in modo che tutti i riferimenti forti formino un grafico aciclico diretto, fatto per garantire l'assenza di perdite.


-2

L'aggiunta di un'altra risposta non ha visto un riferimento per costruire sistemi come quelli makeche utilizzano DAG per scoprire le dipendenze per la costruzione.

Maggiori dettagli qui


Ho detto qualcosa di sbagliato, perché è stato
sottoposto a downgrade

Hai fatto rimbalzare una domanda piuttosto vecchia con una risposta piuttosto scadente. Se sei tentato di scrivere una risposta che sta "aggiungendo questo perché nessun altro l'ha menzionata ..." e hai solo una frase, non è una buona risposta. Prova a rispondere completamente alla domanda e a spiegare come l'applicazione utilizza un DAG, come funziona questo design e perché è stato scelto rispetto ad altre opzioni. Idealmente, diversi paragrafi valgono il contenuto.

Ok, lascia che lo elabori più tardi
dlmeetei,

Ok, invece di ripetere, appena aggiornato con un link che descrive in dettaglio come viene utilizzato in strumenti comemake
dlmeetei,

I collegamenti hanno la brutta abitudine di diventare stantii o falliti. Se ciò accade, sei tornato da dove hai iniziato: una breve risposta di una riga che non aiuta molto. Puoi riassumere i contenuti del link in modo che questa risposta possa essere autonoma? (Mantieni il link, assicurati solo che la risposta sia buona anche senza il link).
Dan Pichelman,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.