From ab165f71b24f3c86851de138f564d050c562cb5a Mon Sep 17 00:00:00 2001 From: Sara H Date: Mon, 10 Feb 2025 21:22:11 -0500 Subject: [PATCH] Use Top Score instead of Max score --- backend/app/domain/services/base/score.py | 29 +++++++++++++++++-- .../app/infrastructure/repositories/score.py | 12 ++++++++ .../TaskPage/PrincipalTaskStats.tsx | 2 +- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/backend/app/domain/services/base/score.py b/backend/app/domain/services/base/score.py index 1319eb3b..8218d6b4 100644 --- a/backend/app/domain/services/base/score.py +++ b/backend/app/domain/services/base/score.py @@ -8,9 +8,13 @@ import boto3 import numpy as np import pandas as pd +import yaml from app.domain.helpers.email import EmailHelper from app.domain.services.base.dataset import DatasetService +from app.domain.services.builder_and_evaluation.eval_utils.metrics_dicts import ( + meta_metrics_dict, +) from app.infrastructure.repositories.dataset import DatasetRepository from app.infrastructure.repositories.model import ModelRepository from app.infrastructure.repositories.round import RoundRepository @@ -307,11 +311,30 @@ def calculate_dynascore( return converted_data def get_maximun_principal_score_by_task(self, task_id: int) -> float: + yaml_file = self.task_repository.get_config_file_by_task_id(task_id)[0] + yaml_file = yaml.safe_load(yaml_file) + perf_metric = yaml_file.get("perf_metric", {}) + if isinstance(perf_metric, list): + evaluation = yaml_file.get("evaluation", None) + main_metric = evaluation.get("main_perf_metric", None) + else: + main_metric = perf_metric.get("type", None) + if main_metric: + metadata = meta_metrics_dict.get(main_metric) + metadata = metadata(None) + direction = metadata.get("utility_direction", None) + else: + direction = 1 scoring_datasets = self.dataset_service.get_scoring_datasets_by_task_id(task_id) scoring_datasets = [dataset["id"] for dataset in scoring_datasets] - scores = self.score_repository.get_maximun_principal_score_by_task( - task_id, scoring_datasets - ) + if direction == -1: + scores = self.score_repository.get_minimum_main_score_by_task( + task_id, scoring_datasets + ) + else: + scores = self.score_repository.get_maximun_principal_score_by_task( + task_id, scoring_datasets + ) if scores: return scores else: diff --git a/backend/app/infrastructure/repositories/score.py b/backend/app/infrastructure/repositories/score.py index 634c8aa3..1b2ca847 100644 --- a/backend/app/infrastructure/repositories/score.py +++ b/backend/app/infrastructure/repositories/score.py @@ -54,6 +54,18 @@ def get_maximun_principal_score_by_task(self, task_id: int, datasets: list): .first() ) + def get_minimum_main_score_by_task(self, task_id: int, datasets: list): + return ( + self.session.query(Model.name, func.avg(Score.perf).label("perf")) + .filter(Score.did.in_(datasets)) + .filter(Score.mid == Model.id) + .filter(Model.tid == task_id) + .filter(Model.is_published) + .group_by(Model.id) + .order_by(func.avg(Score.perf).asc()) + .first() + ) + def get_downstream_scores(self, dataset_id: int, model_id: int): return ( self.session.query(Score) diff --git a/frontends/web/src/new_front/components/TaskPage/PrincipalTaskStats.tsx b/frontends/web/src/new_front/components/TaskPage/PrincipalTaskStats.tsx index 2f35ec2e..66ffdeac 100644 --- a/frontends/web/src/new_front/components/TaskPage/PrincipalTaskStats.tsx +++ b/frontends/web/src/new_front/components/TaskPage/PrincipalTaskStats.tsx @@ -65,7 +65,7 @@ const PrincipalTaskStats: FC = ({ {maxScore!.toFixed(2)}

- Max score + Top score

)}