""" grader_api.py - Grader CLASSES for validator. Validator calls: Task1Grader().grade(env) and checks 0 < result < 1 """ import math from server.graders.json_grader import grade_task1 as _r1 from server.graders.yaml_grader import grade_task2 as _r2 from server.graders.dockerfile_grader import grade_task3 as _r3 from server.graders.compose_grader import grade_task4 as _r4 from server.graders.k8s_grader import grade_task5 as _r5 from server.graders.github_actions_grader import grade_task6 as _r6 from server.graders.nginx_grader import grade_task7 as _r7 def _safe_grade(raw_fn, env): try: if env is None: return 0.50 config = getattr(env, 'current_broken_config', None) or "" if not config: obs = getattr(env, '_build_observation', lambda: None)() if obs is not None: config = getattr(obs, 'broken_config', "") or "" if not config: return 0.50 result = raw_fn(str(config)) if isinstance(result, (tuple, list)): reward = float(result[0]) else: reward = float(result) if math.isnan(reward) or math.isinf(reward): return 0.50 return max(0.01, min(0.99, reward)) except Exception: return 0.50 class Task1Grader: def grade(self, env, *args, **kwargs) -> float: return _safe_grade(_r1, env) class Task2Grader: def grade(self, env, *args, **kwargs) -> float: return _safe_grade(_r2, env) class Task3Grader: def grade(self, env, *args, **kwargs) -> float: return _safe_grade(_r3, env) class Task4Grader: def grade(self, env, *args, **kwargs) -> float: return _safe_grade(_r4, env) class Task5Grader: def grade(self, env, *args, **kwargs) -> float: return _safe_grade(_r5, env) class Task6Grader: def grade(self, env, *args, **kwargs) -> float: return _safe_grade(_r6, env) class Task7Grader: def grade(self, env, *args, **kwargs) -> float: return _safe_grade(_r7, env)