From 91ad7e88a7e9b82ab89f0fcbb195dad392a39b20 Mon Sep 17 00:00:00 2001 From: Nuvole Date: Sat, 26 Oct 2024 15:00:46 +0800 Subject: [PATCH] ffeat: diff finish --- joj3_config_generator/convert.py | 3 -- joj3_config_generator/lib/task.py | 69 ++++++++++++++++++++++++++++ joj3_config_generator/models/task.py | 2 +- 3 files changed, 70 insertions(+), 4 deletions(-) diff --git a/joj3_config_generator/convert.py b/joj3_config_generator/convert.py index f884f22..98ea255 100644 --- a/joj3_config_generator/convert.py +++ b/joj3_config_generator/convert.py @@ -20,9 +20,7 @@ from joj3_config_generator.models import ( ) -# FIXME: LLM generated convert function, only for demostration def convert(repo_conf: Repo, task_conf: Task) -> ResultConfig: - print(task_conf) # Create the base ResultConf object # FIXME: wrap things in functions result_conf = ResultConfig( @@ -100,7 +98,6 @@ def convert(repo_conf: Repo, task_conf: Task) -> ResultConfig: conf_stage = fix_result_detail(task_stage, conf_stage) conf_stage = fix_comment(task_stage, conf_stage) conf_stage = fix_keyword(task_stage, conf_stage) - # TODO: fix diff parser here conf_stage = fix_diff(task_stage, conf_stage) result_conf.stage.stages.append(conf_stage) diff --git a/joj3_config_generator/lib/task.py b/joj3_config_generator/lib/task.py index d8d2f78..35aa92b 100644 --- a/joj3_config_generator/lib/task.py +++ b/joj3_config_generator/lib/task.py @@ -1,5 +1,6 @@ import rtoml +from joj3_config_generator.models.result import CmdFile, OptionalCmd from joj3_config_generator.models.result import Stage as ResultStage from joj3_config_generator.models.task import Stage as TaskStage @@ -78,5 +79,73 @@ def fix_comment(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage: def fix_diff(task_stage: TaskStage, conf_stage: ResultStage) -> ResultStage: + if task_stage.parsers is not None and "diff" in task_stage.parsers: + diff_parser = next((p for p in conf_stage.parsers if p.name == "diff"), None) + skip = task_stage.skip or [] + cases = task_stage.cases or {} + finalized_cases = [case for case in cases if case not in skip] + + stage_cases = [] + parser_cases = [] + + for case in finalized_cases: + case_stage = task_stage.cases.get(case) if task_stage.cases else None + if not case_stage: + continue + + # Ensure case_stage.limit is defined before accessing .cpu and .mem + cpu_limit = ( + case_stage.limit.cpu * 1_000_000_000 + if case_stage.limit and case_stage.limit.cpu is not None + else 0 + ) + clock_limit = ( + 2 * case_stage.limit.cpu * 1_000_000_000 + if case_stage.limit and case_stage.limit.cpu is not None + else 0 + ) + memory_limit = ( + case_stage.limit.mem * 1_024 * 1_024 + if case_stage.limit and case_stage.limit.mem is not None + else 0 + ) + + stage_cases.append( + OptionalCmd( + stdin=CmdFile( + src=f"/home/tt/.config/joj/{conf_stage.name}/{case}.in" + ), + cpu_limit=cpu_limit, + clock_limit=clock_limit, + memory_limit=memory_limit, + proc_limit=50, + ) + ) + + # Ensure case_stage.diff and case_stage.diff.output are defined + diff_output = ( + case_stage.diff.output + if case_stage.diff and case_stage.diff.output + else None + ) + if diff_output: + parser_cases.append( + { + "outputs": [ + { + "score": diff_output.score, + "fileName": "stdout", + "answerPath": f"/home/tt/.config/joj/{conf_stage.name}/{case}.out", + "forceQuitOnDiff": diff_output.forcequit, + "alwaysHide": diff_output.hide, + "compareSpace": not diff_output.ignorespaces, + } + ] + } + ) + + if diff_parser and task_stage.diff is not None: + diff_parser.with_.update({"name": "diff", "cases": parser_cases}) + conf_stage.executor.with_.cases = stage_cases return conf_stage diff --git a/joj3_config_generator/models/task.py b/joj3_config_generator/models/task.py index 9c4602c..fa15fb8 100644 --- a/joj3_config_generator/models/task.py +++ b/joj3_config_generator/models/task.py @@ -50,7 +50,7 @@ class Stage(BaseModel): files: Optional[Files] = None score: Optional[int] = 0 parsers: Optional[list[str]] = [] # list of parsers - limit: Optional[Limit] = None + limit: Optional[Limit] = Limit() dummy: Optional[ParserDummy] = ParserDummy() result_status: Optional[ParserDummy] = Field(ParserDummy(), alias="result-status") keyword: Optional[ParserKeyword] = ParserKeyword()