From 3ce3835e5ae464d8ecd12874aa3a79393719d959 Mon Sep 17 00:00:00 2001 From: Cisco Date: Fri, 4 Apr 2025 02:06:43 +0800 Subject: [PATCH 1/2] hash based on input file not judge file --- src/server/logic/judgements/judge_runner.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/server/logic/judgements/judge_runner.ts b/src/server/logic/judgements/judge_runner.ts index 285cf849..2791afc4 100644 --- a/src/server/logic/judgements/judge_runner.ts +++ b/src/server/logic/judgements/judge_runner.ts @@ -269,6 +269,13 @@ async function judgeSubtask( }; } +function getTaskHash(task_data: JudgeTaskDataFor) { + if ('input_file_hash' in task_data) { + return task_data.input_file_hash; + } + return undefined; +} + async function judgeTaskData( type: Type, context: JudgeContextFor, @@ -278,7 +285,8 @@ async function judgeTaskData( verdict_cache: Map, bad_subtask: boolean ): Promise { - const cached_verdict = verdict_cache.get(task_data.judge_file_hash); + const task_hash = getTaskHash(task_data); + const cached_verdict = task_hash != undefined ? verdict_cache.get(task_hash) : undefined; let result: EvaluationResult; if (bad_subtask) { result = { @@ -337,8 +345,8 @@ async function judgeTaskData( running_time_ms: result.running_time_ms, running_memory_byte: result.running_memory_byte, }; - if (returnResult.verdict !== Verdict.Skipped) { - verdict_cache.set(task_data.judge_file_hash, returnResult); + if (task_hash != undefined && returnResult.verdict !== Verdict.Skipped) { + verdict_cache.set(task_hash, returnResult); } return returnResult; } From a5842f83b7b9799c3956551a22735d789f7d9077 Mon Sep 17 00:00:00 2001 From: Cisco Date: Fri, 4 Apr 2025 02:24:38 +0800 Subject: [PATCH 2/2] fixed the code, in line with other recent changes --- src/server/logic/judgements/judge_runner.ts | 17 ++++++----------- .../logic/submissions/judge_submission.ts | 8 +------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/server/logic/judgements/judge_runner.ts b/src/server/logic/judgements/judge_runner.ts index 2791afc4..188d1e31 100644 --- a/src/server/logic/judgements/judge_runner.ts +++ b/src/server/logic/judgements/judge_runner.ts @@ -269,13 +269,6 @@ async function judgeSubtask( }; } -function getTaskHash(task_data: JudgeTaskDataFor) { - if ('input_file_hash' in task_data) { - return task_data.input_file_hash; - } - return undefined; -} - async function judgeTaskData( type: Type, context: JudgeContextFor, @@ -285,8 +278,10 @@ async function judgeTaskData( verdict_cache: Map, bad_subtask: boolean ): Promise { - const task_hash = getTaskHash(task_data); - const cached_verdict = task_hash != undefined ? verdict_cache.get(task_hash) : undefined; + // An empty task_data.input_file_hash means there is no input file (output-only task) + const cached_verdict = task_data.input_file_hash + ? verdict_cache.get(task_data.input_file_hash) + : undefined; let result: EvaluationResult; if (bad_subtask) { result = { @@ -345,8 +340,8 @@ async function judgeTaskData( running_time_ms: result.running_time_ms, running_memory_byte: result.running_memory_byte, }; - if (task_hash != undefined && returnResult.verdict !== Verdict.Skipped) { - verdict_cache.set(task_hash, returnResult); + if (task_data.input_file_hash && returnResult.verdict !== Verdict.Skipped) { + verdict_cache.set(task_data.input_file_hash, returnResult); } return returnResult; } diff --git a/src/server/logic/submissions/judge_submission.ts b/src/server/logic/submissions/judge_submission.ts index 8903f198..3f8b90c7 100644 --- a/src/server/logic/submissions/judge_submission.ts +++ b/src/server/logic/submissions/judge_submission.ts @@ -247,13 +247,7 @@ async function loadSubtasksOutput( .filter((d) => d.subtask_id == subtask.id) .map((d) => ({ id: d.id, - /*** - * TODO: Perform an overhaul to the DB so that output-only problems can have input files as well - * Currently, our only Output Onlies are TAMa (Project Euler style) - * But more properly, Output-Only in general needs an input file as well, see: https://oj.uz/problem/view/IOI17_nowruz - * (There are no such problems like the above in Hurado _yet_) - * This is just a quick band-aid fix so I can get custom-checkers to work for the others. - **/ + // We put an empty string to mean no input file input_file_name: d.input_file_name ?? '', input_file_hash: d.input_file_hash ?? '', judge_file_name: d.judge_file_name,