Skip to content

Commit

Permalink
Compute big cube BLD means. Addresses #3721. (#4105)
Browse files Browse the repository at this point in the history
  • Loading branch information
lgarron committed May 1, 2019
1 parent 22bd32c commit c2abb66
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 25 deletions.
2 changes: 1 addition & 1 deletion WcaOnRails/app/views/admin/compute_auxiliary_data.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<div>
<h4>This script:</h4>
<ul class="list-group">
<li class="list-group-item">Calculates means for 3x3x3 BLD</li>
<li class="list-group-item">Calculates means for 333bf/444bf/555bf</li>
<li class="list-group-item">Computes some auxiliary tables in the database (ConciseSingleResults, ConciseAverageResults, RanksSingle and RanksAverage).</li>
<li class="list-group-item">Clears some cache files (living on the PHP side)</li>
</ul>
Expand Down
16 changes: 10 additions & 6 deletions WcaOnRails/lib/auxiliary_data_computation.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,31 @@

module AuxiliaryDataComputation
def self.compute_everything
self.compute_best_of_3_in_333bf
self.compute_mean_for_bo3_as_mo3_events
self.compute_concise_results
self.compute_rank_tables

self.delete_php_cache # Note: this should go away together with the PHP code.
end

## Compute mean for 'best of 3' results in 333bf.
def self.compute_best_of_3_in_333bf
## Compute mean for 'best of 3' results in 333bf/444bf/555bf.
def self.compute_mean_for_bo3_as_mo3_events
# Set new DNF average where any of three solves is not completed.
Result.where(eventId: "333bf", formatId: "3", average: 0)
Result.where(eventId: ["333bf", "444bf", "555bf"], formatId: "3", average: 0)
.where("LEAST(value1, value2, value3) < 0")
.where.not(value1: 0, value2: 0, value3: 0)
.update_all(average: -1)
# Set new averages (round times > 10:00).
Result.where(eventId: "333bf", formatId: "3", average: 0)
Result.where(eventId: ["333bf", "444bf", "555bf"], formatId: "3", average: 0)
.where("LEAST(value1, value2, value3) > 0")
.update_all <<-SQL
average = IF(
(value1 + value2 + value3)/3.0 > 60000,
(value1 + value2 + value3)/3.0 - MOD((value1 + value2 + value3)/3.0, 100),
-- In order to round according to Regulation 9f2, we do the
-- following equivalent procedure:
-- - Add 50 centiseconds to the average
-- - Truncate centiseconds from the resulting average.
(value1 + value2 + value3)/3.0 + 50 - MOD((value1 + value2 + value3)/3.0 + 50, 100),
(value1 + value2 + value3)/3.0
)
SQL
Expand Down
53 changes: 37 additions & 16 deletions WcaOnRails/spec/lib/auxiliary_data_computation_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
require 'auxiliary_data_computation'

RSpec.describe "AuxiliaryDataComputation" do
describe ".compute_best_of_3_in_333bf" do
def create_new_333bld_result(attributes = {})
describe ".compute_mean_for_bo3_as_mo3_events" do
def create_new_result(attributes = {})
FactoryBot.build(:result, {
eventId: "333bf", formatId: "3", roundTypeId: "c",
value1: 3000, value2: 3000, value3: 3000, best: 3000,
Expand All @@ -16,32 +16,53 @@ def create_new_333bld_result(attributes = {})
end
end

it "leaves average as skipped if one of three solves is skipped" do
with_skipped_solve = create_new_333bld_result value3: SolveTime::SKIPPED_VALUE
AuxiliaryDataComputation.compute_best_of_3_in_333bf
it "leaves average for 333bf as skipped if one of three solves is skipped" do
with_skipped_solve = create_new_result value3: SolveTime::SKIPPED_VALUE
AuxiliaryDataComputation.compute_mean_for_bo3_as_mo3_events
expect(with_skipped_solve.reload.average).to eq SolveTime::SKIPPED_VALUE
end

it "sets DNF average if one of three solves is either DNF or DNS" do
with_dnf = create_new_333bld_result value3: SolveTime::DNF_VALUE
with_dns = create_new_333bld_result value3: SolveTime::DNS_VALUE
AuxiliaryDataComputation.compute_best_of_3_in_333bf
it "sets DNF average for 333bf if one of three solves is either DNF or DNS" do
with_dnf = create_new_result value3: SolveTime::DNF_VALUE
with_dns = create_new_result value3: SolveTime::DNS_VALUE
AuxiliaryDataComputation.compute_mean_for_bo3_as_mo3_events
expect(with_dnf.reload.average).to eq SolveTime::DNF_VALUE
expect(with_dns.reload.average).to eq SolveTime::DNF_VALUE
end

it "sets a valid average if all three solves are completed" do
with_completed_solves = create_new_333bld_result
AuxiliaryDataComputation.compute_best_of_3_in_333bf
it "sets a valid average for 333bf if all three solves are completed" do
with_completed_solves = create_new_result
AuxiliaryDataComputation.compute_mean_for_bo3_as_mo3_events
expect(with_completed_solves.reload.average).to eq 3000
end

it "rounds averages over 10 minutes to down to full seconds" do
over10 = (10.minutes + 10.5.seconds) * 100 # In centiseconds.
with_completed_solves = create_new_333bld_result value1: over10, value2: over10, value3: over10
AuxiliaryDataComputation.compute_best_of_3_in_333bf
# https://www.worldcubeassociation.org/regulations/#9f2
it "rounds averages for 333bf over 10 minutes down to nearest second for x.49" do
over10 = (10.minutes + 10.49.seconds) * 100 # In centiseconds.
with_completed_solves = create_new_result value1: over10, value2: over10, value3: over10
AuxiliaryDataComputation.compute_mean_for_bo3_as_mo3_events
expect(with_completed_solves.reload.average).to eq((10.minutes + 10.seconds) * 100)
end

# https://www.worldcubeassociation.org/regulations/#9f2
it "rounds averages for 333bf over 10 minutes up to nearest second for x.50" do
over10 = (10.minutes + 10.50.seconds) * 100 # In centiseconds.
with_completed_solves = create_new_result value1: over10, value2: over10, value3: over10
AuxiliaryDataComputation.compute_mean_for_bo3_as_mo3_events
expect(with_completed_solves.reload.average).to eq((10.minutes + 11.seconds) * 100)
end

it "sets a valid average for 444bf if all three solves are completed" do
with_completed_solves = create_new_result eventId: "444bf"
AuxiliaryDataComputation.compute_mean_for_bo3_as_mo3_events
expect(with_completed_solves.reload.average).to eq 3000
end

it "sets a valid average for 555bf if all three solves are completed" do
with_completed_solves = create_new_result eventId: "555bf"
AuxiliaryDataComputation.compute_mean_for_bo3_as_mo3_events
expect(with_completed_solves.reload.average).to eq 3000
end
end

describe ".compute_concise_results", clean_db_with_truncation: true do
Expand Down
2 changes: 1 addition & 1 deletion webroot/results/admin/check_results.php
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ function showCompetitionResults ( $competitionId, $eventId, $roundTypeId ) {
$eventHtml = eventLink( $eventId, $eventName );
$caption = spaced( array( $eventHtml, $roundName, $formatName ));
tableCaptionNew( false, $anchors, $caption );
$bo3_as_mo3 = ($formatId=='3' && ($eventId=='333bf' || $eventId=='333fm' || $eventId=='333ft'));
$bo3_as_mo3 = ($formatId=='3' && ($eventId=='333bf' || $eventId=='444bf' || $eventId=='444bf' || $eventId=='333fm' || $eventId=='333ft'));
$headerAverage = ($formatId == 'a' || $formatId == 'm' || $bo3_as_mo3) ? 'Average' : '';
$headerAllResults = ($formatId != '1') ? 'Result Details' : '';
tableHeader( explode( '|', "Place|Person|Best||$headerAverage||Citizen of|$headerAllResults" ),
Expand Down
2 changes: 1 addition & 1 deletion webroot/results/includes/_check.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ function checkResult ( $result, &$countryIdSet, &$competitionIdSet, &$eventIdSet
$average = 0;
$format = $result['formatId'];
$event = $result['eventId'];
$bo3_as_mo3 = ($format=='3' && ($event=='333bf' || $event=='333fm' || $event=='333ft'));
$bo3_as_mo3 = ($format=='3' && ($event=='333bf' || $event=='444bf' || $event=='555bf' || $event=='333fm' || $event=='333ft'));
$scaler = ($event=='333fm') ? 100 : 1;
if( $format == 'm' || $bo3_as_mo3)
$average = ($zer > 2) ? 0 : (($suc < 3) ? -1 : round(($v[1] + $v[2] + $v[3]) * $scaler / 3));
Expand Down

0 comments on commit c2abb66

Please sign in to comment.