Moje rozumienie problemu, jak pierwotnie stwierdzono, a następnie zaktualizowano w komentarzach pod odpowiedzią Macke, obejmuje następujące elementy: 1) kierowane są oba typy krawędzi (zależności i konflikty); 2) jeżeli dwa węzły są połączone jedną krawędzią, nie mogą być połączone inną, nawet jeśli jest innego typu lub odwrotnie; 3) jeśli można zbudować ścieżkę między dwoma węzłami przez zmieszanie krawędzi różnych typów, wówczas jest to błąd, a nie okoliczność, która jest ignorowana; 4) Jeśli istnieje ścieżka między dwoma węzłami używającymi krawędzi jednego typu, wówczas może nie być innej ścieżki między nimi przy użyciu krawędzi drugiego typu; 5) cykle jednego typu krawędzi lub mieszane typy krawędzi są niedozwolone (na podstawie wniosku, nie jestem pewien, czy cykle tylko konfliktu są błędem, ale ten warunek można usunąć, jeśli nie).
Ponadto założę, że zastosowana struktura danych nie zapobiega wyrażaniu naruszeń tych wymagań (na przykład wykres 2 naruszający warunek nie mógłby zostać wyrażony na mapie od pary węzłów do (typ, kierunek), jeśli para węzłów zawsze ma najpierw najmniej numerowany węzeł.) Jeśli nie można wyrazić określonych błędów, zmniejsza liczbę przypadków do rozważenia.
W rzeczywistości można tu wziąć pod uwagę trzy wykresy: dwa wyłącznie jednego typu krawędzi i wykres mieszany utworzony przez połączenie jednego z każdego z dwóch typów. Możesz użyć tego do systematycznego generowania wszystkich wykresów do pewnej liczby węzłów. Najpierw wygeneruj wszystkie możliwe wykresy N węzłów mających nie więcej niż jedną krawędź między dowolnymi dwiema uporządkowanymi parami węzłów (uporządkowane pary, ponieważ są to wykresy ukierunkowane). Teraz weź wszystkie możliwe pary tych wykresów, jedna reprezentująca zależności, a druga reprezentująca konflikty, oraz tworzą związek każdej pary.
Jeśli twoja struktura danych nie jest w stanie wyrazić naruszenia warunku 2, możesz znacznie zmniejszyć przypadki, które należy wziąć pod uwagę, konstruując tylko wszystkie możliwe wykresy konfliktów, które mieszczą się w przestrzeniach wykresów zależności, i odwrotnie. W przeciwnym razie można wykryć naruszenia warunku 2 podczas tworzenia związku.
Podczas pierwszego przejścia połączonego wykresu z pierwszego węzła możesz zbudować zestaw wszystkich ścieżek do każdego osiągalnego węzła, a gdy to zrobisz, możesz sprawdzić naruszenia wszystkich warunków (w celu wykrycia cyklu możesz użyj algorytmu Tarjana .)
Wystarczy wziąć pod uwagę ścieżki z pierwszego węzła, nawet jeśli wykres jest odłączony, ponieważ ścieżki z dowolnego innego węzła pojawią się jako ścieżki z pierwszego węzła w innym przypadku.
Jeśli ścieżki o mieszanej krawędzi można po prostu zignorować, a nie są błędami (warunek 3), wystarczy rozważyć niezależnie wykresy zależności i konfliktów oraz sprawdzić, czy jeśli węzeł jest osiągalny w jednym, nie ma go w drugim.
Jeśli pamiętasz ścieżki znalezione podczas badania wykresów N-1 węzłów, możesz użyć ich jako punktu wyjścia do generowania i oceny wykresów N węzłów.
Nie generuje to wielu krawędzi tego samego typu między węzłami, ale można to rozszerzyć. Znacznie zwiększyłoby to jednak liczbę przypadków, więc byłoby lepiej, gdyby testowany kod uniemożliwiał przedstawienie lub, w przeciwnym razie, odfiltrowanie wszystkich takich przypadków wcześniej.
Kluczem do napisania takiej wyroczni jest utrzymanie jej tak prostym, jak to możliwe, nawet jeśli oznacza to nieefektywność, abyś mógł w nią zaufać (najlepiej poprzez argumenty za jej poprawnością, poparte testami).
Gdy będziesz już w stanie wygenerować przypadki testowe i zaufasz stworzonej wyroczni, aby dokładnie oddzielić dobro od zła, możesz użyć tego do przeprowadzenia automatycznego testowania kodu docelowego. Jeśli nie jest to wykonalne, następną najlepszą opcją jest przeczesanie wyników dla wyróżniających się przypadków. Wyrocznia może klasyfikować znalezione błędy i udzielać informacji o zaakceptowanych przypadkach, takich jak liczba i długość ścieżek każdego typu oraz czy istnieją jakieś węzły na początku obu typów ścieżek, i to może pomóc w znalezieniu przypadków, których wcześniej nie widziałeś.