From 00b7b11658547bb810cc43199c7af10d162cd091 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Proch=C3=A1zka?= <david@prochazka.dev>
Date: Wed, 10 Feb 2021 15:40:15 +0100
Subject: [PATCH] ADD: ApproxKNN recall measurement

---
 src/mhtree/MHTree.java | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

diff --git a/src/mhtree/MHTree.java b/src/mhtree/MHTree.java
index 7633d8c..a702328 100644
--- a/src/mhtree/MHTree.java
+++ b/src/mhtree/MHTree.java
@@ -5,15 +5,14 @@ import messif.buckets.BucketDispatcher;
 import messif.buckets.BucketErrorCode;
 import messif.buckets.BucketStorageException;
 import messif.buckets.LocalBucket;
+import messif.objects.AbstractObject;
 import messif.objects.LocalAbstractObject;
 import messif.operations.data.InsertOperation;
 import messif.operations.query.ApproxKNNQueryOperation;
+import messif.operations.query.KNNQueryOperation;
 
 import java.io.Serializable;
-import java.util.IntSummaryStatistics;
-import java.util.List;
-import java.util.Map;
-import java.util.PriorityQueue;
+import java.util.*;
 
 public class MHTree extends Algorithm implements Serializable {
 
@@ -121,6 +120,27 @@ public class MHTree extends Algorithm implements Serializable {
         System.out.println("Maximum number of objects: " + statistics.getMax());
     }
 
+    public double measureRecall(ApproxKNNQueryOperation approxKNNOperation) {
+        if (approxKNNOperation.getAnswerCount() == 0) return 0d;
+
+        KNNQueryOperation KNNOperation = new KNNQueryOperation(approxKNNOperation.getQueryObject(), approxKNNOperation.getK());
+        KNN(KNNOperation);
+
+        int trueKNNCount = 0;
+
+        for (Iterator<AbstractObject> KNNIt = KNNOperation.getAnswerObjects(); KNNIt.hasNext(); )
+            for (Iterator<AbstractObject> approxKNNIt = approxKNNOperation.getAnswerObjects(); approxKNNIt.hasNext(); )
+                if (KNNIt.next().getLocatorURI().equals(approxKNNIt.next().getLocatorURI()))
+                    trueKNNCount++;
+
+        return trueKNNCount / (double) KNNOperation.getAnswerCount();
+    }
+
+    private void KNN(KNNQueryOperation operation) {
+        root.getObjects().forEach(operation::addToAnswer);
+        operation.endOperation();
+    }
+
     @Override
     public String toString() {
         return "MHTree{" +
-- 
GitLab