Source code for eval_framework.metrics.completion.concordance_index
import ast
from eval_framework.metrics.base import BaseMetric, MetricResult
from eval_framework.shared.types import Completion
[docs]
class ConcordanceIndex(BaseMetric[Completion]):
NAME = "ConcordanceIndex"
[docs]
def calculate(self, response: Completion) -> list[MetricResult]:
if response.error is not None:
return [MetricResult(metric_name=self.NAME, value=None, higher_is_better=True, error=response.error)]
ground_truths = [gt for gt in response.ground_truth_list if gt is not None]
if not ground_truths:
return [MetricResult(metric_name=self.NAME, value=0.0, higher_is_better=True, error=response.error)]
concordance_count = max([calculate_concordance_index(gt, response.completion) for gt in ground_truths])
return [
MetricResult(metric_name=self.NAME, value=concordance_count, higher_is_better=True, error=response.error)
]
[docs]
def calculate_concordance_index(
ground_truth: str,
completion: str,
) -> float:
ground_truth_arr = ast.literal_eval(ground_truth)
completion_arr = ast.literal_eval(completion)
if len(ground_truth_arr) != len(completion_arr):
return 0
concordance_count = 0
for gt, c in zip(ground_truth_arr, completion_arr):
concordance_count += 1 if gt == c else 0
return concordance_count / len(ground_truth_arr)