/* Ċ Ġ* ĠLicensed Ġto ĠT ed ĠD unning Ġ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 Ġcom . td unning . math . stats Ċ Ċ /** Ċ Ġ* ĠEn codes Ġthe Ġvarious Ġscale Ġfunctions Ġfor Ġt - digest s . ĠThese Ġlimits Ġtrade Ġaccuracy Ġnear Ġthe Ġt ails Ġagainst Ġaccuracy Ġnear Ċ Ġ* Ġthe Ġmedian Ġin Ġdifferent Ġways . ĠFor Ġinstance , ĠK _ 0 Ġhas Ġuniform Ġcluster Ġsizes Ġand Ġresults Ġin Ġconstant Ġaccuracy Ġ( in Ġterms Ċ Ġ* Ġof Ġq ) Ġwhile ĠK _ 3 Ġhas Ġcluster Ġsizes Ġpro portional Ġto Ġmin ( q , 1 - q ) Ġwhich Ġresults Ġin Ġvery Ġmuch Ġsmaller Ġerror Ġnear Ġthe Ġt ails Ċ Ġ* Ġand Ġmode st ly Ġincreased Ġerror Ġnear Ġthe Ġmedian . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠThe Ġbase Ġforms Ġ( K _ 0 , ĠK _ 1 , ĠK _ 2 Ġand ĠK _ 3 ) Ġall Ġresult Ġin Ġt - digest s Ġlimited Ġto Ġa Ġnumber Ġof Ġclusters Ġequal Ġto Ġthe Ċ Ġ* Ġcompression Ġfactor . ĠThe ĠK _ 2 _ NO _ NORM Ġand ĠK _ 3 _ NO _ NORM Ġversions Ġresult Ġin Ġthe Ġcluster Ġcount Ġincreasing Ġroughly Ġwith Ċ Ġ* Ġlog ( n ). Ċ Ġ*/ Ċ enum Ġclass ĠScale Function Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġuniform Ġcluster Ġsizes . ĠUsed Ġfor Ġcomparison Ġonly . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠK _ 0 Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression Ġ* Ġq Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnormal izer Ġ* Ġq ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 2 Ġ* Ġk Ġ/ Ġcompression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġk Ġ/ Ġnormal izer ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 2 Ġ/ Ġcompression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 1 Ġ/ Ġnormal izer ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnormal izer ( compression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġcluster Ġsizes Ġpro portional Ġto Ġsqrt ( q *( 1 - q )). ĠThis Ġgives Ġconstant Ġrelative Ġaccuracy Ġif Ġaccuracy Ġis ĊĠĠĠĠ Ġ* Ġpro portional Ġto Ġsquared Ġcluster Ġsize . ĠIt Ġis Ġexpected Ġthat ĠK _ 2 Ġand ĠK _ 3 Ġwill Ġgive Ġbetter Ġpractical Ġresults . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠK _ 1 Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression Ġ* Ġkotlin . math . asin ( 2 Ġ* Ġq Ġ- Ġ 1 ) Ġ/ Ġ( 2 Ġ* Ġkotlin . math . PI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 1 e - 1 5 , Ġ 1 Ġ- Ġ 1 e - 1 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnormal izer Ġ* Ġkotlin . math . asin ( 2 Ġ* Ġq Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 1 e - 1 5 , Ġ 1 Ġ- Ġ 1 e - 1 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( k : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( kotlin . math . sin ( k Ġ* Ġ( 2 Ġ* Ġkotlin . math . PI Ġ/ Ġcompression )) Ġ+ Ġ 1 ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġk , Ġ- compression Ġ/ Ġ 4 , Ġcompression Ġ/ Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( x : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( kotlin . math . sin ( x ) Ġ+ Ġ 1 ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġk Ġ/ Ġnormal izer ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġx , Ġ- kotlin . math . PI Ġ/ Ġ 2 , Ġkotlin . math . PI Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( q Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( q Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ* Ġkotlin . math . sin ( kotlin . math . PI Ġ/ Ġcompression ) Ġ* Ġkotlin . math . sqrt ( q Ġ* Ġ( 1 Ġ- Ġq )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( q Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( q Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ* Ġkotlin . math . sin ( 0 . 5 Ġ/ Ġnormal izer ) Ġ* Ġkotlin . math . sqrt ( q Ġ* Ġ( 1 Ġ- Ġq )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnormal izer ( compression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression Ġ/ Ġ( 2 Ġ* Ġkotlin . math . PI ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġcluster Ġsizes Ġpro portional Ġto Ġsqrt ( q *( 1 - q )) Ġbut Ġavoids Ġcomputation Ġof Ġas in Ġin Ġthe Ġcritical Ġpath Ġby ĊĠĠĠĠ Ġ* Ġusing Ġan Ġapproximate Ġversion . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠK _ 1 _ FAST Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression Ġ* Ġfast As in ( 2 Ġ* Ġq Ġ- Ġ 1 ) Ġ/ Ġ( 2 Ġ* Ġkotlin . math . PI ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 0 . 0 , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnormal izer Ġ* Ġfast As in ( 2 Ġ* Ġq Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 0 . 0 , Ġ 1 . 0 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( kotlin . math . sin ( k Ġ* Ġ( 2 Ġ* Ġkotlin . math . PI Ġ/ Ġcompression )) Ġ+ Ġ 1 ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ( kotlin . math . sin ( k Ġ/ Ġnormal izer ) Ġ+ Ġ 1 ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( q Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( q Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ* Ġkotlin . math . sin ( kotlin . math . PI Ġ/ Ġcompression ) Ġ* Ġkotlin . math . sqrt ( q Ġ* Ġ( 1 Ġ- Ġq )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( q Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( q Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 Ġ* Ġkotlin . math . sin ( 0 . 5 Ġ/ Ġnormal izer ) Ġ* Ġkotlin . math . sqrt ( q Ġ* Ġ( 1 Ġ- Ġq )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnormal izer ( compression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression Ġ/ Ġ( 2 Ġ* Ġkotlin . math . PI ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġcluster Ġsizes Ġpro portional Ġto Ġq *( 1 - q ). ĠThis Ġmakes Ġtail Ġerror Ġbounds Ġtight er Ġthan Ġfor ĠK _ 1 . ĠThe Ġuse Ġof Ġa ĊĠĠĠĠ Ġ* Ġnormal izing Ġfunction Ġresults Ġin Ġa Ġstrictly Ġbounded Ġnumber Ġof Ġclusters Ġno Ġmatter Ġhow Ġmany Ġsamples . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠK _ 2 Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( n Ġ<= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( q Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ(- 1 0 ). toDouble () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( q Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression Ġ* Ġkotlin . math . ln ( q Ġ/ Ġ( 1 Ġ- Ġq )) Ġ/ ĠZ ( compression , Ġn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 1 e - 1 5 , Ġ 1 Ġ- Ġ 1 e - 1 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkotlin . math . ln ( q Ġ/ Ġ( 1 Ġ- Ġq )) Ġ* Ġnormal izer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 1 e - 1 5 , Ġ 1 Ġ- Ġ 1 e - 1 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw : ĠDouble Ġ= Ġkotlin . math . exp ( k Ġ* ĠZ ( compression , Ġn ) Ġ/ Ġcompression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġw Ġ/ Ġ( 1 Ġ+ Ġw ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw : ĠDouble Ġ= Ġkotlin . math . exp ( k Ġ/ Ġnormal izer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġw Ġ/ Ġ( 1 Ġ+ Ġw ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠZ ( compression , Ġn ) Ġ* Ġq Ġ* Ġ( 1 Ġ- Ġq ) Ġ/ Ġcompression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġq Ġ* Ġ( 1 Ġ- Ġq ) Ġ/ Ġnormal izer ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnormal izer ( compression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression Ġ/ ĠZ ( compression , Ġn ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠZ ( compression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 4 Ġ* Ġkotlin . math . ln ( n Ġ/ Ġcompression ) Ġ+ Ġ 2 4 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġcluster Ġsizes Ġpro portional Ġto Ġmin ( q , Ġ 1 - q ). ĠThis Ġmakes Ġtail Ġerror Ġbounds Ġtight er Ġthan Ġfor ĠK _ 1 Ġor ĠK _ 2 . ĊĠĠĠĠ Ġ* ĠThe Ġuse Ġof Ġa Ġnormal izing Ġfunction Ġresults Ġin Ġa Ġstrictly Ġbounded Ġnumber Ġof Ġclusters Ġno Ġmatter Ġhow Ġmany Ġsamples . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠK _ 3 Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( q Ġ<= Ġ 0 . 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompression Ġ* Ġkotlin . math . ln ( 2 Ġ* Ġq ) Ġ/ ĠZ ( compression , Ġn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- k ( 1 Ġ- Ġq , Ġcompression , Ġn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 1 e - 1 5 , Ġ 1 Ġ- Ġ 1 e - 1 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( q Ġ<= Ġ 0 . 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . math . ln ( 2 Ġ* Ġq ) Ġ* Ġnormal izer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- k ( 1 Ġ- Ġq , Ġnormal izer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 1 e - 1 5 , Ġ 1 Ġ- Ġ 1 e - 1 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( k Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . math . exp ( k Ġ* ĠZ ( compression , Ġn ) Ġ/ Ġcompression ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ- Ġq (- k , Ġcompression , Ġn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( k Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . math . exp ( k Ġ/ Ġnormal izer ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ- Ġq (- k , Ġnormal izer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠZ ( compression , Ġn ) Ġ* Ġkotlin . math . min ( q , Ġ 1 Ġ- Ġq ) Ġ/ Ġcompression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkotlin . math . min ( q , Ġ 1 Ġ- Ġq ) Ġ/ Ġnormal izer ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnormal izer ( compression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression Ġ/ ĠZ ( compression , Ġn ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠZ ( compression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ 4 Ġ* Ġkotlin . math . ln ( n Ġ/ Ġcompression ) Ġ+ Ġ 2 1 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġcluster Ġsizes Ġpro portional Ġto Ġq *( 1 - q ). ĠThis Ġmakes Ġthe Ġtail Ġerror Ġbounds Ġtight er . ĠThis Ġversion Ġdoes Ġnot ĊĠĠĠĠ Ġ* Ġuse Ġa Ġnormal izer Ġfunction Ġand Ġthus Ġthe Ġnumber Ġof Ġclusters Ġincreases Ġroughly Ġpro portional Ġto Ġlog ( n ). ĠThat Ġis Ġgood ĊĠĠĠĠ Ġ* Ġfor Ġaccuracy , Ġbut Ġbad Ġfor Ġsize Ġand Ġbad Ġfor Ġthe Ġstatic ally Ġallocated ĠMer ging Digest , Ġbut Ġcan Ġbe Ġuseful Ġfor ĊĠĠĠĠ Ġ* Ġtree - based Ġimplementations . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠK _ 2 _ NO _ NORM Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression Ġ* Ġkotlin . math . ln ( q Ġ/ Ġ( 1 Ġ- Ġq )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 1 e - 1 5 , Ġ 1 Ġ- Ġ 1 e - 1 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnormal izer Ġ* Ġkotlin . math . ln ( q Ġ/ Ġ( 1 Ġ- Ġq )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 1 e - 1 5 , Ġ 1 Ġ- Ġ 1 e - 1 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw : ĠDouble Ġ= Ġkotlin . math . exp ( k Ġ/ Ġcompression ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġw Ġ/ Ġ( 1 Ġ+ Ġw ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġw : ĠDouble Ġ= Ġkotlin . math . exp ( k Ġ/ Ġnormal izer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġw Ġ/ Ġ( 1 Ġ+ Ġw ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġq Ġ* Ġ( 1 Ġ- Ġq ) Ġ/ Ġcompression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġq Ġ* Ġ( 1 Ġ- Ġq ) Ġ/ Ġnormal izer ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnormal izer ( compression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}, ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠGenerates Ġcluster Ġsizes Ġpro portional Ġto Ġmin ( q , Ġ 1 - q ). ĠThis Ġmakes Ġthe Ġtail Ġerror Ġbounds Ġtight er . ĠThis Ġversion Ġdoes ĊĠĠĠĠ Ġ* Ġnot Ġuse Ġa Ġnormal izer Ġfunction Ġand Ġthus Ġthe Ġnumber Ġof Ġclusters Ġincreases Ġroughly Ġpro portional Ġto Ġlog ( n ). ĠThat Ġis ĊĠĠĠĠ Ġ* Ġgood Ġfor Ġaccuracy , Ġbut Ġbad Ġfor Ġsize Ġand Ġbad Ġfor Ġthe Ġstatic ally Ġallocated ĠMer ging Digest , Ġbut Ġcan Ġbe Ġuseful Ġfor ĊĠĠĠĠ Ġ* Ġtree - based Ġimplementations . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ ĠK _ 3 _ NO _ NORM Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( q Ġ<= Ġ 0 . 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompression Ġ* Ġkotlin . math . ln ( 2 Ġ* Ġq ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- k ( 1 Ġ- Ġq , Ġcompression , Ġn ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 1 e - 1 5 , Ġ 1 Ġ- Ġ 1 e - 1 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġk ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġpoor Ġman 's Ġlambda , Ġs igh ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf : ĠFunction Ġ= Ġobject Ġ: ĠFunction () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġapply ( q : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( q Ġ<= Ġ 0 . 5 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal izer Ġ* Ġkotlin . math . ln ( 2 Ġ* Ġq ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- k ( 1 Ġ- Ġq , Ġnormal izer ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlimit Call ( f , Ġq , Ġ 1 e - 1 5 , Ġ 1 Ġ- Ġ 1 e - 1 5 ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( k Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . math . exp ( k Ġ/ Ġcompression ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ- Ġq (- k , Ġcompression , Ġn ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġq ( k : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( k Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . math . exp ( k Ġ/ Ġnormal izer ) Ġ/ Ġ 2 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ- Ġq (- k , Ġnormal izer ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkotlin . math . min ( q , Ġ 1 Ġ- Ġq ) Ġ/ Ġcompression ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġmax ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġkotlin . math . min ( q , Ġ 1 Ġ- Ġq ) Ġ/ Ġnormal izer ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġnormal izer ( compression : ĠDouble , Ġn : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcompression ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ}; ĊĠĠĠ Ġ// Ġmax Ġweight Ġis Ġmin ( q , 1 - q ), Ġshould Ġimprove Ġtail Ġaccuracy Ġeven Ġmore ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġa Ġquant ile Ġto Ġthe Ġk - scale . ĠThe Ġtotal Ġnumber Ġof Ġpoints Ġis Ġalso Ġprovided Ġso Ġthat Ġa Ġnormal izing Ġfunction ĊĠĠĠĠ Ġ* Ġcan Ġbe Ġcomputed Ġif Ġnecessary . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġq ĠĠĠĠĠĠĠĠĠĠ ĠThe Ġquant ile ĊĠĠĠĠ Ġ* Ġ@ param Ġcompression ĠAlso Ġknown Ġas Ġdelta Ġin Ġliter ature Ġon Ġthe Ġt - digest ĊĠĠĠĠ Ġ* Ġ@ param Ġn ĠĠĠĠĠĠĠĠĠĠ ĠThe Ġtotal Ġnumber Ġof Ġsamples ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcorresponding Ġvalue Ġof Ġk ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġk ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConverts Ġ Ġa Ġquant ile Ġto Ġthe Ġk - scale . ĠThe Ġnormal izer Ġvalue Ġdepends Ġon Ġcompression Ġand Ġ( possibly ) Ġnumber Ġof Ġpoints ĊĠĠĠĠ Ġ* Ġin Ġthe Ġdigest . Ġ# normal izer ( double , Ġdouble ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġq ĠĠĠĠĠĠĠĠĠ ĠThe Ġquant ile ĊĠĠĠĠ Ġ* Ġ@ param Ġnormal izer ĠThe Ġnormal izer Ġvalue Ġwhich Ġdepends Ġon Ġcompression Ġand Ġ( possibly ) Ġnumber Ġof Ġpoints Ġin Ġthe ĊĠĠĠĠ Ġ* Ġdigest . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġcorresponding Ġvalue Ġof Ġk ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġk ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġq Ġas Ġa Ġfunction Ġof Ġk . ĠThis Ġis Ġoften Ġfaster Ġthan Ġfinding Ġk Ġas Ġa Ġfunction Ġof Ġq Ġfor Ġsome Ġscales . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġk ĠĠĠĠĠĠĠĠĠĠ ĠThe Ġindex Ġvalue Ġto Ġconvert Ġinto Ġq Ġscale . ĊĠĠĠĠ Ġ* Ġ@ param Ġcompression ĠThe Ġcompression Ġfactor Ġ( oft en Ġwritten Ġas Ġ) ĊĠĠĠĠ Ġ* Ġ@ param Ġn ĠĠĠĠĠĠĠĠĠĠ ĠThe Ġnumber Ġof Ġsamples Ġalready Ġin Ġthe Ġdigest . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġof Ġq Ġthat Ġcorresponds Ġto Ġk ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġq ( k : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġq Ġas Ġa Ġfunction Ġof Ġk . ĠThis Ġis Ġoften Ġfaster Ġthan Ġfinding Ġk Ġas Ġa Ġfunction Ġof Ġq Ġfor Ġsome Ġscales . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġk ĠĠĠĠĠĠĠĠĠ ĠThe Ġindex Ġvalue Ġto Ġconvert Ġinto Ġq Ġscale . ĊĠĠĠĠ Ġ* Ġ@ param Ġnormal izer ĠThe Ġnormal izer Ġvalue Ġwhich Ġdepends Ġon Ġcompression Ġand Ġ( possibly ) Ġnumber Ġof Ġpoints Ġin Ġthe ĊĠĠĠĠ Ġ* Ġdigest . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġvalue Ġof Ġq Ġthat Ġcorresponds Ġto Ġk ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġq ( k : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġthe Ġmaximum Ġrelative Ġsize Ġa Ġcluster Ġcan Ġhave Ġat Ġquant ile Ġq . ĠNote Ġthat Ġexactly Ġwhere Ġwithin Ġthe Ġrange ĊĠĠĠĠ Ġ* Ġsp anned Ġby Ġa Ġcluster Ġthat Ġq Ġshould Ġbe Ġisn 't Ġclear . ĠThat Ġmeans Ġthat Ġthis Ġfunction Ġusually Ġhas Ġto Ġbe Ġtaken Ġat ĊĠĠĠĠ Ġ* Ġmultiple Ġpoints Ġand Ġthe Ġsmallest Ġvalue Ġused . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthis Ġis Ġthe Ġrelative Ġsize Ġof Ġa Ġcluster . ĠTo Ġget Ġthe Ġmax Ġnumber Ġof Ġsamples Ġin Ġthe Ġcluster , Ġmultiply Ġthis ĊĠĠĠĠ Ġ* Ġvalue Ġtimes Ġthe Ġtotal Ġnumber Ġof Ġsamples Ġin Ġthe Ġdigest . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġq ĠĠĠĠĠĠĠĠĠĠ ĠThe Ġquant ile ĊĠĠĠĠ Ġ* Ġ@ param Ġcompression ĠThe Ġcompression Ġfactor , Ġtypically Ġdelta Ġin Ġthe Ġliter ature ĊĠĠĠĠ Ġ* Ġ@ param Ġn ĠĠĠĠĠĠĠĠĠĠ ĠThe Ġnumber Ġof Ġsamples Ġseen Ġso Ġfar Ġin Ġthe Ġdigest ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġmaximum Ġnumber Ġof Ġsamples Ġthat Ġcan Ġbe Ġin Ġthe Ġcluster ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġmax ( q : ĠDouble , Ġcompression : ĠDouble , Ġn : ĠDouble ): ĠDouble ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġthe Ġmaximum Ġrelative Ġsize Ġa Ġcluster Ġcan Ġhave Ġat Ġquant ile Ġq . ĠNote Ġthat Ġexactly Ġwhere Ġwithin Ġthe Ġrange ĊĠĠĠĠ Ġ* Ġsp anned Ġby Ġa Ġcluster Ġthat Ġq Ġshould Ġbe Ġisn 't Ġclear . ĠThat Ġmeans Ġthat Ġthis Ġfunction Ġusually Ġhas Ġto Ġbe Ġtaken Ġat ĊĠĠĠĠ Ġ* Ġmultiple Ġpoints Ġand Ġthe Ġsmallest Ġvalue Ġused . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthis Ġis Ġthe Ġrelative Ġsize Ġof Ġa Ġcluster . ĠTo Ġget Ġthe Ġmax Ġnumber Ġof Ġsamples Ġin Ġthe Ġcluster , Ġmultiply Ġthis ĊĠĠĠĠ Ġ* Ġvalue Ġtimes Ġthe Ġtotal Ġnumber Ġof Ġsamples Ġin Ġthe Ġdigest . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġq ĠĠĠĠĠĠĠĠĠ ĠThe Ġquant ile ĊĠĠĠĠ Ġ* Ġ@ param Ġnormal izer ĠThe Ġnormal izer Ġvalue Ġwhich Ġdepends Ġon Ġcompression Ġand Ġ( possibly ) Ġnumber Ġof Ġpoints Ġin Ġthe ĊĠĠĠĠ Ġ* Ġdigest . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġmaximum Ġnumber Ġof Ġsamples Ġthat Ġcan Ġbe Ġin Ġthe Ġcluster ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġmax ( q : ĠDouble , Ġnormal izer : ĠDouble ): ĠDouble ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠComputes Ġthe Ġnormal izer Ġgiven Ġcompression Ġand Ġnumber Ġof Ġpoints . ĊĠĠĠĠ Ġ* Ġ@ param Ġcompression ĠThe Ġcompression Ġparameter Ġfor Ġthe Ġdigest ĊĠĠĠĠ Ġ* Ġ@ param Ġn ĠThe Ġnumber Ġof Ġsamples Ġseen Ġso Ġfar ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġnormal izing Ġfactor Ġfor Ġthe Ġscale Ġfunction ĊĠĠĠĠ Ġ* Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġnormal izer ( compression : ĠDouble , Ġn : ĠDouble ): ĠDouble ĊĠĠĠ Ġinternal Ġabstract Ġclass ĠFunction Ġ{ ĊĠĠĠĠĠĠĠ Ġabstract Ġfun Ġapply ( x : ĠDouble ): ĠDouble ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠAppro x im ates Ġas in Ġto Ġwithin Ġabout Ġ 1 e - 6 . ĠThis Ġapproximation Ġworks Ġby Ġbreaking Ġthe Ġrange Ġfrom Ġ 0 Ġto Ġ 1 Ġinto Ġ 5 Ġregions ĊĠĠĠĠĠĠĠĠ Ġ* Ġfor Ġall Ġbut Ġthe Ġregion Ġnearest Ġ 1 , Ġr ational Ġpolynomial Ġmodels Ġget Ġus Ġa Ġvery Ġgood Ġapproximation Ġof Ġas in Ġand Ġby ĊĠĠĠĠĠĠĠĠ Ġ* Ġinterpol ating Ġas Ġwe Ġmove Ġfrom Ġregion Ġto Ġregion , Ġwe Ġcan Ġguarantee Ġcontinu ity Ġand Ġwe Ġhappen Ġto Ġget Ġmon otonic ity Ġas ĊĠĠĠĠĠĠĠĠ Ġ* Ġwell . Ġ Ġfor Ġthe Ġvalues Ġnear Ġ 1 , Ġwe Ġjust Ġuse ĠMath . asin Ġas Ġour Ġregion Ġ" approx imation ". ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ param Ġx Ġsin ( theta ) ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġtheta ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġfast As in ( x : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( x Ġ< Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- fast As in (- x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( x Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDouble . NaN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠC utoff s Ġfor Ġmodels . ĠNote Ġthat Ġthe Ġranges Ġoverlap . ĠIn Ġthe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġoverlap Ġwe Ġdo Ġlinear Ġinterpolation Ġto Ġguarantee Ġthe Ġoverall ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġresult Ġis Ġ" nice " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 0 High Ġ= Ġ 0 . 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 1 High Ġ= Ġ 0 . 5 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 2 Low Ġ= Ġ 0 . 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 2 High Ġ= Ġ 0 . 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 3 Low Ġ= Ġ 0 . 7 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 3 High Ġ= Ġ 0 . 9 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġc 4 Low Ġ= Ġ 0 . 8 7 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x Ġ> Ġc 3 High ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġkotlin . math . asin ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġmodels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm 0 Ġ= Ġdouble ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 9 5 5 3 0 2 4 1 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 2 2 2 1 9 0 3 6 1 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 4 8 8 5 8 3 7 4 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 4 2 2 0 1 5 8 1 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 0 . 3 6 8 8 7 0 0 8 9 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 7 3 3 3 9 8 4 4 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm 1 Ġ= Ġdouble ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 0 . 0 4 3 0 9 9 1 9 2 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 9 5 9 4 0 3 5 7 5 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 0 . 0 3 6 2 3 1 2 2 9 9 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 1 2 0 4 6 2 3 3 5 1 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 4 5 7 0 2 9 6 2 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 0 . 0 0 2 6 0 2 5 2 8 5 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm 2 Ġ= Ġdouble ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 0 . 0 3 4 8 7 3 9 3 3 7 2 4 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 5 4 7 9 6 7 5 2 7 0 3 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 0 . 1 9 4 1 2 7 0 6 3 3 8 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 2 8 3 9 6 3 7 3 5 6 3 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 2 3 8 0 0 1 2 4 9 1 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 0 . 0 0 0 8 7 2 7 2 7 3 8 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġm 3 Ġ= Ġdouble ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 0 . 3 7 5 8 8 3 9 1 8 7 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 . 6 1 9 9 1 8 5 9 0 2 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 2 . 4 8 8 3 5 4 0 6 8 8 6 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 4 8 6 0 5 3 8 7 4 2 5 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 0 8 5 7 6 2 7 4 9 2 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 0 . 0 0 0 1 5 8 0 2 8 7 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġparameters Ġfor Ġall Ġof Ġthe Ġmodels ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvars Ġ= Ġdouble ArrayOf ( 1 . 0 , Ġx , Ġx Ġ* Ġx , Ġx Ġ* Ġx Ġ* Ġx , Ġ 1 Ġ/ Ġ( 1 Ġ- Ġx ), Ġ 1 Ġ/ Ġ( 1 Ġ- Ġx ) Ġ/ Ġ( 1 Ġ- Ġx )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġraw Ġg rist Ġfor Ġinterpolation Ġcoefficients ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 0 Ġ= Ġbound (( c 0 High Ġ- Ġx ) Ġ/ Ġc 0 High ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 1 Ġ= Ġbound (( c 1 High Ġ- Ġx ) Ġ/ Ġ( c 1 High Ġ- Ġc 2 Low )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 2 Ġ= Ġbound (( c 2 High Ġ- Ġx ) Ġ/ Ġ( c 2 High Ġ- Ġc 3 Low )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx 3 Ġ= Ġbound (( c 3 High Ġ- Ġx ) Ġ/ Ġ( c 3 High Ġ- Ġc 4 Low )) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġinterpolation Ġcoefficients ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmix 1 Ġ= Ġ( 1 Ġ- Ġx 0 ) Ġ* Ġx 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmix 2 Ġ= Ġ( 1 Ġ- Ġx 1 ) Ġ* Ġx 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmix 3 Ġ= Ġ( 1 Ġ- Ġx 2 ) Ġ* Ġx 3 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmix 4 Ġ= Ġ 1 Ġ- Ġx 3 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnow Ġmix Ġall Ġthe Ġresults Ġtogether , Ġavoid ing Ġextra Ġevalu ations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġr Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( x 0 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ+= Ġx 0 Ġ* Ġeval ( m 0 , Ġvars ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mix 1 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ+= Ġmix 1 Ġ* Ġeval ( m 1 , Ġvars ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mix 2 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ+= Ġmix 2 Ġ* Ġeval ( m 2 , Ġvars ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mix 3 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ+= Ġmix 3 Ġ* Ġeval ( m 3 , Ġvars ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mix 4 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmodel Ġ 4 Ġis Ġjust Ġthe Ġreal Ġdeal ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ+= Ġmix 4 Ġ* Ġkotlin . math . asin ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġinternal Ġfun Ġlimit Call ( f : ĠFunction , Ġx : ĠDouble , Ġlow : ĠDouble , Ġhigh : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( x Ġ< Ġlow ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . apply ( low ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( x Ġ> Ġhigh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . apply ( high ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġf . apply ( x ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġeval ( model : ĠDouble Array , Ġvars : ĠDouble Array ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġr Ġ= Ġ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġmodel . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr Ġ+= Ġmodel [ i ] Ġ* Ġvars [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġr ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġbound ( v : ĠDouble ): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( v Ġ<= Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( v Ġ>= Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 . 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }