Skip to content

Commit 0966d61

Browse files
committed
apply raw results to energy stats, needs debug
1 parent 57f2cba commit 0966d61

File tree

4 files changed

+79
-7
lines changed

4 files changed

+79
-7
lines changed

.evergreen/config.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -687,6 +687,7 @@ tasks:
687687
binary: bash
688688
args: [*task-runner, driver-benchmark]
689689
- func: send-perf-data
690+
- func: send-perf-pr-comment
690691

691692
- name: test-standalone-noauth-nossl
692693
tags: ["test", "standalone"]

internal/cmd/perfcomp/energystatistics.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414

1515
// Given two matrices, this function returns
1616
// (e, t, h) = (E-statistic, test statistic, e-coefficient of inhomogeneity)
17-
func getEnergyStatistics(x, y *mat.Dense) (float64, float64, float64) {
17+
func GetEnergyStatistics(x, y *mat.Dense) (float64, float64, float64) {
1818
n, _ := x.Dims()
1919
m, _ := y.Dims()
2020
nf := float64(n)

internal/cmd/perfcomp/energystatistics_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func TestEnergyStatistics(t *testing.T) {
3838

3939
t.Run("similar distributions should have small e,t,h values ", func(t *testing.T) {
4040
x, y := createTestVectors(1, 100, 1, 1, 105, 1)
41-
e, tstat, h := getEnergyStatistics(x, y)
41+
e, tstat, h := GetEnergyStatistics(x, y)
4242

4343
del := 1e-3
4444

@@ -49,7 +49,7 @@ func TestEnergyStatistics(t *testing.T) {
4949

5050
t.Run("different distributions should have large e,t,h values", func(t *testing.T) {
5151
x, y := createTestVectors(1, 100, 1, 10000, 13000, 14)
52-
e, tstat, h := getEnergyStatistics(x, y)
52+
e, tstat, h := GetEnergyStatistics(x, y)
5353
del := 1e-3
5454

5555
assert.InDelta(t, 21859.691, e, del)
@@ -59,11 +59,11 @@ func TestEnergyStatistics(t *testing.T) {
5959

6060
t.Run("uni-variate distributions", func(t *testing.T) {
6161
x, y := createTestVectors(1, 300, 1, 1000, 5000, 10)
62-
e, tstat, h := getEnergyStatistics(x, y)
62+
e, tstat, h := GetEnergyStatistics(x, y)
6363
del := 1e-3
6464

6565
assert.InDelta(t, 4257.009, e, del)
66-
assert.InDelta(t, 1481794.709, tstat, del)
67-
assert.InDelta(t, 0.954, h, del)
66+
assert.InDelta(t, 728381.015, tstat, del)
67+
assert.InDelta(t, 0.748, h, del)
6868
})
6969
}

internal/cmd/perfcomp/main.go

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,16 @@ import (
1111
"errors"
1212
"fmt"
1313
"log"
14+
"math"
1415
"os"
16+
"sort"
1517
"strings"
1618
"time"
1719

1820
"go.mongodb.org/mongo-driver/v2/bson"
1921
"go.mongodb.org/mongo-driver/v2/mongo"
2022
"go.mongodb.org/mongo-driver/v2/mongo/options"
23+
"gonum.org/v1/gonum/mat"
2124
)
2225

2326
type RawData struct {
@@ -51,6 +54,15 @@ type RawData struct {
5154
FailedRollupAttempts int64 `bson:"failed_rollup_attempts"`
5255
}
5356

57+
type EnergyStats struct {
58+
Benchmark string
59+
PatchVersion string
60+
MainlineVersion string
61+
E float64
62+
T float64
63+
H float64
64+
}
65+
5466
func main() {
5567
// Connect to analytics node
5668
uri := os.Getenv("perf_uri_private_endpoint")
@@ -98,7 +110,12 @@ func main() {
98110
log.Panicf("Path and mainline data length do not match.")
99111
}
100112

101-
// TODO: Calculate energy statistics
113+
// Calculate energy statistics
114+
energyStats, err := getEnergyStatsForAllBenchMarks(patchRawData, mainlineRawData)
115+
if err != nil {
116+
log.Panicf("Error calculating energy stats: %v", err)
117+
}
118+
fmt.Printf("Successfully retrieved %d energy stats.\n", len(energyStats))
102119

103120
// Disconnect client
104121
err0 := client.Disconnect(context.Background())
@@ -165,3 +182,57 @@ func parseMainelineCommits(rawData []RawData) ([]string, error) {
165182
}
166183
return commits, nil
167184
}
185+
186+
func getEnergyStatsForOneBenchmark(xRaw RawData, yRaw RawData) (*EnergyStats, error) {
187+
188+
var x []float64
189+
var y []float64
190+
for _, stat := range xRaw.Rollups.Stats {
191+
x = append(x, stat.Val)
192+
}
193+
for _, stat := range yRaw.Rollups.Stats {
194+
y = append(y, stat.Val)
195+
}
196+
197+
for i := range (int)(math.Min((float64)(len(xRaw.Rollups.Stats)), float64(len(yRaw.Rollups.Stats)))) {
198+
if xRaw.Rollups.Stats[i].Name != yRaw.Rollups.Stats[i].Name {
199+
return nil, errors.New("measurements do not match")
200+
}
201+
}
202+
203+
e, t, h := GetEnergyStatistics(mat.NewDense(len(x), 1, x), mat.NewDense(len(y), 1, y))
204+
return &EnergyStats{
205+
Benchmark: xRaw.Info.TestName,
206+
PatchVersion: xRaw.Info.Version,
207+
MainlineVersion: yRaw.Info.Version,
208+
E: e,
209+
T: t,
210+
H: h,
211+
}, nil
212+
}
213+
214+
func getEnergyStatsForAllBenchMarks(patchRawData []RawData, mainlineRawData []RawData) ([]*EnergyStats, error) {
215+
216+
sort.Slice(patchRawData, func(i, j int) bool {
217+
return patchRawData[i].Info.TestName < patchRawData[j].Info.TestName
218+
})
219+
sort.Slice(mainlineRawData, func(i, j int) bool {
220+
return mainlineRawData[i].Info.TestName < mainlineRawData[j].Info.TestName
221+
})
222+
223+
var energyStats []*EnergyStats
224+
for i := range patchRawData {
225+
if testname := patchRawData[i].Info.TestName; testname != mainlineRawData[i].Info.TestName {
226+
return nil, errors.New("tests do not match")
227+
}
228+
229+
es, err := getEnergyStatsForOneBenchmark(patchRawData[i], mainlineRawData[i])
230+
if err != nil {
231+
return nil, err
232+
}
233+
energyStats = append(energyStats, es)
234+
235+
fmt.Printf("%s | H-score: %.4f\n", es.Benchmark, es.H)
236+
}
237+
return energyStats, nil
238+
}

0 commit comments

Comments
 (0)