// Copyright 2016 The Fuchsia Authors
//
// 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.
syntax = "proto3";

package cobalt;

option go_package = "config";

// A Cobalt Epoch is a contiguous sequence of days used to aggregate
// observations. Each Report analyzes a set of observations from one epoch.
// Some encodings, such as Forculus, use the current epoch as a parameter.
//
// Each Cobalt |Observation| includes a |day_index| which determines in
// which epoch the Observation falls.
enum EpochType {
  // Each day is a different epoch.
  DAY = 0;
  // A week epoch is a seven day period from Sunday to Saturday
  WEEK = 1;
  // A month epoch is the set of days in a single month of the Gregorian
  // calendar
  MONTH = 2;
}

///////////////////////////////////////////////////////////////
// Messages that describe the configuration of an encoding.
// These are registered in the Cobalt Config Database and consumed
// by both the Encoder and the Analyzer. Each ObservationPart (see
// observation.proto) contains the ID of an EncodingConfig describing how the
// data was encoded.
///////////////////////////////////////////////////////////////

message ForculusConfig {
  // Must satisfy 2 <= threshold <= 1,000,000
  uint32 threshold = 1;

  // Forculus threshold encryption is based on the current epoch. For example
  // if epoch_type = WEEK and threshold = 20 then the criteria for being able
  // to decrypt a given ciphertext is that at least 20 different clients
  // all submit observations of that ciphertext tagged with a day_index in
  // the same week, from Sunday to Saturday.
  EpochType epoch_type = 2;
}

message RapporConfig {
  // k = the number of Bloom filter bits. This must be a power of 2 and
  // it must satisfy:
  // 1 <= h < k <= 1024, where h = num_hashes.
  uint32 num_bloom_bits = 1;

  // h = the number of hashes. This must satisfy
  // 1 <= h <=  8
  uint32 num_hashes = 2;

  // m = the number of cohorts. This must satisfy
  // 1 <= m <= 1024
  uint32 num_cohorts = 3;

  // All probabilities below must be in the range [0.0, 1.0]

  // prob_0_becomes_1 MAY NOT BE EQUAL to prob_1_stays_1.

  // p = p(a zero bit is changed to a one bit in the IRR)
  float prob_0_becomes_1 = 4;

  // q = p(a one bit remains a one bit in the IRR)
  float prob_1_stays_1 = 5;

  // f = p(a bit is randomly assigned a value in the PRR)
  // Note: Not Implemented in version 0.1 of Cobalt.
  // This value must not be set to a non-zero value.
  float prob_rr = 6;
}

// A list of categories to be used in Basic RAPPOR for a metric part of
// type STRING. They must be distinct, non-empty strings and the number
// of categories, k, must satisfy 1 < k < 1024. The zero-based index of a
// category in the list is its bit position in the encoding.
message StringCategories {
  repeated string category = 1;
}

// A range of integer categories to be used in Basic RAPPOR for a metric part of
// type INT. The categories are those integers in the range [first, last].
// The number of categories, k = last - first + 1, must satisfy
// 1 < k < 1024. If i is an integer in the range [first, last] then the bit
// position of category i in the encoding is i - first.
message IntRangeCategories {
  int64 first = 1;
  int64 last = 2;
}

// A specification of the number of categories to be used in Basic RAPPOR for a
// metric part of type INDEX. k = |num_categories| must satisfy
// 1 < k < 1024.
message IndexedCategories {
  uint32 num_categories = 1;
}

message BasicRapporConfig {
  // All probabilities below must be in the range [0.0, 1.0].

  // prob_0_becomes_1 MAY NOT BE EQUAL to prob_1_stays_1.

  // p = p(a zero bit is changed to a one bit in the IRR)
  float prob_0_becomes_1 = 1;

  // q = p(a one bit remains a one bit in the IRR)
  float prob_1_stays_1 = 2;

  // f = p(a bit is randomly assigned a value in the PRR)
  // NOTE: PRR is not implemented in Version 0.1 of Cobalt.
  // This value must not be set to a non-zero value.
  float prob_rr = 3;

  // For basic RAPPOR the Encoder needs to know something about the list of
  // categories. For encoding metric parts of type STRING |string_categories|
  // should be used, for encoding metric parts of type INT
  // |int_range_categories| should be used and for encoding metric parts of
  // type INDEX, |indexed_categories| should be used.
  oneof categories {
    StringCategories string_categories = 7;
    IntRangeCategories int_range_categories = 8;
    IndexedCategories indexed_categories = 9;
  }
}

// The NoOpEncoding specifies that no encoding will be performed. Unencoded
// raw input-values will be used as observations.
message NoOpEncodingConfig {
  // There is no configuration to specify.
}

message EncodingConfig {
  // Next ID: 101
  uint32 customer_id = 1;
  uint32 project_id = 2;
  uint32 id = 3;
  string name = 100;
  oneof config {
    ForculusConfig forculus = 4;
    RapporConfig rappor = 5;
    BasicRapporConfig basic_rappor = 6;
    NoOpEncodingConfig no_op_encoding = 99;
  }
}

// Constains the list of all EncodingConfigs that are registered in the
// Cobalt system. An instance of RegisteredEncodings is deserialized
// from a text file.
message RegisteredEncodings {
  repeated EncodingConfig element = 1;
}
