cpc/confidence.go (94 lines of code) (raw):

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 cpc import "math" var ( iconErrorConstant = math.Log(2.0) //0.693147180559945286 hipErrorConstant = math.Sqrt(math.Log(2.0) / 2.0) //0.588705011257737332 iconHighSideData = []int{ //1, 2, 3, kappa // lgK numTrials 8031, 8559, 9309, // 4 1000000 7084, 7959, 8660, // 5 1000000 7141, 7514, 7876, // 6 1000000 7458, 7430, 7572, // 7 1000000 6892, 7141, 7497, // 8 1000000 6889, 7132, 7290, // 9 1000000 7075, 7118, 7185, // 10 1000000 7040, 7047, 7085, // 11 1000000 6993, 7019, 7053, // 12 1046369 6953, 7001, 6983, // 13 1043411 6944, 6966, 7004, // 14 1000297 } hipHighSideData = []int{ //1, 2, 3, kappa // lgK numTrials 5855, 6688, 7391, // 4 1000000 5886, 6444, 6923, // 5 1000000 5885, 6254, 6594, // 6 1000000 5889, 6134, 6326, // 7 1000000 5900, 6072, 6203, // 8 1000000 5875, 6005, 6089, // 9 1000000 5871, 5980, 6040, // 10 1000000 5889, 5941, 6015, // 11 1000000 5871, 5926, 5973, // 12 1046369 5866, 5901, 5915, // 13 1043411 5880, 5914, 5953, // 14 1000297 } ) func iconConfidenceLB(lgK int, numCoupons uint64, kappa int) float64 { if numCoupons == 0 { return 0.0 } x := iconErrorConstant if lgK <= 14 { x = float64(iconHighSideData[(3*(lgK-4))+(kappa-1)]) / 10000.0 } rel := x / math.Sqrt(float64(uint64(1)<<lgK)) eps := float64(kappa) * rel est := iconEstimate(lgK, numCoupons) result := est / (1.0 + eps) if result < float64(numCoupons) { result = float64(numCoupons) } return result } func iconConfidenceUB(lgK int, numCoupons uint64, kappa int) float64 { if numCoupons == 0 { return 0.0 } x := iconErrorConstant if lgK <= 14 { x = float64(iconHighSideData[(3*(lgK-4))+(kappa-1)]) / 10000.0 } rel := x / math.Sqrt(float64(uint64(1)<<lgK)) eps := float64(kappa) * rel est := iconEstimate(lgK, numCoupons) result := est / (1.0 - eps) return math.Ceil(result) } func hipConfidenceLB(lgK int, numCoupons uint64, hipEstAccum float64, kappa int) float64 { if numCoupons == 0 { return 0.0 } x := hipErrorConstant if lgK <= 14 { x = float64(hipHighSideData[(3*(lgK-4))+(kappa-1)]) / 10000.0 } rel := x / math.Sqrt(float64(uint64(1)<<lgK)) eps := float64(kappa) * rel est := hipEstAccum result := est / (1.0 + eps) if result < float64(numCoupons) { result = float64(numCoupons) } return result } func hipConfidenceUB(lgK int, numCoupons uint64, hipEstAccum float64, kappa int) float64 { if numCoupons == 0 { return 0.0 } x := hipErrorConstant if lgK <= 14 { x = float64(hipHighSideData[(3*(lgK-4))+(kappa-1)]) / 10000.0 } rel := x / math.Sqrt(float64(uint64(1)<<lgK)) eps := float64(kappa) * rel est := hipEstAccum result := est / (1.0 - eps) return math.Ceil(result) }