From ac3e656ec166bc4d205e9a91f81a9d5fd98e9808 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/lib/task.py | 68 +++++++ tests/convert/basic/task.json | 318 +++++++++++++++++++++++++++++- 2 files changed, 382 insertions(+), 4 deletions(-) diff --git a/joj3_config_generator/lib/task.py b/joj3_config_generator/lib/task.py index 765ecb1..d500c45 100644 --- a/joj3_config_generator/lib/task.py +++ b/joj3_config_generator/lib/task.py @@ -307,5 +307,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/tests/convert/basic/task.json b/tests/convert/basic/task.json index 9a71599..a1dd5cc 100644 --- a/tests/convert/basic/task.json +++ b/tests/convert/basic/task.json @@ -879,13 +879,168 @@ "dataSegmentLimit": false, "addressSpaceLimit": false }, - "cases": [] + "cases": [ + { + "args": null, + "env": [ + "PATH=/usr/bin:/bin:/usr/local/bin" + ], + "stdin": { + "src": "/home/tt/.config/joj/judge-base/case4.in", + "content": null, + "fileId": null, + "name": null, + "max": 4194304, + "symlink": null, + "streamIn": false, + "streamOut": false, + "pipe": false + }, + "stdout": null, + "stderr": null, + "cpuLimit": 30000000000, + "realCpuLimit": null, + "clockLimit": 60000000000, + "memoryLimit": 10485760, + "stackLimit": null, + "procLimit": 50, + "cpuRateLimit": null, + "cpuSetLimit": null, + "copyIn": null, + "copyInCached": null, + "copyInDir": null, + "copyOut": null, + "copyOutCached": null, + "copyOutMax": null, + "copyOutDir": null, + "tty": null, + "strictMemoryLimit": null, + "dataSegmentLimit": null, + "addressSpaceLimit": null + }, + { + "args": null, + "env": [ + "PATH=/usr/bin:/bin:/usr/local/bin" + ], + "stdin": { + "src": "/home/tt/.config/joj/judge-base/case5.in", + "content": null, + "fileId": null, + "name": null, + "max": 4194304, + "symlink": null, + "streamIn": false, + "streamOut": false, + "pipe": false + }, + "stdout": null, + "stderr": null, + "cpuLimit": 4000000000, + "realCpuLimit": null, + "clockLimit": 8000000000, + "memoryLimit": 4194304, + "stackLimit": null, + "procLimit": 50, + "cpuRateLimit": null, + "cpuSetLimit": null, + "copyIn": null, + "copyInCached": null, + "copyInDir": null, + "copyOut": null, + "copyOutCached": null, + "copyOutMax": null, + "copyOutDir": null, + "tty": null, + "strictMemoryLimit": null, + "dataSegmentLimit": null, + "addressSpaceLimit": null + }, + { + "args": null, + "env": [ + "PATH=/usr/bin:/bin:/usr/local/bin" + ], + "stdin": { + "src": "/home/tt/.config/joj/judge-base/case8.in", + "content": null, + "fileId": null, + "name": null, + "max": 4194304, + "symlink": null, + "streamIn": false, + "streamOut": false, + "pipe": false + }, + "stdout": null, + "stderr": null, + "cpuLimit": 4000000000, + "realCpuLimit": null, + "clockLimit": 8000000000, + "memoryLimit": 4194304, + "stackLimit": null, + "procLimit": 50, + "cpuRateLimit": null, + "cpuSetLimit": null, + "copyIn": null, + "copyInCached": null, + "copyInDir": null, + "copyOut": null, + "copyOutCached": null, + "copyOutMax": null, + "copyOutDir": null, + "tty": null, + "strictMemoryLimit": null, + "dataSegmentLimit": null, + "addressSpaceLimit": null + } + ] } }, "parsers": [ { "name": "diff", - "with": {} + "with": { + "name": "diff", + "cases": [ + { + "outputs": [ + { + "score": 0, + "fileName": "stdout", + "answerPath": "/home/tt/.config/joj/judge-base/case4.out", + "forceQuitOnDiff": true, + "alwaysHide": false, + "compareSpace": true + } + ] + }, + { + "outputs": [ + { + "score": 0, + "fileName": "stdout", + "answerPath": "/home/tt/.config/joj/judge-base/case5.out", + "forceQuitOnDiff": true, + "alwaysHide": false, + "compareSpace": true + } + ] + }, + { + "outputs": [ + { + "score": 0, + "fileName": "stdout", + "answerPath": "/home/tt/.config/joj/judge-base/case8.out", + "forceQuitOnDiff": true, + "alwaysHide": false, + "compareSpace": true + } + ] + } + ] + } }, { "name": "dummy", @@ -975,13 +1130,168 @@ "dataSegmentLimit": false, "addressSpaceLimit": false }, - "cases": [] + "cases": [ + { + "args": null, + "env": [ + "PATH=/usr/bin:/bin:/usr/local/bin" + ], + "stdin": { + "src": "/home/tt/.config/joj/judge-msan/case4.in", + "content": null, + "fileId": null, + "name": null, + "max": 4194304, + "symlink": null, + "streamIn": false, + "streamOut": false, + "pipe": false + }, + "stdout": null, + "stderr": null, + "cpuLimit": 30000000000, + "realCpuLimit": null, + "clockLimit": 60000000000, + "memoryLimit": 10485760, + "stackLimit": null, + "procLimit": 50, + "cpuRateLimit": null, + "cpuSetLimit": null, + "copyIn": null, + "copyInCached": null, + "copyInDir": null, + "copyOut": null, + "copyOutCached": null, + "copyOutMax": null, + "copyOutDir": null, + "tty": null, + "strictMemoryLimit": null, + "dataSegmentLimit": null, + "addressSpaceLimit": null + }, + { + "args": null, + "env": [ + "PATH=/usr/bin:/bin:/usr/local/bin" + ], + "stdin": { + "src": "/home/tt/.config/joj/judge-msan/case5.in", + "content": null, + "fileId": null, + "name": null, + "max": 4194304, + "symlink": null, + "streamIn": false, + "streamOut": false, + "pipe": false + }, + "stdout": null, + "stderr": null, + "cpuLimit": 4000000000, + "realCpuLimit": null, + "clockLimit": 8000000000, + "memoryLimit": 4194304, + "stackLimit": null, + "procLimit": 50, + "cpuRateLimit": null, + "cpuSetLimit": null, + "copyIn": null, + "copyInCached": null, + "copyInDir": null, + "copyOut": null, + "copyOutCached": null, + "copyOutMax": null, + "copyOutDir": null, + "tty": null, + "strictMemoryLimit": null, + "dataSegmentLimit": null, + "addressSpaceLimit": null + }, + { + "args": null, + "env": [ + "PATH=/usr/bin:/bin:/usr/local/bin" + ], + "stdin": { + "src": "/home/tt/.config/joj/judge-msan/case6.in", + "content": null, + "fileId": null, + "name": null, + "max": 4194304, + "symlink": null, + "streamIn": false, + "streamOut": false, + "pipe": false + }, + "stdout": null, + "stderr": null, + "cpuLimit": 4000000000, + "realCpuLimit": null, + "clockLimit": 8000000000, + "memoryLimit": 4194304, + "stackLimit": null, + "procLimit": 50, + "cpuRateLimit": null, + "cpuSetLimit": null, + "copyIn": null, + "copyInCached": null, + "copyInDir": null, + "copyOut": null, + "copyOutCached": null, + "copyOutMax": null, + "copyOutDir": null, + "tty": null, + "strictMemoryLimit": null, + "dataSegmentLimit": null, + "addressSpaceLimit": null + } + ] } }, "parsers": [ { "name": "diff", - "with": {} + "with": { + "name": "diff", + "cases": [ + { + "outputs": [ + { + "score": 0, + "fileName": "stdout", + "answerPath": "/home/tt/.config/joj/judge-msan/case4.out", + "forceQuitOnDiff": true, + "alwaysHide": false, + "compareSpace": true + } + ] + }, + { + "outputs": [ + { + "score": 0, + "fileName": "stdout", + "answerPath": "/home/tt/.config/joj/judge-msan/case5.out", + "forceQuitOnDiff": true, + "alwaysHide": false, + "compareSpace": true + } + ] + }, + { + "outputs": [ + { + "score": 0, + "fileName": "stdout", + "answerPath": "/home/tt/.config/joj/judge-msan/case6.out", + "forceQuitOnDiff": true, + "alwaysHide": true, + "compareSpace": true + } + ] + } + ] + } }, { "name": "dummy",