以下の数値は make eval がチェックアウトから出力するもので、値はそれを生成するテストが固定しています。検出器の変更で値が動くと、誰かが新しい値を記録するまでテストが落ち、さらにこのページが同じことを述べるまで落ち続けます。
生成コーパスはリポジトリに入っているため、再現率の数値はチェックアウトだけで再現できます。ラベル付きケースがリポジトリに持つのは判定だけでソースは持たないため、適合率の数値を再現するには先に corpus/scripts/materialize-labeled.sh を実行する必要があります。それぞれが何を答えられて何を答えられないかは corpus/README.md を参照してください。
生成された 10 の変異コーパス、クローン対 43 件・意図的な非クローン 11 件。生成コーパスは自分が含むクローンをすべて把握しているので再現率を測れます。適合率は測れません。作られたときのクローンだけにラベルが付いているため、ラベルのない本物のコピーを検出すると減点になってしまうからです。
| コーパス | Fast | Structural |
|---|---|---|
| rust | 0.8571 | 1.0000 |
| c | 0.8333 | 1.0000 |
| cpp | 0.8571 | 1.0000 |
| cpp-common-signature | 1.0000 | 1.0000 |
| rust-graded | 1.0000 | 1.0000 |
| rust-literals | 1.0000 | 1.0000 |
| rust-replaced | 1.0000 | 1.0000 |
| rust-negative | 1.0000 | 1.0000 |
| rust-partial | 1.0000 | 0.5000 |
| rust-divergent | 0.4000 | 0.8000 |
Fast モードは rust / c / cpp の type-3 クローンを 1 件も拾えません。これは調整の問題ではなく、構造パスを飛ばしたことの代償です。rust-partial は Structural が Fast を下回る唯一のコーパスです。cpp-common-signature はシグネチャ sibling チャネルのためにあります。9 本の関数が 1 つの呼び出し形を共有しており、これほど共有された形を証拠として出さないことが主要な結果に何の犠牲も強いないことを固定します。
restricted-semantic の 6 コーパスはここでは採点していません。登録済みルールはそれぞれ専用のテストが「なぜ一致したか / なぜ落としたか」を主張しており、問いの異なるルールをまたいで平均を取るより強い主張になるためです。
実プロジェクトのラベル付きスナップショット 8 件、クローン対の判定 141 件・非クローンの判定 177 件。これらのツリーで検出器が報告したグループにはすべて手書きの判定が付いているため、適合率を測れます。再現率は測れません。誰もそれらのプロジェクトのクローンを事前に数え上げていないからです。
重複レポートは上から読むものなので、これらの判定が最初に答える問いは「上位がどれだけ正しいか」です。ある重複の短い切り口は、それを含む長い所見の中で示されるため順序の中に自分の位置を持ちません。単独の所見を持つ 200 件の判定に対しては次のとおりです。
| 並べ方 | p@10 | p@50 | MAP |
|---|---|---|---|
| priority | 1.0000 | 0.9600 | 0.9290 |
| size | 1.0000 | 0.9400 | 0.8772 |
どちらの並べ方でも上位 10 件に誤検出は入りません。priority 順を既定の並びにしているのはそのためです。これらの数値は Structural モードのもので、既定のモードは Fast です(解析モードを参照)。
これに対して、順序を無視してすべてのツリーのすべてのグループを端から端まで読むと、同じ判定は次の値になります。
| ケース | Structural 適合率 | 確認 | 棄却 |
|---|---|---|---|
| codehelion-store | 1.0000 | 2 | 0 |
| fast-yaml | 1.0000 | 1 | 0 |
| cjson | 0.8235 | 14 | 3 |
| bitflags | 0.7857 | 11 | 3 |
| spdlog | 0.5833 | 21 | 15 |
| serde-json | 0.5357 | 45 | 39 |
| lz4 | 0.5357 | 15 | 13 |
| tinyxml2 | 0.5263 | 10 | 9 |
| 全ケース | 0.5920 | 119 | 82 |
この全体の値が言っているのは、末尾が半分近くノイズだということです。これはレポートが求めていない読み方に対する数字ですが、公開しているのは 2 つの数字の差こそが知る価値のあるものだからです。順位付けが仕事をしているのであって、それを無視して読む人が読んでいるのは 0.5920 のほうです。
8 件のうち 2 件は本プロジェクト作者自身のもので、いずれも 1.0000 です。除くと全体は 0.5859 になります。この 2 件が担う判定は 201 件中 3 件なので、どちらにしてもこの数字は残り 6 プロジェクトのものです。
make eval判定が紐づくスナップショットは corpus/scripts/materialize-labeled.sh が取得するもので、再配布はしません。materialize されていないケースは満点ではなく「未採点」として報告されます。