Mi comprensión del problema, como se declaró originalmente y luego se actualizó mediante comentarios en la respuesta de Macke, incluye lo siguiente: 1) ambos tipos de borde (dependencias y conflictos) están dirigidos; 2) si dos nodos están conectados por un borde, no deben estar conectados por otro, incluso si es del otro tipo o al revés; 3) si se puede construir una ruta entre dos nodos mezclando bordes de diferentes tipos, entonces eso es un error, en lugar de una circunstancia que se ignora; 4) Si hay una ruta entre dos nodos usando bordes de un tipo, entonces puede que no haya otra ruta entre ellos usando bordes del otro tipo; 5) los ciclos de un tipo de borde único o de tipos de borde mixto no están permitidos (por una suposición en la aplicación, no estoy seguro de que los ciclos de solo conflicto sean un error, pero esta condición se puede eliminar, de lo contrario).
Además, supondré que la estructura de datos utilizada no evita que se expresen violaciones de estos requisitos (por ejemplo, un gráfico que viola la condición 2 no podría expresarse en un mapa de nodo a par (tipo, dirección) si el par de nodos siempre tiene el nodo menos numerado primero.) Si no se pueden expresar ciertos errores, reduce el número de casos a considerar.
En realidad, hay tres gráficos que se pueden considerar aquí: los dos de un solo tipo de borde y el gráfico mixto formado por la unión de uno de cada uno de los dos tipos. Puede usar esto para generar sistemáticamente todos los gráficos hasta cierto número de nodos. Primero, genere todos los gráficos posibles de N nodos que no tengan más de un borde entre dos pares de nodos ordenados (pares ordenados porque son gráficos dirigidos). Ahora tome todos los pares posibles de estos gráficos, uno que representa dependencias y el otro que representa conflictos, y formar la unión de cada par.
Si su estructura de datos no puede expresar violaciones de la condición 2, puede reducir significativamente los casos a considerar construyendo solo todos los gráficos de conflicto posibles que quepan dentro de los espacios de los gráficos de dependencia, o viceversa. De lo contrario, puede detectar violaciones de la condición 2 mientras forma la unión.
En un recorrido transversal del gráfico combinado desde el primer nodo, puede construir el conjunto de todas las rutas a cada nodo accesible, y al hacerlo, puede verificar si hay violaciones de todas las condiciones (para la detección del ciclo, puede usa el algoritmo de Tarjan ).
Solo tiene que considerar las rutas del primer nodo, incluso si el gráfico está desconectado, porque las rutas de cualquier otro nodo aparecerán como rutas del primer nodo en algún otro caso.
Si las rutas de borde mixto pueden simplemente ignorarse, en lugar de ser errores (condición 3), es suficiente considerar las gráficas de dependencia y conflicto de forma independiente, y verificar que si un nodo es accesible en uno, no está en el otro.
Si recuerda las rutas que se encuentran al examinar gráficos de nodos N-1, puede usarlos como punto de partida para generar y evaluar gráficos de N nodos.
Esto no genera múltiples bordes del mismo tipo entre nodos, pero podría extenderse para hacerlo. Sin embargo, esto aumentaría en gran medida el número de casos, por lo que sería mejor si el código que se está probando hace que sea imposible de representar, o si falla, filtra todos los casos de antemano.
La clave para escribir un oráculo como este es mantenerlo lo más simple posible, incluso si eso significa ser ineficiente, de modo que pueda establecer confianza en él (idealmente a través de argumentos para su corrección, respaldado por pruebas).
Una vez que tenga los medios para generar casos de prueba, y confíe en el oráculo que ha creado para separar con precisión lo bueno de lo malo, puede usar esto para conducir las pruebas automatizadas del código objetivo. Si eso no es factible, su siguiente mejor opción es revisar los resultados para casos distintivos. El oráculo puede clasificar los errores que encuentra y proporcionarle información sobre los casos aceptados, como el número y la longitud de las rutas de cada tipo, y si hay nodos al comienzo de ambos tipos de ruta, y esto podría ayudarlo a buscar casos que no haya visto antes.