Skip to content

Commit

Permalink
Collapse Assessments by Language and Model
Browse files Browse the repository at this point in the history
Part of #83
  • Loading branch information
Munsio committed May 6, 2024
1 parent bbeb3e5 commit b80fec8
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 0 deletions.
23 changes: 23 additions & 0 deletions evaluate/report/collection.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ type AssessmentPerModelPerLanguagePerRepository map[model.Model]map[language.Lan
// AssessmentPerModel holds a collection of assessments per model.
type AssessmentPerModel map[model.Model]metrics.Assessments

// AssessmentPerLanguagePerModel holds a collection of assessments per language and model.
type AssessmentPerLanguagePerModel map[language.Language]map[model.Model]metrics.Assessments

// NewAssessmentPerModelPerLanguagePerRepository returns a new AssessmentPerModelPerLanguagePerRepository initialized with an empty assessment for each combination.
func NewAssessmentPerModelPerLanguagePerRepository(models []model.Model, languages []language.Language, repositories []string) AssessmentPerModelPerLanguagePerRepository {
a := AssessmentPerModelPerLanguagePerRepository{}
Expand Down Expand Up @@ -85,6 +88,26 @@ func (a AssessmentPerModelPerLanguagePerRepository) CollapseByModel() Assessment
return perModel
}

// CollapseByLanguage returns all assessments aggregated per language and model.
func (a AssessmentPerModelPerLanguagePerRepository) CollapseByLanguage() AssessmentPerLanguagePerModel {
assessments := AssessmentPerLanguagePerModel{}
_ = a.Walk(func(m model.Model, l language.Language, r string, a metrics.Assessments) error {
if _, ok := assessments[l]; !ok {
assessments[l] = map[model.Model]metrics.Assessments{}
}

if _, ok := assessments[l][m]; !ok {
assessments[l][m] = metrics.NewAssessments()
}

assessments[l][m].Add(a)

return nil
})

return assessments
}

// WalkByScore walks the given assessment metrics by their score.
func WalkByScore(assessmentsPerModel AssessmentPerModel, function func(model model.Model, assessment metrics.Assessments, score uint) error) error {
models := maps.Keys(assessmentsPerModel)
Expand Down
86 changes: 86 additions & 0 deletions evaluate/report/collection_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,3 +295,89 @@ func TestAssessmentCollapseByModel(t *testing.T) {
},
})
}

func TestAssessmentCollapseByLanguage(t *testing.T) {
type testCase struct {
Name string

Assessments AssessmentPerModelPerLanguagePerRepository

ExpectedAssessmentPerLanguagePerModel AssessmentPerLanguagePerModel
}

validate := func(t *testing.T, tc *testCase) {
t.Run(tc.Name, func(t *testing.T) {
actualAssessmentPerLanguagePerModel := tc.Assessments.CollapseByLanguage()

assert.Equal(t, tc.ExpectedAssessmentPerLanguagePerModel, actualAssessmentPerLanguagePerModel)
})
}

modelA := modeltesting.NewMockModelNamed(t, "some-model-a")
modelB := modeltesting.NewMockModelNamed(t, "some-model-b")

languageA := languagetesting.NewMockLanguageNamed(t, "some-language-a")
languageB := languagetesting.NewMockLanguageNamed(t, "some-language-b")

validate(t, &testCase{
Name: "Collapse",

Assessments: AssessmentPerModelPerLanguagePerRepository{
modelA: {
languageA: {
"some-repository-a": metrics.Assessments{
metrics.AssessmentKeyResponseNoExcess: 1,
},
"some-repository-b": metrics.Assessments{
metrics.AssessmentKeyResponseNoExcess: 2,
},
},
languageB: {
"some-repository-a": metrics.Assessments{
metrics.AssessmentKeyResponseNoExcess: 3,
},
"some-repository-b": metrics.Assessments{
metrics.AssessmentKeyResponseNoExcess: 4,
},
},
},
modelB: {
languageA: {
"some-repository-a": metrics.Assessments{
metrics.AssessmentKeyResponseNoExcess: 5,
},
"some-repository-b": metrics.Assessments{
metrics.AssessmentKeyResponseNoExcess: 6,
},
},
languageB: {
"some-repository-a": metrics.Assessments{
metrics.AssessmentKeyResponseNoExcess: 7,
},
"some-repository-b": metrics.Assessments{
metrics.AssessmentKeyResponseNoExcess: 8,
},
},
},
},

ExpectedAssessmentPerLanguagePerModel: AssessmentPerLanguagePerModel{
languageA: map[model.Model]metrics.Assessments{
modelA: {
metrics.AssessmentKeyResponseNoExcess: 3,
},
modelB: {
metrics.AssessmentKeyResponseNoExcess: 11,
},
},
languageB: map[model.Model]metrics.Assessments{
modelA: {
metrics.AssessmentKeyResponseNoExcess: 7,
},
modelB: {
metrics.AssessmentKeyResponseNoExcess: 15,
},
},
},
})
}

0 comments on commit b80fec8

Please sign in to comment.