fix: more intuitive default score
All checks were successful
build / build (push) Successful in 2m4s
build / trigger-build-image (push) Successful in 9s

This commit is contained in:
张泊明518370910136 2025-06-20 11:54:51 -04:00
parent 29952a9d2d
commit fd7d09e7b2
GPG Key ID: D47306D7062CDA9D
7 changed files with 93 additions and 10 deletions

View File

@ -99,6 +99,9 @@ class ParserDiffOutputs(BaseModel):
class ParserDiff(BaseModel): class ParserDiff(BaseModel):
output: ParserDiffOutputs = ParserDiffOutputs() output: ParserDiffOutputs = ParserDiffOutputs()
class ParserDiffFull(ParserDiff):
default_score: int = Field( default_score: int = Field(
DEFAULT_CASE_SCORE, DEFAULT_CASE_SCORE,
validation_alias=AliasChoices("default-score", "default_score"), validation_alias=AliasChoices("default-score", "default_score"),
@ -147,7 +150,7 @@ class Parser(str, Enum):
ELF = "elf" ELF = "elf"
class Case(BaseModel): class CaseBase(BaseModel):
env: List[str] = [] env: List[str] = []
command: str = "" # Command to run command: str = "" # Command to run
files: StageFiles = StageFiles() files: StageFiles = StageFiles()
@ -158,10 +161,17 @@ class Case(BaseModel):
) )
limit: Limit = Limit() limit: Limit = Limit()
score: int = 0 score: int = 0
class StageCase(CaseBase):
diff: ParserDiffFull = ParserDiffFull()
class DictCase(CaseBase):
diff: ParserDiff = ParserDiff() diff: ParserDiff = ParserDiff()
class Stage(Case): class Stage(StageCase):
name: str = "" # stage name name: str = "" # stage name
skip: List[str] = [] skip: List[str] = []
@ -182,7 +192,7 @@ class Stage(Case):
) )
file: ParserFile = ParserFile() file: ParserFile = ParserFile()
cases: Dict[str, Case] = {} cases: Dict[str, DictCase] = {}
model_config = ConfigDict(extra="allow") model_config = ConfigDict(extra="allow")

View File

@ -182,7 +182,7 @@ def fix_file(file_parser_config: task.ParserFile, file_parser: result.Parser) ->
def fix_diff( def fix_diff(
_: task.ParserDiff, _: task.ParserDiffFull,
diff_parser: result.Parser, diff_parser: result.Parser,
task_stage: task.Stage, task_stage: task.Stage,
executor: result.Executor, executor: result.Executor,
@ -231,7 +231,11 @@ def fix_diff(
parser_case = result.DiffCasesConfig( parser_case = result.DiffCasesConfig(
outputs=[ outputs=[
result.DiffOutputConfig( 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", file_name="stdout",
answer_path=stdout, answer_path=stdout,
force_quit_on_diff=case.diff.output.force_quit, force_quit_on_diff=case.diff.output.force_quit,
@ -268,7 +272,7 @@ def fix_diff(
def get_unspecified_cases( 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]: ) -> List[str]:
testcases = set() testcases = set()
for testcases_path in (task_root / task_path).parent.glob("**/*.in"): for testcases_path in (task_root / task_path).parent.glob("**/*.in"):
@ -298,7 +302,7 @@ def get_unspecified_cases(
def get_stdin_stdout( 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]]: ) -> Tuple[result.Stdin, Optional[str]]:
case_stdout_name = case.out_ if case.out_ else f"{case_name}.out" case_stdout_name = case.out_ if case.out_ else f"{case_name}.out"
stdin: result.Stdin = result.MemoryFile(content="") stdin: result.Stdin = result.MemoryFile(content="")

View File

View File

View File

View File

@ -763,7 +763,27 @@
"dataSegmentLimit": false, "dataSegmentLimit": false,
"addressSpaceLimit": false "addressSpaceLimit": false
}, },
"cases": [] "cases": [
{
"stdin": {
"content": ""
},
"cpuLimit": 500000000,
"clockLimit": 1000000000,
"memoryLimit": 5242880
},
{
"stdin": {
"content": ""
},
"memoryLimit": 5242880
},
{
"stdin": {
"content": ""
}
}
]
} }
}, },
"parsers": [ "parsers": [
@ -771,7 +791,53 @@
"name": "diff", "name": "diff",
"with": { "with": {
"name": "diff", "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
}
]
}
]
} }
}, },
{ {

View File

@ -92,12 +92,13 @@ copy-in-cwd = false
files.import = [ "h7/build/ex2-asan" ] files.import = [ "h7/build/ex2-asan" ]
limit.mem = "128m" limit.mem = "128m"
diff.default-score = 10
parsers = [ "diff", "result-detail" ] parsers = [ "diff", "result-detail" ]
result-detail.exit-status = true result-detail.exit-status = true
result-detail.stderr = true result-detail.stderr = true
# will be removed as long as the name is fixed # will be removed as long as the name is fixed
case0.diff.output.score = 5
case0.limit.cpu = "0.5s" case0.limit.cpu = "0.5s"
case0.limit.mem = "5m" case0.limit.mem = "5m"
case0.diff.output.ignore-spaces = true case0.diff.output.ignore-spaces = true
@ -112,3 +113,5 @@ case1.diff.output.ignore-spaces = true
#case1.limit.stdout = 8 #case1.limit.stdout = 8
#case1.command = "./h7/build/ex2" #case1.command = "./h7/build/ex2"
case1.in = "case1.in" case1.in = "case1.in"
case2.diff.output.hide = true