Index: components/ntp_snippets/user_classifier.cc |
diff --git a/components/ntp_snippets/user_classifier.cc b/components/ntp_snippets/user_classifier.cc |
index 92b0312de491dbd848919aeeeb62298b9d35405c..32930b4d8fb6db621c02603ae7124ea7bdd6c9d1 100644 |
--- a/components/ntp_snippets/user_classifier.cc |
+++ b/components/ntp_snippets/user_classifier.cc |
@@ -24,30 +24,32 @@ namespace { |
// The discount rate for computing the discounted-average metrics. Must be |
// strictly larger than 0 and strictly smaller than 1! |
const double kDiscountRatePerDay = 0.25; |
-const char kDiscountRatePerDayParam[] = "user_classifier_discount_rate_per_day"; |
+constexpr base::FeatureParam<double> kDiscountRatePerDayParam{ |
+ &kArticleSuggestionsFeature, "user_classifier_discount_rate_per_day", 0.25}; |
// Never consider any larger interval than this (so that extreme situations such |
// as losing your phone or going for a long offline vacation do not skew the |
// average too much). |
// When everriding via variation parameters, it is better to use smaller values |
// than |kMaxHours| as this it the maximum value reported in the histograms. |
-const double kMaxHours = 7 * 24; |
-const char kMaxHoursParam[] = "user_classifier_max_hours"; |
+constexpr base::FeatureParam<double> kMaxHoursParam{ |
+ &kArticleSuggestionsFeature, "user_classifier_max_hours", 7 * 24}; |
// Ignore events within |kMinHours| hours since the last event (|kMinHours| is |
// the length of the browsing session where subsequent events of the same type |
// do not count again). |
-const double kMinHours = 0.5; |
-const char kMinHoursParam[] = "user_classifier_min_hours"; |
+constexpr base::FeatureParam<double> kMinHoursParam{ |
+ &kArticleSuggestionsFeature, "user_classifier_min_hours", 0.5}; |
// Classification constants. |
-const double kActiveConsumerClicksAtLeastOncePerHours = 72; |
-const char kActiveConsumerClicksAtLeastOncePerHoursParam[] = |
- "user_classifier_active_consumer_clicks_at_least_once_per_hours"; |
+constexpr base::FeatureParam<double> |
+ kActiveConsumerClicksAtLeastOncePerHoursParam{ |
+ &kArticleSuggestionsFeature, |
+ "user_classifier_active_consumer_clicks_at_least_once_per_hours", 72}; |
-const double kRareUserOpensNTPAtMostOncePerHours = 96; |
-const char kRareUserOpensNTPAtMostOncePerHoursParam[] = |
- "user_classifier_rare_user_opens_ntp_at_most_once_per_hours"; |
+constexpr base::FeatureParam<double> kRareUserOpensNTPAtMostOncePerHoursParam{ |
+ &kArticleSuggestionsFeature, |
+ "user_classifier_rare_user_opens_ntp_at_most_once_per_hours", 96}; |
// Histograms for logging the estimated average hours to next event. |
const char kHistogramAverageHoursToOpenNTP[] = |
@@ -73,11 +75,13 @@ const char* kLastTimeKeys[] = {prefs::kUserClassifierLastTimeToOpenNTP, |
prefs::kUserClassifierLastTimeToUseSuggestions}; |
// Default lengths of the intervals for new users for the metrics. |
-const double kInitialHoursBetweenEvents[] = {24, 48, 96}; |
-const char* kInitialHoursBetweenEventsParams[] = { |
- "user_classifier_default_interval_ntp_opened", |
- "user_classifier_default_interval_suggestions_shown", |
- "user_classifier_default_interval_suggestions_used"}; |
+constexpr base::FeatureParam<double> kInitialHoursBetweenEventsParams[] = { |
+ {&kArticleSuggestionsFeature, "user_classifier_default_interval_ntp_opened", |
+ 24}, |
+ {&kArticleSuggestionsFeature, |
+ "user_classifier_default_interval_suggestions_shown", 48}, |
+ {&kArticleSuggestionsFeature, |
+ "user_classifier_default_interval_suggestions_used", 96}}; |
static_assert(arraysize(kMetrics) == |
static_cast<int>(UserClassifier::Metric::COUNT) && |
@@ -85,21 +89,17 @@ static_assert(arraysize(kMetrics) == |
static_cast<int>(UserClassifier::Metric::COUNT) && |
arraysize(kLastTimeKeys) == |
static_cast<int>(UserClassifier::Metric::COUNT) && |
- arraysize(kInitialHoursBetweenEvents) == |
- static_cast<int>(UserClassifier::Metric::COUNT) && |
arraysize(kInitialHoursBetweenEventsParams) == |
static_cast<int>(UserClassifier::Metric::COUNT), |
"Fill in info for all metrics."); |
// Computes the discount rate. |
double GetDiscountRatePerHour() { |
- double discount_rate_per_day = variations::GetVariationParamByFeatureAsDouble( |
- kArticleSuggestionsFeature, kDiscountRatePerDayParam, |
- kDiscountRatePerDay); |
+ double discount_rate_per_day = kDiscountRatePerDayParam.Get(); |
// Check for illegal values. |
if (discount_rate_per_day <= 0 || discount_rate_per_day >= 1) { |
DLOG(WARNING) << "Illegal value " << discount_rate_per_day |
- << " for the parameter " << kDiscountRatePerDayParam |
+ << " for the parameter " << kDiscountRatePerDayParam.name |
<< " (must be strictly between 0 and 1; the default " |
<< kDiscountRatePerDay << " is used, instead)."; |
discount_rate_per_day = kDiscountRatePerDay; |
@@ -110,20 +110,7 @@ double GetDiscountRatePerHour() { |
} |
double GetInitialHoursBetweenEvents(UserClassifier::Metric metric) { |
- return variations::GetVariationParamByFeatureAsDouble( |
- kArticleSuggestionsFeature, |
- kInitialHoursBetweenEventsParams[static_cast<int>(metric)], |
- kInitialHoursBetweenEvents[static_cast<int>(metric)]); |
-} |
- |
-double GetMinHours() { |
- return variations::GetVariationParamByFeatureAsDouble( |
- kArticleSuggestionsFeature, kMinHoursParam, kMinHours); |
-} |
- |
-double GetMaxHours() { |
- return variations::GetVariationParamByFeatureAsDouble( |
- kArticleSuggestionsFeature, kMaxHoursParam, kMaxHours); |
+ return kInitialHoursBetweenEventsParams[static_cast<int>(metric)].Get(); |
} |
// Returns the new value of the metric using its |old_value|, assuming |
@@ -186,18 +173,12 @@ UserClassifier::UserClassifier(PrefService* pref_service, |
: pref_service_(pref_service), |
clock_(std::move(clock)), |
discount_rate_per_hour_(GetDiscountRatePerHour()), |
- min_hours_(GetMinHours()), |
- max_hours_(GetMaxHours()), |
+ min_hours_(kMinHoursParam.Get()), |
+ max_hours_(kMaxHoursParam.Get()), |
active_consumer_clicks_at_least_once_per_hours_( |
- variations::GetVariationParamByFeatureAsDouble( |
- kArticleSuggestionsFeature, |
- kActiveConsumerClicksAtLeastOncePerHoursParam, |
- kActiveConsumerClicksAtLeastOncePerHours)), |
+ kActiveConsumerClicksAtLeastOncePerHoursParam.Get()), |
rare_user_opens_ntp_at_most_once_per_hours_( |
- variations::GetVariationParamByFeatureAsDouble( |
- kArticleSuggestionsFeature, |
- kRareUserOpensNTPAtMostOncePerHoursParam, |
- kRareUserOpensNTPAtMostOncePerHours)) { |
+ kRareUserOpensNTPAtMostOncePerHoursParam.Get()) { |
// The pref_service_ can be null in tests. |
if (!pref_service_) { |
return; |
@@ -220,8 +201,8 @@ UserClassifier::~UserClassifier() = default; |
// static |
void UserClassifier::RegisterProfilePrefs(PrefRegistrySimple* registry) { |
double discount_rate = GetDiscountRatePerHour(); |
- double min_hours = GetMinHours(); |
- double max_hours = GetMaxHours(); |
+ double min_hours = kMinHoursParam.Get(); |
+ double max_hours = kMaxHoursParam.Get(); |
for (Metric metric : kMetrics) { |
double default_metric_value = GetMetricValueForEstimateHoursBetweenEvents( |
@@ -244,15 +225,15 @@ void UserClassifier::OnEvent(Metric metric) { |
switch (metric) { |
case Metric::NTP_OPENED: |
UMA_HISTOGRAM_CUSTOM_COUNTS(kHistogramAverageHoursToOpenNTP, avg, 1, |
- kMaxHours, 50); |
+ kMaxHoursParam.default_value, 50); |
break; |
case Metric::SUGGESTIONS_SHOWN: |
UMA_HISTOGRAM_CUSTOM_COUNTS(kHistogramAverageHoursToShowSuggestions, avg, |
- 1, kMaxHours, 50); |
+ 1, kMaxHoursParam.default_value, 50); |
break; |
case Metric::SUGGESTIONS_USED: |
UMA_HISTOGRAM_CUSTOM_COUNTS(kHistogramAverageHoursToUseSuggestions, avg, |
- 1, kMaxHours, 50); |
+ 1, kMaxHoursParam.default_value, 50); |
break; |
case Metric::COUNT: |
NOTREACHED(); |