Skip to content

Commit bd86386

Browse files
committed
get stable regions and calc for hscore
1 parent 0966d61 commit bd86386

File tree

3 files changed

+115
-91
lines changed

3 files changed

+115
-91
lines changed

internal/cmd/perfcomp/energystatistics.go

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,34 @@ func GetEnergyStatistics(x, y *mat.Dense) (float64, float64, float64) {
1919
m, _ := y.Dims()
2020
nf := float64(n)
2121
mf := float64(m)
22-
A := getDistance(x, y) / (nf * mf) // E|X-Y|
23-
B := getDistance(x, x) / (nf * nf) // E|X-X'|
24-
C := getDistance(y, y) / (mf * mf) // E|Y-Y'|
22+
23+
var A float64 // E|X-Y|
24+
if nf > 0 && mf > 0 {
25+
A = getDistance(x, y) / (nf * mf)
26+
} else {
27+
A = 0
28+
}
29+
var B float64 // E|X-X'|
30+
if nf > 0 {
31+
B = getDistance(x, x) / (nf * nf)
32+
} else {
33+
B = 0
34+
}
35+
var C float64 // E|Y-Y'|
36+
if mf > 0 {
37+
C = getDistance(y, y) / (mf * mf)
38+
} else {
39+
C = 0
40+
}
2541

2642
E := 2*A - B - C // D^2(F_x, F_y)
2743
T := ((nf * mf) / (nf + mf)) * E
28-
H := E / (2 * A)
44+
var H float64
45+
if A > 0 {
46+
H = E / (2 * A)
47+
} else {
48+
H = 0
49+
}
2950
return E, T, H
3051
}
3152

internal/cmd/perfcomp/energystatistics_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,17 @@ func TestEnergyStatistics(t *testing.T) {
6666
assert.InDelta(t, 728381.015, tstat, del)
6767
assert.InDelta(t, 0.748, h, del)
6868
})
69+
70+
t.Run("equal distributions should have all 0 values", func(t *testing.T) {
71+
x := mat.NewDense(10, 1, []float64{1, 1, 1, 1, 1, 1, 1, 1, 1, 1})
72+
y := mat.NewDense(1, 1, []float64{1})
73+
74+
e, tstat, h := GetEnergyStatistics(x, y)
75+
del := 1e-3
76+
77+
assert.InDelta(t, 0.0, e, del)
78+
assert.InDelta(t, 0.0, tstat, del)
79+
assert.InDelta(t, 0.0, h, del)
80+
})
81+
6982
}

internal/cmd/perfcomp/main.go

Lines changed: 77 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ import (
1111
"errors"
1212
"fmt"
1313
"log"
14-
"math"
1514
"os"
16-
"sort"
17-
"strings"
1815
"time"
1916

2017
"go.mongodb.org/mongo-driver/v2/bson"
@@ -55,12 +52,14 @@ type RawData struct {
5552
}
5653

5754
type EnergyStats struct {
58-
Benchmark string
59-
PatchVersion string
60-
MainlineVersion string
61-
E float64
62-
T float64
63-
H float64
55+
Benchmark string
56+
Measurement string
57+
PatchVersion string
58+
StableRegionValues []float64
59+
PatchValues []float64
60+
E float64
61+
T float64
62+
H float64
6463
}
6564

6665
func main() {
@@ -83,39 +82,25 @@ func main() {
8382
}
8483
fmt.Println("Successfully connected to MongoDB Analytics node.")
8584

86-
coll := client.Database("expanded_metrics").Collection("raw_results")
85+
db := client.Database("expanded_metrics")
8786
version := os.Getenv("VERSION_ID")
8887
if version == "" {
8988
log.Panic("could not retrieve version")
9089
}
9190

92-
// Get and pre-process raw data
93-
patchRawData, err3 := findRawData(version, coll)
91+
// Get raw data, most recent stable region, and calculate energy stats
92+
patchRawData, err3 := findRawData(version, db.Collection("raw_results"))
9493
if err3 != nil {
9594
log.Panicf("Error getting raw data: %v", err3)
9695
}
9796

98-
mainlineCommits, err4 := parseMainelineCommits(patchRawData)
97+
allEnergyStats, err4 := getEnergyStatsForAllBenchMarks(patchRawData, db.Collection("stable_regions"))
9998
if err4 != nil {
100-
log.Panicf("Error parsing commits: %v", err4)
99+
log.Panicf("Error getting raw data: %v", err4)
101100
}
102-
103-
mainlineVersion := "mongo_go_driver_" + mainlineCommits[0]
104-
mainlineRawData, err5 := findRawData(mainlineVersion, coll)
105-
if err5 != nil {
106-
log.Panicf("Could not retrieve mainline raw data")
107-
}
108-
109-
if len(mainlineRawData) != len(patchRawData) {
110-
log.Panicf("Path and mainline data length do not match.")
111-
}
112-
113-
// Calculate energy statistics
114-
energyStats, err := getEnergyStatsForAllBenchMarks(patchRawData, mainlineRawData)
115-
if err != nil {
116-
log.Panicf("Error calculating energy stats: %v", err)
101+
for _, es := range allEnergyStats {
102+
fmt.Printf("%s | %s | E: %f | T: %f | H: %f\n", es.Benchmark, es.Measurement, es.E, es.T, es.H)
117103
}
118-
fmt.Printf("Successfully retrieved %d energy stats.\n", len(energyStats))
119104

120105
// Disconnect client
121106
err0 := client.Disconnect(context.Background())
@@ -162,77 +147,82 @@ func findRawData(version string, coll *mongo.Collection) ([]RawData, error) {
162147
return rawData, nil
163148
}
164149

165-
func parseMainelineCommits(rawData []RawData) ([]string, error) {
166-
commits := make([]string, 0, len(rawData))
167-
for i, rd := range rawData {
168-
taskID := rd.Info.TaskID
169-
pieces := strings.Split(taskID, "_") // Format: mongo_go_driver_perf_perf_patch_<commit-SHA>_<version>_<timestamp>
170-
for j, p := range pieces {
171-
if p == "patch" {
172-
if len(pieces) < j+2 {
173-
return nil, errors.New("task ID doesn't hold commit SHA")
174-
}
175-
commits = append(commits, pieces[j+1])
176-
break
177-
}
178-
}
179-
if len(commits) < i+1 { // didn't find SHA in task_ID
180-
return nil, errors.New("task ID doesn't hold commit SHA")
181-
}
150+
func findLastStableRegion(testname string, measurement string, coll *mongo.Collection) ([]float64, error) {
151+
filter := bson.D{
152+
{"time_series_info.project", "mongo-go-driver"},
153+
{"time_series_info.variant", "perf"},
154+
{"time_series_info.task", "perf"},
155+
{"time_series_info.test", testname},
156+
{"time_series_info.measurement", measurement},
157+
{"last", true},
158+
{"contexts", []string{"GoDriver perf (h-score)"}},
182159
}
183-
return commits, nil
184-
}
160+
projection := bson.D{
161+
{"values", 1},
162+
}
163+
findOptions := options.FindOne().SetSort(bson.D{{"end", -1}}).SetProjection(projection)
185164

186-
func getEnergyStatsForOneBenchmark(xRaw RawData, yRaw RawData) (*EnergyStats, error) {
165+
findCtx, cancel := context.WithTimeout(context.Background(), 180*time.Second)
166+
defer cancel()
187167

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)
168+
var result bson.M
169+
err := coll.FindOne(findCtx, filter, findOptions).Decode(&result)
170+
if err != nil {
171+
return nil, err
195172
}
196173

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")
174+
valuesSlice, ok := result["values"].(bson.A)
175+
if !ok {
176+
return nil, errors.New("values is not of type bson.A")
177+
}
178+
var values []float64
179+
for _, v := range valuesSlice {
180+
number, ok := v.(float64)
181+
if !ok {
182+
return nil, errors.New("value is not float64")
200183
}
184+
values = append(values, number)
201185
}
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
186+
return values, nil
212187
}
213188

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-
189+
// For a specific test and measurement
190+
func getEnergyStatsForOneBenchmark(rd RawData, coll *mongo.Collection) ([]*EnergyStats, error) {
191+
testname := rd.Info.TestName
223192
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-
}
228193

229-
es, err := getEnergyStatsForOneBenchmark(patchRawData[i], mainlineRawData[i])
194+
for i := range rd.Rollups.Stats {
195+
measurement := rd.Rollups.Stats[i].Name
196+
patchVal := []float64{rd.Rollups.Stats[i].Val}
197+
stableRegionVals, err := findLastStableRegion(testname, measurement, coll)
230198
if err != nil {
231199
return nil, err
232200
}
233-
energyStats = append(energyStats, es)
234-
235-
fmt.Printf("%s | H-score: %.4f\n", es.Benchmark, es.H)
201+
e, t, h := GetEnergyStatistics(mat.NewDense(len(stableRegionVals), 1, stableRegionVals), mat.NewDense(1, 1, patchVal))
202+
es := EnergyStats{
203+
Benchmark: testname,
204+
Measurement: measurement,
205+
PatchVersion: rd.Info.Version,
206+
StableRegionValues: stableRegionVals,
207+
PatchValues: patchVal,
208+
E: e,
209+
T: t,
210+
H: h,
211+
}
212+
energyStats = append(energyStats, &es)
236213
}
214+
237215
return energyStats, nil
238216
}
217+
218+
func getEnergyStatsForAllBenchMarks(patchRawData []RawData, coll *mongo.Collection) ([]*EnergyStats, error) {
219+
var allEnergyStats []*EnergyStats
220+
for _, rd := range patchRawData {
221+
energyStats, err := getEnergyStatsForOneBenchmark(rd, coll)
222+
if err != nil {
223+
return nil, err
224+
}
225+
allEnergyStats = append(allEnergyStats, energyStats...)
226+
}
227+
return allEnergyStats, nil
228+
}

0 commit comments

Comments
 (0)