最初に述べられ、Mackeの返信の下でコメントによって更新された問題の私の理解には、以下が含まれます。1)両方のエッジタイプ(依存関係および競合)が指示されます。2)2つのノードが1つのエッジで接続されている場合、別のタイプまたは逆であっても、別のノードで接続してはなりません。3)2つのノード間のパスが異なるタイプのエッジを混合することによって構築できる場合、それは無視される状況ではなくエラーです。4)1つのタイプのエッジを使用して2つのノード間にパスがある場合、他のタイプのエッジを使用して2つのノード間に別のパスがない場合があります。5)シングルエッジタイプまたは混合エッジタイプのサイクルは許可されません(アプリケーションでの推測から、競合のみのサイクルがエラーであるかどうかはわかりませんが、そうでない場合はこの条件を削除できます)。
さらに、使用されるデータ構造は、表現されるこれらの要件の違反を防止しないと仮定します(たとえば、ノードペアが常に、ノードペアから(タイプ、方向)へのマップで条件2に違反するグラフを表現できませんでした)特定のエラーを表現できない場合、考慮されるケースの数を減らします。
ここで考慮できるグラフは実際には3つあります。1つだけのエッジタイプの2つ、および2つのタイプのそれぞれの1つの結合によって形成される混合グラフです。これを使用して、いくつかのノードまでのすべてのグラフを体系的に生成できます。最初に、ノードの任意の2つの順序のペア(有向グラフであるため順序付けられたペア)の間に1つ以下のエッジを持つN個のノードのすべての可能なグラフを生成します。各ペアの結合を形成します。
データ構造が条件2の違反を表現できない場合、依存関係グラフのスペース内に収まる可能性のあるすべての競合グラフを構築するだけで、考慮されるケースを大幅に減らすことができます。それ以外の場合、結合の形成中に条件2の違反を検出できます。
最初のノードからの結合グラフの幅優先走査では、到達可能なすべてのノードへのすべてのパスのセットを構築でき、そのようにして、すべての条件の違反をチェックできます(サイクル検出では、Tarjanのアルゴリズムを使用します。)
他のノードからのパスは、他の場合には最初のノードからのパスとして表示されるため、グラフが切断されていても、最初のノードからのパスのみを考慮する必要があります。
エラー(条件3)ではなく、混合エッジパスを単純に無視できる場合は、依存関係グラフと競合グラフを個別に検討し、一方が到達可能な場合は他方に到達しないことを確認するだけで十分です。
N-1ノードのグラフの調査で見つかったパスを覚えている場合、Nノードのグラフを生成および評価するための開始点としてそれらを使用できます。
これは、ノード間で同じタイプの複数のエッジを生成しませんが、そうするために拡張できます。ただし、これによりケースの数が大幅に増加するため、テスト対象のコードでこのようなケースをすべて表現できないようにしたり、失敗した場合は、事前にそのようなケースをすべて除外しておくとよいでしょう。
このようなオラクルを書くための鍵は、それが非効率であることを意味する場合でも、できるだけシンプルに保ち、信頼を確立できるようにすることです(理想的には、テストによって裏付けられたその正当性の引数を通じて)
テストケースを生成する手段があり、作成したオラクルを信頼して、良いものと悪いものを正確に分離したら、これを使用してターゲットコードの自動テストを実行できます。それが実行可能でない場合、次の最良のオプションは、特徴的なケースの結果をくまなく調べることです。オラクルは、検出したエラーを分類し、各タイプのパスの数と長さ、両方のタイプのパスの開始点にノードがあるかどうかなど、受け入れられたケースに関する情報を提供します。あなたが前に見たことがないケースを探すのに役立つかもしれません。