/* * Copyright 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.privacy.internal.rappor; import android.privacy.DifferentialPrivacyConfig; import android.text.TextUtils; import com.android.internal.util.Preconditions; /** * A class to store {@link RapporEncoder} config. * * @hide */ public class RapporConfig implements DifferentialPrivacyConfig { private static final String ALGORITHM_NAME = "Rappor"; final String mEncoderId; final int mNumBits; final double mProbabilityF; final double mProbabilityP; final double mProbabilityQ; final int mNumCohorts; final int mNumBloomHashes; /** * Constructor for {@link RapporConfig}. * * @param encoderId Unique id for encoder. * @param numBits Number of bits to be encoded in Rappor algorithm. * @param probabilityF Probability F that used in Rappor algorithm. This will be * quantized to the nearest 1/128. * @param probabilityP Probability P that used in Rappor algorithm. * @param probabilityQ Probability Q that used in Rappor algorithm. * @param numCohorts Number of cohorts that used in Rappor algorithm. * @param numBloomHashes Number of bloom hashes that used in Rappor algorithm. */ public RapporConfig(String encoderId, int numBits, double probabilityF, double probabilityP, double probabilityQ, int numCohorts, int numBloomHashes) { Preconditions.checkArgument(!TextUtils.isEmpty(encoderId), "encoderId cannot be empty"); this.mEncoderId = encoderId; Preconditions.checkArgument(numBits > 0, "numBits needs to be > 0"); this.mNumBits = numBits; Preconditions.checkArgument(probabilityF >= 0 && probabilityF <= 1, "probabilityF must be in range [0.0, 1.0]"); this.mProbabilityF = probabilityF; Preconditions.checkArgument(probabilityP >= 0 && probabilityP <= 1, "probabilityP must be in range [0.0, 1.0]"); this.mProbabilityP = probabilityP; Preconditions.checkArgument(probabilityQ >= 0 && probabilityQ <= 1, "probabilityQ must be in range [0.0, 1.0]"); this.mProbabilityQ = probabilityQ; Preconditions.checkArgument(numCohorts > 0, "numCohorts needs to be > 0"); this.mNumCohorts = numCohorts; Preconditions.checkArgument(numBloomHashes > 0, "numBloomHashes needs to be > 0"); this.mNumBloomHashes = numBloomHashes; } @Override public String getAlgorithm() { return ALGORITHM_NAME; } @Override public String toString() { return String.format( "EncoderId: %s, NumBits: %d, ProbabilityF: %.3f, ProbabilityP: %.3f" + ", ProbabilityQ: %.3f, NumCohorts: %d, NumBloomHashes: %d", mEncoderId, mNumBits, mProbabilityF, mProbabilityP, mProbabilityQ, mNumCohorts, mNumBloomHashes); } }