-
Notifications
You must be signed in to change notification settings - Fork 0
/
recall.hpp
63 lines (53 loc) · 1.61 KB
/
recall.hpp
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//
// Copyright (c) 2017 – Technicolor R&D France
//
// The source code form of this open source project is subject to the terms of the
// Clear BSD license.
//
// You can redistribute it and/or modify it under the terms of the Clear BSD
// License (See LICENSE file).
//
#ifndef RECALL_HPP_
#define RECALL_HPP_
#include <cstdlib>
#include <vector>
#include <algorithm>
#include "binheap.hpp"
#include "vector_io.hpp"
template<typename ForwardIterator1, typename ForwardIterator2>
bool all_in(ForwardIterator1 oracle_first, ForwardIterator1 oracle_last,
ForwardIterator2 first, ForwardIterator2 last) {
while (oracle_first != oracle_last) {
if (std::find(first, last, *oracle_first) == last) {
return false;
}
oracle_first++;
}
return true;
}
;
class recall_file {
vectors_owner<int> groundtruth;
public:
recall_file(const char* filename) {
groundtruth = load_vectors<int>(filename);
}
int max_t() const {
return groundtruth.dimension;
}
template<typename ForwardIterator>
int check_labels(const int query_i, ForwardIterator labels_first,
ForwardIterator labels_last, const int t) const {
int* groundtruth_query = groundtruth.get(query_i);
if (all_in(groundtruth_query, groundtruth_query + t, labels_first,
labels_last)) {
return 1;
}
return 0;
}
int check_labels(const int query_i, const std::vector<int>& labels,
const int t) const {
return check_labels(query_i, labels.begin(), labels.end(), t);
}
};
#endif /* RECALL_HPP_ */