// 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 }