Error calculator readability updates.
* Remove hourly population math from function call and update comments
* Lowercase error messages sans punctuation.
https://g3doc.corp.google.com/go/g3doc/style/decisions.md?cl=head#error-strings
* Make functions private.
Change-Id: I8de0cd77d9d74b561c9e30915e5ee83047ebf867
Reviewed-on: https://fuchsia-review.googlesource.com/c/cobalt/+/478419
Commit-Queue: Jared Weinstein <jaredweinstein@google.com>
Reviewed-by: Alexandre Zani <azani@google.com>
diff --git a/src/bin/config_parser/src/privacy/error_calculator.go b/src/bin/config_parser/src/privacy/error_calculator.go
index 6c78165..da1ddfe 100644
--- a/src/bin/config_parser/src/privacy/error_calculator.go
+++ b/src/bin/config_parser/src/privacy/error_calculator.go
@@ -49,7 +49,6 @@
return -1, err
}
- // For report types with an hourly contribution interval, the population is set to (24*population) pseudo-users.
probBitFlip := privacyEncodingParams.ProbBitFlip
discretization := uint64(privacyEncodingParams.NumIndexPoints)
var errorEstimate float64
@@ -57,15 +56,18 @@
case config.ReportDefinition_UNIQUE_DEVICE_HISTOGRAMS:
fallthrough // Calculate RMSE Error for each bucket.
case config.ReportDefinition_UNIQUE_DEVICE_COUNTS:
- errorEstimate = SingleContributionRapporRMSE(population, probBitFlip)
+ errorEstimate = singleContributionRapporRMSE(population, probBitFlip)
case config.ReportDefinition_HOURLY_VALUE_HISTOGRAMS:
- errorEstimate = SingleContributionRapporRMSE(24*population, probBitFlip)
+ population *= 24 // Hourly contribution interval: 24*population pseudo-users.
+ errorEstimate = singleContributionRapporRMSE(population, probBitFlip)
case config.ReportDefinition_FLEETWIDE_OCCURRENCE_COUNTS:
contributionRange := uint64(report.MaxValue - report.MinValue)
- errorEstimate = MultipleContributionRapporRMSE(24*population, probBitFlip, contributionRange, discretization)
+ population *= 24 // Hourly contribution interval: 24*population pseudo-users.
+ errorEstimate = multipleContributionRapporRMSE(population, probBitFlip, contributionRange, discretization)
case config.ReportDefinition_FLEETWIDE_HISTOGRAMS:
contributionRange := report.MaxCount
- errorEstimate = MultipleContributionRapporRMSE(24*population, probBitFlip, contributionRange, discretization)
+ population *= 24 // Hourly contribution interval: 24*population pseudo-users.
+ errorEstimate = multipleContributionRapporRMSE(population, probBitFlip, contributionRange, discretization)
// TODO(jaredweinstein): Enable NumericStats once the formula is resolved.
// case config.ReportDefinition_UNIQUE_DEVICE_NUMERIC_STATS:
// if err := meanReportConfigurationError(report, minDenominatorEstimate); err != nil {
@@ -76,19 +78,21 @@
// if err := meanReportConfigurationError(report, minDenominatorEstimate); err != nil {
// return -1, err
// }
- // errorEstimate = NumericStatsRapporRMSE(24*population, privacyEncodingParams, minDenominatorEstimate, report)
+ // population *= 24 // Hourly contribution interval: 24*population pseudo-users.
+ // errorEstimate = NumericStatsRapporRMSE(population, privacyEncodingParams, minDenominatorEstimate, report)
case config.ReportDefinition_FLEETWIDE_MEANS:
if err := meanReportConfigurationError(report, minDenominatorEstimate); err != nil {
return -1, err
}
- errorEstimate = FleetwideMeansRapporRMSE(24*population, probBitFlip, minDenominatorEstimate, discretization, report)
+ population *= 24 // Hourly contribution interval: 24*population pseudo-users.
+ errorEstimate = fleetwideMeansRapporRMSE(population, probBitFlip, minDenominatorEstimate, discretization, report)
default:
reportType := config.ReportDefinition_ReportType_name[int32(report.GetReportType())]
- return -1, fmt.Errorf("Error estimation is not supported for reports of type %s.", reportType)
+ return -1, fmt.Errorf("error estimation is not supported for reports of type %s", reportType)
}
if math.IsNaN(errorEstimate) || math.IsInf(errorEstimate, 0) {
- return errorEstimate, fmt.Errorf("Error estimation failed to return valid result due to an invalid or missing field.")
+ return errorEstimate, fmt.Errorf("error estimation failed to return valid result due to an invalid or missing field")
}
return errorEstimate, nil
}
@@ -96,14 +100,14 @@
// Compute the 2D-RAPPOR RMSE for reports with single contributions.
//
// See Proposition 1 and 2 of go/histogram-aggregation-privacy-guarantee.
-func SingleContributionRapporRMSE(population uint64, probBitFlip float64) float64 {
+func singleContributionRapporRMSE(population uint64, probBitFlip float64) float64 {
return math.Sqrt(float64(population)*probBitFlip*(1-probBitFlip)) / (1 - 2*probBitFlip)
}
// Compute 2D-RAPPOR RMSE for reports with multiple or real-number contributions.
//
// See Proposition 1, 2, and 3 of go/histogram-aggregation-privacy-guarantee.
-func MultipleContributionRapporRMSE(population uint64, probBitFlip float64, contributionRange uint64, discretization uint64) float64 {
+func multipleContributionRapporRMSE(population uint64, probBitFlip float64, contributionRange uint64, discretization uint64) float64 {
var n = float64(population)
var p = probBitFlip
var m = float64(contributionRange)
@@ -117,6 +121,7 @@
}
// TODO(jaredweinstein): Add back NumericStats once the formula is resolved.
+// Compute 2D-RAPPOR RMSE for NumericStats reports.
// func NumericStatsRapporRMSE(population uint64, params PrivacyEncodingParams, minDenominatorEstimate uint64, report *config.ReportDefinition) float64 {
// sigma := SingleContributionRapporRMSE(population, params)
// a := params.ProbBitFlip / (1 - 2*params.ProbBitFlip)
@@ -133,18 +138,19 @@
// return meanRapporRMSE(mseNumerator, mseDenominator, sigma, a, float64(M), float64(minDenominatorEstimate))
// }
-func FleetwideMeansRapporRMSE(population uint64, probBitFlip float64, minDenominatorEstimate uint64, discretization uint64, report *config.ReportDefinition) float64 {
+// Compute 2D-RAPPOR RMSE for the FleetwideMeans report.
+func fleetwideMeansRapporRMSE(population uint64, probBitFlip float64, minDenominatorEstimate uint64, discretization uint64, report *config.ReportDefinition) float64 {
t := report.MaxCount
a := probBitFlip * float64(t) / (1 - 2*probBitFlip)
T := float64(math.Max(float64(-report.MinValue), float64(report.MaxValue)))
// Numerator is aggregated like FleetwideOccurrenceCounts.
numeratorContributionRange := uint64(report.MaxValue - report.MinValue)
- rmseNumerator := MultipleContributionRapporRMSE(population, probBitFlip, numeratorContributionRange, discretization)
+ rmseNumerator := multipleContributionRapporRMSE(population, probBitFlip, numeratorContributionRange, discretization)
mseNumerator := math.Pow(rmseNumerator, 2)
// Denominator RMSE aggregated like FleetwideHistograms.
- sigma := MultipleContributionRapporRMSE(population, probBitFlip, t, discretization)
+ sigma := multipleContributionRapporRMSE(population, probBitFlip, t, discretization)
return meanRapporRMSE(mseNumerator, sigma, a, T, float64(minDenominatorEstimate))
}