Mein Verständnis des Problems, wie es ursprünglich angegeben und dann durch Kommentare unter Mackes Antwort aktualisiert wurde, umfasst Folgendes: 1) Beide Kantentypen (Abhängigkeiten und Konflikte) sind gerichtet. 2) wenn zwei Knoten durch eine Kante verbunden sind, dürfen sie nicht durch eine andere verbunden werden, auch wenn es sich um einen anderen Typ handelt oder umgekehrt; 3) Wenn ein Pfad zwischen zwei Knoten konstruiert werden kann, indem Kanten verschiedener Typen gemischt werden, ist dies eher ein Fehler als ein Umstand, der ignoriert wird. 4) Wenn es einen Pfad zwischen zwei Knoten gibt, die Kanten eines Typs verwenden, gibt es möglicherweise keinen anderen Pfad zwischen ihnen, wenn Kanten des anderen Typs verwendet werden. 5) Zyklen eines einzelnen Kantentyps oder gemischter Kantentypen sind nicht zulässig (nach einer Schätzung der Anwendung bin ich nicht sicher, ob Konfliktzyklen ein Fehler sind, aber diese Bedingung kann entfernt werden, wenn dies nicht der Fall ist.)
Weiterhin gehe ich davon aus, dass die verwendete Datenstruktur Verstöße gegen diese Anforderungen nicht verhindert (zum Beispiel könnte ein Graph, der die Bedingung 2 verletzt, nicht in einer Abbildung von Knotenpaar zu (Typ, Richtung) ausgedrückt werden, wenn das Knotenpaar immer hat zuerst den Knoten mit der niedrigsten Nummer.) Wenn bestimmte Fehler nicht ausgedrückt werden können, wird die Anzahl der zu berücksichtigenden Fälle verringert.
Tatsächlich gibt es drei Diagramme, die hier betrachtet werden können: die zwei mit ausschließlich einem Kantentyp und das gemischte Diagramm, das durch die Vereinigung von einem der beiden Typen gebildet wird. Auf diese Weise können Sie systematisch alle Diagramme bis zu einer bestimmten Anzahl von Knoten erstellen. Erzeugen Sie zunächst alle möglichen Graphen von N Knoten mit nicht mehr als einer Kante zwischen zwei geordneten Knotenpaaren (geordnete Paare, da es sich um gerichtete Graphen handelt). Nehmen Sie nun alle möglichen Paare dieser Graphen, von denen eines Abhängigkeiten und das andere Konflikte darstellt, und bilden die Vereinigung jedes Paares.
Wenn Ihre Datenstruktur Verstöße gegen Bedingung 2 nicht ausdrücken kann, können Sie die zu berücksichtigenden Fälle erheblich reduzieren, indem Sie nur alle möglichen Konfliktdiagramme erstellen, die in die Bereiche der Abhängigkeitsdiagramme passen, oder umgekehrt. Andernfalls können Sie Verstöße gegen Bedingung 2 beim Bilden der Vereinigung erkennen.
Beim Durchlaufen des kombinierten Graphen vom ersten Knoten an können Sie die Menge aller Pfade zu jedem erreichbaren Knoten erstellen und dabei nach Verstößen gegen alle Bedingungen suchen (für die Zykluserkennung können Sie dies tun) benutze Tarjans Algorithmus .)
Sie müssen nur Pfade vom ersten Knoten berücksichtigen, auch wenn das Diagramm nicht verbunden ist, da Pfade von jedem anderen Knoten in einem anderen Fall als Pfade vom ersten Knoten angezeigt werden.
Wenn Pfade mit gemischten Kanten einfach ignoriert werden können, anstatt Fehler zu sein (Bedingung 3), ist es ausreichend, die Abhängigkeits- und Konfliktdiagramme unabhängig voneinander zu betrachten und zu überprüfen, ob ein Knoten in einem erreichbar ist, der andere nicht.
Wenn Sie sich an die Pfade erinnern, die beim Untersuchen von Diagrammen von N-1-Knoten gefunden wurden, können Sie diese als Ausgangspunkt für das Generieren und Auswerten von Diagrammen von N-Knoten verwenden.
Dadurch werden nicht mehrere Kanten desselben Typs zwischen Knoten generiert, es kann jedoch eine Erweiterung vorgenommen werden. Dies würde jedoch die Anzahl der Fälle stark erhöhen. Es wäre daher besser, wenn der getestete Code es unmöglich machen würde, alle derartigen Fälle im Voraus darzustellen, oder wenn dies nicht der Fall wäre.
Der Schlüssel zum Schreiben eines solchen Orakels besteht darin, es so einfach wie möglich zu halten, auch wenn dies ineffizient bedeutet, damit Sie Vertrauen in es aufbauen können (idealerweise durch Argumente für seine Richtigkeit, die durch Tests gestützt werden).
Sobald Sie über die Mittel verfügen, um Testfälle zu generieren, und Sie darauf vertrauen, dass das von Ihnen erstellte Orakel die guten von den schlechten trennt, können Sie damit das automatisierte Testen des Zielcodes vorantreiben. Wenn dies nicht möglich ist, können Sie die Ergebnisse am besten nach Einzelfällen durchsuchen. Das Orakel kann die gefundenen Fehler klassifizieren und Ihnen einige Informationen zu den akzeptierten Fällen geben, z. B. die Anzahl und Länge der Pfade jedes Typs und ob sich am Anfang beider Pfadtypen Knoten befinden könnte Ihnen helfen, nach Fällen zu suchen, die Sie vorher nicht gesehen haben.