From 3e76f806c660ed8a23758a1bf16e7d6bb5bb5747 Mon Sep 17 00:00:00 2001 From: Yuri Gorshenin Date: Mon, 6 Feb 2017 14:02:46 +0300 Subject: [PATCH] [search] Multiple TokenRanges in PreRankingInfo. --- search/geocoder.cpp | 6 +----- search/pre_ranker.cpp | 2 +- search/pre_ranking_info.cpp | 9 ++++++++- search/pre_ranking_info.hpp | 19 +++++++++++++++++-- search/ranker.cpp | 4 ++-- .../pre_ranker_test.cpp | 6 +----- search/token_range.hpp | 2 +- 7 files changed, 31 insertions(+), 17 deletions(-) diff --git a/search/geocoder.cpp b/search/geocoder.cpp index 940a050f0e..82a10dff1a 100644 --- a/search/geocoder.cpp +++ b/search/geocoder.cpp @@ -1264,11 +1264,7 @@ void Geocoder::EmitResult(BaseContext const & ctx, MwmSet::MwmId const & mwmId, // TODO (@y, @m): need to skip zero rank features that are too // distant from the pivot when there're enough results close to the // pivot. - PreRankingInfo info; - info.m_searchType = type; - info.m_tokenRange = tokenRange; - - m_preRanker.Emplace(id, info); + m_preRanker.Emplace(id, PreRankingInfo(type, tokenRange)); } void Geocoder::EmitResult(BaseContext const & ctx, Region const & region, diff --git a/search/pre_ranker.cpp b/search/pre_ranker.cpp index 662f298994..70c849df4e 100644 --- a/search/pre_ranker.cpp +++ b/search/pre_ranker.cpp @@ -42,7 +42,7 @@ struct ComparePreResult1 auto const & rinfo = rhs.GetInfo(); if (linfo.GetNumTokens() != rinfo.GetNumTokens()) return linfo.GetNumTokens() > rinfo.GetNumTokens(); - return linfo.m_tokenRange.Begin() < rinfo.m_tokenRange.Begin(); + return linfo.InnermostTokenRange().Begin() < rinfo.InnermostTokenRange().Begin(); } }; diff --git a/search/pre_ranking_info.cpp b/search/pre_ranking_info.cpp index 49bde42cb6..2e4237635d 100644 --- a/search/pre_ranking_info.cpp +++ b/search/pre_ranking_info.cpp @@ -9,7 +9,14 @@ string DebugPrint(PreRankingInfo const & info) ostringstream os; os << "PreRankingInfo ["; os << "m_distanceToPivot:" << info.m_distanceToPivot << ","; - os << "m_tokenRange:" << DebugPrint(info.m_tokenRange) << ","; + for (size_t i = 0; i < static_cast(SearchModel::SEARCH_TYPE_COUNT); ++i) + { + if (info.m_tokenRange[i].Empty()) + continue; + + auto const type = static_cast(i); + os << "m_tokenRange[" << DebugPrint(type) << "]:" << DebugPrint(info.m_tokenRange[i]) << ","; + } os << "m_rank:" << info.m_rank << ","; os << "m_searchType:" << info.m_searchType; os << "]"; diff --git a/search/pre_ranking_info.hpp b/search/pre_ranking_info.hpp index e71525b7b8..a8b0d2899c 100644 --- a/search/pre_ranking_info.hpp +++ b/search/pre_ranking_info.hpp @@ -5,13 +5,28 @@ #include "geometry/point2d.hpp" +#include "base/assert.hpp" + #include "std/cstdint.hpp" namespace search { struct PreRankingInfo { - inline size_t GetNumTokens() const { return m_tokenRange.Size(); } + PreRankingInfo(SearchModel::SearchType type, TokenRange const & range) + { + ASSERT_LESS(type, SearchModel::SEARCH_TYPE_COUNT, ()); + m_searchType = type; + m_tokenRange[m_searchType] = range; + } + + inline TokenRange const & InnermostTokenRange() const + { + ASSERT_LESS(m_searchType, SearchModel::SEARCH_TYPE_COUNT, ()); + return m_tokenRange[m_searchType]; + } + + inline size_t GetNumTokens() const { return InnermostTokenRange().Size(); } // An abstract distance from the feature to the pivot. Measurement // units do not matter here. @@ -21,7 +36,7 @@ struct PreRankingInfo bool m_centerLoaded = false; // Tokens match to the feature name or house number. - TokenRange m_tokenRange; + TokenRange m_tokenRange[SearchModel::SEARCH_TYPE_COUNT]; // Rank of the feature. uint8_t m_rank = 0; diff --git a/search/ranker.cpp b/search/ranker.cpp index 9e5e6b5e9d..93bdecc88f 100644 --- a/search/ranker.cpp +++ b/search/ranker.cpp @@ -179,8 +179,8 @@ class PreResult2Maker info.m_searchType = preInfo.m_searchType; info.m_nameScore = NAME_SCORE_ZERO; - TokenSlice slice(m_params, preInfo.m_tokenRange); - TokenSliceNoCategories sliceNoCategories(m_params, preInfo.m_tokenRange); + TokenSlice slice(m_params, preInfo.InnermostTokenRange()); + TokenSliceNoCategories sliceNoCategories(m_params, preInfo.InnermostTokenRange()); for (auto const & lang : m_params.GetLangs()) { diff --git a/search/search_integration_tests/pre_ranker_test.cpp b/search/search_integration_tests/pre_ranker_test.cpp index b071715ae9..31612485c2 100644 --- a/search/search_integration_tests/pre_ranker_test.cpp +++ b/search/search_integration_tests/pre_ranker_test.cpp @@ -131,11 +131,7 @@ UNIT_CLASS_TEST(PreRankerTest, Smoke) FeaturesVectorTest fv(mwmId.GetInfo()->GetLocalFile().GetPath(MapOptions::Map)); fv.GetVector().ForEach([&](FeatureType & ft, uint32_t index) { FeatureID id(mwmId, index); - - PreRankingInfo info; - info.m_tokenRange = TokenRange(0, 1); - info.m_searchType = SearchModel::SEARCH_TYPE_POI; - preRanker.Emplace(id, info); + preRanker.Emplace(id, PreRankingInfo(SearchModel::SEARCH_TYPE_POI, TokenRange(0, 1))); TEST_LESS(index, pois.size(), ()); distances[index] = MercatorBounds::DistanceOnEarth(feature::GetCenter(ft), kPivot); diff --git a/search/token_range.hpp b/search/token_range.hpp index b01222a7ff..0de51db8d7 100644 --- a/search/token_range.hpp +++ b/search/token_range.hpp @@ -78,7 +78,7 @@ private: inline std::string DebugPrint(TokenRange const & tokenRange) { std::ostringstream os; - os << "TokenRange [" << tokenRange.m_begin << ", " << tokenRange.m_end << ")"; + os << "TokenRange [" << tokenRange.Begin() << ", " << tokenRange.End() << ")"; return os.str(); } } // namespace search