github.com/network-quality/goresponsiveness@v0.0.0-20240129151524-343954285090/series/statistics.go (about)

     1  /*
     2   * This file is part of Go Responsiveness.
     3   *
     4   * Go Responsiveness is free software: you can redistribute it and/or modify it under
     5   * the terms of the GNU General Public License as published by the Free Software Foundation,
     6   * either version 2 of the License, or (at your option) any later version.
     7   * Go Responsiveness is distributed in the hope that it will be useful, but WITHOUT ANY
     8   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
     9   * PARTICULAR PURPOSE. See the GNU General Public License for more details.
    10   *
    11   * You should have received a copy of the GNU General Public License along
    12   * with Go Responsiveness. If not, see <https://www.gnu.org/licenses/>.
    13   */
    14  
    15  package series
    16  
    17  import (
    18  	"github.com/network-quality/goresponsiveness/utilities"
    19  )
    20  
    21  func SeriesStandardDeviation[Data utilities.Number, Bucket utilities.Number](s WindowSeries[Data, Bucket]) (bool, float64) {
    22  	complete := s.Complete()
    23  
    24  	inputValues := s.GetValues()
    25  
    26  	actualValues := utilities.Filter(inputValues, func(d utilities.Optional[Data]) bool {
    27  		return utilities.IsSome[Data](d)
    28  	})
    29  	values := utilities.Fmap(actualValues, func(d utilities.Optional[Data]) Data { return utilities.GetSome[Data](d) })
    30  
    31  	return complete, utilities.CalculateStandardDeviation[Data](values)
    32  }
    33  
    34  func Percentile[Data utilities.Number, Bucket utilities.Number](s WindowSeries[Data, Bucket], p uint) (bool, Data) {
    35  	complete := s.Complete()
    36  
    37  	inputValues := s.GetValues()
    38  
    39  	actualValues := utilities.Filter(inputValues, func(d utilities.Optional[Data]) bool {
    40  		return utilities.IsSome[Data](d)
    41  	})
    42  	values := utilities.Fmap(actualValues, func(d utilities.Optional[Data]) Data { return utilities.GetSome[Data](d) })
    43  
    44  	return complete, utilities.CalculatePercentile(values, p)
    45  }
    46  
    47  func AllSequentialIncreasesLessThan[Data utilities.Number, Bucket utilities.Number](s WindowSeries[Data, Bucket], limit float64,
    48  ) (bool, bool, float64) {
    49  	complete := s.Complete()
    50  
    51  	inputValues := s.GetValues()
    52  
    53  	actualValues := utilities.Filter(utilities.Reverse(inputValues), func(d utilities.Optional[Data]) bool {
    54  		return utilities.IsSome[Data](d)
    55  	})
    56  	values := utilities.Fmap(actualValues, func(d utilities.Optional[Data]) Data { return utilities.GetSome[Data](d) })
    57  
    58  	result, actualLimit := utilities.AllSequentialIncreasesLessThan(values, limit)
    59  	return complete, result, actualLimit
    60  }
    61  
    62  func CalculateAverage[Data utilities.Number, Bucket utilities.Number](s WindowSeries[Data, Bucket]) (bool, float64) {
    63  	complete := s.Complete()
    64  
    65  	inputValues := s.GetValues()
    66  
    67  	actualValues := utilities.Filter(inputValues, func(d utilities.Optional[Data]) bool {
    68  		return utilities.IsSome[Data](d)
    69  	})
    70  	values := utilities.Fmap(actualValues, func(d utilities.Optional[Data]) Data { return utilities.GetSome[Data](d) })
    71  
    72  	return complete, utilities.CalculateAverage(values)
    73  }
    74  
    75  func TrimmedMean[Data utilities.Number, Bucket utilities.Number](s WindowSeries[Data, Bucket], trim int) (bool, float64, []Data) {
    76  	complete := s.Complete()
    77  
    78  	inputValues := s.GetValues()
    79  
    80  	actualValues := utilities.Filter(inputValues, func(d utilities.Optional[Data]) bool {
    81  		return utilities.IsSome[Data](d)
    82  	})
    83  	values := utilities.Fmap(actualValues, func(d utilities.Optional[Data]) Data { return utilities.GetSome[Data](d) })
    84  
    85  	trimmedMean, trimmedElements := utilities.TrimmedMean(values, trim)
    86  	return complete, trimmedMean, trimmedElements
    87  }