Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions doc/manual/config-basic.rst
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,11 @@ it need not have started yet). You can verify whether the submissions
gave the expected answer in the Judging Verifier, available from
the jury index page.

After this rejudge the whole contest with a higher overshoot, as well as
judge remaining testcases. This rejudging is used to distinguish between the
slowest *Accepted* solution and the fastest *Time Limit Exceeded*.
As a rule of thumb set the timelimit to twice the slowest *Accepted*
solution. The Statistics/Analytics page of each problem has a graphic
overview for those submissions.

.. _ICPC-compatible teams.tsv files: https://ccs-specs.icpc.io/2021-11/ccs_system_requirements#teamstsv
31 changes: 19 additions & 12 deletions webapp/src/Controller/Jury/JuryMiscController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use App\Controller\API\GeneralInfoController as GI;
use App\Controller\BaseController;
use App\Entity\Contest;
use App\Entity\ContestProblem;
use App\Entity\Judging;
use App\Entity\Language;
use App\Entity\Problem;
Expand Down Expand Up @@ -247,18 +248,8 @@ public function judgingVerifierAction(Request $request): Response
{
/** @var Submission[] $submissions */
$submissions = [];
if ($contest = $this->dj->getCurrentContest()) {
$submissions = $this->em->createQueryBuilder()
->from(Submission::class, 's')
->join('s.judgings', 'j', Join::WITH, 'j.valid = 1')
->select('s', 'j')
->andWhere('s.contest = :contest')
->andWhere('j.result IS NOT NULL')
->setParameter('contest', $contest)
->getQuery()
->getResult();
}

/** @var ContestProblem[] $problems */
$problems = [];
$numChecked = 0;
$numUnchecked = 0;

Expand All @@ -272,6 +263,20 @@ public function judgingVerifierAction(Request $request): Response

$verifyMultiple = (bool)$request->get('verify_multiple', false);

$contest = $this->dj->getCurrentContest();
if ($contest) {
$problems = $contest->getProblems();
$submissions = $this->em->createQueryBuilder()
->from(Submission::class, 's')
->join('s.judgings', 'j', Join::WITH, 'j.valid = 1')
->select('s', 'j')
->andWhere('s.contest = :contest')
->andWhere('j.result IS NOT NULL')
->setParameter('contest', $contest)
->getQuery()
->getResult();
}

foreach ($submissions as $submission) {
// As we only load the needed judging, this will automatically be the first one
/** @var Judging $judging */
Expand Down Expand Up @@ -329,6 +334,8 @@ public function judgingVerifierAction(Request $request): Response
'verified' => $verified,
'nomatch' => $nomatch,
'earlier' => $earlier,
'problems' => $problems,
'contestId' => $this->dj->getCurrentContest()?->getCid(),
'verifyMultiple' => $verifyMultiple,
]);
}
Expand Down
17 changes: 17 additions & 0 deletions webapp/templates/jury/check_judgings.html.twig
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,21 @@
{{ checkJudgings.verifyResults('earlier', 'Verified earlier', earlier, true) }}
{{ checkJudgings.verifyResults('nomatch', 'Without magic string', nomatch, true) }}

{% if problems != [] %}
<h2>Problem runtime analytics</h2>
You probably want to <a href="{{ path('jury_contest', {'contestId': contestId }) }}">rejudge</a>
all submissions with a reasonable overshoot and
{%- if not is_granted('ROLE_ADMIN') %} let an admin {% endif %}
judge the
{%- if is_granted('ROLE_ADMIN') %}<a href="{{ path('jury_contest_request_remaining', {'contestId': contestId}) }}">{% endif %}
remaining testcases
{%- if is_granted('ROLE_ADMIN') %}</a>{% endif %}.
After this compare the maximum runtime for <code>Accepted</code>
solutions and tune those against expected <code>Time Limit Exceeded</code> solutions.<br>
{% for p in problems %}
{% set link = path('analysis_problem', {'probid': p.probid, 'view': 'hidden'}) %}
<a href="{{ link }}">{{ p | problemBadge }}</a>
{% endfor %}
{% endif %}

{% endblock %}
Loading