Our Algorithm
s are templated by the input data type, and return output encoded in an Output
proto. We also provide some utility functions for converting scalar data to/from Output
protos.
Algorithms are templated on the input type. For example, we can find the mean of integer values by building the BoundedMean
algorithm like below. Note that the template only affects the input type; the mean that we return will always be a double.
base::StatusOr<std::unique_ptr<BoundedMean<int64>>> bounded_mean = BoundedMean<int64>::Builder.SetEpsilon(1) .SetLower(-10) .SetUpper(10) .Build();
Output
The Output
contains the algorithm results, and any available accuracy details.
message Output { message Element { optional ValueType value = 1; optional ValueType error = 2; } repeated Element elements = 1; message ErrorReport { optional ConfidenceInterval noise_confidence_interval = 1; optional BoundingReport bounding_report = 2; } optional ErrorReport error_report = 3; }
elements
contain the differentially private results of the algorithm. Each ValueType
holds one value of the type specified by the algorithm. Note that float_value
is a double and int_value
is a long.error_report
contains additional accuracy details. It is only populated for some algorithms. If populated, noise_confidence_interval
will return the 95% confidence interval of the noise added. The bounding_report
is populated in the case that a bounded algorithm
automatically inferred bounds; see the ApproxBounds
algorithm page for more information.Converting to/from these types can be cumbersome, so we provide utility functions for the common cases. We outline some of these functions below. See the utility function file for the full list.
template <typename T> T GetValue(const Output& output);
Extracts the first element from the provided Output
proto. T
is the requested return type; the value in the proto must match that type. For example, if T
is an integral type, the element must have int_value
set.
Creates an Output
with one element. Which field gets set depends on the type of the template parameter T
. For example, MakeOutput(7)
will set int_value
, but MakeOutput(7.0)
will set float_value
.
template <typename T> MakeOutput(T value);
Adds an element to the given output. Which field gets set depends on the type of the template parameter T
. For example, AddToOutput(&output, 7.0)
will add an element to output
and set the float_value
.
template <typename T> void AddToOutput(Output* output, T value) {