Skills › Scientific Agent Skills › scholar-evaluation › calculate_scores.py
calculate_scores.py
57 lines · skills/scholar-evaluation/scripts/calculate_scores.py at 5f2bc03
1#!/usr/bin/env python3
2"""Calculate transparent bounded rubric math for one scholarly work."""
4from __future__ import annotations
6import argparse
7from pathlib import Path
9import _common
12def calculate(rubric: dict, evaluation: dict) -> dict:
13 rubric_issues = _common.validate_rubric(rubric)
14 _common.require_valid(rubric_issues)
15 evaluation_issues = _common.validate_evaluation(evaluation, rubric)
16 _common.require_valid(evaluation_issues)
17 report = _common.score_evaluation(rubric, evaluation)
18 report["rubric_warnings"] = [
19 issue.as_dict() for issue in rubric_issues if issue.level == "warning"
20 ]
21 return report
24def build_parser() -> argparse.ArgumentParser:
25 parser = argparse.ArgumentParser(
26 description=(
27 "Compute bounded descriptive rubric scores with explicit missing, "
28 "not-applicable, coverage, and uncertainty fields. The output never "
29 "makes a decision recommendation."
30 )
31 )
32 parser.add_argument("--rubric", required=True, type=Path, help="Local rubric JSON")
33 parser.add_argument(
34 "--evaluation", required=True, type=Path, help="Local evaluation JSON"
35 )
36 parser.add_argument("--output", type=Path, help="Optional local JSON report")
37 parser.add_argument(
38 "--force", action="store_true", help="Replace an existing output JSON file"
39 )
40 return parser
43def main() -> int:
44 args = build_parser().parse_args()
45 try:
46 rubric = _common.read_json(args.rubric)
47 evaluation = _common.read_json(args.evaluation)
48 report = calculate(rubric, evaluation)
49 _common.write_json(report, args.output, force=args.force)
50 return 0
51 except _common.ValidationError as error:
52 _common.write_json(_common.failure_report(error), None)
53 return 2
56if __name__ == "__main__":
57 raise SystemExit(main())