package experiments.evaluation; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; public class M_MAP extends StatisticalMeasure { private HashMap<String, Integer> retrievedDocsInQuery; private HashMap<String, Integer> correctRetrievedDocs; private HashMap<String, Integer> correctRelevantDocs; private List<String> docList; private double queryMap; private double overallAveragePrecision; private int amountQueries; public M_MAP() { super(); retrievedDocsInQuery = new HashMap<String, Integer>(); correctRetrievedDocs = new HashMap<String, Integer>(); correctRelevantDocs = new HashMap<String, Integer>(); docList = new LinkedList<String>(); queryMap = 0; overallAveragePrecision = 0; amountQueries = 0; classname = new String[1]; classname[0] = "MAP"; } @Override public void workQuery(CorrectEntry ce, ResultEntry re) { if (ce.getDocName().equalsIgnoreCase(re.getDocName())) { correctRetrievedDocs.put(re.getDocName(), 0); } docList.add(re.getDocName()); retrievedDocsInQuery.put(re.getDocName(), 0); correctRelevantDocs.put(ce.getDocName(), 0); } @Override public void finishQuery(int qryN) { amountQueries++; double averagePrecision = 0; // Query Average Precision int it = 0; for (int i = 0; i < retrievedDocsInQuery.size(); i++) { String name = docList.get(i); for (Map.Entry<String, Integer> entry : correctRetrievedDocs.entrySet()) { String key = entry.getKey(); if(name.equalsIgnoreCase(key)) { it++; averagePrecision += ((double) it) / ((double)(i + 1)); break; } } } if(it == 0) { averagePrecision = 0; } else { averagePrecision /= (double) correctRelevantDocs.size(); } queryMap = averagePrecision; overallAveragePrecision += averagePrecision; averagePrecision = 0; retrievedDocsInQuery = new HashMap<String, Integer>(); correctRetrievedDocs = new HashMap<String, Integer>(); correctRelevantDocs = new HashMap<String, Integer>(); docList = new LinkedList<String>(); } @Override public double[] getResult() { double[] result = new double[1]; result[0] = overallAveragePrecision / (double)amountQueries; return result; } @Override public double[] getQueryResult() { double[] result = new double[1]; result[0] = queryMap; return result; } }