diff --git a/core/basic/avg.go b/core/basic/avg.go new file mode 100644 index 0000000..2cddd76 --- /dev/null +++ b/core/basic/avg.go @@ -0,0 +1,50 @@ +package basic + +import ( + "github.com/n-is/stream-math/utils/cast" +) + +// Avg type +type Avg struct { + avg float64 +} + +// InitAvg function +func InitAvg() *Avg { + return &Avg{ + avg: 0, + } +} + +// GetAvg function +func GetAvg(preAvg float64, v interface{}, n float64) float64 { + newAvg := preAvg + + if val, ok := cast.TryFloat(v); ok { + newAvg = (preAvg*n + val) / (n + 1) + } + + return newAvg +} + +// StreamAvg method +func (a *Avg) StreamAvg(arr []float64) { + a.avg = 0 + + for i := 0; i < len(arr); i++ { + a.avg = GetAvg(a.avg, arr[i], float64(i)) + } + +} + +// func main() { +// fmt.Println("Beginning ... ") + +// var numberStream = []float64{1000, 2, 3, 17, 50} +// a := InitAvg() + +// a.StreamAvg(numberStream) +// fmt.Println("Stream Average is :", a.avg) + +// fmt.Println("End ... ") +// } diff --git a/core/basic/avg_test.go b/core/basic/avg_test.go new file mode 100644 index 0000000..5a22f45 --- /dev/null +++ b/core/basic/avg_test.go @@ -0,0 +1,56 @@ +package basic + +import ( + "math/rand" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestAvg(t *testing.T) { + + t.Run("Natural Numbers Avg", func(t *testing.T) { + // Generate data + data := make([]float64, 50) + for i := 0; i < len(data); i++ { + data[i] = float64(i + 1) + } + + // Find Calculated Avg + sum := float64(0) + for i := 0; i < len(data); i++ { + sum += data[i] + } + calculatedAverage := sum / float64(len(data)) + + // Find Stream Avg + streamAverage := InitAvg() + streamAverage.StreamAvg(data) + + // Compare the results + assert.Equal(t, calculatedAverage, streamAverage.avg) + }) + + t.Run("Random Numbers Avg", func(t *testing.T) { + // Generate data + data := make([]float64, 50) + for i := 0; i < len(data); i++ { + data[i] = (rand.Float64() - 0.5) * float64(i) + } + + // Find Calculated Avg + sum := float64(0) + for i := 0; i < len(data); i++ { + sum += data[i] + } + calculatedAverage := sum / float64(len(data)) + + // Find Stream Avg + streamAverage := InitAvg() + streamAverage.StreamAvg(data) + + // Compare the results + assert.Equal(t, calculatedAverage, streamAverage.avg) + }) + +}