More code standards

This commit is contained in:
Jens True 2024-02-02 14:53:38 +00:00
parent 968c78d989
commit 3dddfc05db
46 changed files with 156 additions and 55 deletions

@ -15,6 +15,8 @@ use DNW\Skills\Teams;
class BasicBench
{
/**
* To benchmark performance when using TwoPlayerTrueSkillCalculator
*
* @Revs(20)
* @Iterations(20)
*/
@ -44,6 +46,8 @@ class BasicBench
}
/**
* To benchmark performance when using TwoTeamTrueSkillCalculator for just two players in two teams
*
* @Revs(20)
* @Iterations(20)
*/
@ -73,6 +77,8 @@ class BasicBench
}
/**
* To benchmark performance when using FactorGraphTrueSkillCalculator for just two players in two teams
*
* @Revs(20)
* @Iterations(20)
*/
@ -102,6 +108,8 @@ class BasicBench
}
/**
* To benchmark performance when using FactorGraphTrueSkillCalculator with 3 players in 3 teams
*
* @Revs(20)
* @Iterations(20)
*/

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\FactorGraphs;
use DNW\Skills\Guard;
@ -94,6 +96,7 @@ abstract class Factor implements \Stringable
/**
* Sends the ith message to the marginal and returns the log-normalization constant
*
* @throws Exception
*/
public function sendMessageIndex(int $messageIndex): float|int

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\FactorGraphs;
use DNW\Skills\FactorGraphs\ScheduleSequence;
@ -42,6 +44,7 @@ abstract class FactorGraphLayer
/**
* This reference is still needed
*
* @return array<int,array<int,object>>
*/
public function &getOutputVariablesGroups(): array
@ -82,11 +85,11 @@ abstract class FactorGraphLayer
public function createPriorSchedule(): ?ScheduleSequence
{
return null;
return NULL;
}
public function createPosteriorSchedule(): ?ScheduleSequence
{
return null;
return NULL;
}
}

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\FactorGraphs;
/**

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\FactorGraphs;
class ScheduleLoop extends Schedule

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\FactorGraphs;
class ScheduleSequence extends Schedule

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\FactorGraphs;
class ScheduleStep extends Schedule

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\FactorGraphs;
use DNW\Skills\Numerics\GaussianDistribution;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\FactorGraphs;
class VariableFactory

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills;
/**
@ -23,7 +25,8 @@ class GameInfo
private float $beta = self::DEFAULT_BETA,
private float $dynamicsFactor = self::DEFAULT_DYNAMICS_FACTOR,
private float $drawProbability = self::DEFAULT_DRAW_PROBABILITY
) {
)
{
}
public function getInitialMean(): float

@ -13,7 +13,7 @@ class Guard
{
public static function argumentNotNull(mixed $value, string $parameterName): void
{
if ($value == null) {
if ($value == NULL) {
throw new Exception($parameterName . ' can not be null');
}
}

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\Numerics;
class DiagonalMatrix extends Matrix

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\Numerics;
use Exception;
@ -11,7 +13,7 @@ class Matrix
/**
* @param array<int,array<int,float>> $matrixRowData
*/
public function __construct(private int $rowCount = 0, private int $columnCount = 0, private array $matrixRowData = array())
public function __construct(private int $rowCount = 0, private int $columnCount = 0, private array $matrixRowData = [])
{
}
@ -307,7 +309,7 @@ class Matrix
public function equals(Matrix $otherMatrix): bool
{
if (($this->rowCount != $otherMatrix->getRowCount()) || ($this->columnCount != $otherMatrix->getColumnCount())) {
return false;
return FALSE;
}
for ($currentRow = 0; $currentRow < $this->rowCount; $currentRow++) {
@ -319,11 +321,11 @@ class Matrix
);
if ($delta > self::ERROR_TOLERANCE) {
return false;
return FALSE;
}
}
}
return true;
return TRUE;
}
}

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills;
/**
@ -10,8 +12,9 @@ class RankSorter
/**
* Performs an in-place sort of the items in according to the ranks in non-decreasing order.
*
* @param array<mixed> $teams The items to sort according to the order specified by ranks.
* @param array<int> $teamRanks The ranks for each item where 1 is first place.
* @param array<mixed> $teams The items to sort according to the order specified by ranks.
* @param array<int> $teamRanks The ranks for each item where 1 is first place.
*
* @return array<int>
*/
public static function sort(array &$teams, array &$teamRanks): array

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills;
use Exception;
@ -13,15 +15,17 @@ abstract class SkillCalculator
private int $supportedOptions,
private readonly TeamsRange $totalTeamsAllowed,
private readonly PlayersRange $playersPerTeamAllowed
) {
)
{
}
/**
* Calculates new ratings based on the prior ratings and team ranks.
*
* @param GameInfo $gameInfo Parameters for the game.
* @param Team[] $teams A mapping of team players and their ratings.
* @param int[] $teamRanks The ranks of the teams where 1 is first place. For a tie, repeat the number (e.g. 1, 2, 2).
* @param GameInfo $gameInfo Parameters for the game.
* @param Team[] $teams A mapping of team players and their ratings.
* @param int[] $teamRanks The ranks of the teams where 1 is first place. For a tie, repeat the number (e.g. 1, 2, 2).
*
* @return RatingContainer All the players and their new ratings.
*/
abstract public function calculateNewRatings(
@ -35,6 +39,7 @@ abstract class SkillCalculator
*
* @param GameInfo $gameInfo Parameters for the game.
* @param Team[] $teams A mapping of team players and their ratings.
*
* @return float The quality of the match between the teams as a percentage (0% = bad, 100% = well matched).
*/
abstract public function calculateMatchQuality(GameInfo $gameInfo, array $teams): float;

@ -4,7 +4,7 @@ namespace DNW\Skills;
class Team extends RatingContainer
{
public function __construct(Player $player = null, Rating $rating = null)
public function __construct(Player $player = NULL, Rating $rating = NULL)
{
parent::__construct();

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills;
class Teams

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills;
use DNW\Skills\Numerics\Range;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill;
use DNW\Skills\Numerics\GaussianDistribution;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill\Factors;
use DNW\Skills\FactorGraphs\Message;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill\Layers;
use DNW\Skills\FactorGraphs\ScheduleLoop;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill\Layers;
use DNW\Skills\FactorGraphs\ScheduleStep;
@ -87,7 +89,7 @@ class PlayerPerformancesToTeamPerformancesLayer extends TrueSkillFactorGraphLaye
*/
private function createOutputVariable(array $team): Variable
{
$memberNames = array_map(fn ($currentPlayer) => (string) ($currentPlayer->getKey()), $team);
$memberNames = array_map(fn ($currentPlayer) => (string)($currentPlayer->getKey()), $team);
$teamMemberNames = \implode(', ', $memberNames);

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill\Layers;
use DNW\Skills\FactorGraphs\ScheduleStep;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill\Layers;
use DNW\Skills\FactorGraphs\KeyedVariable;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill\Layers;
use DNW\Skills\TrueSkill\DrawMargin;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill\Layers;
use DNW\Skills\FactorGraphs\Variable;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill;
use DNW\Skills\FactorGraphs\FactorGraph;
@ -60,11 +62,11 @@ class TrueSkillFactorGraph extends FactorGraph
public function buildGraph(): void
{
$lastOutput = null;
$lastOutput = NULL;
$layers = $this->layers;
foreach ($layers as $currentLayer) {
if ($lastOutput != null) {
if ($lastOutput != NULL) {
$currentLayer->setInputVariablesGroups($lastOutput);
}
@ -105,7 +107,7 @@ class TrueSkillFactorGraph extends FactorGraph
$layers = $this->layers;
foreach ($layers as $currentLayer) {
$currentPriorSchedule = $currentLayer->createPriorSchedule();
if ($currentPriorSchedule != null) {
if ($currentPriorSchedule != NULL) {
$fullSchedule[] = $currentPriorSchedule;
}
}
@ -114,7 +116,7 @@ class TrueSkillFactorGraph extends FactorGraph
foreach ($allLayersReverse as $currentLayer) {
$currentPosteriorSchedule = $currentLayer->createPosteriorSchedule();
if ($currentPosteriorSchedule != null) {
if ($currentPosteriorSchedule != NULL) {
$fullSchedule[] = $currentPosteriorSchedule;
}
}

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill;
use DNW\Skills\Numerics\GaussianDistribution;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill;
use DNW\Skills\GameInfo;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\TrueSkill;
use DNW\Skills\GameInfo;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\FactorGraphs;
use DNW\Skills\FactorGraphs\ScheduleStep;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\FactorGraphs;
use DNW\Skills\FactorGraphs\Variable;
@ -11,8 +13,9 @@ class VariableTest extends TestCase
public function test(): void
{
$gd_prior = new GaussianDistribution();
$var = new Variable('dummy', $gd_prior);
$var = new Variable('dummy', $gd_prior);
$this->assertEquals($gd_prior, $var->getValue());
$gd_new = new GaussianDistribution();
$this->assertEquals($gd_new, $var->getValue());
$var->resetToPrior();

@ -1,4 +1,6 @@
<?php declare(strict_types=1);
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests;
@ -12,7 +14,7 @@ class GuardTest extends TestCase
{
$this->expectException(Exception::class);
$this->expectExceptionMessage('dummy can not be null');
Guard::argumentNotNull(null, "dummy");
Guard::argumentNotNull(NULL, "dummy");
}
public function testargumentIsValidIndex(): void

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\Numerics;
use DNW\Skills\Numerics\BasicMath;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\Numerics;
use DNW\Skills\Numerics\BasicMath;
@ -39,9 +41,9 @@ class GaussianDistributionTest extends TestCase
public function testMultiplication(): void
{
// I verified this against the formula at http://www.tina-vision.net/tina-knoppix/tina-memo/2003-003.pdf
$standardNormal = new GaussianDistribution(0, 1);
$standardNormal = new GaussianDistribution(0, 1);
$shiftedGaussian = new GaussianDistribution(2, 3);
$product = GaussianDistribution::multiply($standardNormal, $shiftedGaussian);
$product = GaussianDistribution::multiply($standardNormal, $shiftedGaussian);
$this->assertEqualsWithDelta(0.2, $product->getMean(), GaussianDistributionTest::ERROR_TOLERANCE);
$this->assertEqualsWithDelta(3.0 / sqrt(10), $product->getStandardDeviation(), GaussianDistributionTest::ERROR_TOLERANCE);
@ -61,15 +63,15 @@ class GaussianDistributionTest extends TestCase
public function testDivision(): void
{
// Since the multiplication was worked out by hand, we use the same numbers but work backwards
$product = new GaussianDistribution(0.2, 3.0 / sqrt(10));
$product = new GaussianDistribution(0.2, 3.0 / sqrt(10));
$standardNormal = new GaussianDistribution(0, 1);
$productDividedByStandardNormal = GaussianDistribution::divide($product, $standardNormal);
$this->assertEqualsWithDelta(2.0, $productDividedByStandardNormal->getMean(), GaussianDistributionTest::ERROR_TOLERANCE);
$this->assertEqualsWithDelta(3.0, $productDividedByStandardNormal->getStandardDeviation(), GaussianDistributionTest::ERROR_TOLERANCE);
$product2 = new GaussianDistribution((4 * BasicMath::square(7) + 6 * BasicMath::square(5)) / (BasicMath::square(5) + BasicMath::square(7)), sqrt(((BasicMath::square(5) * BasicMath::square(7)) / (BasicMath::square(5) + BasicMath::square(7)))));
$m4s5 = new GaussianDistribution(4, 5);
$product2 = new GaussianDistribution((4 * BasicMath::square(7) + 6 * BasicMath::square(5)) / (BasicMath::square(5) + BasicMath::square(7)), sqrt(((BasicMath::square(5) * BasicMath::square(7)) / (BasicMath::square(5) + BasicMath::square(7)))));
$m4s5 = new GaussianDistribution(4, 5);
$product2DividedByM4S5 = GaussianDistribution::divide($product2, $m4s5);
$this->assertEqualsWithDelta(6.0, $product2DividedByM4S5->getMean(), GaussianDistributionTest::ERROR_TOLERANCE);
$this->assertEqualsWithDelta(7.0, $product2DividedByM4S5->getStandardDeviation(), GaussianDistributionTest::ERROR_TOLERANCE);
@ -93,7 +95,7 @@ class GaussianDistributionTest extends TestCase
// Verified with Ralf Herbrich's F# implementation
$m1s2 = new GaussianDistribution(1, 2);
$m3s4 = new GaussianDistribution(3, 4);
$lrn = GaussianDistribution::logRatioNormalization($m1s2, $m3s4);
$lrn = GaussianDistribution::logRatioNormalization($m1s2, $m3s4);
$this->assertEqualsWithDelta(2.6157405972171204, $lrn, GaussianDistributionTest::ERROR_TOLERANCE);
}
@ -101,7 +103,7 @@ class GaussianDistributionTest extends TestCase
{
// Verified with Ralf Herbrich's F# implementation
$standardNormal = new GaussianDistribution(0, 1);
$absDiff = GaussianDistribution::absoluteDifference($standardNormal, $standardNormal);
$absDiff = GaussianDistribution::absoluteDifference($standardNormal, $standardNormal);
$this->assertEqualsWithDelta(0.0, $absDiff, GaussianDistributionTest::ERROR_TOLERANCE);
$m1s2 = new GaussianDistribution(1, 2);

@ -1,4 +1,6 @@
<?php declare(strict_types=1);
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\Numerics;

@ -1,4 +1,6 @@
<?php declare(strict_types=1);
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\Numerics;

@ -1,4 +1,6 @@
<?php declare(strict_types=1);
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests;
use DNW\Skills\RankSorter;

@ -1,5 +1,7 @@
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests;
use DNW\Skills\Rating;
@ -18,11 +20,11 @@ class RatingTest extends TestCase
public function testPartialUpdate(): void
{
$rating = new Rating(100, 10, 5);
$rating_prior = new Rating(100, 10, 5);
$rating_new = new Rating(200, 10, 5);
$rating = new Rating(100, 10, 5);
$ratingOld = new Rating(100, 10, 5);
$ratingNew = new Rating(200, 10, 5);
$rating_partial = $rating ->getPartialUpdate($rating_prior, $rating_new, 0.5);
$rating_partial = $rating->getPartialUpdate($ratingOld, $ratingNew, 0.5);
$this->assertEquals(150, $rating_partial->getMean());

@ -1,4 +1,6 @@
<?php declare(strict_types=1);
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\TrueSkill;

@ -1,4 +1,6 @@
<?php declare(strict_types=1);
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\TrueSkill;
@ -21,6 +23,6 @@ class FactorGraphTeamTrueSkillCalculatorTest extends TestCase
public function testMethodisSupported(): void
{
$calculator = new FactorGraphTrueSkillCalculator();
$this->assertEquals(true, $calculator->isSupported(SkillCalculatorSupportedOptions::PARTIAL_PLAY));
$this->assertEquals(TRUE, $calculator->isSupported(SkillCalculatorSupportedOptions::PARTIAL_PLAY));
}
}

@ -1,4 +1,6 @@
<?php declare(strict_types=1);
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\TrueSkill;
@ -25,7 +27,7 @@ class FactorGraphTrueSkillCalculatorTest extends TestCase
new Player("hillary"),
];
$teams = array();
$teams = [];
foreach ($players as $player) {
$teams[] = new Team($player, $gameInfo->getDefaultRating());
}

@ -1,4 +1,6 @@
<?php declare(strict_types=1);
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\TrueSkill;
@ -78,8 +80,8 @@ class TrueSkillCalculatorTests
private static function twoPlayerTestNotDrawn(TestCase $testClass, SkillCalculator $calculator): void
{
$player1 = new Player(1);
$player2 = new Player(2);
$player1 = new Player(1);
$player2 = new Player(2);
$gameInfo = new GameInfo();
$team1 = new Team($player1, $gameInfo->getDefaultRating());
@ -108,6 +110,7 @@ class TrueSkillCalculatorTests
$team2 = new Team($player2, $gameInfo->getDefaultRating());
$teams = Teams::concat($team1, $team2);
$newRatings = $calculator->calculateNewRatings($gameInfo, $teams, [1, 1]);
$player1NewRating = $newRatings->getRating($player1);
@ -122,8 +125,8 @@ class TrueSkillCalculatorTests
private static function twoPlayerChessTestNotDrawn(TestCase $testClass, SkillCalculator $calculator): void
{
// Inspired by a real bug :-)
$player1 = new Player(1);
$player2 = new Player(2);
$player1 = new Player(1);
$player2 = new Player(2);
$gameInfo = new GameInfo(1200.0, 1200.0 / 3.0, 200.0, 1200.0 / 300.0, 0.03);
$team1 = new Team($player1, new Rating(1301.0007, 42.9232));
@ -169,11 +172,9 @@ class TrueSkillCalculatorTests
private static function oneOnTwoSimpleTest(TestCase $testClass, SkillCalculator $calculator): void
{
$player1 = new Player(1);
$player1 = new Player(1);
$gameInfo = new GameInfo();
$team1 = new Team();
$team1 = new Team();
$team1->addPlayer($player1, $gameInfo->getDefaultRating());
$player2 = new Player(2);
@ -975,7 +976,7 @@ class TrueSkillCalculatorTests
{
$gameInfo = new GameInfo();
$p1 = new Player(1);
$p1 = new Player(1);
$team1 = new Team($p1, $gameInfo->getDefaultRating());
$p2 = new Player(2, 0.0);
@ -985,7 +986,7 @@ class TrueSkillCalculatorTests
$team2->addPlayer($p2, $gameInfo->getDefaultRating());
$team2->addPlayer($p3, $gameInfo->getDefaultRating());
$teams = Teams::concat($team1, $team2);
$teams = Teams::concat($team1, $team2);
$newRatings = $calculator->calculateNewRatings($gameInfo, $teams, [1, 2]);
$p1NewRating = $newRatings->getRating($p1);

@ -1,4 +1,6 @@
<?php declare(strict_types=1);
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\TrueSkill;

@ -1,4 +1,6 @@
<?php declare(strict_types=1);
<?php
declare(strict_types=1);
namespace DNW\Skills\Tests\TrueSkill;