trueskill/examples/motogp/goat.php

91 lines
3.3 KiB
PHP
Raw Normal View History

2024-07-04 09:38:03 +00:00
<?php
require __DIR__ . "/../../vendor/autoload.php";
use League\Csv\Reader;
use League\Csv\Statement;
use DNW\Skills\TrueSkill\FactorGraphTrueSkillCalculator;
use DNW\Skills\GameInfo;
use DNW\Skills\Player;
use DNW\Skills\Team;
use DNW\Skills\Teams;
//load the CSV document from a stream
$stream = fopen('motogp.csv', 'r');
$csv = Reader::createFromStream($stream);
$csv->setDelimiter(',');
$csv->setHeaderOffset(0);
//build a statement
2024-09-13 07:26:48 +00:00
$stmt = Statement::create()->where(static fn (array $record): bool => $record['category'] == "MotoGP" || $record['category'] == "500cc");
2024-07-04 09:38:03 +00:00
2024-09-13 07:26:48 +00:00
/**
* @var $riders Player[]
*/
2024-07-04 09:38:03 +00:00
$riders = [];
//query your records from the document
$records = $stmt->process($csv);
$gameInfo = new GameInfo();
$calculator = new FactorGraphTrueSkillCalculator();
$first_record = $records->first();
2024-09-13 07:26:48 +00:00
$year_race = $first_record['year'] . '_' . $first_record['sequence'] . '_' . $first_record['category'];
2024-07-04 09:38:03 +00:00
$race_rate = [];
2024-09-13 07:26:48 +00:00
foreach ($records as $record) {
if ($year_race !== $record['year'] . '_' . $record['sequence'] . '_' . $record['category']) {
2024-07-04 09:38:03 +00:00
//Calculate the old race
$newRatings = $calculator->calculateNewRatings($gameInfo, $teams, $pos);
//update ratings
$highest_rate = 0;
$highest_rider = "";
2024-09-13 07:26:48 +00:00
foreach ($riders as $rider) {
2024-07-04 09:38:03 +00:00
//echo $rider['P']->getId().": ". $newRatings->getRating($rider['P'])->getConservativeRating() . PHP_EOL;
$rider['T']->setRating($rider['P'], $newRatings->getRating($rider['P']));
2024-09-13 07:26:48 +00:00
if ($newRatings->getRating($rider['P'])->getConservativeRating() > $highest_rate) {
2024-07-04 09:38:03 +00:00
$highest_rate = $newRatings->getRating($rider['P'])->getConservativeRating();
$highest_rider = $rider['P']->getId();
}
}
2024-09-13 07:26:48 +00:00
echo sprintf('Highest rider: %s => %s', $highest_rider, $highest_rate) . PHP_EOL;
2024-07-04 09:38:03 +00:00
2024-09-13 07:26:48 +00:00
foreach ($global_riders as $r) {
2024-07-04 09:38:03 +00:00
$rate = $r['T']->getRating($r['P'])->getConservativeRating();
$race_rate[$year_race][$r['P']->getId()] = $rate;
2024-09-13 07:26:48 +00:00
if (! isset($top_rating[$r['P']->getId()]) || $top_rating[$r['P']->getId()] < $rate) {
2024-07-04 09:38:03 +00:00
$top_rating[$r['P']->getId()] = $rate;
}
}
//prepare for next race
2024-09-13 07:26:48 +00:00
$year_race = $record['year'] . '_' . $record['sequence'] . '_' . $record['category'];
$races[] = ['year' => $record['year'], 'race' => $record['sequence'], 'circuit' => $record['circuit_name']];
echo "New Race: " . $year_race . ' => ' . $record['circuit_name'] . PHP_EOL;
2024-07-04 09:38:03 +00:00
$riders = [];
$teams = [];
$pos = [];
}
2024-09-13 07:26:48 +00:00
//Is it a new rider?
if (! isset($global_riders[$record['rider']])) {
2024-07-04 09:38:03 +00:00
$global_riders[$record['rider']]['P'] = new Player($record['rider_name']);
$global_riders[$record['rider']]['T'] = new Team($global_riders[$record['rider']]['P'], $gameInfo->getDefaultRating());
//echo "New Rider: ". $record['rider'] . " => ".$global_riders[$record['rider']]['P']->getId().PHP_EOL;
}
$riders[] = $global_riders[$record['rider']];
$teams[] = $global_riders[$record['rider']]['T'];
//Position or DNF?
$pos[] = $record['position'] >= 1 ? $record['position'] : end($pos);
}
2024-09-13 07:26:48 +00:00
echo "All time top score" . PHP_EOL;
2024-07-04 09:38:03 +00:00
asort($top_rating);
2024-09-13 07:26:48 +00:00
foreach ($top_rating as $n => $r) {
echo sprintf('%s => %s', $n, $r) . PHP_EOL;
2024-07-04 09:38:03 +00:00
}