go-ml/compare.go
Claude b1e6787b24
Some checks failed
Security Scan / security (pull_request) Successful in 11s
Test / test (pull_request) Failing after 15m27s
chore: use slices.Sorted(maps.Keys()) for ordered iteration
2026-02-24 16:03:25 +00:00

64 lines
1.5 KiB
Go

package ml
import (
"fmt"
"maps"
"slices"
)
// RunCompare reads two score files and prints a comparison table for each
// model showing Old, New, and Delta values for every metric.
func RunCompare(oldPath, newPath string) error {
oldOutput, err := ReadScorerOutput(oldPath)
if err != nil {
return fmt.Errorf("read old file: %w", err)
}
newOutput, err := ReadScorerOutput(newPath)
if err != nil {
return fmt.Errorf("read new file: %w", err)
}
// Collect all models present in both files.
models := make(map[string]bool)
for m := range oldOutput.ModelAverages {
models[m] = true
}
for m := range newOutput.ModelAverages {
models[m] = true
}
// Sort model names for deterministic output.
for _, model := range slices.Sorted(maps.Keys(models)) {
oldAvgs := oldOutput.ModelAverages[model]
newAvgs := newOutput.ModelAverages[model]
if oldAvgs == nil && newAvgs == nil {
continue
}
fmt.Printf("\nModel: %s\n", model)
fmt.Printf("%-25s %11s %11s %6s\n", "", "Old", "New", "Delta")
// Collect all metrics from both old and new.
metrics := make(map[string]bool)
for k := range oldAvgs {
metrics[k] = true
}
for k := range newAvgs {
metrics[k] = true
}
for _, metric := range slices.Sorted(maps.Keys(metrics)) {
oldVal := oldAvgs[metric]
newVal := newAvgs[metric]
delta := newVal - oldVal
deltaStr := fmt.Sprintf("%+.2f", delta)
fmt.Printf("%-25s %11.2f %11.2f %6s\n", metric, oldVal, newVal, deltaStr)
}
}
return nil
}