def grade_cases(self, grader, cases, short_circuit=False, is_short_circuiting=False): for case in cases: # Yield notifying objects for batch begin/end, and unwrap all cases inside the batches if isinstance(case, BatchedTestCase): yield BatchBegin() for _ in self.grade_cases(grader, case.batched_cases, short_circuit=True, is_short_circuiting=is_short_circuiting): yield _ yield BatchEnd() continue # Stop grading if we're short circuiting if is_short_circuiting: result = Result(case) result.result_flag = Result.SC yield result continue # Must check here because we might be interrupted mid-execution # If we don't bail out, we get an IR. # In Java's case, all the code after this will crash. if self._terminate_grading: raise TerminateGrading() result = grader.grade(case) # If the WA bit of result_flag is set and we are set to short-circuit (e.g., in a batch), # short circuit the rest of the cases. # Do the same if the case is a pretest (i.e. has 0 points) if (result.result_flag & Result.WA) > 0 and (short_circuit or case.points == 0): is_short_circuiting = True yield result
def grade_cases(self, grader, cases, short_circuit=False, is_short_circuiting=False): for case in cases: # Yield notifying objects for batch begin/end, and unwrap all cases inside the batches if isinstance(case, BatchedTestCase): yield BatchBegin() for batched_case in self.grade_cases(grader, case.batched_cases, short_circuit=case.config['short_circuit'], is_short_circuiting=is_short_circuiting): # A batched case just failed. # There are two cases where this means that we should completely short-circuit: # 1. If the batch was worth 0 points, to emulate the property of 0-point cases. # 2. If the short_circuit flag is true, see <https://github.com/DMOJ/judge/issues/341>. if (batched_case.result_flag & Result.WA) and (not case.points or short_circuit): is_short_circuiting = True yield batched_case yield BatchEnd() continue # Stop grading if we're short circuiting if is_short_circuiting: result = Result(case) result.result_flag = Result.SC yield result continue # Must check here because we might be interrupted mid-execution # If we don't bail out, we get an IR. # In Java's case, all the code after this will crash. if self._terminate_grading: raise TerminateGrading() result = grader.grade(case) # If the WA bit of result_flag is set and we are set to short-circuit (e.g., in a batch), # short circuit the rest of the cases. # Do the same if the case is a pretest (i.e. has 0 points) if (result.result_flag & Result.WA) > 0 and (short_circuit or not case.points): is_short_circuiting = True yield result