Measurement Constructors#

This section gives a high-level overview of the measurements that are available in the library. Refer to the Measurement section for an explanation of what a measurement is.

As covered in the Chaining section, the intermediate domains and metrics need to match when chaining. This means you will need to choose a measurement that chains with your aggregator.

In the following table, the scalar-valued and vector-valued versions of each measurement are listed separately. You can choose whether to construct scalar or vector-valued versions by setting the D type argument when calling the constructor.

Scalar

D=AllDomain[T] (default)

Vector

D=VectorDomain[AllDomain[T]]

Measurement

Input Domain

Output Metric

Output Measure

opendp.meas.make_base_geometric()

AllDomain<T>

AbsoluteDistance<T>

MaxDivergence<T>

opendp.meas.make_base_geometric()

VectorDomain<AllDomain<T>>

L1Distance<T>

MaxDivergence<T>

opendp.meas.make_base_laplace()

AllDomain<T>

AbsoluteDistance<T>

MaxDivergence<T>

opendp.meas.make_base_laplace()

VectorDomain<AllDomain<T>>

L1Distance<T>

MaxDivergence<T>

opendp.meas.make_base_gaussian()

AllDomain<T>

AbsoluteDistance<T>

SmoothedMaxDivergence<T>

opendp.meas.make_base_gaussian()

VectorDomain<AllDomain<T>>

L2Distance<T>

SmoothedMaxDivergence<T>

opendp.meas.make_base_analytic_gaussian()

AllDomain<T>

AbsoluteDistance<T>

SmoothedMaxDivergence<T>

opendp.meas.make_base_analytic_gaussian()

VectorDomain<AllDomain<T>>

L2Distance<T>

SmoothedMaxDivergence<T>

opendp.meas.make_base_ptr()

MapDomain<AllDomain<TIA>, AllDomain<TOA>>

L1Distance<T>

SmoothedMaxDivergence<T>

opendp.meas.make_randomized_response_bool()

AllDomain<bool>

SymmetricDistance

MaxDivergence<T>

opendp.meas.make_randomized_response()

AllDomain<T>

SymmetricDistance

MaxDivergence<T>

Floating-Point#

Given the context of measurements, this section goes into greater detail than Limitations on floating-point issues. Be warned that opendp.meas.make_base_laplace(), opendp.meas.make_base_gaussian() and opendp.meas.make_base_ptr() depend on continuous distributions that are poorly approximated by finite computers.

At this time these mechanisms are present in the library, but require explicit opt-in:

>>> from opendp.mod import enable_features
>>> enable_features("floating-point")

The canonical paper on this and introduction of the snapping mechanism is here: On Significance of the Least Significant Bits For Differential Privacy.

Precautions have been made to sample noise using the GNU MPFR library in a way that provides cryptographically secure, non-porous noise at standard scale. Noise at arbitrary scale is achieved through a combination of preprocessing and postprocessing that preserves the properties of differential privacy.

Precautions have also been made to explicitly specify floating-point rounding modes in such a way that the privacy budget is always slightly overestimated.

We acknowledge the snapping mechanism and have an implementation of it in PR #84.

We are also working towards adding support for fixed-point data types in PR #184.