forked from extern/smegmesh
661fb0d54c
Keepalive is based on per mesh and not per node. Using total ordering mechanism similar to paxos to elect a leader if leader doesn't update it's timestamp within 3 * keepAlive then give the leader a gravestone and elect the next leader. Leader is bassed on lexicographically ordered public key.
41 lines
816 B
Go
41 lines
816 B
Go
// lib contains helper functions for the implementation
|
|
package lib
|
|
|
|
import (
|
|
"cmp"
|
|
"math"
|
|
|
|
"gonum.org/v1/gonum/stat"
|
|
"gonum.org/v1/gonum/stat/distuv"
|
|
)
|
|
|
|
// Modelling the distribution using a normal distribution get the count
|
|
// of the outliers
|
|
func GetOutliers[K cmp.Ordered](counts map[K]uint64, alpha float64) []K {
|
|
n := float64(len(counts))
|
|
|
|
keys := MapKeys(counts)
|
|
values := make([]float64, len(keys))
|
|
|
|
for index, key := range keys {
|
|
values[index] = float64(counts[key])
|
|
}
|
|
|
|
mean := stat.Mean(values, nil)
|
|
stdDev := stat.StdDev(values, nil)
|
|
|
|
moe := distuv.Normal{Mu: 0, Sigma: 1}.Quantile(1-alpha/2) * (stdDev / math.Sqrt(n))
|
|
|
|
lowerBound := mean - moe
|
|
|
|
var outliers []K
|
|
|
|
for i, count := range values {
|
|
if count < lowerBound {
|
|
outliers = append(outliers, keys[i])
|
|
}
|
|
}
|
|
|
|
return outliers
|
|
}
|