libpairtwo/src/Tiebreaks.php

163 lines
4.7 KiB
PHP
Raw Normal View History

2019-05-28 17:04:53 +02:00
<?php
namespace JeroenED\Libpairtwo;
2019-05-28 18:07:43 +02:00
use JeroenED\Libpairtwo\Enums\Color;
2019-05-28 17:04:53 +02:00
use JeroenED\Libpairtwo\Models\Tournament;
2019-05-28 18:07:43 +02:00
use JeroenED\Libpairtwo\Enums\Result;
2019-05-28 17:04:53 +02:00
abstract class Tiebreaks extends Tournament
{
private const Won = [ Result::won, Result::wonforfait, Result::wonbye, Result::wonadjourned ];
private const Draw = [ Result::draw, Result::drawadjourned];
private const Lost = [ Result::absent, Result::bye, Result::lost, Result::adjourned ];
2019-05-29 17:56:30 +02:00
private const NotPlayed = [ Result::bye, Result::wonbye, Result::absent ];
private const Black = [ Color::black ];
private const White = [ Color::white ];
2019-05-28 17:04:53 +02:00
/**
2019-05-28 18:07:43 +02:00
* @param Player $player
* @return float|null
2019-05-28 17:04:53 +02:00
*/
protected function calculateKeizer(Player $player): ?float
2019-05-28 17:04:53 +02:00
{
return $player->getBinaryData('ScoreAmerican');
2019-05-28 18:07:43 +02:00
}
2019-05-28 18:07:43 +02:00
/**
* @param Player $player
* @return float|null
2019-05-28 18:07:43 +02:00
*/
protected function calculateAmerican(Player $player): ?float
2019-05-28 18:07:43 +02:00
{
return $player->getBinaryData('ScoreAmerican');
2019-05-28 18:07:43 +02:00
}
/**
* @param Player $player
* @return float|null
2019-05-28 18:07:43 +02:00
*/
protected function calculatePoints(Player $player): ?float
2019-05-28 18:07:43 +02:00
{
$points = 0;
foreach ($player->getPairings() as $pairing) {
if (array_search($pairing->getResult(), self::Won) !== false) {
$points = $points + 1;
} elseif (array_search($pairing->getResult(), self::Draw) !== false) {
$points = $points + 0.5;
}
}
return $points;
2019-05-28 17:04:53 +02:00
}
2019-05-28 18:07:43 +02:00
2019-05-28 17:04:53 +02:00
/**
2019-05-28 18:07:43 +02:00
* @param Player $player
* @return float|null
2019-05-28 17:04:53 +02:00
*/
protected function calculateBaumbach(Player $player): ?float
2019-05-28 17:04:53 +02:00
{
2019-05-28 18:07:43 +02:00
$totalwins = 0;
foreach ($player->getPairings() as $pairing) {
if (array_search($pairing->getResult(), self::Won) !== false) {
2019-05-28 18:07:43 +02:00
$totalwins++;
}
2019-05-28 17:04:53 +02:00
}
return $totalwins;
2019-05-28 17:04:53 +02:00
}
2019-05-28 17:04:53 +02:00
/**
2019-05-28 18:07:43 +02:00
* @param Player $player
* @return float|null
2019-05-28 18:07:43 +02:00
*/
protected function calculateBlackPlayed(Player $player): ?float
2019-05-28 18:07:43 +02:00
{
$totalwins = 0;
foreach ($player->getPairings() as $pairing) {
if (array_search($pairing->getColor(), self::Black) !== false) {
2019-05-28 18:07:43 +02:00
$totalwins++;
}
}
return $totalwins;
2019-05-28 18:07:43 +02:00
}
2019-05-28 18:07:43 +02:00
/**
* @param Player $player
* @return float|null
2019-05-28 17:04:53 +02:00
*/
protected function calculateBlackWin(Player $player): ?float
2019-05-28 17:04:53 +02:00
{
2019-05-28 18:07:43 +02:00
$totalwins = 0;
foreach ($player->getPairings() as $pairing) {
if (array_search($pairing->getColor(), self::Black) !== false && array_search($pairing->getResult(), Self::Won) !== false) {
2019-05-28 18:07:43 +02:00
$totalwins++;
}
2019-05-28 17:04:53 +02:00
}
return $totalwins;
}
/**
* @param Player $player
* @param array $opponents
* @param int $key
* @return float|null
*/
protected function calculateMutualResult(Player $player, array $opponents, int $key): ?float
{
$interestingplayers = $opponents;
if ($key != 0) {
$interestingplayers = [];
foreach ($opponents as $opponent) {
if (($opponent->getTiebreaks()[$key - 1] == $player->getTiebreaks()[$key - 1]) && ($player != $opponent)) {
$interestingplayers[] = $opponent;
}
}
}
$points = 0;
$totalmatches = 0;
foreach ($player->getPairings() as $pairing) {
if (array_search($pairing->getOpponent(), $interestingplayers) !== false) {
if (array_search($pairing->getResult(), self::Won) !== false) {
$points = $points + 1;
} elseif (array_search($pairing->getResult(), self::Draw) !== false) {
$points = $points + 0.5;
}
$totalmatches++;
}
}
if ($totalmatches != count($interestingplayers)) {
$points = null;
}
return $points;
}
2019-05-29 17:56:30 +02:00
/**
* @param Player $player
* @return float
*/
2019-05-30 08:33:52 +02:00
protected function calculateAverageRating(Player $player, int $cut = 0)
2019-05-29 17:56:30 +02:00
{
$pairings = $player->getPairings();
$totalrating = 0;
2019-05-29 17:56:30 +02:00
$totalopponents = 0;
2019-05-30 08:33:52 +02:00
$allratings = [];
foreach ($pairings as $pairing) {
2019-05-29 17:56:30 +02:00
if (array_search($pairing->getResult(), self::NotPlayed) === false) {
$toadd = $pairing->getOpponent()->getElos()['home'];
if ($toadd != 0) {
2019-05-30 08:33:52 +02:00
$allratings[] = $toadd;
2019-05-29 17:56:30 +02:00
}
}
}
2019-05-30 08:33:52 +02:00
sort($allratings);
$allratings = array_slice($allratings, $cut);
return round(array_sum($allratings) / count($allratings));
2019-05-28 17:04:53 +02:00
}
}