43 lines
1003 B
Go
43 lines
1003 B
Go
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package stats
|
||
|
|
||
|
// LinearHist is a Histogram with uniformly-sized bins.
|
||
|
type LinearHist struct {
|
||
|
min, max, delta float64
|
||
|
low, high uint
|
||
|
bins []uint
|
||
|
}
|
||
|
|
||
|
// NewLinearHist returns an empty histogram with nbins uniformly-sized
|
||
|
// bins spanning [min, max].
|
||
|
func NewLinearHist(min, max float64, nbins int) *LinearHist {
|
||
|
delta := float64(nbins) / (max - min)
|
||
|
return &LinearHist{min, max, delta, 0, 0, make([]uint, nbins)}
|
||
|
}
|
||
|
|
||
|
func (h *LinearHist) bin(x float64) int {
|
||
|
return int(h.delta * (x - h.min))
|
||
|
}
|
||
|
|
||
|
func (h *LinearHist) Add(x float64) {
|
||
|
bin := h.bin(x)
|
||
|
if bin < 0 {
|
||
|
h.low++
|
||
|
} else if bin >= len(h.bins) {
|
||
|
h.high++
|
||
|
} else {
|
||
|
h.bins[bin]++
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (h *LinearHist) Counts() (uint, []uint, uint) {
|
||
|
return h.low, h.bins, h.high
|
||
|
}
|
||
|
|
||
|
func (h *LinearHist) BinToValue(bin float64) float64 {
|
||
|
return h.min + bin*h.delta
|
||
|
}
|