Skip to content

Commit 4ea9227

Browse files
committed
write optscore sum to scoreboard cache
1 parent 1a183db commit 4ea9227

File tree

4 files changed

+152
-2
lines changed

4 files changed

+152
-2
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DoctrineMigrations;
6+
7+
use Doctrine\DBAL\Schema\Schema;
8+
use Doctrine\Migrations\AbstractMigration;
9+
10+
/**
11+
* Auto-generated Migration: Please modify to your needs!
12+
*/
13+
final class Version20250519064616 extends AbstractMigration
14+
{
15+
public function getDescription(): string
16+
{
17+
return '';
18+
}
19+
20+
public function up(Schema $schema): void
21+
{
22+
// this up() migration is auto-generated, please modify it to your needs
23+
$this->addSql('ALTER TABLE scorecache ADD optscore_max_restricted DOUBLE PRECISION DEFAULT \'0\' NOT NULL COMMENT \'Max optscore (restricted audience)\', ADD optscore_max_public DOUBLE PRECISION DEFAULT \'0\' NOT NULL COMMENT \'Max optscore (public audience)\', ADD optscore_min_restricted DOUBLE PRECISION DEFAULT \'0\' NOT NULL COMMENT \'Min optscore (restricted audience)\', ADD optscore_min_public DOUBLE PRECISION DEFAULT \'0\' NOT NULL COMMENT \'Min optscore (public audience)\'');
24+
}
25+
26+
public function down(Schema $schema): void
27+
{
28+
// this down() migration is auto-generated, please modify it to your needs
29+
$this->addSql('ALTER TABLE scorecache DROP optscore_max_restricted, DROP optscore_max_public, DROP optscore_min_restricted, DROP optscore_min_public');
30+
}
31+
32+
public function isTransactional(): bool
33+
{
34+
return false;
35+
}
36+
}

webapp/src/Entity/Judging.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,21 @@ public function getMaxRuntime(): ?float
179179
return $max;
180180
}
181181

182+
public function getSumOptScore(): ?float
183+
{
184+
if ($this->runs->isEmpty()) {
185+
return null;
186+
}
187+
$sum = 0;
188+
foreach ($this->runs as $run) {
189+
if ($run->getOptscore() === null) {
190+
return null;
191+
}
192+
$sum += $run->getOptscore();
193+
}
194+
return $sum;
195+
}
196+
182197
public function getSumRuntime(): float
183198
{
184199
$sum = 0;

webapp/src/Entity/ScoreCache.php

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,30 @@ class ScoreCache
5757
])]
5858
private int $runtime_restricted = 0;
5959

60+
#[ORM\Column(options: [
61+
'comment' => 'Max optscore (restricted audience)',
62+
'default' => 0,
63+
])]
64+
private float $optscore_max_restricted = 0;
65+
66+
#[ORM\Column(options: [
67+
'comment' => 'Max optscore (public audience)',
68+
'default' => 0,
69+
])]
70+
private float $optscore_max_public = 0;
71+
72+
#[ORM\Column(options: [
73+
'comment' => 'Min optscore (restricted audience)',
74+
'default' => 0,
75+
])]
76+
private float $optscore_min_restricted = 0;
77+
78+
#[ORM\Column(options: [
79+
'comment' => 'Min optscore (public audience)',
80+
'default' => 0,
81+
])]
82+
private float $optscore_min_public = 0;
83+
6084
#[ORM\Column(options: [
6185
'comment' => 'Number of submissions made (public)',
6286
'unsigned' => true,
@@ -163,6 +187,50 @@ public function getRuntimeRestricted(): int
163187
{
164188
return $this->runtime_restricted;
165189
}
190+
191+
public function setOptScoreMaxRestricted(float $optscoreMaxRestricted): ScoreCache
192+
{
193+
$this->optscore_max_restricted = $optscoreMaxRestricted;
194+
return $this;
195+
}
196+
197+
public function getOptScoreMaxRestricted(): float
198+
{
199+
return $this->optscore_max_restricted;
200+
}
201+
202+
public function setOptScoreMaxPublic(float $optscoreMaxPublic): ScoreCache
203+
{
204+
$this->optscore_max_public = $optscoreMaxPublic;
205+
return $this;
206+
}
207+
208+
public function getOptScoreMaxPublic(): float
209+
{
210+
return $this->optscore_max_public;
211+
}
212+
213+
public function setOptScoreMinRestricted(float $optscoreMinRestricted): ScoreCache
214+
{
215+
$this->optscore_min_restricted = $optscoreMinRestricted;
216+
return $this;
217+
}
218+
219+
public function getOptScoreMinRestricted(): float
220+
{
221+
return $this->optscore_min_restricted;
222+
}
223+
224+
public function setOptScoreMinPublic(float $optscoreMinPublic): ScoreCache
225+
{
226+
$this->optscore_min_public = $optscoreMinPublic;
227+
return $this;
228+
}
229+
230+
public function getOptScoreMinPublic(): float
231+
{
232+
return $this->optscore_min_public;
233+
}
166234

167235
public function setSubmissionsPublic(int $submissionsPublic): ScoreCache
168236
{

webapp/src/Service/ScoreboardService.php

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,10 @@ public function calculateScoreRow(
328328
$correctPubl = false;
329329
$runtimeJury = PHP_INT_MAX;
330330
$runtimePubl = PHP_INT_MAX;
331+
$optmaxJury = null;
332+
$optmaxPubl = null;
333+
$optminJury = null;
334+
$optminPubl = null;
331335

332336
foreach ($submissions as $submission) {
333337
/** @var Judging|ExternalJudgement|null $judging */
@@ -352,6 +356,27 @@ public function calculateScoreRow(
352356
}
353357
}
354358

359+
if ($judging !== null && $judging->getResult() == Judging::RESULT_CORRECT) {
360+
$opt = $judging->getSumOptScore();
361+
if ($opt !== null) {
362+
// Max and Min
363+
if ($optmaxJury === null || $opt > $optmaxJury) {
364+
$optmaxJury = $opt;
365+
}
366+
if ($optminJury === null || $opt < $optminJury) {
367+
$optminJury = $opt;
368+
}
369+
if (!$submission->isAfterFreeze()) {
370+
if ($optmaxPubl === null || $opt > $optmaxPubl) {
371+
$optmaxPubl = $opt;
372+
}
373+
if ($optminPubl === null || $opt < $optminPubl) {
374+
$optminPubl = $opt;
375+
}
376+
}
377+
}
378+
}
379+
355380
// If there is a public and correct submission, we can stop counting
356381
// submissions or looking for a correct one (skip steps 2,3)
357382
if ($correctPubl) {
@@ -483,13 +508,19 @@ public function calculateScoreRow(
483508
'runtimePublic' => $runtimePubl === PHP_INT_MAX ? 0 : $runtimePubl,
484509
'isCorrectPublic' => (int)$correctPubl,
485510
'isFirstToSolve' => (int)$firstToSolve,
511+
'optScoreMaxRestricted' => $optmaxJury,
512+
'optScoreMaxPublic' => $optmaxPubl,
513+
'optScoreMinRestricted' => $optminJury,
514+
'optScoreMinPublic' => $optminPubl,
486515
];
487516
$this->em->getConnection()->executeQuery('REPLACE INTO scorecache
488517
(cid, teamid, probid,
489518
submissions_restricted, pending_restricted, solvetime_restricted, runtime_restricted, is_correct_restricted,
490-
submissions_public, pending_public, solvetime_public, runtime_public, is_correct_public, is_first_to_solve)
519+
submissions_public, pending_public, solvetime_public, runtime_public, is_correct_public, is_first_to_solve,
520+
optscore_max_restricted, optscore_max_public, optscore_min_restricted, optscore_min_public)
491521
VALUES (:cid, :teamid, :probid, :submissionsRestricted, :pendingRestricted, :solvetimeRestricted, :runtimeRestricted, :isCorrectRestricted,
492-
:submissionsPublic, :pendingPublic, :solvetimePublic, :runtimePublic, :isCorrectPublic, :isFirstToSolve)', $params);
522+
:submissionsPublic, :pendingPublic, :solvetimePublic, :runtimePublic, :isCorrectPublic, :isFirstToSolve,
523+
:optScoreMaxRestricted, :optScoreMaxPublic, :optScoreMinRestricted, :optScoreMinPublic)', $params);
493524

494525
if ($this->em->getConnection()->fetchOne('SELECT RELEASE_LOCK(:lock)',
495526
['lock' => $lockString]) != 1) {

0 commit comments

Comments
 (0)