go: add a way to print statistic table
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
7ada3dac80
commit
63da28a8f0
24
algo/algo.go
24
algo/algo.go
@ -5,6 +5,9 @@ package algo
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
"git.dotya.ml/wanderer/math-optim/bench"
|
||||
"git.dotya.ml/wanderer/math-optim/stats"
|
||||
)
|
||||
|
||||
// Values type is just a fancy named []float64 that will allow us to define
|
||||
@ -19,14 +22,21 @@ func DoRandomSearch(wg *sync.WaitGroup) {
|
||||
|
||||
printRandomSearch("starting...")
|
||||
|
||||
// ng y'all.
|
||||
schw := RandomSearchNG(10000, 30, []int{5, 10, 20}, "Schwefel")
|
||||
djg1 := RandomSearchNG(10000, 30, []int{5, 10, 20}, "De Jong 1st")
|
||||
djg2 := RandomSearchNG(10000, 30, []int{5, 10, 20}, "De Jong 2nd")
|
||||
// funcCount is the number of bench functions available.
|
||||
funcCount := len(bench.Functions)
|
||||
// stats for the current algo (RandomSearch).
|
||||
algoStats := make([][]stats.Stats, funcCount)
|
||||
|
||||
plotAllDims(schw, "plot", ".svg")
|
||||
plotAllDims(djg1, "plot", ".svg")
|
||||
plotAllDims(djg2, "plot", ".svg")
|
||||
// ng y'all.
|
||||
algoStats[0] = RandomSearchNG(10000, 30, []int{5, 10, 20}, "Schwefel")
|
||||
algoStats[1] = RandomSearchNG(10000, 30, []int{5, 10, 20}, "De Jong 1st")
|
||||
algoStats[2] = RandomSearchNG(10000, 30, []int{5, 10, 20}, "De Jong 2nd")
|
||||
|
||||
for i := range algoStats {
|
||||
plotAllDims(algoStats[i], "plot", ".svg")
|
||||
}
|
||||
|
||||
stats.PrintStatisticTable(algoStats)
|
||||
}
|
||||
|
||||
// DoStochasticHillClimbing performs a search using the 'Stochastic Hill
|
||||
|
96
stats/table.go
Normal file
96
stats/table.go
Normal file
@ -0,0 +1,96 @@
|
||||
// Copyright 2022 wanderer <a_mirre at utb dot cz>
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package stats
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"gonum.org/v1/gonum/floats"
|
||||
"gonum.org/v1/gonum/stat"
|
||||
)
|
||||
|
||||
type statsHdr struct {
|
||||
Algo string
|
||||
BenchFuncName string
|
||||
Dimens int
|
||||
Generations int
|
||||
Iterations int
|
||||
}
|
||||
|
||||
type statsRow struct {
|
||||
Min float64
|
||||
Max float64
|
||||
Mean float64
|
||||
Median float64
|
||||
StdDev float64
|
||||
}
|
||||
|
||||
// PrintStatisticTable prints to console computed statistics for current algo.
|
||||
func PrintStatisticTable(algoStats [][]Stats) {
|
||||
fmt.Fprintln(os.Stderr, "printing statistic table data (min, max, mean, median, stddev)")
|
||||
|
||||
for _, singleFunc := range algoStats {
|
||||
statsSingleFunc(singleFunc)
|
||||
}
|
||||
}
|
||||
|
||||
// statsSingleFunc computes statistics out of results of a single bench func.
|
||||
func statsSingleFunc(singleFuncStats []Stats) {
|
||||
var (
|
||||
// hdr is the table header as determined based on the data being dealt with.
|
||||
hdr statsHdr
|
||||
// row contains the data of the statistic properties being tracked.
|
||||
row statsRow
|
||||
)
|
||||
|
||||
for _, s := range singleFuncStats {
|
||||
for _, dim := range s.BenchFuncStats {
|
||||
hdr = makeTableHdr(
|
||||
s.Algo,
|
||||
s.BenchFuncStats[0].BenchName,
|
||||
s.Dimens,
|
||||
s.Generations,
|
||||
s.Iterations,
|
||||
)
|
||||
fmt.Fprintln(os.Stderr, hdr)
|
||||
|
||||
// collect the best.
|
||||
var best []float64
|
||||
|
||||
for _, iter := range dim.Solution {
|
||||
last := s.Generations - 1
|
||||
|
||||
best = append(best, iter.Results[last])
|
||||
}
|
||||
|
||||
row.Min = floats.Min(best)
|
||||
row.Max = floats.Max(best)
|
||||
row.Mean = stat.Mean(best, nil)
|
||||
row.Median = stat.Mean(best, nil)
|
||||
row.StdDev = stat.StdDev(best, nil)
|
||||
|
||||
fmt.Fprintln(os.Stderr, row)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func makeTableHdr(
|
||||
algo, benchFuncName string,
|
||||
dimens, generations, iterations int,
|
||||
) statsHdr {
|
||||
hdr := newStatsHdr()
|
||||
|
||||
hdr.Algo = algo
|
||||
hdr.BenchFuncName = benchFuncName
|
||||
hdr.Dimens = dimens
|
||||
hdr.Generations = generations
|
||||
hdr.Iterations = iterations
|
||||
|
||||
return *hdr
|
||||
}
|
||||
|
||||
func newStatsHdr() *statsHdr {
|
||||
return &statsHdr{}
|
||||
}
|
Loading…
Reference in New Issue
Block a user