go: collect and process mean vals
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
* compute and save mean values of x (e.g. 30) bench runs * safely save mean vals for all bench-dimens combinations to AlgoMeans from goroutines (use mutex to protect shared access) * rework algo/plot.go to use already computed mean values. todo: plot mean vals of all algorithms (per benchmark) in a single pic.
This commit is contained in:
parent
c433b11eea
commit
2bf3a4a767
@ -15,6 +15,11 @@ import (
|
|||||||
// methods over it.
|
// methods over it.
|
||||||
type Values []float64
|
type Values []float64
|
||||||
|
|
||||||
|
// mu protects access to meanStats.
|
||||||
|
var mu sync.Mutex
|
||||||
|
|
||||||
|
var meanStats = &stats.MeanStats{}
|
||||||
|
|
||||||
// DoRandomSearch executes a search using the 'Random search' method.
|
// DoRandomSearch executes a search using the 'Random search' method.
|
||||||
func DoRandomSearch(wg *sync.WaitGroup, m *sync.Mutex) {
|
func DoRandomSearch(wg *sync.WaitGroup, m *sync.Mutex) {
|
||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
|
@ -21,7 +21,7 @@ import (
|
|||||||
|
|
||||||
const preferredFontStyle = "Mono"
|
const preferredFontStyle = "Mono"
|
||||||
|
|
||||||
func plotMeanVals(vals []stats.BenchRound, title string, fes int) *plot.Plot {
|
func plotMeanVals(meanVals []float64, title string, fes int) *plot.Plot {
|
||||||
plotter.DefaultFont.Typeface = preferredFontStyle
|
plotter.DefaultFont.Typeface = preferredFontStyle
|
||||||
plotter.DefaultLineStyle.Width = vg.Points(2.0)
|
plotter.DefaultLineStyle.Width = vg.Points(2.0)
|
||||||
|
|
||||||
@ -43,9 +43,6 @@ func plotMeanVals(vals []stats.BenchRound, title string, fes int) *plot.Plot {
|
|||||||
p.Title.TextStyle.Font.Weight = 2 // SemiBold
|
p.Title.TextStyle.Font.Weight = 2 // SemiBold
|
||||||
p.Title.Padding = 3 * vg.Millimeter
|
p.Title.Padding = 3 * vg.Millimeter
|
||||||
|
|
||||||
// get mean vals.
|
|
||||||
meanVals := stats.GetMeanVals(vals, fes)
|
|
||||||
|
|
||||||
// mark the end of the X axis with len(meanVals).
|
// mark the end of the X axis with len(meanVals).
|
||||||
p.X.Max = float64(len(meanVals))
|
p.X.Max = float64(len(meanVals))
|
||||||
p.Y.Min = floats.Min(meanVals)
|
p.Y.Min = floats.Min(meanVals)
|
||||||
@ -190,7 +187,7 @@ func plotAllDims(algoStats []stats.Stats, fPrefix, fExt string, ch chan report.P
|
|||||||
picMean.FilePath = filenameMean
|
picMean.FilePath = filenameMean
|
||||||
|
|
||||||
// get the *mean* plot.
|
// get the *mean* plot.
|
||||||
pMean := plotMeanVals(dim.BenchResults, meanTitle, s.Generations)
|
pMean := plotMeanVals(dim.MeanVals, meanTitle, s.Generations)
|
||||||
|
|
||||||
elapsed := time.Since(start)
|
elapsed := time.Since(start)
|
||||||
info := "saving img to file: " + filename + "(-Mean)" + fExt +
|
info := "saving img to file: " + filename + "(-Mean)" + fExt +
|
||||||
|
@ -99,6 +99,8 @@ func RandomSearchNG(maxFES, benchMinIters int, theD []int, benchFunc string, ch
|
|||||||
)),
|
)),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rsMeans := &stats.AlgoMean{Algo: "Random Search"}
|
||||||
|
|
||||||
// iterate over whatever was passed to us with theD - dimens slice.
|
// iterate over whatever was passed to us with theD - dimens slice.
|
||||||
for _, dimens := range localD {
|
for _, dimens := range localD {
|
||||||
randomSearchStatDimX := &stats.Stats{
|
randomSearchStatDimX := &stats.Stats{
|
||||||
@ -109,6 +111,14 @@ func RandomSearchNG(maxFES, benchMinIters int, theD []int, benchFunc string, ch
|
|||||||
}
|
}
|
||||||
funcStats := &stats.FuncStats{BenchName: benchFunc}
|
funcStats := &stats.FuncStats{BenchName: benchFunc}
|
||||||
benchFuncParams := bench.FunctionParams[benchFunc]
|
benchFuncParams := bench.FunctionParams[benchFunc]
|
||||||
|
dimXMean := &stats.Mean{
|
||||||
|
Bench: benchFunc,
|
||||||
|
Dimens: dimens,
|
||||||
|
Iterations: minIters,
|
||||||
|
Generations: fes,
|
||||||
|
// not applicable to Random Search...
|
||||||
|
Neighbours: -1,
|
||||||
|
}
|
||||||
|
|
||||||
// set min/max bounds.
|
// set min/max bounds.
|
||||||
uniformDist.Min = benchFuncParams.Min()
|
uniformDist.Min = benchFuncParams.Min()
|
||||||
@ -156,6 +166,11 @@ func RandomSearchNG(maxFES, benchMinIters int, theD []int, benchFunc string, ch
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get mean vals.
|
||||||
|
dimXMean.MeanVals = stats.GetMeanVals(funcStats.BenchResults, fes)
|
||||||
|
// save to funcStats, too.
|
||||||
|
funcStats.MeanVals = dimXMean.MeanVals
|
||||||
|
|
||||||
// save cumulative results of 'minIters' runs.
|
// save cumulative results of 'minIters' runs.
|
||||||
randomSearchStatDimX.BenchFuncStats = append(
|
randomSearchStatDimX.BenchFuncStats = append(
|
||||||
randomSearchStatDimX.BenchFuncStats,
|
randomSearchStatDimX.BenchFuncStats,
|
||||||
@ -164,7 +179,15 @@ func RandomSearchNG(maxFES, benchMinIters int, theD []int, benchFunc string, ch
|
|||||||
|
|
||||||
// save stats for each dimension to a stats slice.
|
// save stats for each dimension to a stats slice.
|
||||||
randomSearchStats = append(randomSearchStats, *randomSearchStatDimX)
|
randomSearchStats = append(randomSearchStats, *randomSearchStatDimX)
|
||||||
|
|
||||||
|
// save to AlgoMeans
|
||||||
|
rsMeans.Means = append(rsMeans.Means, *dimXMean)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// export AlgoMeans.
|
||||||
|
mu.Lock()
|
||||||
|
meanStats.AlgoMeans = append(meanStats.AlgoMeans, *rsMeans)
|
||||||
|
mu.Unlock()
|
||||||
|
|
||||||
ch <- randomSearchStats
|
ch <- randomSearchStats
|
||||||
}
|
}
|
||||||
|
@ -186,6 +186,8 @@ func HillClimb(maxFES, benchMinIters int, theD []int, benchFunc string, ch chan
|
|||||||
localD = theD
|
localD = theD
|
||||||
minIters = benchMinIters
|
minIters = benchMinIters
|
||||||
|
|
||||||
|
shcMeans := &stats.AlgoMean{Algo: "Stochastic Hill Climbing"}
|
||||||
|
|
||||||
for _, dimens := range localD {
|
for _, dimens := range localD {
|
||||||
stochasticHCStatDimX := &stats.Stats{
|
stochasticHCStatDimX := &stats.Stats{
|
||||||
Algo: "Stochastic Hill Climbing",
|
Algo: "Stochastic Hill Climbing",
|
||||||
@ -198,6 +200,13 @@ func HillClimb(maxFES, benchMinIters int, theD []int, benchFunc string, ch chan
|
|||||||
}
|
}
|
||||||
funcStats := &stats.FuncStats{BenchName: benchFunc}
|
funcStats := &stats.FuncStats{BenchName: benchFunc}
|
||||||
benchFuncParams := bench.FunctionParams[benchFunc]
|
benchFuncParams := bench.FunctionParams[benchFunc]
|
||||||
|
dimXMean := &stats.Mean{
|
||||||
|
Bench: benchFunc,
|
||||||
|
Dimens: dimens,
|
||||||
|
Iterations: minIters,
|
||||||
|
Generations: fesPerIter,
|
||||||
|
Neighbours: bench.Neighbourhood,
|
||||||
|
}
|
||||||
uniDist := distuv.Uniform{
|
uniDist := distuv.Uniform{
|
||||||
Min: benchFuncParams.Min(),
|
Min: benchFuncParams.Min(),
|
||||||
Max: benchFuncParams.Max(),
|
Max: benchFuncParams.Max(),
|
||||||
@ -276,13 +285,26 @@ func HillClimb(maxFES, benchMinIters int, theD []int, benchFunc string, ch chan
|
|||||||
benchFunc + "\" for " + fmt.Sprint(dimens) + "D took " + fmt.Sprint(elapsed),
|
benchFunc + "\" for " + fmt.Sprint(dimens) + "D took " + fmt.Sprint(elapsed),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// get mean vals.
|
||||||
|
dimXMean.MeanVals = stats.GetMeanVals(funcStats.BenchResults, fesPerIter)
|
||||||
|
// save to funcStats, too.
|
||||||
|
funcStats.MeanVals = dimXMean.MeanVals
|
||||||
|
|
||||||
stochasticHCStatDimX.BenchFuncStats = append(
|
stochasticHCStatDimX.BenchFuncStats = append(
|
||||||
stochasticHCStatDimX.BenchFuncStats,
|
stochasticHCStatDimX.BenchFuncStats,
|
||||||
*funcStats,
|
*funcStats,
|
||||||
)
|
)
|
||||||
|
|
||||||
stochasticHCStats = append(stochasticHCStats, *stochasticHCStatDimX)
|
stochasticHCStats = append(stochasticHCStats, *stochasticHCStatDimX)
|
||||||
|
|
||||||
|
// save to AlgoMeans.
|
||||||
|
shcMeans.Means = append(shcMeans.Means, *dimXMean)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// export AlgoMeans.
|
||||||
|
mu.Lock()
|
||||||
|
meanStats.AlgoMeans = append(meanStats.AlgoMeans, *shcMeans)
|
||||||
|
mu.Unlock()
|
||||||
|
|
||||||
ch <- stochasticHCStats
|
ch <- stochasticHCStats
|
||||||
}
|
}
|
||||||
|
@ -21,6 +21,34 @@ type BenchRound struct {
|
|||||||
type FuncStats struct {
|
type FuncStats struct {
|
||||||
BenchName string
|
BenchName string
|
||||||
BenchResults []BenchRound
|
BenchResults []BenchRound
|
||||||
|
// MeanVals holds the mean value for each step of the iteration.
|
||||||
|
MeanVals []float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mean structure holds mean vals and metadata of a specified
|
||||||
|
// bench-algo-settings combination.
|
||||||
|
type Mean struct {
|
||||||
|
Bench string
|
||||||
|
Dimens int
|
||||||
|
|
||||||
|
Iterations int
|
||||||
|
Generations int
|
||||||
|
// Neighbours param is used in Hill Climbing type algos, set to -1 if not
|
||||||
|
// applicable.
|
||||||
|
Neighbours int
|
||||||
|
// MeanVals holds the mean value for each step of the iteration.
|
||||||
|
MeanVals []float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// AlgoMean holds Mean structs of different benchmarks but the same algorithm.
|
||||||
|
type AlgoMean struct {
|
||||||
|
Algo string
|
||||||
|
Means []Mean
|
||||||
|
}
|
||||||
|
|
||||||
|
// MeanStats aggregates AlgoMean structs of different algos.
|
||||||
|
type MeanStats struct {
|
||||||
|
AlgoMeans []AlgoMean
|
||||||
}
|
}
|
||||||
|
|
||||||
type Stats struct {
|
type Stats struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user