1*14675a02SAndroid Build Coastguard Worker /* 2*14675a02SAndroid Build Coastguard Worker * Copyright 2023 Google LLC 3*14675a02SAndroid Build Coastguard Worker * 4*14675a02SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*14675a02SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*14675a02SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*14675a02SAndroid Build Coastguard Worker * 8*14675a02SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*14675a02SAndroid Build Coastguard Worker * 10*14675a02SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*14675a02SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*14675a02SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*14675a02SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*14675a02SAndroid Build Coastguard Worker * limitations under the License. 15*14675a02SAndroid Build Coastguard Worker */ 16*14675a02SAndroid Build Coastguard Worker 17*14675a02SAndroid Build Coastguard Worker #ifndef FCP_SECAGG_SERVER_DISTRIBUTION_UTILITIES_H_ 18*14675a02SAndroid Build Coastguard Worker #define FCP_SECAGG_SERVER_DISTRIBUTION_UTILITIES_H_ 19*14675a02SAndroid Build Coastguard Worker 20*14675a02SAndroid Build Coastguard Worker #include <memory> 21*14675a02SAndroid Build Coastguard Worker 22*14675a02SAndroid Build Coastguard Worker #include "fcp/base/monitoring.h" 23*14675a02SAndroid Build Coastguard Worker 24*14675a02SAndroid Build Coastguard Worker namespace fcp { 25*14675a02SAndroid Build Coastguard Worker namespace secagg { 26*14675a02SAndroid Build Coastguard Worker 27*14675a02SAndroid Build Coastguard Worker // Represents a Hypergeometric distribution with parameters fixed at creation of 28*14675a02SAndroid Build Coastguard Worker // the object. Allows to query certain distribution functions. 29*14675a02SAndroid Build Coastguard Worker class HypergeometricDistribution { 30*14675a02SAndroid Build Coastguard Worker public: 31*14675a02SAndroid Build Coastguard Worker static StatusOr<std::unique_ptr<HypergeometricDistribution>> Create( 32*14675a02SAndroid Build Coastguard Worker int total, int marked, int sampled); 33*14675a02SAndroid Build Coastguard Worker 34*14675a02SAndroid Build Coastguard Worker // Evaluates the probability mass funciton of the random variable at x. 35*14675a02SAndroid Build Coastguard Worker double PMF(double x); 36*14675a02SAndroid Build Coastguard Worker 37*14675a02SAndroid Build Coastguard Worker // Evaluates the cumulative distribution function of the random variable at x. 38*14675a02SAndroid Build Coastguard Worker double CDF(double x); 39*14675a02SAndroid Build Coastguard Worker 40*14675a02SAndroid Build Coastguard Worker // Finds the value whose cdf is quantile rounded outwards to an integer. 41*14675a02SAndroid Build Coastguard Worker // Setting complement to true is equivalent to setting quantile = 1 - quantile 42*14675a02SAndroid Build Coastguard Worker // but can avoid numerical error in the extreme upper tail. 43*14675a02SAndroid Build Coastguard Worker double FindQuantile(double quantile, bool complement = false); 44*14675a02SAndroid Build Coastguard Worker 45*14675a02SAndroid Build Coastguard Worker private: 46*14675a02SAndroid Build Coastguard Worker const int total_; 47*14675a02SAndroid Build Coastguard Worker const int marked_; 48*14675a02SAndroid Build Coastguard Worker const int sampled_; 49*14675a02SAndroid Build Coastguard Worker HypergeometricDistribution(int total,int marked,int sampled)50*14675a02SAndroid Build Coastguard Worker HypergeometricDistribution(int total, int marked, int sampled) 51*14675a02SAndroid Build Coastguard Worker : total_(total), marked_(marked), sampled_(sampled) {} 52*14675a02SAndroid Build Coastguard Worker 53*14675a02SAndroid Build Coastguard Worker double PMFImpl(double x, int counted); 54*14675a02SAndroid Build Coastguard Worker 55*14675a02SAndroid Build Coastguard Worker double CDFImpl(double x, int counted); 56*14675a02SAndroid Build Coastguard Worker 57*14675a02SAndroid Build Coastguard Worker double FindQuantileImpl(double quantile, int counted); 58*14675a02SAndroid Build Coastguard Worker }; 59*14675a02SAndroid Build Coastguard Worker 60*14675a02SAndroid Build Coastguard Worker } // namespace secagg 61*14675a02SAndroid Build Coastguard Worker } // namespace fcp 62*14675a02SAndroid Build Coastguard Worker #endif // FCP_SECAGG_SERVER_DISTRIBUTION_UTILITIES_H_ 63