Ma compréhension du problème, tel qu'indiqué à l'origine puis mis à jour par les commentaires sous la réponse de Macke, comprend les éléments suivants: 1) les deux types de bord (dépendances et conflits) sont dirigés; 2) si deux nœuds sont connectés par un bord, ils ne doivent pas être connectés par un autre, même s'il est de l'autre type ou inversé; 3) si un chemin entre deux nœuds peut être construit en mélangeant des bords de différents types, alors c'est une erreur, plutôt qu'une circonstance qui est ignorée; 4) S'il y a un chemin entre deux nœuds utilisant des bords d'un type, alors il ne peut pas y avoir un autre chemin entre eux utilisant des bords d'un autre type; 5) cycles de soit un seul type de bord ou types bord mixtes ne sont pas autorisés (à partir d'une estimation à l'application, je ne suis pas sûr que les cycles de conflit ne sont une erreur, mais cette condition peut être enlevé, sinon.)
De plus, je suppose que la structure de données utilisée n'empêche pas que des violations de ces exigences soient exprimées (par exemple, un graphique violant la condition 2 ne peut pas être exprimé dans une carte de la paire de nœuds à (type, direction) si la paire de nœuds est toujours a le noeud moins numéroté en premier.) Si certaines erreurs ne peuvent être exprimées, il réduit à considérer le nombre de cas.
Il y a en fait trois graphiques qui peuvent être considérés ici: les deux exclusivement un type de bord, et le graphique mixte formé par l'union d'un de chacun des deux types. Vous pouvez l'utiliser pour générer systématiquement tous les graphiques jusqu'à un certain nombre de nœuds. Générez d'abord tous les graphiques possibles de N nœuds n'ayant pas plus d'un bord entre deux paires ordonnées de nœuds (paires ordonnées car ce sont des graphiques dirigés.) Prenez maintenant toutes les paires possibles de ces graphiques, l'une représentant les dépendances et l'autre représentant les conflits, et former l'union de chaque paire.
Si votre structure de données ne peut pas exprimer les violations de la condition 2, vous pouvez réduire considérablement les cas à considérer en construisant uniquement tous les graphiques de conflit possibles qui tiennent dans les espaces des graphiques de dépendance, ou vice-versa. Dans le cas contraire, vous pouvez détecter les violations de l'état 2 tout en formant l'union.
Sur une traversée en largeur du graphique combiné à partir du premier nœud, vous pouvez créer l'ensemble de tous les chemins vers chaque nœud accessible et, ce faisant, vous pouvez vérifier les violations de toutes les conditions (pour la détection de cycle, vous pouvez utiliser l'algorithme de Tarjan .)
Il vous suffit de considérer les chemins du premier noeud, même si le graphique est déconnecté, car les chemins de tout autre noeud apparaissent comme les chemins du premier noeud dans un autre cas.
Si les chemins à bords mixtes peuvent simplement être ignorés, plutôt que d'être des erreurs (condition 3), il suffit de considérer les graphiques de dépendance et de conflit indépendamment et de vérifier que si un nœud est accessible dans l'un, il ne l'est pas dans l'autre.
Si vous vous rappelez les chemins trouvés dans l'examen des graphiques des nœuds N-1, vous pouvez les utiliser comme point de départ pour générer et graphiques évaluation des noeuds N.
Cela ne génère pas de multiples arêtes du même type entre les nœuds, mais il pourrait être étendu à le faire. Cela augmenter considérablement le nombre de cas cependant, il serait préférable que l'être de code testé a fait cette impossible de représenter ou, à défaut, filtré tous les cas au préalable.
La clé pour écrire un oracle comme celui-ci est de le garder aussi simple que possible, même si cela signifie être inefficace, afin que vous puissiez lui faire confiance (idéalement par le biais d'arguments pour son exactitude, étayés par des tests.)
Une fois que vous avez les moyens de générer des cas de test et que vous faites confiance à l'oracle que vous avez créé pour séparer avec précision le bon du mauvais, vous pouvez l'utiliser pour piloter le test automatisé du code cible. Si cela n'est pas possible, votre prochaine meilleure option consiste à passer en revue les résultats pour les cas distinctifs. L'oracle peut classer les erreurs qu'il trouve et vous donner des informations sur les cas acceptés, tels que le nombre et la longueur des chemins de chaque type, et s'il y a des nœuds au début des deux types de chemin, et cela pourrait vous aider à rechercher des cas que vous n'avez jamais vus auparavant.