From fd7d09e7b2fd28eaa895dc712d57203ffafa926e Mon Sep 17 00:00:00 2001 From: Boming Zhang Date: Fri, 20 Jun 2025 11:54:51 -0400 Subject: [PATCH] fix: more intuitive default score --- joj3_config_generator/models/task.py | 16 ++++- joj3_config_generator/transformers/task.py | 12 ++-- tests/convert/basic/cases/case0.out | 0 tests/convert/basic/cases/case1.out | 0 tests/convert/basic/cases/case2.out | 0 tests/convert/basic/task.json | 70 +++++++++++++++++++++- tests/convert/basic/task.toml | 5 +- 7 files changed, 93 insertions(+), 10 deletions(-) create mode 100644 tests/convert/basic/cases/case0.out create mode 100644 tests/convert/basic/cases/case1.out create mode 100644 tests/convert/basic/cases/case2.out diff --git a/joj3_config_generator/models/task.py b/joj3_config_generator/models/task.py index a59160a..81d69ad 100644 --- a/joj3_config_generator/models/task.py +++ b/joj3_config_generator/models/task.py @@ -99,6 +99,9 @@ class ParserDiffOutputs(BaseModel): class ParserDiff(BaseModel): output: ParserDiffOutputs = ParserDiffOutputs() + + +class ParserDiffFull(ParserDiff): default_score: int = Field( DEFAULT_CASE_SCORE, validation_alias=AliasChoices("default-score", "default_score"), @@ -147,7 +150,7 @@ class Parser(str, Enum): ELF = "elf" -class Case(BaseModel): +class CaseBase(BaseModel): env: List[str] = [] command: str = "" # Command to run files: StageFiles = StageFiles() @@ -158,10 +161,17 @@ class Case(BaseModel): ) limit: Limit = Limit() score: int = 0 + + +class StageCase(CaseBase): + diff: ParserDiffFull = ParserDiffFull() + + +class DictCase(CaseBase): diff: ParserDiff = ParserDiff() -class Stage(Case): +class Stage(StageCase): name: str = "" # stage name skip: List[str] = [] @@ -182,7 +192,7 @@ class Stage(Case): ) file: ParserFile = ParserFile() - cases: Dict[str, Case] = {} + cases: Dict[str, DictCase] = {} model_config = ConfigDict(extra="allow") diff --git a/joj3_config_generator/transformers/task.py b/joj3_config_generator/transformers/task.py index f63b22f..1f34450 100644 --- a/joj3_config_generator/transformers/task.py +++ b/joj3_config_generator/transformers/task.py @@ -182,7 +182,7 @@ def fix_file(file_parser_config: task.ParserFile, file_parser: result.Parser) -> def fix_diff( - _: task.ParserDiff, + _: task.ParserDiffFull, diff_parser: result.Parser, task_stage: task.Stage, executor: result.Executor, @@ -231,7 +231,11 @@ def fix_diff( parser_case = result.DiffCasesConfig( outputs=[ result.DiffOutputConfig( - score=case.diff.output.score, + score=( + case.diff.output.score + if "score" in case.diff.output.model_fields_set + else task_stage.diff.default_score + ), file_name="stdout", answer_path=stdout, force_quit_on_diff=case.diff.output.force_quit, @@ -268,7 +272,7 @@ def fix_diff( def get_unspecified_cases( - task_root: Path, task_path: Path, cases: Dict[str, task.Case] + task_root: Path, task_path: Path, cases: Dict[str, task.DictCase] ) -> List[str]: testcases = set() for testcases_path in (task_root / task_path).parent.glob("**/*.in"): @@ -298,7 +302,7 @@ def get_unspecified_cases( def get_stdin_stdout( - task_root: Path, task_path: Path, case_name: str, case: task.Case + task_root: Path, task_path: Path, case_name: str, case: task.DictCase ) -> Tuple[result.Stdin, Optional[str]]: case_stdout_name = case.out_ if case.out_ else f"{case_name}.out" stdin: result.Stdin = result.MemoryFile(content="") diff --git a/tests/convert/basic/cases/case0.out b/tests/convert/basic/cases/case0.out new file mode 100644 index 0000000..e69de29 diff --git a/tests/convert/basic/cases/case1.out b/tests/convert/basic/cases/case1.out new file mode 100644 index 0000000..e69de29 diff --git a/tests/convert/basic/cases/case2.out b/tests/convert/basic/cases/case2.out new file mode 100644 index 0000000..e69de29 diff --git a/tests/convert/basic/task.json b/tests/convert/basic/task.json index ad0f3da..7db50dc 100644 --- a/tests/convert/basic/task.json +++ b/tests/convert/basic/task.json @@ -763,7 +763,27 @@ "dataSegmentLimit": false, "addressSpaceLimit": false }, - "cases": [] + "cases": [ + { + "stdin": { + "content": "" + }, + "cpuLimit": 500000000, + "clockLimit": 1000000000, + "memoryLimit": 5242880 + }, + { + "stdin": { + "content": "" + }, + "memoryLimit": 5242880 + }, + { + "stdin": { + "content": "" + } + } + ] } }, "parsers": [ @@ -771,7 +791,53 @@ "name": "diff", "with": { "name": "diff", - "cases": [] + "cases": [ + { + "outputs": [ + { + "score": 10, + "fileName": "stdout", + "answerPath": "/home/tt/.config/joj/basic/cases/case0.out", + "compareSpace": false, + "alwaysHide": false, + "forceQuitOnDiff": false, + "maxDiffLength": 2048, + "maxDiffLines": 50, + "hideCommonPrefix": false + } + ] + }, + { + "outputs": [ + { + "score": 5, + "fileName": "stdout", + "answerPath": "/home/tt/.config/joj/basic/cases/case1.out", + "compareSpace": false, + "alwaysHide": false, + "forceQuitOnDiff": false, + "maxDiffLength": 2048, + "maxDiffLines": 50, + "hideCommonPrefix": false + } + ] + }, + { + "outputs": [ + { + "score": 10, + "fileName": "stdout", + "answerPath": "/home/tt/.config/joj/basic/cases/case2.out", + "compareSpace": false, + "alwaysHide": true, + "forceQuitOnDiff": false, + "maxDiffLength": 2048, + "maxDiffLines": 50, + "hideCommonPrefix": false + } + ] + } + ] } }, { diff --git a/tests/convert/basic/task.toml b/tests/convert/basic/task.toml index 62c0329..2768650 100644 --- a/tests/convert/basic/task.toml +++ b/tests/convert/basic/task.toml @@ -92,12 +92,13 @@ copy-in-cwd = false files.import = [ "h7/build/ex2-asan" ] limit.mem = "128m" +diff.default-score = 10 + parsers = [ "diff", "result-detail" ] result-detail.exit-status = true result-detail.stderr = true # will be removed as long as the name is fixed -case0.diff.output.score = 5 case0.limit.cpu = "0.5s" case0.limit.mem = "5m" case0.diff.output.ignore-spaces = true @@ -112,3 +113,5 @@ case1.diff.output.ignore-spaces = true #case1.limit.stdout = 8 #case1.command = "./h7/build/ex2" case1.in = "case1.in" + +case2.diff.output.hide = true