La mia comprensione del problema, come inizialmente dichiarato e poi aggiornato dai commenti sotto la risposta di Macke, include quanto segue: 1) entrambi i tipi di bordo (dipendenze e conflitti) sono diretti; 2) se due nodi sono collegati da un lato, non devono essere collegati da un altro, anche se è dell'altro tipo o al contrario; 3) se un percorso tra due nodi può essere costruito mescolando i bordi di tipi diversi, allora questo è un errore, piuttosto che una circostanza che viene ignorata; 4) Se c'è un percorso tra due nodi usando i bordi di un tipo, allora potrebbe non esserci un altro percorso tra loro usando i bordi dell'altro tipo; 5) i cicli di tipo single edge o mixed edge non sono consentiti (da un'ipotesi dell'applicazione, non sono sicuro che i cicli di soli conflitti siano un errore, ma questa condizione può essere rimossa, in caso contrario.)
Inoltre, assumerò che la struttura dei dati utilizzata non impedisca di esprimere le violazioni di questi requisiti (ad esempio, un grafico che viola la condizione 2 non potrebbe essere espresso in una mappa dalla coppia di nodi a (tipo, direzione) se il nodo -pair ha sempre il nodo con il numero minimo.) Se alcuni errori non possono essere espressi, riduce il numero di casi da considerare.
Ci sono in realtà tre grafici che possono essere considerati qui: i due di un solo tipo di bordo e il grafico misto formato dall'unione di uno dei due tipi. È possibile utilizzare questo per generare sistematicamente tutti i grafici fino ad un certo numero di nodi. Prima genera tutti i possibili grafici di N nodi che non hanno più di un bordo tra due coppie di nodi ordinati (coppie ordinate perché questi sono grafici diretti). Prendi ora tutte le possibili coppie di questi grafici, uno che rappresenta le dipendenze e l'altro che rappresenta i conflitti, e formare l'unione di ogni coppia.
Se la struttura dei dati non può esprimere violazioni della condizione 2, è possibile ridurre significativamente i casi da considerare costruendo tutti i possibili grafici di conflitto che si adattano agli spazi dei grafici delle dipendenze o viceversa. Altrimenti, è possibile rilevare le violazioni della condizione 2 durante la formazione dell'unione.
Durante una traversata in ampiezza del grafico combinato dal primo nodo, puoi creare l'insieme di tutti i percorsi per ogni nodo raggiungibile e, mentre lo fai, puoi controllare le violazioni di tutte le condizioni (per il rilevamento del ciclo , puoi utilizzare l'algoritmo di Tarjan .)
Devi solo considerare i percorsi dal primo nodo, anche se il grafico è disconnesso, perché i percorsi di qualsiasi altro nodo appariranno come percorsi dal primo nodo in qualche altro caso.
Se i percorsi a bordo misto possono semplicemente essere ignorati, piuttosto che essere errori (condizione 3), è sufficiente considerare indipendentemente i grafici di dipendenza e conflitto e verificare che se un nodo è raggiungibile in uno, non è nel altro.
Se ricordi i percorsi trovati nell'esaminare i grafici dei nodi N-1, puoi usarli come punto di partenza per generare e valutare grafici di N nodi.
Questo non genera più spigoli dello stesso tipo tra i nodi, ma potrebbe essere esteso per farlo. Ciò tuttavia aumenterebbe notevolmente il numero di casi, quindi sarebbe meglio se il codice da testare rendesse impossibile rappresentarlo o, in caso contrario, filtrasse tutti questi casi in anticipo.
La chiave per scrivere un oracolo come questo è di mantenerlo il più semplice possibile, anche se ciò significa essere inefficienti, in modo da poter stabilire fiducia in esso (idealmente attraverso argomenti per la sua correttezza, supportati da test).
Una volta che hai i mezzi per generare casi di test, e ti fidi dell'oracolo che hai creato per separare accuratamente il bene dal male, puoi usare questo per guidare il test automatico del codice di destinazione. Se ciò non è fattibile, la tua prossima migliore opzione è quella di analizzare i risultati per casi distintivi. L'oracolo può classificare gli errori che trova e fornire alcune informazioni sui casi accettati, come il numero e la lunghezza dei percorsi di ciascun tipo e se ci sono nodi all'inizio di entrambi i tipi di percorso e questo potrebbe aiutarti a cercare casi che non hai mai visto prima.