From 37e09a0f99042274a26682262c91bda915255996 Mon Sep 17 00:00:00 2001 From: "didier.amyot" Date: Sat, 17 May 2014 22:36:31 -0400 Subject: [PATCH 1/2] shit on stats --- stats.go | 57 +++++++++++++++++++++++++++++++++++++++++++++++---- stats_test.go | 54 ++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 105 insertions(+), 6 deletions(-) diff --git a/stats.go b/stats.go index b90f015..815fab6 100644 --- a/stats.go +++ b/stats.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "math" ) var _ = fmt.Print @@ -9,20 +10,34 @@ var _ = fmt.Print const initialLength int = 1024 const verySmall float64 = -100000 const veryBig float64 = 100000 +const epsilon = 0.00000002 type StatAggregator struct { sum float64 sumOfTheSquares float64 n int - histogram []float64 - min float64 - max float64 + // histogram is a list of point between [min max] each point in the + //histogram represents the beginning of the histogram bars. + histogram []float64 + histogramValues []int + histogramBarWidth float64 + numberOfHistogramBar int + min float64 + max float64 } type Stats struct{} func NewStatAggregator() *StatAggregator { - return &StatAggregator{0, 0, 0, make([]float64, initialLength), veryBig, verySmall} + return &StatAggregator{0, + 0, + 0, + make([]float64, 0, initialLength), + make([]int, 0, initialLength), + 0, + initialLength, + veryBig, + verySmall} } func (this *StatAggregator) AddStats(dataChannel chan float64, output chan *Stats) { @@ -39,3 +54,37 @@ func (this *StatAggregator) AddStats(dataChannel chan float64, output chan *Stat } output <- nil } + +// always assume the min and max includes the value! +func (this *StatAggregator) AddDataToHistogram(value float64) { + if len(this.histogramValues) < this.numberOfHistogramBar { + this.AddDataToHistogramWhenLessDataThanBarAreOnHistograms(value) + } else { + this.AddDataToHistogramWithMaximalNumberOfBars(value) + + } + +} + +func (this *StatAggregator) AddDataToHistogramWithMaximalNumberOfBars(value float64) { +} + +func (this *StatAggregator) AddDataToHistogramWhenLessDataThanBarAreOnHistograms(value float64) { + for i, v := range this.histogram { + if math.Abs(value-v) < epsilon { + this.histogramValues[i]++ + return + } else if value < v { + this.histogram = append(this.histogram, 0) + copy(this.histogram[i+1:], this.histogram[i:]) + this.histogram[i] = value + + this.histogramValues = append(this.histogramValues, 0) + copy(this.histogramValues[i+1:], this.histogramValues[i:]) + this.histogramValues[i] = 1 + return + } + } + this.histogramValues = append(this.histogramValues, 1) + this.histogram = append(this.histogram, value) +} diff --git a/stats_test.go b/stats_test.go index c10951e..1ed3b47 100644 --- a/stats_test.go +++ b/stats_test.go @@ -1,6 +1,7 @@ package main import ( + "reflect" "testing" ) @@ -9,9 +10,11 @@ func TestNewStats(t *testing.T) { if s.n != 0 || s.sum != 0 || s.sumOfTheSquares != 0 || - len(s.histogram) != initialLength || + s.numberOfHistogramBar != initialLength || s.min != veryBig || - s.max != verySmall { + s.max != verySmall || + len(s.histogram) != 0 || + len(s.histogramValues) != 0 { t.Fail() } } @@ -31,5 +34,52 @@ func TestAddStatsBasic(t *testing.T) { if s.n != 4. || s.min != -1. || s.max != 20. || s.sum != 23. || s.sumOfTheSquares != 411. { t.Error(">>>", s.max, s.min) } +} + +func TestAddDataToHistogramWhenLessDataThanBarAreOnHistograms(t *testing.T) { + s := NewStatAggregator() + s.AddDataToHistogramWhenLessDataThanBarAreOnHistograms(17) + if !reflect.DeepEqual([]float64{17}, s.histogram) { + t.Error("bad histogram", s.histogram) + } + if !reflect.DeepEqual([]int{1}, s.histogramValues) { + t.Error("bad histogramValues:", s.histogramValues) + } + s.histogram = []float64{-1, 1, 2, 3} + s.histogramValues = []int{1, 1, 1, 1} + s.AddDataToHistogramWhenLessDataThanBarAreOnHistograms(2) + if !reflect.DeepEqual([]int{1, 1, 2, 1}, s.histogramValues) { + t.Error("bad histogramValues", s.histogramValues) + } + + s.AddDataToHistogramWhenLessDataThanBarAreOnHistograms(2.5) + if !reflect.DeepEqual([]float64{-1, 1, 2, 2.5, 3}, s.histogram) { + t.Error("bad histogram", s.histogram) + } + if !reflect.DeepEqual([]int{1, 1, 2, 1, 1}, s.histogramValues) { + t.Error("bad histogramValues:", s.histogramValues) + } + + s.AddDataToHistogramWhenLessDataThanBarAreOnHistograms(22.5) + if !reflect.DeepEqual([]float64{-1, 1, 2, 2.5, 3, 22.5}, s.histogram) { + t.Error("bad histogram", s.histogram) + } + if !reflect.DeepEqual([]int{1, 1, 2, 1, 1, 1}, s.histogramValues) { + t.Error("bad histogramValues:", s.histogramValues) + } } + +func TestAddDataToHistogramWithMaximalNumberOfBars(t *testing.T) { + s := NewStatAggregator() + s.numberOfHistogramBar = 5 + s.histogram = []float64{1, 2, 3, 4, 5} + s.histogramValues = []int{1, 1, 2, 3, 4} + s.AddDataToHistogramWithMaximalNumberOfBars(3.5) + if !reflect.DeepEqual(s.histogram, []float64{1, 2, 3, 4, 5}) { + t.Fail() + } + if !reflect.DeepEqual(s.histogramValues, []int{1, 1, 2, 3, 4}) { + t.Fail() + } +} From 5242d125f827a1d5b09aad86cab9eddd3bd6ad0a Mon Sep 17 00:00:00 2001 From: "didier.amyot" Date: Tue, 20 May 2014 11:16:25 -0400 Subject: [PATCH 2/2] removed shit. --- stats.go | 68 +++++++++++++-------------------------------------- stats_test.go | 57 +++++++++--------------------------------- 2 files changed, 29 insertions(+), 96 deletions(-) diff --git a/stats.go b/stats.go index 815fab6..af0e185 100644 --- a/stats.go +++ b/stats.go @@ -10,34 +10,24 @@ var _ = fmt.Print const initialLength int = 1024 const verySmall float64 = -100000 const veryBig float64 = 100000 -const epsilon = 0.00000002 + +type Stats struct { + Mean float64 `json:"mean"` + Var float64 `json:"var"` + Std float64 `json:"std"` +} type StatAggregator struct { sum float64 sumOfTheSquares float64 n int - // histogram is a list of point between [min max] each point in the - //histogram represents the beginning of the histogram bars. - histogram []float64 - histogramValues []int - histogramBarWidth float64 - numberOfHistogramBar int - min float64 - max float64 + histogram []float64 + min float64 + max float64 } -type Stats struct{} - func NewStatAggregator() *StatAggregator { - return &StatAggregator{0, - 0, - 0, - make([]float64, 0, initialLength), - make([]int, 0, initialLength), - 0, - initialLength, - veryBig, - verySmall} + return &StatAggregator{0, 0, 0, make([]float64, initialLength), veryBig, verySmall} } func (this *StatAggregator) AddStats(dataChannel chan float64, output chan *Stats) { @@ -52,39 +42,15 @@ func (this *StatAggregator) AddStats(dataChannel chan float64, output chan *Stat this.max = datum } } - output <- nil + output <- this.getFinalStats() } -// always assume the min and max includes the value! -func (this *StatAggregator) AddDataToHistogram(value float64) { - if len(this.histogramValues) < this.numberOfHistogramBar { - this.AddDataToHistogramWhenLessDataThanBarAreOnHistograms(value) - } else { - this.AddDataToHistogramWithMaximalNumberOfBars(value) +func (this *StatAggregator) getFinalStats() *Stats { + stats := new(Stats) + stats.Mean = this.sum / float64(this.n) + stats.Var = this.sumOfTheSquares/float64(this.n) - stats.Mean*stats.Mean + stats.Std = math.Sqrt(stats.Var) - } + return stats } - -func (this *StatAggregator) AddDataToHistogramWithMaximalNumberOfBars(value float64) { -} - -func (this *StatAggregator) AddDataToHistogramWhenLessDataThanBarAreOnHistograms(value float64) { - for i, v := range this.histogram { - if math.Abs(value-v) < epsilon { - this.histogramValues[i]++ - return - } else if value < v { - this.histogram = append(this.histogram, 0) - copy(this.histogram[i+1:], this.histogram[i:]) - this.histogram[i] = value - - this.histogramValues = append(this.histogramValues, 0) - copy(this.histogramValues[i+1:], this.histogramValues[i:]) - this.histogramValues[i] = 1 - return - } - } - this.histogramValues = append(this.histogramValues, 1) - this.histogram = append(this.histogram, value) -} diff --git a/stats_test.go b/stats_test.go index 1ed3b47..01019b3 100644 --- a/stats_test.go +++ b/stats_test.go @@ -1,7 +1,6 @@ package main import ( - "reflect" "testing" ) @@ -10,11 +9,9 @@ func TestNewStats(t *testing.T) { if s.n != 0 || s.sum != 0 || s.sumOfTheSquares != 0 || - s.numberOfHistogramBar != initialLength || + len(s.histogram) != initialLength || s.min != veryBig || - s.max != verySmall || - len(s.histogram) != 0 || - len(s.histogramValues) != 0 { + s.max != verySmall { t.Fail() } } @@ -34,52 +31,22 @@ func TestAddStatsBasic(t *testing.T) { if s.n != 4. || s.min != -1. || s.max != 20. || s.sum != 23. || s.sumOfTheSquares != 411. { t.Error(">>>", s.max, s.min) } -} - -func TestAddDataToHistogramWhenLessDataThanBarAreOnHistograms(t *testing.T) { - s := NewStatAggregator() - s.AddDataToHistogramWhenLessDataThanBarAreOnHistograms(17) - if !reflect.DeepEqual([]float64{17}, s.histogram) { - t.Error("bad histogram", s.histogram) - } - if !reflect.DeepEqual([]int{1}, s.histogramValues) { - t.Error("bad histogramValues:", s.histogramValues) - } - s.histogram = []float64{-1, 1, 2, 3} - s.histogramValues = []int{1, 1, 1, 1} - s.AddDataToHistogramWhenLessDataThanBarAreOnHistograms(2) - if !reflect.DeepEqual([]int{1, 1, 2, 1}, s.histogramValues) { - t.Error("bad histogramValues", s.histogramValues) - } - - s.AddDataToHistogramWhenLessDataThanBarAreOnHistograms(2.5) - if !reflect.DeepEqual([]float64{-1, 1, 2, 2.5, 3}, s.histogram) { - t.Error("bad histogram", s.histogram) - } - if !reflect.DeepEqual([]int{1, 1, 2, 1, 1}, s.histogramValues) { - t.Error("bad histogramValues:", s.histogramValues) - } - - s.AddDataToHistogramWhenLessDataThanBarAreOnHistograms(22.5) - if !reflect.DeepEqual([]float64{-1, 1, 2, 2.5, 3, 22.5}, s.histogram) { - t.Error("bad histogram", s.histogram) - } - if !reflect.DeepEqual([]int{1, 1, 2, 1, 1, 1}, s.histogramValues) { - t.Error("bad histogramValues:", s.histogramValues) - } } -func TestAddDataToHistogramWithMaximalNumberOfBars(t *testing.T) { +func TestGetFinalStats(t *testing.T) { s := NewStatAggregator() - s.numberOfHistogramBar = 5 - s.histogram = []float64{1, 2, 3, 4, 5} - s.histogramValues = []int{1, 1, 2, 3, 4} - s.AddDataToHistogramWithMaximalNumberOfBars(3.5) - if !reflect.DeepEqual(s.histogram, []float64{1, 2, 3, 4, 5}) { + s.sumOfTheSquares = 5000 + s.sum = 200 + s.n = 10 + stats := s.getFinalStats() + if stats.Mean != 20. { t.Fail() } - if !reflect.DeepEqual(s.histogramValues, []int{1, 1, 2, 3, 4}) { + if stats.Var != 100. { + t.Fail() + } + if stats.Std != 10. { t.Fail() } }