| 585 | |
| 586 | template <class TDescriptor, class F> |
| 587 | void TemplatedDatabase<TDescriptor, F>::queryL1(const BowVector& vec, |
| 588 | QueryResults& ret, |
| 589 | int max_results, |
| 590 | int max_id) const { |
| 591 | BowVector::const_iterator vit; |
| 592 | typename IFRow::const_iterator rit; |
| 593 | |
| 594 | std::map<EntryId, double> pairs; |
| 595 | std::map<EntryId, double>::iterator pit; |
| 596 | |
| 597 | for (vit = vec.begin(); vit != vec.end(); ++vit) { |
| 598 | const WordId word_id = vit->first; |
| 599 | const WordValue& qvalue = vit->second; |
| 600 | |
| 601 | const IFRow& row = m_ifile[word_id]; |
| 602 | |
| 603 | // IFRows are sorted in ascending entry_id order |
| 604 | |
| 605 | for (rit = row.begin(); rit != row.end(); ++rit) { |
| 606 | const EntryId entry_id = rit->entry_id; |
| 607 | const WordValue& dvalue = rit->word_weight; |
| 608 | |
| 609 | if ((int)entry_id < max_id || max_id == -1) // Modified by Sharmin |
| 610 | { |
| 611 | // std::cout<<"Entry Id: "<< entry_id <<" MaxId: "<< max_id <<" No enry: "<< m_nentries<<std::endl; |
| 612 | double value = fabs(qvalue - dvalue) - fabs(qvalue) - fabs(dvalue); |
| 613 | |
| 614 | pit = pairs.lower_bound(entry_id); |
| 615 | if (pit != pairs.end() && !(pairs.key_comp()(entry_id, pit->first))) { |
| 616 | pit->second += value; |
| 617 | } else { |
| 618 | pairs.insert(pit, std::map<EntryId, double>::value_type(entry_id, value)); |
| 619 | } |
| 620 | } |
| 621 | |
| 622 | } // for each inverted row |
| 623 | } // for each query word |
| 624 | |
| 625 | // move to vector |
| 626 | ret.reserve(pairs.size()); |
| 627 | for (pit = pairs.begin(); pit != pairs.end(); ++pit) { |
| 628 | ret.push_back(Result(pit->first, pit->second)); |
| 629 | } |
| 630 | |
| 631 | // resulting "scores" are now in [-2 best .. 0 worst] |
| 632 | |
| 633 | // sort vector in ascending order of score |
| 634 | std::sort(ret.begin(), ret.end()); |
| 635 | // (ret is inverted now --the lower the better--) |
| 636 | |
| 637 | // cut vector |
| 638 | if (max_results > 0 && (int)ret.size() > max_results) ret.resize(max_results); |
| 639 | |
| 640 | // complete and scale score to [0 worst .. 1 best] |
| 641 | // ||v - w||_{L1} = 2 + Sum(|v_i - w_i| - |v_i| - |w_i|) |
| 642 | // for all i | v_i != 0 and w_i != 0 |
| 643 | // (Nister, 2006) |
| 644 | // scaled_||v - w||_{L1} = 1 - 0.5 * ||v - w||_{L1} |