blob: 221999bf0a95b8c1b46fc4b8426352d69e55b819 [file] [log] [blame]
/*
* 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);
}
}