17 std::cerr <<
"Error reading index from " << file_name << std::endl;
20 if(!this->
load(file_name)) {
21 std::cerr <<
"Error reading index from " << file_name << std::endl;
26 std::cout <<
"Reading inverted index from " << file_path <<
"..." << std::endl;
28 std::ifstream ifs(file_path, std::ios::binary);
30 ifs.read((
char *)&num_clusters,
sizeof(uint32_t));
33 ifs.read((
char *)&
idf_weights[0],
sizeof(
float) * num_clusters);
36 ifs.read((
char *)&num_entries,
sizeof(uint64_t));
38 ifs.read((
char *)&
inverted_index[i][0],
sizeof(uint64_t) * num_entries);
41 std::cout <<
"Done reading inverted index." << std::endl;
43 return (ifs.rdstate() & std::ifstream::failbit) == 0;
48 std::cout <<
"Writing inverted index to " << file_path <<
"..." << std::endl;
50 std::ofstream ofs(file_path, std::ios::binary | std::ios::trunc);
53 ofs.write((
const char *)&num_clusters,
sizeof(uint32_t));
54 ofs.write((
const char *)&
idf_weights[0],
sizeof(
float) * num_clusters);
57 ofs.write((
const char *)&num_entries,
sizeof(uint64_t));
58 ofs.write((
const char *)&
inverted_index[i][0],
sizeof(uint64_t) * num_entries);
61 std::cout <<
"Done writing inverted index." << std::endl;
63 return (ofs.rdstate() & std::ofstream::failbit) == 0;
66 bool InvertedIndex::train(
Dataset &dataset,
const std::shared_ptr<const TrainParamsBase> ¶ms,
const std::vector< std::shared_ptr<const Image > > &examples) {
67 const std::shared_ptr<const TrainParams> &ii_params = std::static_pointer_cast<
const TrainParams>(params);
69 const std::shared_ptr<BagOfWords> &bag_of_words = ii_params->
bag_of_words;
71 if(bag_of_words ==
nullptr)
return false;
74 idf_weights.resize(bag_of_words->num_clusters(), 0.f);
76 for (
size_t i = 0; i < examples.size(); i++) {
77 const std::shared_ptr<const Image> &image = examples[i];
78 const std::string &bow_descriptors_location = dataset.
location(image->feature_path(
"bow_descriptors"));
85 for(
size_t j=0; j<bow_descriptors.size(); j++) {
92 (
float)examples.size() /
99 std::shared_ptr<MatchResultsBase>
InvertedIndex::search(
Dataset &dataset,
const std::shared_ptr<const SearchParamsBase> ¶ms,
const std::shared_ptr<const Image > &example) {
103 std::shared_ptr<MatchResults> match_result = std::make_shared<MatchResults>();
105 const std::string &example_bow_descriptors_location = dataset.
location(example->feature_path(
"bow_descriptors"));
107 std::cerr <<
"No file at load " << example_bow_descriptors_location << std::endl;
112 std::cerr <<
"Failed to load " << example_bow_descriptors_location << std::endl;
116 std::vector<uint64_t> candidates(dataset.
num_images(), 0);
117 uint64_t num_candidates = 0;
118 for(
size_t i=0; i<example_bow_descriptors.size(); i++) {
119 uint32_t cluster = example_bow_descriptors[i].first;
126 std::vector< std::pair<float, uint64_t> > candidate_scores(num_candidates);
128 #if ENABLE_MULTITHREADING && ENABLE_OPENMP
129 #pragma omp parallel for schedule(dynamic)
131 for(int64_t i=0; i<(int64_t)candidates.size(); i++) {
132 if(!candidates[i])
continue;
134 const std::string &bow_descriptors_location = dataset.
location(dataset.
image(i)->feature_path(
"bow_descriptors"));
140 candidate_scores[candidates[i]-1] = std::pair<float, uint64_t>(sim, i);
143 std::sort(candidate_scores.begin(), candidate_scores.end(),
144 boost::bind(&std::pair<float, uint64_t>::first, _1) >
145 boost::bind(&std::pair<float, uint64_t>::first, _2));
147 match_result->tfidf_scores.resize(candidate_scores.size());
148 match_result->matches.resize(candidate_scores.size());
150 for(int64_t i=0; i<(int64_t)candidate_scores.size(); i++) {
151 match_result->tfidf_scores[i] = candidate_scores[i].first;
152 match_result->matches[i] = candidate_scores[i].second;
164 for(uint32_t i=0; i<MIN(8, match_results.
matches.size()); i++) {