content: /*
   * 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);
      }
  }
  