Pemahaman saya tentang masalah, seperti yang dinyatakan sebelumnya dan kemudian diperbarui oleh komentar di bawah jawaban Macke, meliputi yang berikut: 1) kedua jenis tepi (dependensi dan konflik) diarahkan; 2) jika dua node dihubungkan oleh satu sisi, mereka tidak boleh dihubungkan oleh yang lain, bahkan jika itu dari tipe yang lain atau terbalik; 3) jika jalur antara dua node dapat dibangun dengan mencampurkan tepi dari tipe yang berbeda, maka itu adalah kesalahan, bukan keadaan yang diabaikan; 4) Jika ada jalur antara dua node menggunakan tepi dari satu jenis, maka mungkin tidak ada jalur lain di antara mereka menggunakan tepi dari jenis lainnya; 5) siklus jenis tepi tunggal atau jenis tepi campuran tidak diizinkan (dari tebakan di aplikasi, saya tidak yakin bahwa siklus konflik saja merupakan kesalahan, tetapi kondisi ini dapat dihapus, jika tidak.)
Lebih jauh, saya akan mengasumsikan struktur data yang digunakan tidak mencegah pelanggaran terhadap persyaratan yang dinyatakan (misalnya, grafik yang melanggar kondisi 2 tidak dapat diekspresikan dalam peta dari pasangan-simpul ke (tipe, arah) jika pasangan-pasangan selalu memiliki simpul bernomor paling rendah terlebih dahulu.) Jika kesalahan tertentu tidak dapat diungkapkan, ini mengurangi jumlah kasus yang harus dipertimbangkan.
Sebenarnya ada tiga grafik yang dapat dipertimbangkan di sini: dua secara eksklusif satu jenis tepi, dan grafik campuran dibentuk oleh penyatuan satu dari masing-masing dua jenis. Anda dapat menggunakan ini untuk secara sistematis menghasilkan semua grafik hingga sejumlah node. Pertama-tama buat semua grafik yang mungkin dari simpul N yang tidak memiliki lebih dari satu tepi antara dua pasang simpul yang dipesan (pasangan yang dipesan karena ini adalah grafik yang diarahkan.) Sekarang ambil semua pasangan yang memungkinkan dari grafik ini, yang satu mewakili dependensi dan yang lainnya mewakili konflik, dan membentuk persatuan masing-masing pasangan.
Jika struktur data Anda tidak dapat mengungkapkan pelanggaran kondisi 2, Anda dapat secara signifikan mengurangi kasus yang harus dipertimbangkan dengan hanya membuat semua grafik konflik yang sesuai dengan ruang grafik ketergantungan, atau sebaliknya. Jika tidak, Anda dapat mendeteksi pelanggaran kondisi 2 saat membentuk serikat pekerja.
Pada lintasan pertama dari grafik gabungan dari simpul pertama, Anda bisa membangun set semua lintasan ke setiap simpul yang dapat dijangkau, dan saat melakukannya, Anda bisa memeriksa pelanggaran semua kondisi (untuk deteksi siklus, Anda bisa gunakan algoritma Tarjan .)
Anda hanya perlu mempertimbangkan jalur dari simpul pertama, bahkan jika grafik terputus, karena jalur dari simpul lain akan muncul sebagai jalur dari simpul pertama dalam beberapa kasus lain.
Jika jalur campuran dapat diabaikan, alih-alih menjadi kesalahan (kondisi 3), cukup untuk mempertimbangkan grafik dependensi dan konflik secara independen, dan memeriksa bahwa jika sebuah node dapat dijangkau di satu, itu tidak di yang lain.
Jika Anda ingat jalur yang ditemukan dalam memeriksa grafik N-1 node, Anda dapat menggunakannya sebagai titik awal untuk menghasilkan dan mengevaluasi grafik N node.
Ini tidak menghasilkan banyak sisi dengan tipe yang sama antar node, tetapi bisa diperluas untuk melakukannya. Ini akan sangat meningkatkan jumlah kasus, jadi akan lebih baik jika kode yang diuji membuat ini tidak mungkin untuk mewakili, atau gagal itu, menyaring semua kasus tersebut sebelumnya.
Kunci untuk menulis oracle seperti ini adalah menjaganya sesederhana mungkin, meskipun itu berarti tidak efisien, sehingga Anda dapat membangun kepercayaan di dalamnya (idealnya melalui argumen untuk kebenarannya, didukung oleh pengujian.)
Setelah Anda memiliki sarana untuk menghasilkan kasus uji, dan Anda percaya pada oracle yang telah Anda buat untuk secara akurat memisahkan yang baik dari yang buruk, Anda mungkin menggunakan ini untuk mendorong pengujian otomatis kode target. Jika itu tidak layak, pilihan terbaik Anda berikutnya adalah menyisir hasil untuk kasus yang berbeda. Oracle dapat mengklasifikasikan kesalahan yang ditemukannya, dan memberi Anda beberapa informasi tentang kasus yang diterima, seperti jumlah dan panjang jalur dari setiap jenis, dan apakah ada node yang ada di awal kedua jenis jalur, dan ini dapat membantu Anda mencari kasus yang belum Anda lihat sebelumnya.