Much stricter coding standards for phpstan, phpstan and psalm.

This commit is contained in:
2025-04-15 08:14:08 +00:00
parent 3c617e9869
commit b38a9656eb
63 changed files with 137 additions and 134 deletions

View File

@ -14,7 +14,7 @@ use DNW\Skills\Team;
/** /**
* Basic Benchmarks. * Basic Benchmarks.
*/ */
class BasicBench final class BasicBench
{ {
/** /**
* To benchmark performance when using TwoPlayerTrueSkillCalculator * To benchmark performance when using TwoPlayerTrueSkillCalculator

53
composer.lock generated
View File

@ -1249,26 +1249,29 @@
}, },
{ {
"name": "doctrine/deprecations", "name": "doctrine/deprecations",
"version": "1.1.4", "version": "1.1.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/doctrine/deprecations.git", "url": "https://github.com/doctrine/deprecations.git",
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"php": "^7.1 || ^8.0" "php": "^7.1 || ^8.0"
}, },
"conflict": {
"phpunit/phpunit": "<=7.5 || >=13"
},
"require-dev": { "require-dev": {
"doctrine/coding-standard": "^9 || ^12", "doctrine/coding-standard": "^9 || ^12 || ^13",
"phpstan/phpstan": "1.4.10 || 2.0.3", "phpstan/phpstan": "1.4.10 || 2.1.11",
"phpstan/phpstan-phpunit": "^1.0 || ^2", "phpstan/phpstan-phpunit": "^1.0 || ^2",
"phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12",
"psr/log": "^1 || ^2 || ^3" "psr/log": "^1 || ^2 || ^3"
}, },
"suggest": { "suggest": {
@ -1288,9 +1291,9 @@
"homepage": "https://www.doctrine-project.org/", "homepage": "https://www.doctrine-project.org/",
"support": { "support": {
"issues": "https://github.com/doctrine/deprecations/issues", "issues": "https://github.com/doctrine/deprecations/issues",
"source": "https://github.com/doctrine/deprecations/tree/1.1.4" "source": "https://github.com/doctrine/deprecations/tree/1.1.5"
}, },
"time": "2024-12-07T21:18:45+00:00" "time": "2025-04-07T20:06:18+00:00"
}, },
{ {
"name": "felixfbecker/language-server-protocol", "name": "felixfbecker/language-server-protocol",
@ -2117,16 +2120,16 @@
}, },
{ {
"name": "phpdocumentor/reflection-docblock", "name": "phpdocumentor/reflection-docblock",
"version": "5.6.1", "version": "5.6.2",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
"reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8" "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62",
"reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2175,9 +2178,9 @@
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": { "support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
"source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1" "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2"
}, },
"time": "2024-12-07T09:39:29+00:00" "time": "2025-04-13T19:20:35+00:00"
}, },
{ {
"name": "phpdocumentor/type-resolver", "name": "phpdocumentor/type-resolver",
@ -2744,16 +2747,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "11.5.15", "version": "11.5.17",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c" "reference": "fd2e863a2995cdfd864fb514b5e0b28b09895b5c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fd2e863a2995cdfd864fb514b5e0b28b09895b5c",
"reference": "4b6a4ee654e5e0c5e1f17e2f83c0f4c91dee1f9c", "reference": "fd2e863a2995cdfd864fb514b5e0b28b09895b5c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -2825,7 +2828,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.15" "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.17"
}, },
"funding": [ "funding": [
{ {
@ -2841,7 +2844,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2025-03-23T16:02:11+00:00" "time": "2025-04-08T07:59:11+00:00"
}, },
{ {
"name": "psalm/plugin-phpunit", "name": "psalm/plugin-phpunit",
@ -5137,12 +5140,12 @@
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/vimeo/psalm.git", "url": "https://github.com/vimeo/psalm.git",
"reference": "1288d7a06a0c142cfdeabee8e597aa38a3fe4661" "reference": "c65b0f026cd7c5d26587d4a939f3a35be49bd267"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/vimeo/psalm/zipball/1288d7a06a0c142cfdeabee8e597aa38a3fe4661", "url": "https://api.github.com/repos/vimeo/psalm/zipball/c65b0f026cd7c5d26587d4a939f3a35be49bd267",
"reference": "1288d7a06a0c142cfdeabee8e597aa38a3fe4661", "reference": "c65b0f026cd7c5d26587d4a939f3a35be49bd267",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5247,7 +5250,7 @@
"issues": "https://github.com/vimeo/psalm/issues", "issues": "https://github.com/vimeo/psalm/issues",
"source": "https://github.com/vimeo/psalm" "source": "https://github.com/vimeo/psalm"
}, },
"time": "2025-03-31T10:16:55+00:00" "time": "2025-04-09T09:51:06+00:00"
}, },
{ {
"name": "webmozart/assert", "name": "webmozart/assert",

View File

@ -7,7 +7,7 @@ namespace DNW\Skills\FactorGraphs;
/** /**
* Helper class for computing the factor graph's normalization constant. * Helper class for computing the factor graph's normalization constant.
*/ */
class FactorList final class FactorList
{ {
/** /**
* @var Factor[] $list * @var Factor[] $list
@ -31,11 +31,11 @@ class FactorList
$numberOfMessages = $factor->getNumberOfMessages(); $numberOfMessages = $factor->getNumberOfMessages();
for ($j = 0; $j < $numberOfMessages; ++$j) { for ($j = 0; $j < $numberOfMessages; ++$j) {
$sumLogZ += $factor->sendMessageIndex($j); $sumLogZ += (float)$factor->sendMessageIndex($j);
} }
} }
$sumLogS = 0; $sumLogS = 0.0;
foreach ($list as &$currentFactor) { foreach ($list as &$currentFactor) {
$sumLogS += $currentFactor->getLogNormalization(); $sumLogS += $currentFactor->getLogNormalization();

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
namespace DNW\Skills\FactorGraphs; namespace DNW\Skills\FactorGraphs;
class KeyedVariable extends Variable final class KeyedVariable extends Variable
{ {
public function __construct(private readonly mixed $key, mixed $prior) public function __construct(private readonly mixed $key, mixed $prior)
{ {

View File

@ -6,7 +6,7 @@ namespace DNW\Skills\FactorGraphs;
use DNW\Skills\Numerics\GaussianDistribution; use DNW\Skills\Numerics\GaussianDistribution;
class Message final class Message
{ {
public function __construct(private GaussianDistribution $value) public function __construct(private GaussianDistribution $value)
{ {

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
namespace DNW\Skills\FactorGraphs; namespace DNW\Skills\FactorGraphs;
class ScheduleLoop extends Schedule final class ScheduleLoop extends Schedule
{ {
public function __construct(private readonly Schedule $scheduleToLoop, private readonly float $maxDelta) public function __construct(private readonly Schedule $scheduleToLoop, private readonly float $maxDelta)
{ {

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
namespace DNW\Skills\FactorGraphs; namespace DNW\Skills\FactorGraphs;
class ScheduleSequence extends Schedule final class ScheduleSequence extends Schedule
{ {
/** /**
* @param Schedule[] $schedules * @param Schedule[] $schedules

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
namespace DNW\Skills\FactorGraphs; namespace DNW\Skills\FactorGraphs;
class ScheduleStep extends Schedule final class ScheduleStep extends Schedule
{ {
public function __construct(private readonly Factor $factor, private readonly int $index) public function __construct(private readonly Factor $factor, private readonly int $index)
{ {

View File

@ -4,9 +4,9 @@ declare(strict_types=1);
namespace DNW\Skills\FactorGraphs; namespace DNW\Skills\FactorGraphs;
class VariableFactory final readonly class VariableFactory
{ {
public function __construct(private readonly \Closure $varPriorInitializer) public function __construct(private \Closure $varPriorInitializer)
{ {
} }

View File

@ -7,7 +7,7 @@ namespace DNW\Skills;
/** /**
* Parameters about the game for calculating the TrueSkill. * Parameters about the game for calculating the TrueSkill.
*/ */
class GameInfo final readonly class GameInfo
{ {
/** /**
* Default initial mean / 6 * Default initial mean / 6
@ -26,11 +26,11 @@ class GameInfo
private const float DEFAULT_INITIAL_STANDARD_DEVIATION = 8.3333333333333333333333333333333; private const float DEFAULT_INITIAL_STANDARD_DEVIATION = 8.3333333333333333333333333333333;
public function __construct( public function __construct(
private readonly float $initialMean = self::DEFAULT_INITIAL_MEAN, private float $initialMean = self::DEFAULT_INITIAL_MEAN,
private readonly float $initialStdDev = self::DEFAULT_INITIAL_STANDARD_DEVIATION, private float $initialStdDev = self::DEFAULT_INITIAL_STANDARD_DEVIATION,
private readonly float $beta = self::DEFAULT_BETA, private float $beta = self::DEFAULT_BETA,
private readonly float $dynamicsFactor = self::DEFAULT_DYNAMICS_FACTOR, private float $dynamicsFactor = self::DEFAULT_DYNAMICS_FACTOR,
private readonly float $drawProbability = self::DEFAULT_DRAW_PROBABILITY private float $drawProbability = self::DEFAULT_DRAW_PROBABILITY
) )
{ {
} }

View File

@ -11,7 +11,7 @@ use Exception;
* *
* @see http://www.moserware.com/2008/01/borrowing-ideas-from-3-interesting.html * @see http://www.moserware.com/2008/01/borrowing-ideas-from-3-interesting.html
*/ */
class Guard final class Guard
{ {
public static function argumentIsValidIndex(int $index, int $count, string $parameterName): void public static function argumentIsValidIndex(int $index, int $count, string $parameterName): void
{ {
@ -23,7 +23,7 @@ class Guard
public static function argumentInRangeInclusive(float $value, float $min, float $max, string $parameterName): void public static function argumentInRangeInclusive(float $value, float $min, float $max, string $parameterName): void
{ {
if (($value < $min) || ($value > $max)) { if (($value < $min) || ($value > $max)) {
throw new Exception($parameterName . ' is not in the valid range [' . $min . ', ' . $max . ']'); throw new Exception($parameterName . ' is not in the valid range [' . (int)$min . ', ' . (int)$max . ']');
} }
} }
} }

View File

@ -7,7 +7,7 @@ namespace DNW\Skills;
/** /**
* Basic hashmap that supports object keys. * Basic hashmap that supports object keys.
*/ */
class HashMap final class HashMap
{ {
/** /**
* @var mixed[] $hashToValue * @var mixed[] $hashToValue

View File

@ -10,7 +10,7 @@ namespace DNW\Skills\Numerics;
* @author Jeff Moser <jeff@moserware.com> * @author Jeff Moser <jeff@moserware.com>
* @copyright 2010 Jeff Moser * @copyright 2010 Jeff Moser
*/ */
class BasicMath final class BasicMath
{ {
/** /**
* Squares the input (input^2 = input * input) * Squares the input (input^2 = input * input)

View File

@ -10,7 +10,7 @@ namespace DNW\Skills\Numerics;
* @author Jeff Moser <jeff@moserware.com> * @author Jeff Moser <jeff@moserware.com>
* @copyright 2010 Jeff Moser * @copyright 2010 Jeff Moser
*/ */
class GaussianDistribution final class GaussianDistribution
{ {
private const float DEFAULT_STANDARD_DEVIATION = 1.0; private const float DEFAULT_STANDARD_DEVIATION = 1.0;
@ -171,7 +171,7 @@ class GaussianDistribution
$meanDifference = $numerator->mean - $denominator->mean; $meanDifference = $numerator->mean - $denominator->mean;
return log($denominator->variance) + self::M_LOG_SQRT_2_PI - log($varianceDifference) / 2.0 + return log($denominator->variance) + self::M_LOG_SQRT_2_PI - log($varianceDifference) / 2.0 +
BasicMath::square($meanDifference) / (2 * $varianceDifference); BasicMath::square($meanDifference) / (2.0 * $varianceDifference);
} }
public static function at(float $var, float $mean = 0.0, float $standardDeviation = 1.0): float public static function at(float $var, float $mean = 0.0, float $standardDeviation = 1.0): float
@ -182,7 +182,7 @@ class GaussianDistribution
// stdDev * sqrt(2*pi) // stdDev * sqrt(2*pi)
$multiplier = 1.0 / ($standardDeviation * self::M_SQRT_2_PI); $multiplier = 1.0 / ($standardDeviation * self::M_SQRT_2_PI);
$expPart = exp((-1.0 * BasicMath::square($var - $mean)) / (2 * BasicMath::square($standardDeviation))); $expPart = exp((-1.0 * BasicMath::square($var - $mean)) / (2.0 * BasicMath::square($standardDeviation)));
return $multiplier * $expPart; return $multiplier * $expPart;
} }
@ -200,7 +200,7 @@ class GaussianDistribution
$z = abs($var); $z = abs($var);
$t = 2.0 / (2.0 + $z); $t = 2.0 / (2.0 + $z);
$ty = 4 * $t - 2; $ty = 4.0 * $t - 2.0;
$coefficients = [ $coefficients = [
-1.3026537197817094, -1.3026537197817094,
@ -259,8 +259,8 @@ class GaussianDistribution
return 100; return 100;
} }
$pp = ($p < 1.0) ? $p : 2 - $p; $pp = ($p < 1.0) ? $p : 2.0 - $p;
$t = sqrt(-2 * log($pp / 2.0)); // Initial guess $t = sqrt(-2.0 * log($pp / 2.0)); // Initial guess
$x = -M_SQRT1_2 * ((2.30753 + $t * 0.27061) / (1.0 + $t * (0.99229 + $t * 0.04481)) - $t); $x = -M_SQRT1_2 * ((2.30753 + $t * 0.27061) / (1.0 + $t * (0.99229 + $t * 0.04481)) - $t);
for ($j = 0; $j < 2; ++$j) { for ($j = 0; $j < 2; ++$j) {
@ -274,6 +274,6 @@ class GaussianDistribution
public static function inverseCumulativeTo(float $var, float $mean = 0.0, float $standardDeviation = 1.0): float public static function inverseCumulativeTo(float $var, float $mean = 0.0, float $standardDeviation = 1.0): float
{ {
// From numerical recipes, page 320 // From numerical recipes, page 320
return $mean - M_SQRT2 * $standardDeviation * GaussianDistribution::inverseErrorFunctionCumulativeTo(2 * $var); return $mean - M_SQRT2 * $standardDeviation * GaussianDistribution::inverseErrorFunctionCumulativeTo(2.0 * $var);
} }
} }

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
namespace DNW\Skills\Numerics; namespace DNW\Skills\Numerics;
class IdentityMatrix extends DiagonalMatrix final class IdentityMatrix extends DiagonalMatrix
{ {
public function __construct(int $rows) public function __construct(int $rows)
{ {

View File

@ -130,10 +130,10 @@ class Matrix
// | a b | // | a b |
// | c d | // | c d |
// The determinant is ad - bc // The determinant is ad - bc
$a = $this->getValue(0, 0); $a = (float)$this->getValue(0, 0);
$b = $this->getValue(0, 1); $b = (float)$this->getValue(0, 1);
$c = $this->getValue(1, 0); $c = (float)$this->getValue(1, 0);
$d = $this->getValue(1, 1); $d = (float)$this->getValue(1, 1);
return $a * $d - $b * $c; return $a * $d - $b * $c;
} }
@ -148,7 +148,7 @@ class Matrix
// I expand along the first row // I expand along the first row
for ($currentColumn = 0; $currentColumn < $this->columnCount; ++$currentColumn) { for ($currentColumn = 0; $currentColumn < $this->columnCount; ++$currentColumn) {
$firstRowColValue = $this->getValue(0, $currentColumn); $firstRowColValue = (float)$this->getValue(0, $currentColumn);
$cofactor = $this->getCofactor(0, $currentColumn); $cofactor = $this->getCofactor(0, $currentColumn);
$itemToAdd = $firstRowColValue * $cofactor; $itemToAdd = $firstRowColValue * $cofactor;
$result += $itemToAdd; $result += $itemToAdd;
@ -201,7 +201,7 @@ class Matrix
public function getInverse(): Matrix|SquareMatrix public function getInverse(): Matrix|SquareMatrix
{ {
if (($this->rowCount == 1) && ($this->columnCount == 1)) { if (($this->rowCount == 1) && ($this->columnCount == 1)) {
return new SquareMatrix(1.0 / $this->getValue(0, 0)); return new SquareMatrix(1.0 / (float)$this->getValue(0, 0));
} }
// Take the simple approach: // Take the simple approach:
@ -240,9 +240,9 @@ class Matrix
for ($currentRow = 0; $currentRow < $left->getRowCount(); ++$currentRow) { for ($currentRow = 0; $currentRow < $left->getRowCount(); ++$currentRow) {
for ($currentColumn = 0; $currentColumn < $right->getColumnCount(); ++$currentColumn) { for ($currentColumn = 0; $currentColumn < $right->getColumnCount(); ++$currentColumn) {
$resultMatrix[$currentRow][$currentColumn] = $resultMatrix[$currentRow][$currentColumn] =
$left->getValue($currentRow, $currentColumn) (float)$left->getValue($currentRow, $currentColumn)
+ +
$right->getValue($currentRow, $currentColumn); (float)$right->getValue($currentRow, $currentColumn);
} }
} }
@ -268,8 +268,8 @@ class Matrix
$productValue = 0; $productValue = 0;
for ($vectorIndex = 0; $vectorIndex < $left->getColumnCount(); ++$vectorIndex) { for ($vectorIndex = 0; $vectorIndex < $left->getColumnCount(); ++$vectorIndex) {
$leftValue = $left->getValue($currentRow, $vectorIndex); $leftValue = (float)$left->getValue($currentRow, $vectorIndex);
$rightValue = $right->getValue($vectorIndex, $currentColumn); $rightValue = (float)$right->getValue($vectorIndex, $currentColumn);
$vectorIndexProduct = $leftValue * $rightValue; $vectorIndexProduct = $leftValue * $rightValue;
$productValue += $vectorIndexProduct; $productValue += $vectorIndexProduct;
} }
@ -339,8 +339,8 @@ class Matrix
for ($currentColumn = 0; $currentColumn < $this->columnCount; ++$currentColumn) { for ($currentColumn = 0; $currentColumn < $this->columnCount; ++$currentColumn) {
$delta = $delta =
abs( abs(
$this->getValue($currentRow, $currentColumn) - (float)$this->getValue($currentRow, $currentColumn) -
$otherMatrix->getValue($currentRow, $currentColumn) (float)$otherMatrix->getValue($currentRow, $currentColumn)
); );
if ($delta > self::ERROR_TOLERANCE) { if ($delta > self::ERROR_TOLERANCE) {

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
namespace DNW\Skills\Numerics; namespace DNW\Skills\Numerics;
class SquareMatrix extends Matrix final class SquareMatrix extends Matrix
{ {
public function __construct(float|int ...$allValues) public function __construct(float|int ...$allValues)
{ {

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
namespace DNW\Skills\Numerics; namespace DNW\Skills\Numerics;
class Vector extends Matrix final class Vector extends Matrix
{ {
/** /**
* @param float[] $vectorValues * @param float[] $vectorValues

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
namespace DNW\Skills; namespace DNW\Skills;
class PartialPlay final class PartialPlay
{ {
public static function getPartialPlayPercentage(Player $player): float public static function getPartialPlayPercentage(Player $player): float
{ {

View File

@ -7,15 +7,15 @@ namespace DNW\Skills;
/** /**
* Represents a player who has a Rating. * Represents a player who has a Rating.
*/ */
class Player implements ISupportPartialPlay, ISupportPartialUpdate final readonly class Player implements ISupportPartialPlay, ISupportPartialUpdate
{ {
private const float DEFAULT_PARTIAL_PLAY_PERCENTAGE = 1.0; // = 100% play time private const float DEFAULT_PARTIAL_PLAY_PERCENTAGE = 1.0; // = 100% play time
private const float DEFAULT_PARTIAL_UPDATE_PERCENTAGE = 1.0; private const float DEFAULT_PARTIAL_UPDATE_PERCENTAGE = 1.0;
private readonly float $PartialPlayPct; private float $PartialPlayPct;
private readonly float $PartialUpdatePct; private float $PartialUpdatePct;
/** /**
* Constructs a player. * Constructs a player.
@ -25,7 +25,7 @@ class Player implements ISupportPartialPlay, ISupportPartialUpdate
* @param float $partialUpdatePct Indicated how much of a skill update a player should receive where 0 represents no update and 1.0 represents 100% of the update. * @param float $partialUpdatePct Indicated how much of a skill update a player should receive where 0 represents no update and 1.0 represents 100% of the update.
*/ */
public function __construct( public function __construct(
private readonly mixed $Id, private mixed $Id,
float $partialPlayPct = self::DEFAULT_PARTIAL_PLAY_PERCENTAGE, float $partialPlayPct = self::DEFAULT_PARTIAL_PLAY_PERCENTAGE,
float $partialUpdatePct = self::DEFAULT_PARTIAL_UPDATE_PERCENTAGE float $partialUpdatePct = self::DEFAULT_PARTIAL_UPDATE_PERCENTAGE
) )

View File

@ -6,6 +6,6 @@ namespace DNW\Skills;
use DNW\Skills\Numerics\Range; use DNW\Skills\Numerics\Range;
class PlayersRange extends Range final class PlayersRange extends Range
{ {
} }

View File

@ -7,7 +7,7 @@ namespace DNW\Skills;
/** /**
* Helper class to sort ranks in non-decreasing order. * Helper class to sort ranks in non-decreasing order.
*/ */
class RankSorter final class RankSorter
{ {
/** /**
* Performs an in-place sort of the items in according to the ranks in non-decreasing order. * Performs an in-place sort of the items in according to the ranks in non-decreasing order.

View File

@ -9,7 +9,7 @@ use DNW\Skills\Numerics\GaussianDistribution;
/** /**
* Container for a player's rating. * Container for a player's rating.
*/ */
class Rating final readonly class Rating
{ {
private const float CONSERVATIVE_STANDARD_DEVIATION_MULTIPLIER = 3; private const float CONSERVATIVE_STANDARD_DEVIATION_MULTIPLIER = 3;
@ -18,9 +18,9 @@ class Rating
* *
* @param float $mean The statistical mean value of the rating (also known as mu). * @param float $mean The statistical mean value of the rating (also known as mu).
* @param float $standardDeviation The standard deviation of the rating (also known as s). * @param float $standardDeviation The standard deviation of the rating (also known as s).
* @param float|int $conservativeStandardDeviationMultiplier optional The number of standardDeviations to subtract from the mean to achieve a conservative rating. * @param float $conservativeStandardDeviationMultiplier optional The number of standardDeviations to subtract from the mean to achieve a conservative rating.
*/ */
public function __construct(private readonly float $mean, private readonly float $standardDeviation, private readonly float|int $conservativeStandardDeviationMultiplier = self::CONSERVATIVE_STANDARD_DEVIATION_MULTIPLIER) public function __construct(private float $mean, private float $standardDeviation, private float $conservativeStandardDeviationMultiplier = self::CONSERVATIVE_STANDARD_DEVIATION_MULTIPLIER)
{ {
} }

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
namespace DNW\Skills; namespace DNW\Skills;
class Team extends RatingContainer final class Team extends RatingContainer
{ {
public function __construct(?Player $player = NULL, ?Rating $rating = NULL) public function __construct(?Player $player = NULL, ?Rating $rating = NULL)
{ {

View File

@ -6,6 +6,6 @@ namespace DNW\Skills;
use DNW\Skills\Numerics\Range; use DNW\Skills\Numerics\Range;
class TeamsRange extends Range final class TeamsRange extends Range
{ {
} }

View File

@ -18,6 +18,6 @@ final class DrawMargin
// //
// margin = inversecdf((draw probability + 1)/2) * sqrt(n1+n2) * beta // margin = inversecdf((draw probability + 1)/2) * sqrt(n1+n2) * beta
// n1 and n2 are the number of players on each team // n1 and n2 are the number of players on each team
return GaussianDistribution::inverseCumulativeTo(.5 * ($drawProbability + 1), 0, 1) * M_SQRT2 * $beta; return GaussianDistribution::inverseCumulativeTo(0.5 * ($drawProbability + 1.0), 0.0, 1.0) * M_SQRT2 * $beta;
} }
} }

View File

@ -22,7 +22,7 @@ use DNW\Skills\Rating;
/** /**
* Calculates TrueSkill using a full factor graph. * Calculates TrueSkill using a full factor graph.
*/ */
class FactorGraphTrueSkillCalculator extends SkillCalculator final class FactorGraphTrueSkillCalculator extends SkillCalculator
{ {
public function __construct() public function __construct()
{ {

View File

@ -14,7 +14,7 @@ use DNW\Skills\TrueSkill\TruncatedGaussianCorrectionFunctions;
* *
* See the accompanying math paper for more details. * See the accompanying math paper for more details.
*/ */
class GaussianGreaterThanFactor extends GaussianFactor final class GaussianGreaterThanFactor extends GaussianFactor
{ {
public function __construct(private readonly float $epsilon, Variable $variable) public function __construct(private readonly float $epsilon, Variable $variable)
{ {

View File

@ -15,7 +15,7 @@ use Exception;
* *
* See the accompanying math paper for more details. * See the accompanying math paper for more details.
*/ */
class GaussianLikelihoodFactor extends GaussianFactor final class GaussianLikelihoodFactor extends GaussianFactor
{ {
private readonly float $precision; private readonly float $precision;

View File

@ -13,7 +13,7 @@ use DNW\Skills\Numerics\GaussianDistribution;
* *
* See the accompanying math paper for more details. * See the accompanying math paper for more details.
*/ */
class GaussianPriorFactor extends GaussianFactor final class GaussianPriorFactor extends GaussianFactor
{ {
private readonly GaussianDistribution $newMessage; private readonly GaussianDistribution $newMessage;

View File

@ -16,7 +16,7 @@ use DNW\Skills\Numerics\GaussianDistribution;
* *
* See the accompanying math paper for more details. * See the accompanying math paper for more details.
*/ */
class GaussianWeightedSumFactor extends GaussianFactor final class GaussianWeightedSumFactor extends GaussianFactor
{ {
/** /**
* @var array<int[]> $varIndexOrdersForWeights * @var array<int[]> $varIndexOrdersForWeights

View File

@ -14,7 +14,7 @@ use DNW\Skills\TrueSkill\TruncatedGaussianCorrectionFunctions;
* *
* See the accompanying math paper for more details. * See the accompanying math paper for more details.
*/ */
class GaussianWithinFactor extends GaussianFactor final class GaussianWithinFactor extends GaussianFactor
{ {
public function __construct(private readonly float $epsilon, Variable $variable) public function __construct(private readonly float $epsilon, Variable $variable)
{ {

View File

@ -11,7 +11,7 @@ use DNW\Skills\TrueSkill\TrueSkillFactorGraph;
use Exception; use Exception;
// The whole purpose of this is to do a loop on the bottom // The whole purpose of this is to do a loop on the bottom
class IteratedTeamDifferencesInnerLayer extends TrueSkillFactorGraphLayer final class IteratedTeamDifferencesInnerLayer extends TrueSkillFactorGraphLayer
{ {
public function __construct( public function __construct(
TrueSkillFactorGraph $parentGraph, TrueSkillFactorGraph $parentGraph,

View File

@ -11,7 +11,7 @@ use DNW\Skills\TrueSkill\Factors\GaussianWeightedSumFactor;
use DNW\Skills\FactorGraphs\Variable; use DNW\Skills\FactorGraphs\Variable;
use DNW\Skills\FactorGraphs\KeyedVariable; use DNW\Skills\FactorGraphs\KeyedVariable;
class PlayerPerformancesToTeamPerformancesLayer extends TrueSkillFactorGraphLayer final class PlayerPerformancesToTeamPerformancesLayer extends TrueSkillFactorGraphLayer
{ {
#[\Override] #[\Override]
public function buildLayer(): void public function buildLayer(): void
@ -51,7 +51,7 @@ class PlayerPerformancesToTeamPerformancesLayer extends TrueSkillFactorGraphLaye
/** /**
* @param KeyedVariable[] $teamMembers * @param KeyedVariable[] $teamMembers
*/ */
protected function createPlayerToTeamSumFactor(array $teamMembers, Variable $sumVariable): GaussianWeightedSumFactor private function createPlayerToTeamSumFactor(array $teamMembers, Variable $sumVariable): GaussianWeightedSumFactor
{ {
$weights = array_map( $weights = array_map(
static function ($v): float { static function ($v): float {

View File

@ -17,7 +17,7 @@ use DNW\Skills\FactorGraphs\ScheduleSequence;
// We intentionally have no Posterior schedule since the only purpose here is to // We intentionally have no Posterior schedule since the only purpose here is to
// start the process. // start the process.
class PlayerPriorValuesToSkillsLayer extends TrueSkillFactorGraphLayer final class PlayerPriorValuesToSkillsLayer extends TrueSkillFactorGraphLayer
{ {
/** /**
* @param Team[] $teams * @param Team[] $teams

View File

@ -11,7 +11,7 @@ use DNW\Skills\Numerics\BasicMath;
use DNW\Skills\TrueSkill\Factors\GaussianLikelihoodFactor; use DNW\Skills\TrueSkill\Factors\GaussianLikelihoodFactor;
use DNW\Skills\FactorGraphs\ScheduleSequence; use DNW\Skills\FactorGraphs\ScheduleSequence;
class PlayerSkillsToPerformancesLayer extends TrueSkillFactorGraphLayer final class PlayerSkillsToPerformancesLayer extends TrueSkillFactorGraphLayer
{ {
#[\Override] #[\Override]
public function buildLayer(): void public function buildLayer(): void

View File

@ -9,7 +9,7 @@ use DNW\Skills\TrueSkill\Factors\GaussianGreaterThanFactor;
use DNW\Skills\TrueSkill\Factors\GaussianWithinFactor; use DNW\Skills\TrueSkill\Factors\GaussianWithinFactor;
use DNW\Skills\TrueSkill\TrueSkillFactorGraph; use DNW\Skills\TrueSkill\TrueSkillFactorGraph;
class TeamDifferencesComparisonLayer extends TrueSkillFactorGraphLayer final class TeamDifferencesComparisonLayer extends TrueSkillFactorGraphLayer
{ {
private readonly float $epsilon; private readonly float $epsilon;

View File

@ -7,7 +7,7 @@ namespace DNW\Skills\TrueSkill\Layers;
use DNW\Skills\FactorGraphs\Variable; use DNW\Skills\FactorGraphs\Variable;
use DNW\Skills\TrueSkill\Factors\GaussianWeightedSumFactor; use DNW\Skills\TrueSkill\Factors\GaussianWeightedSumFactor;
class TeamPerformancesToTeamPerformanceDifferencesLayer extends TrueSkillFactorGraphLayer final class TeamPerformancesToTeamPerformanceDifferencesLayer extends TrueSkillFactorGraphLayer
{ {
#[\Override] #[\Override]
public function buildLayer(): void public function buildLayer(): void

View File

@ -23,7 +23,7 @@ use DNW\Skills\TrueSkill\Layers\PlayerSkillsToPerformancesLayer;
use DNW\Skills\TrueSkill\Layers\TeamDifferencesComparisonLayer; use DNW\Skills\TrueSkill\Layers\TeamDifferencesComparisonLayer;
use DNW\Skills\TrueSkill\Layers\TeamPerformancesToTeamPerformanceDifferencesLayer; use DNW\Skills\TrueSkill\Layers\TeamPerformancesToTeamPerformanceDifferencesLayer;
class TrueSkillFactorGraph extends FactorGraph final class TrueSkillFactorGraph extends FactorGraph
{ {
/** /**
* @var FactorGraphLayer[] $layers * @var FactorGraphLayer[] $layers

View File

@ -6,7 +6,7 @@ namespace DNW\Skills\TrueSkill;
use DNW\Skills\Numerics\GaussianDistribution; use DNW\Skills\Numerics\GaussianDistribution;
class TruncatedGaussianCorrectionFunctions final class TruncatedGaussianCorrectionFunctions
{ {
// These functions from the bottom of page 4 of the TrueSkill paper. // These functions from the bottom of page 4 of the TrueSkill paper.

View File

@ -21,7 +21,7 @@ use DNW\Skills\TeamsRange;
* When you only have two players, a lot of the math simplifies. The main purpose of this class * When you only have two players, a lot of the math simplifies. The main purpose of this class
* is to show the bare minimum of what a TrueSkill implementation should have. * is to show the bare minimum of what a TrueSkill implementation should have.
*/ */
class TwoPlayerTrueSkillCalculator extends SkillCalculator final class TwoPlayerTrueSkillCalculator extends SkillCalculator
{ {
public function __construct() public function __construct()
{ {
@ -95,7 +95,7 @@ class TwoPlayerTrueSkillCalculator extends SkillCalculator
+ +
BasicMath::square($opponentRating->getStandardDeviation()) BasicMath::square($opponentRating->getStandardDeviation())
+ +
2 * BasicMath::square($gameInfo->getBeta()) 2.0 * BasicMath::square($gameInfo->getBeta())
); );
$winningMean = $selfRating->getMean(); $winningMean = $selfRating->getMean();
@ -131,7 +131,7 @@ class TwoPlayerTrueSkillCalculator extends SkillCalculator
$stdDevMultiplier = $varianceWithDynamics / BasicMath::square($c); $stdDevMultiplier = $varianceWithDynamics / BasicMath::square($c);
$newMean = $selfRating->getMean() + ($rankMultiplier * $meanMultiplier * $v); $newMean = $selfRating->getMean() + ($rankMultiplier * $meanMultiplier * $v);
$newStdDev = sqrt($varianceWithDynamics * (1 - $w * $stdDevMultiplier)); $newStdDev = sqrt($varianceWithDynamics * (1.0 - $w * $stdDevMultiplier));
return new Rating($newMean, $newStdDev); return new Rating($newMean, $newStdDev);
} }
@ -160,16 +160,16 @@ class TwoPlayerTrueSkillCalculator extends SkillCalculator
// This is the square root part of the equation: // This is the square root part of the equation:
$sqrtPart = sqrt( $sqrtPart = sqrt(
(2 * $betaSquared) (2.0 * $betaSquared)
/ /
(2 * $betaSquared + $player1SigmaSquared + $player2SigmaSquared) (2.0 * $betaSquared + $player1SigmaSquared + $player2SigmaSquared)
); );
// This is the exponent part of the equation: // This is the exponent part of the equation:
$expPart = exp( $expPart = exp(
(-1 * BasicMath::square($player1Rating->getMean() - $player2Rating->getMean())) (-1.0 * BasicMath::square($player1Rating->getMean() - $player2Rating->getMean()))
/ /
(2 * (2 * $betaSquared + $player1SigmaSquared + $player2SigmaSquared)) (2.0 * (2.0 * $betaSquared + $player1SigmaSquared + $player2SigmaSquared))
); );
return $sqrtPart * $expPart; return $sqrtPart * $expPart;

View File

@ -21,7 +21,7 @@ use DNW\Skills\TeamsRange;
* *
* When you only have two teams, the math is still simple: no factor graphs are used yet. * When you only have two teams, the math is still simple: no factor graphs are used yet.
*/ */
class TwoTeamTrueSkillCalculator extends SkillCalculator final class TwoTeamTrueSkillCalculator extends SkillCalculator
{ {
public function __construct() public function __construct()
{ {
@ -122,7 +122,7 @@ class TwoTeamTrueSkillCalculator extends SkillCalculator
// assume draw // assume draw
$v = TruncatedGaussianCorrectionFunctions::vWithinMarginScaled($meanDelta, $drawMargin, $c); $v = TruncatedGaussianCorrectionFunctions::vWithinMarginScaled($meanDelta, $drawMargin, $c);
$w = TruncatedGaussianCorrectionFunctions::wWithinMarginScaled($meanDelta, $drawMargin, $c); $w = TruncatedGaussianCorrectionFunctions::wWithinMarginScaled($meanDelta, $drawMargin, $c);
$rankMultiplier = 1; $rankMultiplier = 1.0;
} }
$selfTeamAllPlayers = $selfTeam->getAllPlayers(); $selfTeamAllPlayers = $selfTeam->getAllPlayers();
@ -137,7 +137,7 @@ class TwoTeamTrueSkillCalculator extends SkillCalculator
$newMean = $previousPlayerRating->getMean() + $playerMeanDelta; $newMean = $previousPlayerRating->getMean() + $playerMeanDelta;
$newStdDev = sqrt( $newStdDev = sqrt(
(BasicMath::square($previousPlayerRating->getStandardDeviation()) + $tauSquared) * (1 - $w * $stdDevMultiplier) (BasicMath::square($previousPlayerRating->getStandardDeviation()) + $tauSquared) * (1.0 - $w * $stdDevMultiplier)
); );
$newPlayerRatings->setRating($localSelfTeamCurPlayer, new Rating($newMean, $newStdDev)); $newPlayerRatings->setRating($localSelfTeamCurPlayer, new Rating($newMean, $newStdDev));
@ -184,9 +184,9 @@ class TwoTeamTrueSkillCalculator extends SkillCalculator
); );
$expPart = exp( $expPart = exp(
(-1 * BasicMath::square($team1MeanSum - $team2MeanSum)) (-1.0 * BasicMath::square($team1MeanSum - $team2MeanSum))
/ /
(2 * ($totalPlayers * $betaSquared + $team1StdDevSquared + $team2StdDevSquared)) (2.0 * ($totalPlayers * $betaSquared + $team1StdDevSquared + $team2StdDevSquared))
); );
return $expPart * $sqrtPart; return $expPart * $sqrtPart;

View File

@ -12,7 +12,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[CoversClass(Variable::class)] #[CoversClass(Variable::class)]
#[UsesClass(GaussianDistribution::class)] #[UsesClass(GaussianDistribution::class)]
class VariableTest extends TestCase final class VariableTest extends TestCase
{ {
public function testGetterSetter(): void public function testGetterSetter(): void
{ {

View File

@ -12,7 +12,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[CoversClass(GameInfo::class)] #[CoversClass(GameInfo::class)]
#[UsesClass(Rating::class)] #[UsesClass(Rating::class)]
class GameInfoTest extends TestCase final class GameInfoTest extends TestCase
{ {
public function testMembers(): void public function testMembers(): void
{ {

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\CoversClass;
#[CoversClass(Guard::class)] #[CoversClass(Guard::class)]
class GuardTest extends TestCase final class GuardTest extends TestCase
{ {
public function testargumentIsValidIndexArgumentAbove(): void public function testargumentIsValidIndexArgumentAbove(): void
{ {

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\Attributes\CoversClass;
use stdClass; use stdClass;
#[CoversClass(HashMap::class)] #[CoversClass(HashMap::class)]
class HashMapTest extends TestCase final class HashMapTest extends TestCase
{ {
public function testHashmap(): void public function testHashmap(): void
{ {

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\CoversClass;
#[CoversClass(BasicMath::class)] #[CoversClass(BasicMath::class)]
class BasicMathTest extends TestCase final class BasicMathTest extends TestCase
{ {
public function testSquare(): void public function testSquare(): void
{ {
@ -23,7 +23,7 @@ class BasicMathTest extends TestCase
$arr = [1, 1, 1, 1]; $arr = [1, 1, 1, 1];
$func_return = static fn(float $f): float => $f; $func_return = static fn(float $f): float => $f;
$func_double = static fn(float $f): float => $f * 2; $func_double = static fn(float $f): float => $f * 2.0;
$this->assertEquals(4, BasicMath::sum($arr, $func_return)); $this->assertEquals(4, BasicMath::sum($arr, $func_return));
$this->assertEquals(8, BasicMath::sum($arr, $func_double)); $this->assertEquals(8, BasicMath::sum($arr, $func_double));
} }

View File

@ -12,7 +12,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[CoversClass(GaussianDistribution::class)] #[CoversClass(GaussianDistribution::class)]
#[UsesClass(BasicMath::class)] #[UsesClass(BasicMath::class)]
class GaussianDistributionTest extends TestCase final class GaussianDistributionTest extends TestCase
{ {
private const float ERROR_TOLERANCE = 0.000001; private const float ERROR_TOLERANCE = 0.000001;
@ -24,7 +24,7 @@ class GaussianDistributionTest extends TestCase
$this->assertEquals(9, $gd->getVariance()); $this->assertEquals(9, $gd->getVariance());
$this->assertEquals(3, $gd->getStandardDeviation()); $this->assertEquals(3, $gd->getStandardDeviation());
$this->assertEquals(1 / 9, $gd->getPrecision()); $this->assertEquals(1 / 9, $gd->getPrecision());
$this->assertEquals(1 / 9 * 10, $gd->getPrecisionMean()); $this->assertEquals(1.0 / 9.0 * 10.0, $gd->getPrecisionMean());
$this->assertEqualsWithDelta(0.13298076013, $gd->getNormalizationConstant(), GaussianDistributionTest::ERROR_TOLERANCE); $this->assertEqualsWithDelta(0.13298076013, $gd->getNormalizationConstant(), GaussianDistributionTest::ERROR_TOLERANCE);
} }
@ -57,7 +57,7 @@ class GaussianDistributionTest extends TestCase
$product2 = GaussianDistribution::multiply($m4s5, $m6s7); $product2 = GaussianDistribution::multiply($m4s5, $m6s7);
$expectedMean = (4 * BasicMath::square(7) + 6 * BasicMath::square(5)) / (BasicMath::square(5) + BasicMath::square(7)); $expectedMean = (4.0 * BasicMath::square(7) + 6.0 * BasicMath::square(5)) / (BasicMath::square(5) + BasicMath::square(7));
$this->assertEqualsWithDelta($expectedMean, $product2->getMean(), GaussianDistributionTest::ERROR_TOLERANCE); $this->assertEqualsWithDelta($expectedMean, $product2->getMean(), GaussianDistributionTest::ERROR_TOLERANCE);
$expectedSigma = sqrt(((BasicMath::square(5) * BasicMath::square(7)) / (BasicMath::square(5) + BasicMath::square(7)))); $expectedSigma = sqrt(((BasicMath::square(5) * BasicMath::square(7)) / (BasicMath::square(5) + BasicMath::square(7))));
@ -74,7 +74,7 @@ class GaussianDistributionTest extends TestCase
$this->assertEqualsWithDelta(2.0, $productDividedByStandardNormal->getMean(), GaussianDistributionTest::ERROR_TOLERANCE); $this->assertEqualsWithDelta(2.0, $productDividedByStandardNormal->getMean(), GaussianDistributionTest::ERROR_TOLERANCE);
$this->assertEqualsWithDelta(3.0, $productDividedByStandardNormal->getStandardDeviation(), 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))))); $product2 = new GaussianDistribution((4.0 * BasicMath::square(7) + 6.0 * 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); $m4s5 = new GaussianDistribution(4, 5);
$product2DividedByM4S5 = GaussianDistribution::divide($product2, $m4s5); $product2DividedByM4S5 = GaussianDistribution::divide($product2, $m4s5);
$this->assertEqualsWithDelta(6.0, $product2DividedByM4S5->getMean(), GaussianDistributionTest::ERROR_TOLERANCE); $this->assertEqualsWithDelta(6.0, $product2DividedByM4S5->getMean(), GaussianDistributionTest::ERROR_TOLERANCE);

View File

@ -20,7 +20,7 @@ use Exception;
#[CoversClass(DiagonalMatrix::class)] #[CoversClass(DiagonalMatrix::class)]
#[CoversClass(Vector::class)] #[CoversClass(Vector::class)]
// phpcs:disable PSR2.Methods.FunctionCallSignature,Generic.Functions.FunctionCallArgumentSpacing.TooMuchSpaceAfterComma // phpcs:disable PSR2.Methods.FunctionCallSignature,Generic.Functions.FunctionCallArgumentSpacing.TooMuchSpaceAfterComma
class MatrixTest extends TestCase final class MatrixTest extends TestCase
{ {
public function testEmptyMatrix(): void public function testEmptyMatrix(): void
{ {
@ -295,7 +295,7 @@ class MatrixTest extends TestCase
1, 0, 6); 1, 0, 6);
$cInverse = $c->getInverse(); $cInverse = $c->getInverse();
$d = Matrix::scalarMultiply((1.0 / 22), new SquareMatrix(24, -12, -2, $d = Matrix::scalarMultiply((1.0 / 22.0), new SquareMatrix(24, -12, -2,
5, 3, -5, 5, 3, -5,
-4, 2, 4)); -4, 2, 4));

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\Attributes\CoversClass;
use Exception; use Exception;
#[CoversClass(Range::class)] #[CoversClass(Range::class)]
class RangeTest extends TestCase final class RangeTest extends TestCase
{ {
public function testConstructInvalidParam(): void public function testConstructInvalidParam(): void
{ {

View File

@ -14,7 +14,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[CoversClass(PartialPlay::class)] #[CoversClass(PartialPlay::class)]
#[UsesClass(Player::class)] #[UsesClass(Player::class)]
#[UsesClass(Guard::class)] #[UsesClass(Guard::class)]
class PartialPlayTest extends TestCase final class PartialPlayTest extends TestCase
{ {
public function testgetPartialPlayPercentage(): void public function testgetPartialPlayPercentage(): void
{ {

View File

@ -12,7 +12,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[CoversClass(Player::class)] #[CoversClass(Player::class)]
#[UsesClass(Guard::class)] #[UsesClass(Guard::class)]
class PlayerTest extends TestCase final class PlayerTest extends TestCase
{ {
public function testPlayerObjectGetterSetter(): void public function testPlayerObjectGetterSetter(): void
{ {

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
use PHPUnit\Framework\Attributes\CoversClass; use PHPUnit\Framework\Attributes\CoversClass;
#[CoversClass(RankSorter::class)] #[CoversClass(RankSorter::class)]
class RankSorterTest extends TestCase final class RankSorterTest extends TestCase
{ {
public function testSort(): void public function testSort(): void
{ {

View File

@ -18,7 +18,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[UsesClass(Player::class)] #[UsesClass(Player::class)]
#[UsesClass(Rating::class)] #[UsesClass(Rating::class)]
#[UsesClass(Guard::class)] #[UsesClass(Guard::class)]
class RatingContainerTest extends TestCase final class RatingContainerTest extends TestCase
{ {
public function testRatingContainer(): void public function testRatingContainer(): void
{ {

View File

@ -14,7 +14,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[CoversClass(Rating::class)] #[CoversClass(Rating::class)]
#[UsesClass(BasicMath::class)] #[UsesClass(BasicMath::class)]
#[UsesClass(GaussianDistribution::class)] #[UsesClass(GaussianDistribution::class)]
class RatingTest extends TestCase final class RatingTest extends TestCase
{ {
public function testGetRatingParameters(): void public function testGetRatingParameters(): void
{ {

View File

@ -17,7 +17,7 @@ use PHPUnit\Framework\Attributes\RequiresPhpunit;
#[UsesClass(PlayersRange::class)] #[UsesClass(PlayersRange::class)]
#[UsesClass(TeamsRange::class)] #[UsesClass(TeamsRange::class)]
#[RequiresPhpunit('<12.0')] #[RequiresPhpunit('<12.0')]
class SkillCalculatorTest extends TestCase final class SkillCalculatorTest extends TestCase
{ {
public function testisSupported(): void public function testisSupported(): void
{ {

View File

@ -20,7 +20,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[UsesClass(Player::class)] #[UsesClass(Player::class)]
#[UsesClass(Rating::class)] #[UsesClass(Rating::class)]
#[UsesClass(Guard::class)] #[UsesClass(Guard::class)]
class TeamTest extends TestCase final class TeamTest extends TestCase
{ {
public function testTeam(): void public function testTeam(): void
{ {

View File

@ -14,7 +14,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[CoversClass(DrawMargin::class)] #[CoversClass(DrawMargin::class)]
#[UsesClass(BasicMath::class)] #[UsesClass(BasicMath::class)]
#[UsesClass(GaussianDistribution::class)] #[UsesClass(GaussianDistribution::class)]
class DrawMarginTest extends TestCase final class DrawMarginTest extends TestCase
{ {
private const float ERROR_TOLERANCE = 0.000001; private const float ERROR_TOLERANCE = 0.000001;

View File

@ -19,7 +19,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[UsesClass(\DNW\Skills\PlayersRange::class)] #[UsesClass(\DNW\Skills\PlayersRange::class)]
#[UsesClass(\DNW\Skills\SkillCalculator::class)] #[UsesClass(\DNW\Skills\SkillCalculator::class)]
#[UsesClass(\DNW\Skills\TeamsRange::class)] #[UsesClass(\DNW\Skills\TeamsRange::class)]
class FactorGraphTrueSkillCalculatorTest extends TestCase final class FactorGraphTrueSkillCalculatorTest extends TestCase
{ {
#[CoversNothing] #[CoversNothing]
public function testMicrosoftResearchExample(): void public function testMicrosoftResearchExample(): void

View File

@ -11,7 +11,7 @@ use DNW\Skills\SkillCalculator;
use DNW\Skills\Team; use DNW\Skills\Team;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
class TrueSkillCalculatorTests final class TrueSkillCalculatorTests
{ {
private const float ERROR_TOLERANCE_TRUESKILL = 0.085; private const float ERROR_TOLERANCE_TRUESKILL = 0.085;

View File

@ -14,7 +14,7 @@ use PHPUnit\Framework\Attributes\UsesClass;
#[CoversClass(TruncatedGaussianCorrectionFunctions::class)] #[CoversClass(TruncatedGaussianCorrectionFunctions::class)]
#[UsesClass(BasicMath::class)] #[UsesClass(BasicMath::class)]
#[UsesClass(GaussianDistribution::class)] #[UsesClass(GaussianDistribution::class)]
class TruncatedGaussianCorrectionFunctionsTest extends TestCase final class TruncatedGaussianCorrectionFunctionsTest extends TestCase
{ {
public function testvGreaterThan(): void public function testvGreaterThan(): void
{ {

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\Attributes\CoversNothing;
#[CoversClass(TwoPlayerTrueSkillCalculator::class)] #[CoversClass(TwoPlayerTrueSkillCalculator::class)]
class TwoPlayerTrueSkillCalculatorTest extends TestCase final class TwoPlayerTrueSkillCalculatorTest extends TestCase
{ {
#[CoversNothing] #[CoversNothing]
public function testTwoPlayerTrueSkillCalculator(): void public function testTwoPlayerTrueSkillCalculator(): void

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\Attributes\CoversClass;
use PHPUnit\Framework\Attributes\CoversNothing; use PHPUnit\Framework\Attributes\CoversNothing;
#[CoversClass(TwoTeamTrueSkillCalculator::class)] #[CoversClass(TwoTeamTrueSkillCalculator::class)]
class TwoTeamTrueSkillCalculatorTest extends TestCase final class TwoTeamTrueSkillCalculatorTest extends TestCase
{ {
#[CoversNothing] #[CoversNothing]
public function testTwoTeamTrueSkillCalculator(): void public function testTwoTeamTrueSkillCalculator(): void