-
Notifications
You must be signed in to change notification settings - Fork 122
/
Copy pathrecallAtN.m
45 lines (32 loc) · 1.31 KB
/
recallAtN.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function [res, recalls]= recallAtN(searcher, nQueries, isPos, ns, printN, nSample)
if nargin<6, nSample= inf; end
rngState= rng;
if nSample < nQueries
rng(43);
toTest= randsample(nQueries, nSample);
else
toTest= 1:nQueries;
end
assert(issorted(ns));
nTop= max(ns);
recalls= zeros(length(toTest), length(ns));
printRecalls= zeros(length(toTest),1);
evalProg= tic;
for iTestSample= 1:length(toTest)
relja_progress(iTestSample, ...
length(toTest), ...
sprintf('%.4f', mean(printRecalls(1:(iTestSample-1)))), evalProg);
iTest= toTest(iTestSample);
ids= searcher(iTest, nTop);
numReturned= length(ids);
assert(numReturned<=nTop); % if your searcher returns fewer, it's your fault
thisRecall= cumsum( isPos(iTest, ids) ) > 0;
recalls(iTestSample, :)= thisRecall( min(ns, numReturned) );
printRecalls(iTestSample)= thisRecall(printN);
end
t= toc(evalProg);
res= mean(printRecalls);
relja_display('\n\trec@%d= %.4f, time= %.4f s, avgTime= %.4f ms\n', printN, res, t, t*1000/length(toTest));
relja_display('%03d %.4f\n', [ns(:), mean(recalls,1)']');
rng(rngState);
end