Index: components/omnibox/browser/scored_history_match.cc |
diff --git a/components/omnibox/browser/scored_history_match.cc b/components/omnibox/browser/scored_history_match.cc |
index bdde8e547430e18c6a9659cc48203cde566edf58..8e88bfa1cc22a990ca673aa703cb1a29301d35cd 100644 |
--- a/components/omnibox/browser/scored_history_match.cc |
+++ b/components/omnibox/browser/scored_history_match.cc |
@@ -10,6 +10,7 @@ |
#include <vector> |
#include "base/logging.h" |
+#include "base/macros.h" |
#include "base/numerics/safe_conversions.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_split.h" |
@@ -113,17 +114,9 @@ size_t ScoredHistoryMatch::max_visits_to_score_; |
bool ScoredHistoryMatch::allow_tld_matches_; |
bool ScoredHistoryMatch::allow_scheme_matches_; |
size_t ScoredHistoryMatch::num_title_words_to_allow_; |
-bool ScoredHistoryMatch::hqp_experimental_scoring_enabled_; |
- |
-// Default topicality threshold. See GetTopicalityScore() for details. |
-float ScoredHistoryMatch::topicality_threshold_ = 0.8f; |
- |
-// Default HQP relevance buckets. See GetFinalRelevancyScore() for more details |
-// on these numbers. |
-char ScoredHistoryMatch::hqp_relevance_buckets_str_[] = |
- "0.0:400,1.5:600,5.0:900,10.5:1203,15.0:1300,20.0:1399"; |
-std::vector<ScoredHistoryMatch::ScoreMaxRelevance>* |
- ScoredHistoryMatch::hqp_relevance_buckets_ = nullptr; |
+float ScoredHistoryMatch::topicality_threshold_; |
+ScoredHistoryMatch::ScoreMaxRelevances* |
+ ScoredHistoryMatch::relevance_buckets_override_ = nullptr; |
ScoredHistoryMatch::ScoredHistoryMatch() |
: ScoredHistoryMatch(history::URLRow(), |
@@ -261,8 +254,8 @@ ScoredHistoryMatch::ScoredHistoryMatch( |
const float topicality_score = GetTopicalityScore( |
terms_vector.size(), url, terms_to_word_starts_offsets, word_starts); |
const float frequency_score = GetFrequency(now, is_url_bookmarked, visits); |
- raw_score = base::saturated_cast<int>(GetFinalRelevancyScore( |
- topicality_score, frequency_score, *hqp_relevance_buckets_)); |
+ raw_score = base::saturated_cast<int>( |
+ GetFinalRelevancyScore(topicality_score, frequency_score)); |
if (also_do_hup_like_scoring_ && likely_can_inline) { |
// HistoryURL-provider-like scoring gives any match that is |
@@ -415,10 +408,11 @@ void ScoredHistoryMatch::Init() { |
allow_tld_matches_ = OmniboxFieldTrial::HQPAllowMatchInTLDValue(); |
allow_scheme_matches_ = OmniboxFieldTrial::HQPAllowMatchInSchemeValue(); |
num_title_words_to_allow_ = OmniboxFieldTrial::HQPNumTitleWordsToAllow(); |
+ topicality_threshold_ = |
+ OmniboxFieldTrial::HQPExperimentalTopicalityThreshold(); |
InitRawTermScoreToTopicalityScoreArray(); |
InitDaysAgoToRecencyScoreArray(); |
- InitHQPExperimentalParams(); |
} |
float ScoredHistoryMatch::GetTopicalityScore( |
@@ -617,12 +611,17 @@ float ScoredHistoryMatch::GetFrequency(const base::Time& now, |
} |
// static |
-float ScoredHistoryMatch::GetFinalRelevancyScore( |
- float topicality_score, |
- float frequency_score, |
- const std::vector<ScoreMaxRelevance>& hqp_relevance_buckets) { |
- DCHECK(hqp_relevance_buckets.size() > 0); |
- DCHECK_EQ(hqp_relevance_buckets[0].first, 0.0); |
+float ScoredHistoryMatch::GetFinalRelevancyScore(float topicality_score, |
+ float frequency_score) { |
+ // |relevance_buckets| gives a mapping from intemerdiate score to the final |
+ // relevance score. |
+ CR_DEFINE_STATIC_LOCAL(ScoreMaxRelevances, default_relevance_buckets, |
+ (GetHQPBuckets())); |
+ ScoreMaxRelevances* relevance_buckets = relevance_buckets_override_ |
+ ? relevance_buckets_override_ |
+ : &default_relevance_buckets; |
+ DCHECK(!relevance_buckets->empty()); |
+ DCHECK_EQ(0.0, (*relevance_buckets)[0].first); |
if (topicality_score == 0) |
return 0; |
@@ -642,7 +641,7 @@ float ScoredHistoryMatch::GetFinalRelevancyScore( |
// |
// The below code maps intermediate_score to the range [0, 1399]. |
// For example: |
- // HQP default scoring buckets: "0.0:400,1.5:600,12.0:1300,20.0:1399" |
+ // The default scoring buckets: "0.0:400,1.5:600,12.0:1300,20.0:1399" |
// We will linearly interpolate the scores between: |
// 0 to 1.5 --> 400 to 600 |
// 1.5 to 12.0 --> 600 to 1300 |
@@ -655,76 +654,52 @@ float ScoredHistoryMatch::GetFinalRelevancyScore( |
// Find the threshold where intermediate score is greater than bucket. |
size_t i = 1; |
- for (; i < hqp_relevance_buckets.size(); ++i) { |
- const ScoreMaxRelevance& hqp_bucket = hqp_relevance_buckets[i]; |
- if (intermediate_score >= hqp_bucket.first) { |
+ for (; i < relevance_buckets->size(); ++i) { |
+ const ScoreMaxRelevance& bucket = (*relevance_buckets)[i]; |
+ if (intermediate_score >= bucket.first) { |
continue; |
} |
- const ScoreMaxRelevance& previous_bucket = hqp_relevance_buckets[i - 1]; |
- const float slope = ((hqp_bucket.second - previous_bucket.second) / |
- (hqp_bucket.first - previous_bucket.first)); |
+ const ScoreMaxRelevance& previous_bucket = (*relevance_buckets)[i - 1]; |
+ const float slope = ((bucket.second - previous_bucket.second) / |
+ (bucket.first - previous_bucket.first)); |
return (previous_bucket.second + |
(slope * (intermediate_score - previous_bucket.first))); |
} |
// It will reach this stage when the score is > highest bucket score. |
// Return the highest bucket score. |
- return hqp_relevance_buckets[i - 1].second; |
+ return (*relevance_buckets)[i - 1].second; |
} |
// static |
-void ScoredHistoryMatch::InitHQPExperimentalParams() { |
- // These are default HQP relevance scoring buckets. |
- // See GetFinalRelevancyScore() for details. |
- std::string hqp_relevance_buckets_str = std::string( |
- hqp_relevance_buckets_str_); |
- |
- // Fetch the experiment params if they are any. |
- hqp_experimental_scoring_enabled_ = |
- OmniboxFieldTrial::HQPExperimentalScoringEnabled(); |
- |
- if (hqp_experimental_scoring_enabled_) { |
- // Add the topicality threshold from experiment params. |
- float hqp_experimental_topicality_threhold = |
- OmniboxFieldTrial::HQPExperimentalTopicalityThreshold(); |
- topicality_threshold_ = hqp_experimental_topicality_threhold; |
- |
- // Add the HQP experimental scoring buckets. |
- std::string hqp_experimental_scoring_buckets = |
- OmniboxFieldTrial::HQPExperimentalScoringBuckets(); |
- if (!hqp_experimental_scoring_buckets.empty()) |
- hqp_relevance_buckets_str = hqp_experimental_scoring_buckets; |
- } |
- |
- // Parse the hqp_relevance_buckets_str string once and store them in vector |
- // which is easy to access. |
- hqp_relevance_buckets_ = |
- new std::vector<ScoredHistoryMatch::ScoreMaxRelevance>(); |
- |
- bool is_valid_bucket_str = GetHQPBucketsFromString(hqp_relevance_buckets_str, |
- hqp_relevance_buckets_); |
- DCHECK(is_valid_bucket_str); |
+std::vector<ScoredHistoryMatch::ScoreMaxRelevance> |
+ScoredHistoryMatch::GetHQPBuckets() { |
+ // Start with the default buckets and override them if appropriate. |
+ std::string relevance_buckets_str = |
+ "0.0:400,1.5:600,5.0:900,10.5:1203,15.0:1300,20.0:1399"; |
+ std::string experimental_scoring_buckets = |
+ OmniboxFieldTrial::HQPExperimentalScoringBuckets(); |
+ if (!experimental_scoring_buckets.empty()) |
+ relevance_buckets_str = experimental_scoring_buckets; |
+ return GetHQPBucketsFromString(relevance_buckets_str); |
} |
// static |
-bool ScoredHistoryMatch::GetHQPBucketsFromString( |
- const std::string& buckets_str, |
- std::vector<ScoreMaxRelevance>* hqp_buckets) { |
- DCHECK(hqp_buckets != NULL); |
+ScoredHistoryMatch::ScoreMaxRelevances |
+ScoredHistoryMatch::GetHQPBucketsFromString(const std::string& buckets_str) { |
DCHECK(!buckets_str.empty()); |
- |
base::StringPairs kv_pairs; |
- if (base::SplitStringIntoKeyValuePairs(buckets_str, ':', ',', &kv_pairs)) { |
- for (base::StringPairs::const_iterator it = kv_pairs.begin(); |
- it != kv_pairs.end(); ++it) { |
- ScoreMaxRelevance bucket; |
- bool is_valid_intermediate_score = |
- base::StringToDouble(it->first, &bucket.first); |
- DCHECK(is_valid_intermediate_score); |
- bool is_valid_hqp_score = base::StringToInt(it->second, &bucket.second); |
- DCHECK(is_valid_hqp_score); |
- hqp_buckets->push_back(bucket); |
- } |
- return true; |
+ if (!base::SplitStringIntoKeyValuePairs(buckets_str, ':', ',', &kv_pairs)) |
+ return ScoreMaxRelevances(); |
+ ScoreMaxRelevances hqp_buckets; |
+ for (base::StringPairs::const_iterator it = kv_pairs.begin(); |
+ it != kv_pairs.end(); ++it) { |
+ ScoreMaxRelevance bucket; |
+ bool is_valid_intermediate_score = |
+ base::StringToDouble(it->first, &bucket.first); |
+ DCHECK(is_valid_intermediate_score); |
+ bool is_valid_hqp_score = base::StringToInt(it->second, &bucket.second); |
+ DCHECK(is_valid_hqp_score); |
+ hqp_buckets.push_back(bucket); |
} |
- return false; |
+ return hqp_buckets; |
} |