Upgrade to PHP 7.1 (#150)

* upgrade to PHP 7.1

* bump travis and composer to PHP 7.1

* fix tests
This commit is contained in:
Tomáš Votruba 2017-11-14 21:21:23 +01:00 committed by Arkadiusz Kondas
parent 331d4b133e
commit 653c7c772d
127 changed files with 419 additions and 420 deletions

View File

@ -4,9 +4,6 @@ matrix:
fast_finish: true
include:
- os: linux
php: '7.0'
- os: linux
php: '7.1'
@ -18,7 +15,7 @@ matrix:
language: generic
env:
- _OSX=10.11
- _PHP: php70
- _PHP: php71
before_install:
- if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then /usr/bin/env bash tools/prepare_osx_env.sh ; fi

View File

@ -17,7 +17,7 @@
}
},
"require": {
"php": ">=7.0.0"
"php": "^7.1"
},
"require-dev": {
"phpunit/phpunit": "^6.0",

View File

@ -11,13 +11,13 @@ class Apriori implements Associator
{
use Trainable, Predictable;
const ARRAY_KEY_ANTECEDENT = 'antecedent';
public const ARRAY_KEY_ANTECEDENT = 'antecedent';
const ARRAY_KEY_CONFIDENCE = 'confidence';
public const ARRAY_KEY_CONFIDENCE = 'confidence';
const ARRAY_KEY_CONSEQUENT = 'consequent';
public const ARRAY_KEY_CONSEQUENT = 'consequent';
const ARRAY_KEY_SUPPORT = 'support';
public const ARRAY_KEY_SUPPORT = 'support';
/**
* Minimum relative probability of frequent transactions.
@ -116,7 +116,7 @@ class Apriori implements Associator
/**
* Generate rules for each k-length frequent item set.
*/
private function generateAllRules()
private function generateAllRules(): void
{
for ($k = 2; !empty($this->large[$k]); ++$k) {
foreach ($this->large[$k] as $frequent) {
@ -130,7 +130,7 @@ class Apriori implements Associator
*
* @param mixed[] $frequent
*/
private function generateRules(array $frequent)
private function generateRules(array $frequent): void
{
foreach ($this->antecedents($frequent) as $antecedent) {
if ($this->confidence <= ($confidence = $this->confidence($frequent, $antecedent))) {

View File

@ -14,8 +14,8 @@ class DecisionTree implements Classifier
{
use Trainable, Predictable;
const CONTINUOUS = 1;
const NOMINAL = 2;
public const CONTINUOUS = 1;
public const NOMINAL = 2;
/**
* @var array
@ -72,7 +72,7 @@ class DecisionTree implements Classifier
$this->maxDepth = $maxDepth;
}
public function train(array $samples, array $targets)
public function train(array $samples, array $targets): void
{
$this->samples = array_merge($this->samples, $samples);
$this->targets = array_merge($this->targets, $targets);
@ -354,7 +354,7 @@ class DecisionTree implements Classifier
/**
* Used to set predefined features to consider while deciding which column to use for a split
*/
protected function setSelectedFeatures(array $selectedFeatures)
protected function setSelectedFeatures(array $selectedFeatures): void
{
$this->selectedFeatures = $selectedFeatures;
}

View File

@ -84,7 +84,7 @@ class AdaBoost implements Classifier
/**
* Sets the base classifier that will be used for boosting (default = DecisionStump)
*/
public function setBaseClassifier(string $baseClassifier = DecisionStump::class, array $classifierOptions = [])
public function setBaseClassifier(string $baseClassifier = DecisionStump::class, array $classifierOptions = []): void
{
$this->baseClassifier = $baseClassifier;
$this->classifierOptions = $classifierOptions;
@ -93,7 +93,7 @@ class AdaBoost implements Classifier
/**
* @throws \Exception
*/
public function train(array $samples, array $targets)
public function train(array $samples, array $targets): void
{
// Initialize usual variables
$this->labels = array_keys(array_count_values($targets));
@ -149,7 +149,7 @@ class AdaBoost implements Classifier
$classifier->setSampleWeights($this->weights);
$classifier->train($this->samples, $this->targets);
} else {
list($samples, $targets) = $this->resample();
[$samples, $targets] = $this->resample();
$classifier->train($samples, $targets);
}
@ -216,7 +216,7 @@ class AdaBoost implements Classifier
/**
* Updates the sample weights
*/
protected function updateWeights(Classifier $classifier, float $alpha)
protected function updateWeights(Classifier $classifier, float $alpha): void
{
$sumOfWeights = array_sum($this->weights);
$weightsT1 = [];

View File

@ -106,7 +106,7 @@ class Bagging implements Classifier
return $this;
}
public function train(array $samples, array $targets)
public function train(array $samples, array $targets): void
{
$this->samples = array_merge($this->samples, $samples);
$this->targets = array_merge($this->targets, $targets);
@ -117,7 +117,7 @@ class Bagging implements Classifier
$this->classifiers = $this->initClassifiers();
$index = 0;
foreach ($this->classifiers as $classifier) {
list($samples, $targets) = $this->getRandomSubset($index);
[$samples, $targets] = $this->getRandomSubset($index);
$classifier->train($samples, $targets);
++$index;
}

View File

@ -26,7 +26,7 @@ class KNearestNeighbors implements Classifier
/**
* @param Distance|null $distanceMetric (if null then Euclidean distance as default)
*/
public function __construct(int $k = 3, Distance $distanceMetric = null)
public function __construct(int $k = 3, ?Distance $distanceMetric = null)
{
if (null === $distanceMetric) {
$distanceMetric = new Euclidean();

View File

@ -9,12 +9,12 @@ class Adaline extends Perceptron
/**
* Batch training is the default Adaline training algorithm
*/
const BATCH_TRAINING = 1;
public const BATCH_TRAINING = 1;
/**
* Online training: Stochastic gradient descent learning
*/
const ONLINE_TRAINING = 2;
public const ONLINE_TRAINING = 2;
/**
* Training type may be either 'Batch' or 'Online' learning

View File

@ -14,7 +14,7 @@ class DecisionStump extends WeightedClassifier
{
use Predictable, OneVsRest;
const AUTO_SELECT = -1;
public const AUTO_SELECT = -1;
/**
* @var int
@ -86,7 +86,7 @@ class DecisionStump extends WeightedClassifier
/**
* @throws \Exception
*/
protected function trainBinary(array $samples, array $targets, array $labels)
protected function trainBinary(array $samples, array $targets, array $labels): void
{
$this->binaryLabels = $labels;
$this->featureCount = count($samples[0]);
@ -146,7 +146,7 @@ class DecisionStump extends WeightedClassifier
* points to be probed. The more split counts, the better performance but
* worse processing time (Default value is 10.0)
*/
public function setNumericalSplitCount(float $count)
public function setNumericalSplitCount(float $count): void
{
$this->numSplitCount = $count;
}
@ -171,7 +171,7 @@ class DecisionStump extends WeightedClassifier
// Before trying all possible split points, let's first try
// the average value for the cut point
$threshold = array_sum($values) / (float) count($values);
list($errorRate, $prob) = $this->calculateErrorRate($targets, $threshold, $operator, $values);
[$errorRate, $prob] = $this->calculateErrorRate($targets, $threshold, $operator, $values);
if ($split == null || $errorRate < $split['trainingErrorRate']) {
$split = ['value' => $threshold, 'operator' => $operator,
'prob' => $prob, 'column' => $col,
@ -181,7 +181,7 @@ class DecisionStump extends WeightedClassifier
// Try other possible points one by one
for ($step = $minValue; $step <= $maxValue; $step += $stepSize) {
$threshold = (float) $step;
list($errorRate, $prob) = $this->calculateErrorRate($targets, $threshold, $operator, $values);
[$errorRate, $prob] = $this->calculateErrorRate($targets, $threshold, $operator, $values);
if ($errorRate < $split['trainingErrorRate']) {
$split = ['value' => $threshold, 'operator' => $operator,
'prob' => $prob, 'column' => $col,
@ -203,7 +203,7 @@ class DecisionStump extends WeightedClassifier
foreach (['=', '!='] as $operator) {
foreach ($distinctVals as $val) {
list($errorRate, $prob) = $this->calculateErrorRate($targets, $val, $operator, $values);
[$errorRate, $prob] = $this->calculateErrorRate($targets, $val, $operator, $values);
if ($split == null || $split['trainingErrorRate'] < $errorRate) {
$split = ['value' => $val, 'operator' => $operator,
@ -289,7 +289,7 @@ class DecisionStump extends WeightedClassifier
return $this->binaryLabels[1];
}
protected function resetBinary()
protected function resetBinary(): void
{
}

View File

@ -11,17 +11,17 @@ class LogisticRegression extends Adaline
/**
* Batch training: Gradient descent algorithm (default)
*/
const BATCH_TRAINING = 1;
public const BATCH_TRAINING = 1;
/**
* Online training: Stochastic gradient descent learning
*/
const ONLINE_TRAINING = 2;
public const ONLINE_TRAINING = 2;
/**
* Conjugate Batch: Conjugate Gradient algorithm
*/
const CONJUGATE_GRAD_TRAINING = 3;
public const CONJUGATE_GRAD_TRAINING = 3;
/**
* Cost function to optimize: 'log' and 'sse' are supported <br>
@ -97,7 +97,7 @@ class LogisticRegression extends Adaline
* Sets the learning rate if gradient descent algorithm is
* selected for training
*/
public function setLearningRate(float $learningRate)
public function setLearningRate(float $learningRate): void
{
$this->learningRate = $learningRate;
}
@ -106,7 +106,7 @@ class LogisticRegression extends Adaline
* Lambda (λ) parameter of regularization term. If 0 is given,
* then the regularization term is cancelled
*/
public function setLambda(float $lambda)
public function setLambda(float $lambda): void
{
$this->lambda = $lambda;
}
@ -139,7 +139,7 @@ class LogisticRegression extends Adaline
/**
* Executes Conjugate Gradient method to optimize the weights of the LogReg model
*/
protected function runConjugateGradient(array $samples, array $targets, \Closure $gradientFunc)
protected function runConjugateGradient(array $samples, array $targets, \Closure $gradientFunc): void
{
if (empty($this->optimizer)) {
$this->optimizer = (new ConjugateGradient($this->featureCount))

View File

@ -88,12 +88,12 @@ class Perceptron implements Classifier, IncrementalEstimator
$this->maxIterations = $maxIterations;
}
public function partialTrain(array $samples, array $targets, array $labels = [])
public function partialTrain(array $samples, array $targets, array $labels = []): void
{
$this->trainByLabel($samples, $targets, $labels);
}
public function trainBinary(array $samples, array $targets, array $labels)
public function trainBinary(array $samples, array $targets, array $labels): void
{
if ($this->normalizer) {
$this->normalizer->transform($samples);
@ -111,7 +111,7 @@ class Perceptron implements Classifier, IncrementalEstimator
$this->runTraining($samples, $targets);
}
protected function resetBinary()
protected function resetBinary(): void
{
$this->labels = [];
$this->optimizer = null;
@ -148,6 +148,8 @@ class Perceptron implements Classifier, IncrementalEstimator
/**
* Trains the perceptron model with Stochastic Gradient Descent optimization
* to get the correct set of weights
*
* @return void|mixed
*/
protected function runTraining(array $samples, array $targets)
{
@ -169,7 +171,7 @@ class Perceptron implements Classifier, IncrementalEstimator
* Executes a Gradient Descent algorithm for
* the given cost function
*/
protected function runGradientDescent(array $samples, array $targets, \Closure $gradientFunc, bool $isBatch = false)
protected function runGradientDescent(array $samples, array $targets, \Closure $gradientFunc, bool $isBatch = false): void
{
$class = $isBatch ? GD::class : StochasticGD::class;

View File

@ -45,7 +45,7 @@ class MLPClassifier extends MultilayerPerceptron implements Classifier
/**
* @param mixed $target
*/
protected function trainSample(array $sample, $target)
protected function trainSample(array $sample, $target): void
{
// Feed-forward.

View File

@ -13,9 +13,9 @@ class NaiveBayes implements Classifier
{
use Trainable, Predictable;
const CONTINUOS = 1;
const NOMINAL = 2;
const EPSILON = 1e-10;
public const CONTINUOS = 1;
public const NOMINAL = 2;
public const EPSILON = 1e-10;
/**
* @var array
@ -57,7 +57,7 @@ class NaiveBayes implements Classifier
*/
private $labels = [];
public function train(array $samples, array $targets)
public function train(array $samples, array $targets): void
{
$this->samples = array_merge($this->samples, $samples);
$this->targets = array_merge($this->targets, $targets);
@ -77,7 +77,7 @@ class NaiveBayes implements Classifier
* Calculates vital statistics for each label & feature. Stores these
* values in private array in order to avoid repeated calculation
*/
private function calculateStatistics(string $label, array $samples)
private function calculateStatistics(string $label, array $samples): void
{
$this->std[$label] = array_fill(0, $this->featureCount, 0);
$this->mean[$label] = array_fill(0, $this->featureCount, 0);

View File

@ -14,7 +14,7 @@ class SVC extends SupportVectorMachine implements Classifier
int $kernel = Kernel::LINEAR,
float $cost = 1.0,
int $degree = 3,
float $gamma = null,
?float $gamma = null,
float $coef0 = 0.0,
float $tolerance = 0.001,
int $cacheSize = 100,

View File

@ -14,7 +14,7 @@ abstract class WeightedClassifier implements Classifier
/**
* Sets the array including a weight for each sample
*/
public function setSampleWeights(array $weights)
public function setSampleWeights(array $weights): void
{
$this->weights = $weights;
}

View File

@ -24,7 +24,7 @@ class DBSCAN implements Clusterer
*/
private $distanceMetric;
public function __construct(float $epsilon = 0.5, int $minSamples = 3, Distance $distanceMetric = null)
public function __construct(float $epsilon = 0.5, int $minSamples = 3, ?Distance $distanceMetric = null)
{
if (null === $distanceMetric) {
$distanceMetric = new Euclidean();

View File

@ -71,7 +71,7 @@ class FuzzyCMeans implements Clusterer
$this->maxIterations = $maxIterations;
}
protected function initClusters()
protected function initClusters(): void
{
// Membership array is a matrix of cluster number by sample counts
// We initilize the membership array with random values
@ -80,7 +80,7 @@ class FuzzyCMeans implements Clusterer
$this->updateClusters();
}
protected function generateRandomMembership(int $rows, int $cols)
protected function generateRandomMembership(int $rows, int $cols): void
{
$this->membership = [];
for ($i = 0; $i < $rows; ++$i) {
@ -98,7 +98,7 @@ class FuzzyCMeans implements Clusterer
}
}
protected function updateClusters()
protected function updateClusters(): void
{
$dim = $this->space->getDimension();
if (!$this->clusters) {
@ -136,7 +136,7 @@ class FuzzyCMeans implements Clusterer
return $sum;
}
protected function updateMembershipMatrix()
protected function updateMembershipMatrix(): void
{
for ($i = 0; $i < $this->clustersNumber; ++$i) {
for ($k = 0; $k < $this->sampleCount; ++$k) {

View File

@ -9,8 +9,8 @@ use Phpml\Exception\InvalidArgumentException;
class KMeans implements Clusterer
{
const INIT_RANDOM = 1;
const INIT_KMEANS_PLUS_PLUS = 2;
public const INIT_RANDOM = 1;
public const INIT_KMEANS_PLUS_PLUS = 2;
/**
* @var int

View File

@ -64,17 +64,17 @@ class Cluster extends Point implements IteratorAggregate, Countable
return $point;
}
public function attachAll(SplObjectStorage $points)
public function attachAll(SplObjectStorage $points): void
{
$this->points->addAll($points);
}
public function detachAll(SplObjectStorage $points)
public function detachAll(SplObjectStorage $points): void
{
$this->points->removeAll($points);
}
public function updateCentroid()
public function updateCentroid(): void
{
if (!$count = count($this->points)) {
return;
@ -109,7 +109,7 @@ class Cluster extends Point implements IteratorAggregate, Countable
return count($this->points);
}
public function setCoordinates(array $newCoordinates)
public function setCoordinates(array $newCoordinates): void
{
$this->coordinates = $newCoordinates;
}

View File

@ -93,7 +93,7 @@ class Point implements ArrayAccess
* @param mixed $offset
* @param mixed $value
*/
public function offsetSet($offset, $value)
public function offsetSet($offset, $value): void
{
$this->coordinates[$offset] = $value;
}
@ -101,7 +101,7 @@ class Point implements ArrayAccess
/**
* @param mixed $offset
*/
public function offsetUnset($offset)
public function offsetUnset($offset): void
{
unset($this->coordinates[$offset]);
}

View File

@ -47,7 +47,7 @@ class Space extends SplObjectStorage
/**
* @param null $data
*/
public function addPoint(array $coordinates, $data = null)
public function addPoint(array $coordinates, $data = null): void
{
$this->attach($this->newPoint($coordinates), $data);
}
@ -56,7 +56,7 @@ class Space extends SplObjectStorage
* @param Point $point
* @param null $data
*/
public function attach($point, $data = null)
public function attach($point, $data = null): void
{
if (!$point instanceof Point) {
throw new InvalidArgumentException('can only attach points to spaces');
@ -180,7 +180,7 @@ class Space extends SplObjectStorage
private function initializeRandomClusters(int $clustersNumber) : array
{
$clusters = [];
list($min, $max) = $this->getBoundaries();
[$min, $max] = $this->getBoundaries();
for ($n = 0; $n < $clustersNumber; ++$n) {
$clusters[] = new Cluster($this, $this->getRandomPoint($min, $max)->getCoordinates());

View File

@ -8,7 +8,7 @@ use Phpml\Dataset\Dataset;
class RandomSplit extends Split
{
protected function splitDataset(Dataset $dataset, float $testSize)
protected function splitDataset(Dataset $dataset, float $testSize): void
{
$samples = $dataset->getSamples();
$labels = $dataset->getTargets();

View File

@ -29,7 +29,7 @@ abstract class Split
*/
protected $testLabels = [];
public function __construct(Dataset $dataset, float $testSize = 0.3, int $seed = null)
public function __construct(Dataset $dataset, float $testSize = 0.3, ?int $seed = null)
{
if (0 >= $testSize || 1 <= $testSize) {
throw InvalidArgumentException::percentNotInRange('testSize');
@ -61,7 +61,7 @@ abstract class Split
return $this->testLabels;
}
protected function seedGenerator(int $seed = null)
protected function seedGenerator(?int $seed = null): void
{
if (null === $seed) {
mt_srand();

View File

@ -9,7 +9,7 @@ use Phpml\Dataset\Dataset;
class StratifiedRandomSplit extends RandomSplit
{
protected function splitDataset(Dataset $dataset, float $testSize)
protected function splitDataset(Dataset $dataset, float $testSize): void
{
$datasets = $this->splitByTarget($dataset);

View File

@ -17,14 +17,14 @@ class FilesDataset extends ArrayDataset
$this->scanRootPath($rootPath);
}
private function scanRootPath(string $rootPath)
private function scanRootPath(string $rootPath): void
{
foreach (glob($rootPath.DIRECTORY_SEPARATOR.'*', GLOB_ONLYDIR) as $dir) {
$this->scanDir($dir);
}
}
private function scanDir(string $dir)
private function scanDir(string $dir): void
{
$target = basename($dir);

View File

@ -48,7 +48,7 @@ abstract class EigenTransformerBase
* top eigenVectors along with the largest eigenValues. The total explained variance
* of these eigenVectors will be no less than desired $totalVariance value
*/
protected function eigenDecomposition(array $matrix)
protected function eigenDecomposition(array $matrix): void
{
$eig = new EigenvalueDecomposition($matrix);
$eigVals = $eig->getRealEigenvalues();

View File

@ -10,10 +10,10 @@ use Phpml\Math\Matrix;
class KernelPCA extends PCA
{
const KERNEL_RBF = 1;
const KERNEL_SIGMOID = 2;
const KERNEL_LAPLACIAN = 3;
const KERNEL_LINEAR = 4;
public const KERNEL_RBF = 1;
public const KERNEL_SIGMOID = 2;
public const KERNEL_LAPLACIAN = 3;
public const KERNEL_LINEAR = 4;
/**
* Selected kernel function
@ -50,7 +50,7 @@ class KernelPCA extends PCA
*
* @throws \Exception
*/
public function __construct(int $kernel = self::KERNEL_RBF, float $totalVariance = null, int $numFeatures = null, float $gamma = null)
public function __construct(int $kernel = self::KERNEL_RBF, ?float $totalVariance = null, ?int $numFeatures = null, ?float $gamma = null)
{
$availableKernels = [self::KERNEL_RBF, self::KERNEL_SIGMOID, self::KERNEL_LAPLACIAN, self::KERNEL_LINEAR];
if (!in_array($kernel, $availableKernels)) {

View File

@ -47,7 +47,7 @@ class LDA extends EigenTransformerBase
*
* @throws \Exception
*/
public function __construct(float $totalVariance = null, int $numFeatures = null)
public function __construct(?float $totalVariance = null, ?int $numFeatures = null)
{
if ($totalVariance !== null && ($totalVariance < 0.1 || $totalVariance > 0.99)) {
throw new \Exception('Total variance can be a value between 0.1 and 0.99');

View File

@ -32,7 +32,7 @@ class PCA extends EigenTransformerBase
*
* @throws \Exception
*/
public function __construct(float $totalVariance = null, int $numFeatures = null)
public function __construct(?float $totalVariance = null, ?int $numFeatures = null)
{
if ($totalVariance !== null && ($totalVariance < 0.1 || $totalVariance > 0.99)) {
throw new \Exception('Total variance can be a value between 0.1 and 0.99');
@ -73,7 +73,7 @@ class PCA extends EigenTransformerBase
return $this->reduce($data);
}
protected function calculateMeans(array $data, int $n)
protected function calculateMeans(array $data, int $n): void
{
// Calculate means for each dimension
$this->means = [];

View File

@ -13,14 +13,14 @@ class TfIdfTransformer implements Transformer
*/
private $idf;
public function __construct(array $samples = null)
public function __construct(?array $samples = null)
{
if ($samples) {
$this->fit($samples);
}
}
public function fit(array $samples)
public function fit(array $samples): void
{
$this->countTokensFrequency($samples);
@ -30,7 +30,7 @@ class TfIdfTransformer implements Transformer
}
}
public function transform(array &$samples)
public function transform(array &$samples): void
{
foreach ($samples as &$sample) {
foreach ($sample as $index => &$feature) {
@ -39,7 +39,7 @@ class TfIdfTransformer implements Transformer
}
}
private function countTokensFrequency(array $samples)
private function countTokensFrequency(array $samples): void
{
$this->idf = array_fill_keys(array_keys($samples[0]), 0);

View File

@ -34,7 +34,7 @@ class TokenCountVectorizer implements Transformer
*/
private $frequencies;
public function __construct(Tokenizer $tokenizer, StopWords $stopWords = null, float $minDF = 0.0)
public function __construct(Tokenizer $tokenizer, ?StopWords $stopWords = null, float $minDF = 0.0)
{
$this->tokenizer = $tokenizer;
$this->stopWords = $stopWords;
@ -44,12 +44,12 @@ class TokenCountVectorizer implements Transformer
$this->frequencies = [];
}
public function fit(array $samples)
public function fit(array $samples): void
{
$this->buildVocabulary($samples);
}
public function transform(array &$samples)
public function transform(array &$samples): void
{
foreach ($samples as &$sample) {
$this->transformSample($sample);
@ -63,7 +63,7 @@ class TokenCountVectorizer implements Transformer
return array_flip($this->vocabulary);
}
private function buildVocabulary(array &$samples)
private function buildVocabulary(array &$samples): void
{
foreach ($samples as $index => $sample) {
$tokens = $this->tokenizer->tokenize($sample);
@ -73,7 +73,7 @@ class TokenCountVectorizer implements Transformer
}
}
private function transformSample(string &$sample)
private function transformSample(string &$sample): void
{
$counts = [];
$tokens = $this->tokenizer->tokenize($sample);
@ -113,7 +113,7 @@ class TokenCountVectorizer implements Transformer
return $this->vocabulary[$token] ?? false;
}
private function addTokenToVocabulary(string $token)
private function addTokenToVocabulary(string $token): void
{
if ($this->isStopWord($token)) {
return;
@ -129,7 +129,7 @@ class TokenCountVectorizer implements Transformer
return $this->stopWords && $this->stopWords->isStopWord($token);
}
private function updateFrequency(string $token)
private function updateFrequency(string $token): void
{
if (!isset($this->frequencies[$token])) {
$this->frequencies[$token] = 0;
@ -138,7 +138,7 @@ class TokenCountVectorizer implements Transformer
++$this->frequencies[$token];
}
private function checkDocumentFrequency(array &$samples)
private function checkDocumentFrequency(array &$samples): void
{
if ($this->minDF > 0) {
$beyondMinimum = $this->getBeyondMinimumIndexes(count($samples));
@ -148,7 +148,7 @@ class TokenCountVectorizer implements Transformer
}
}
private function resetBeyondMinimum(array &$sample, array $beyondMinimum)
private function resetBeyondMinimum(array &$sample, array $beyondMinimum): void
{
foreach ($beyondMinimum as $index) {
$sample[$index] = 0;

View File

@ -28,7 +28,7 @@ trait OneVsRest
/**
* Train a binary classifier in the OvR style
*/
public function train(array $samples, array $targets)
public function train(array $samples, array $targets): void
{
// Clears previous stuff.
$this->reset();
@ -36,7 +36,7 @@ trait OneVsRest
$this->trainBylabel($samples, $targets);
}
protected function trainByLabel(array $samples, array $targets, array $allLabels = [])
protected function trainByLabel(array $samples, array $targets, array $allLabels = []): void
{
// Overwrites the current value if it exist. $allLabels must be provided for each partialTrain run.
if (!empty($allLabels)) {
@ -63,7 +63,7 @@ trait OneVsRest
$this->classifiers[$label] = $this->getClassifierCopy();
}
list($binarizedTargets, $classifierLabels) = $this->binarizeTargets($targets, $label);
[$binarizedTargets, $classifierLabels] = $this->binarizeTargets($targets, $label);
$this->classifiers[$label]->trainBinary($samples, $binarizedTargets, $classifierLabels);
}
}
@ -80,7 +80,7 @@ trait OneVsRest
/**
* Resets the classifier and the vars internally used by OneVsRest to create multiple classifiers.
*/
public function reset()
public function reset(): void
{
$this->classifiers = [];
$this->allLabels = [];
@ -158,7 +158,7 @@ trait OneVsRest
*
* @return void
*/
abstract protected function resetBinary();
abstract protected function resetBinary(): void;
/**
* Each classifier that make use of OvR approach should be able to

View File

@ -61,7 +61,7 @@ class ConjugateGradient extends GD
*/
protected function gradient(array $theta) : array
{
list(, $gradient) = parent::gradient($theta);
[, $gradient] = parent::gradient($theta);
return $gradient;
}
@ -71,7 +71,7 @@ class ConjugateGradient extends GD
*/
protected function cost(array $theta) : float
{
list($cost) = parent::gradient($theta);
[$cost] = parent::gradient($theta);
return array_sum($cost) / $this->sampleCount;
}

View File

@ -31,7 +31,7 @@ class GD extends StochasticGD
$theta = $this->theta;
// Calculate update terms for each sample
list($errors, $updates, $totalPenalty) = $this->gradient($theta);
[$errors, $updates, $totalPenalty] = $this->gradient($theta);
$this->updateWeightsWithUpdates($updates, $totalPenalty);
@ -61,7 +61,7 @@ class GD extends StochasticGD
$target = $this->targets[$index];
$result = ($this->gradientCb)($theta, $sample, $target);
list($cost, $grad, $penalty) = array_pad($result, 3, 0);
[$cost, $grad, $penalty] = array_pad($result, 3, 0);
$costs[] = $cost;
$gradient[] = $grad;
@ -73,7 +73,7 @@ class GD extends StochasticGD
return [$costs, $gradient, $totalPenalty];
}
protected function updateWeightsWithUpdates(array $updates, float $penalty)
protected function updateWeightsWithUpdates(array $updates, float $penalty): void
{
// Updates all weights at once
for ($i = 0; $i <= $this->dimensions; ++$i) {
@ -96,7 +96,7 @@ class GD extends StochasticGD
/**
* Clears the optimizer internal vars after the optimization process.
*/
protected function clear()
protected function clear(): void
{
$this->sampleCount = null;
parent::clear();

View File

@ -191,7 +191,7 @@ class StochasticGD extends Optimizer
$result = ($this->gradientCb)($theta, $sample, $target);
list($error, $gradient, $penalty) = array_pad($result, 3, 0);
[$error, $gradient, $penalty] = array_pad($result, 3, 0);
// Update bias
$this->theta[0] -= $this->learningRate * $gradient;
@ -249,7 +249,7 @@ class StochasticGD extends Optimizer
/**
* Clears the optimizer internal vars after the optimization process.
*/
protected function clear()
protected function clear(): void
{
$this->samples = [];
$this->targets = [];

View File

@ -20,7 +20,7 @@ trait Trainable
* @param array $samples
* @param array $targets
*/
public function train(array $samples, array $targets)
public function train(array $samples, array $targets): void
{
$this->samples = array_merge($this->samples, $samples);
$this->targets = array_merge($this->targets, $targets);

View File

@ -119,7 +119,7 @@ class EigenvalueDecomposition
/**
* Symmetric Householder reduction to tridiagonal form.
*/
private function tred2()
private function tred2(): void
{
// This is derived from the Algol procedures tred2 by
// Bowdler, Martin, Reinsch, and Wilkinson, Handbook for
@ -236,7 +236,7 @@ class EigenvalueDecomposition
* Auto. Comp., Vol.ii-Linear Algebra, and the corresponding
* Fortran subroutine in EISPACK.
*/
private function tql2()
private function tql2(): void
{
for ($i = 1; $i < $this->n; ++$i) {
$this->e[$i - 1] = $this->e[$i];
@ -343,7 +343,7 @@ class EigenvalueDecomposition
* Vol.ii-Linear Algebra, and the corresponding
* Fortran subroutines in EISPACK.
*/
private function orthes()
private function orthes(): void
{
$low = 0;
$high = $this->n - 1;
@ -428,7 +428,7 @@ class EigenvalueDecomposition
* @param int|float $yr
* @param int|float $yi
*/
private function cdiv($xr, $xi, $yr, $yi)
private function cdiv($xr, $xi, $yr, $yi): void
{
if (abs($yr) > abs($yi)) {
$r = $yi / $yr;
@ -451,7 +451,7 @@ class EigenvalueDecomposition
* Vol.ii-Linear Algebra, and the corresponding
* Fortran subroutine in EISPACK.
*/
private function hqr2()
private function hqr2(): void
{
// Initialize
$nn = $this->n;

View File

@ -13,7 +13,7 @@ class Covariance
*
* @throws InvalidArgumentException
*/
public static function fromXYArrays(array $x, array $y, bool $sample = true, float $meanX = null, float $meanY = null) : float
public static function fromXYArrays(array $x, array $y, bool $sample = true, ?float $meanX = null, ?float $meanY = null) : float
{
if (empty($x) || empty($y)) {
throw InvalidArgumentException::arrayCantBeEmpty();
@ -51,7 +51,7 @@ class Covariance
* @throws InvalidArgumentException
* @throws \Exception
*/
public static function fromDataset(array $data, int $i, int $k, bool $sample = true, float $meanX = null, float $meanY = null) : float
public static function fromDataset(array $data, int $i, int $k, bool $sample = true, ?float $meanX = null, ?float $meanY = null) : float
{
if (empty($data)) {
throw InvalidArgumentException::arrayCantBeEmpty();
@ -112,7 +112,7 @@ class Covariance
*
* @param array|null $means
*/
public static function covarianceMatrix(array $data, array $means = null) : array
public static function covarianceMatrix(array $data, ?array $means = null) : array
{
$n = count($data[0]);

View File

@ -56,7 +56,7 @@ class Mean
/**
* @throws InvalidArgumentException
*/
private static function checkArrayLength(array $array)
private static function checkArrayLength(array $array): void
{
if (empty($array)) {
throw InvalidArgumentException::arrayCantBeEmpty();

View File

@ -76,7 +76,7 @@ class ClassificationReport
return $this->average;
}
private function computeMetrics(array $truePositive, array $falsePositive, array $falseNegative)
private function computeMetrics(array $truePositive, array $falsePositive, array $falseNegative): void
{
foreach ($truePositive as $label => $tp) {
$this->precision[$label] = $this->computePrecision($tp, $falsePositive[$label]);
@ -85,7 +85,7 @@ class ClassificationReport
}
}
private function computeAverage()
private function computeAverage(): void
{
foreach (['precision', 'recall', 'f1score'] as $metric) {
$values = array_filter($this->{$metric});

View File

@ -6,7 +6,7 @@ namespace Phpml\Metric;
class ConfusionMatrix
{
public static function compute(array $actualLabels, array $predictedLabels, array $labels = null) : array
public static function compute(array $actualLabels, array $predictedLabels, ?array $labels = null) : array
{
$labels = $labels ? array_flip($labels) : self::getUniqueLabels($actualLabels);
$matrix = self::generateMatrixWithZeros($labels);

View File

@ -9,7 +9,7 @@ use Phpml\Exception\SerializeException;
class ModelManager
{
public function saveToFile(Estimator $estimator, string $filepath)
public function saveToFile(Estimator $estimator, string $filepath): void
{
if (!is_writable(dirname($filepath))) {
throw FileException::cantSaveFile(basename($filepath));

View File

@ -17,7 +17,7 @@ class Layer
/**
* @throws InvalidArgumentException
*/
public function __construct(int $nodesNumber = 0, string $nodeClass = Neuron::class, ActivationFunction $activationFunction = null)
public function __construct(int $nodesNumber = 0, string $nodeClass = Neuron::class, ?ActivationFunction $activationFunction = null)
{
if (!in_array(Node::class, class_implements($nodeClass))) {
throw InvalidArgumentException::invalidLayerNodeClass();
@ -33,7 +33,7 @@ class Layer
*
* @return Neuron
*/
private function createNode(string $nodeClass, ActivationFunction $activationFunction = null)
private function createNode(string $nodeClass, ?ActivationFunction $activationFunction = null)
{
if (Neuron::class == $nodeClass) {
return new Neuron($activationFunction);
@ -42,7 +42,7 @@ class Layer
return new $nodeClass();
}
public function addNode(Node $node)
public function addNode(Node $node): void
{
$this->nodes[] = $node;
}

View File

@ -16,7 +16,7 @@ abstract class LayeredNetwork implements Network
*/
protected $layers;
public function addLayer(Layer $layer)
public function addLayer(Layer $layer): void
{
$this->layers[] = $layer;
}
@ -29,7 +29,7 @@ abstract class LayeredNetwork implements Network
return $this->layers;
}
public function removeLayers()
public function removeLayers(): void
{
unset($this->layers);
}

View File

@ -58,7 +58,7 @@ abstract class MultilayerPerceptron extends LayeredNetwork implements Estimator,
/**
* @throws InvalidArgumentException
*/
public function __construct(int $inputLayerFeatures, array $hiddenLayers, array $classes, int $iterations = 10000, ActivationFunction $activationFunction = null, int $theta = 1)
public function __construct(int $inputLayerFeatures, array $hiddenLayers, array $classes, int $iterations = 10000, ?ActivationFunction $activationFunction = null, int $theta = 1)
{
if (empty($hiddenLayers)) {
throw InvalidArgumentException::invalidLayersNumber();
@ -78,7 +78,7 @@ abstract class MultilayerPerceptron extends LayeredNetwork implements Estimator,
$this->initNetwork();
}
private function initNetwork()
private function initNetwork(): void
{
$this->addInputLayer($this->inputLayerFeatures);
$this->addNeuronLayers($this->hiddenLayers, $this->activationFunction);
@ -90,7 +90,7 @@ abstract class MultilayerPerceptron extends LayeredNetwork implements Estimator,
$this->backpropagation = new Backpropagation($this->theta);
}
public function train(array $samples, array $targets)
public function train(array $samples, array $targets): void
{
$this->reset();
$this->initNetwork();
@ -100,7 +100,7 @@ abstract class MultilayerPerceptron extends LayeredNetwork implements Estimator,
/**
* @throws InvalidArgumentException
*/
public function partialTrain(array $samples, array $targets, array $classes = [])
public function partialTrain(array $samples, array $targets, array $classes = []): void
{
if (!empty($classes) && array_values($classes) !== $this->classes) {
// We require the list of classes in the constructor.
@ -122,24 +122,24 @@ abstract class MultilayerPerceptron extends LayeredNetwork implements Estimator,
*/
abstract protected function predictSample(array $sample);
protected function reset()
protected function reset(): void
{
$this->removeLayers();
}
private function addInputLayer(int $nodes)
private function addInputLayer(int $nodes): void
{
$this->addLayer(new Layer($nodes, Input::class));
}
private function addNeuronLayers(array $layers, ActivationFunction $activationFunction = null)
private function addNeuronLayers(array $layers, ?ActivationFunction $activationFunction = null): void
{
foreach ($layers as $neurons) {
$this->addLayer(new Layer($neurons, Neuron::class, $activationFunction));
}
}
private function generateSynapses()
private function generateSynapses(): void
{
$layersNumber = count($this->layers) - 1;
for ($i = 0; $i < $layersNumber; ++$i) {
@ -149,7 +149,7 @@ abstract class MultilayerPerceptron extends LayeredNetwork implements Estimator,
}
}
private function addBiasNodes()
private function addBiasNodes(): void
{
$biasLayers = count($this->layers) - 1;
for ($i = 0; $i < $biasLayers; ++$i) {
@ -157,7 +157,7 @@ abstract class MultilayerPerceptron extends LayeredNetwork implements Estimator,
}
}
private function generateLayerSynapses(Layer $nextLayer, Layer $currentLayer)
private function generateLayerSynapses(Layer $nextLayer, Layer $currentLayer): void
{
foreach ($nextLayer->getNodes() as $nextNeuron) {
if ($nextNeuron instanceof Neuron) {
@ -166,14 +166,14 @@ abstract class MultilayerPerceptron extends LayeredNetwork implements Estimator,
}
}
private function generateNeuronSynapses(Layer $currentLayer, Neuron $nextNeuron)
private function generateNeuronSynapses(Layer $currentLayer, Neuron $nextNeuron): void
{
foreach ($currentLayer->getNodes() as $currentNeuron) {
$nextNeuron->addSynapse(new Synapse($currentNeuron));
}
}
private function trainSamples(array $samples, array $targets)
private function trainSamples(array $samples, array $targets): void
{
foreach ($targets as $key => $target) {
$this->trainSample($samples[$key], $target);

View File

@ -23,7 +23,7 @@ class Input implements Node
return $this->input;
}
public function setInput(float $input)
public function setInput(float $input): void
{
$this->input = $input;
}

View File

@ -25,14 +25,14 @@ class Neuron implements Node
*/
protected $output;
public function __construct(ActivationFunction $activationFunction = null)
public function __construct(?ActivationFunction $activationFunction = null)
{
$this->activationFunction = $activationFunction ?: new ActivationFunction\Sigmoid();
$this->synapses = [];
$this->output = 0;
}
public function addSynapse(Synapse $synapse)
public function addSynapse(Synapse $synapse): void
{
$this->synapses[] = $synapse;
}
@ -59,7 +59,7 @@ class Neuron implements Node
return $this->output;
}
public function reset()
public function reset(): void
{
$this->output = 0;
}

View File

@ -21,7 +21,7 @@ class Synapse
/**
* @param float|null $weight
*/
public function __construct(Node $node, float $weight = null)
public function __construct(Node $node, ?float $weight = null)
{
$this->node = $node;
$this->weight = $weight ?: $this->generateRandomWeight();
@ -37,7 +37,7 @@ class Synapse
return $this->weight * $this->node->getOutput();
}
public function changeWeight(float $delta)
public function changeWeight(float $delta): void
{
$this->weight += $delta;
}

View File

@ -32,7 +32,7 @@ class Backpropagation
/**
* @param mixed $targetClass
*/
public function backpropagate(array $layers, $targetClass)
public function backpropagate(array $layers, $targetClass): void
{
$layersNumber = count($layers);

View File

@ -28,12 +28,12 @@ class Pipeline implements Estimator
$this->estimator = $estimator;
}
public function addTransformer(Transformer $transformer)
public function addTransformer(Transformer $transformer): void
{
$this->transformers[] = $transformer;
}
public function setEstimator(Estimator $estimator)
public function setEstimator(Estimator $estimator): void
{
$this->estimator = $estimator;
}
@ -51,7 +51,7 @@ class Pipeline implements Estimator
return $this->estimator;
}
public function train(array $samples, array $targets)
public function train(array $samples, array $targets): void
{
foreach ($this->transformers as $transformer) {
$transformer->fit($samples);
@ -71,7 +71,7 @@ class Pipeline implements Estimator
return $this->estimator->predict($samples);
}
private function transformSamples(array &$samples)
private function transformSamples(array &$samples): void
{
foreach ($this->transformers as $transformer) {
$transformer->transform($samples);

View File

@ -8,8 +8,8 @@ use Phpml\Preprocessing\Imputer\Strategy;
class Imputer implements Preprocessor
{
const AXIS_COLUMN = 0;
const AXIS_ROW = 1;
public const AXIS_COLUMN = 0;
public const AXIS_ROW = 1;
/**
* @var mixed
@ -43,19 +43,19 @@ class Imputer implements Preprocessor
$this->samples = $samples;
}
public function fit(array $samples)
public function fit(array $samples): void
{
$this->samples = $samples;
}
public function transform(array &$samples)
public function transform(array &$samples): void
{
foreach ($samples as &$sample) {
$this->preprocessSample($sample);
}
}
private function preprocessSample(array &$sample)
private function preprocessSample(array &$sample): void
{
foreach ($sample as $column => &$value) {
if ($value === $this->missingValue) {

View File

@ -10,9 +10,9 @@ use Phpml\Math\Statistic\StandardDeviation;
class Normalizer implements Preprocessor
{
const NORM_L1 = 1;
const NORM_L2 = 2;
const NORM_STD = 3;
public const NORM_L1 = 1;
public const NORM_L2 = 2;
public const NORM_STD = 3;
/**
* @var int
@ -46,7 +46,7 @@ class Normalizer implements Preprocessor
$this->norm = $norm;
}
public function fit(array $samples)
public function fit(array $samples): void
{
if ($this->fitted) {
return;
@ -64,7 +64,7 @@ class Normalizer implements Preprocessor
$this->fitted = true;
}
public function transform(array &$samples)
public function transform(array &$samples): void
{
$methods = [
self::NORM_L1 => 'normalizeL1',
@ -80,7 +80,7 @@ class Normalizer implements Preprocessor
}
}
private function normalizeL1(array &$sample)
private function normalizeL1(array &$sample): void
{
$norm1 = 0;
foreach ($sample as $feature) {
@ -97,7 +97,7 @@ class Normalizer implements Preprocessor
}
}
private function normalizeL2(array &$sample)
private function normalizeL2(array &$sample): void
{
$norm2 = 0;
foreach ($sample as $feature) {
@ -114,7 +114,7 @@ class Normalizer implements Preprocessor
}
}
private function normalizeSTD(array &$sample)
private function normalizeSTD(array &$sample): void
{
foreach ($sample as $i => $val) {
if ($this->std[$i] != 0) {

View File

@ -30,7 +30,7 @@ class LeastSquares implements Regression
*/
private $coefficients;
public function train(array $samples, array $targets)
public function train(array $samples, array $targets): void
{
$this->samples = array_merge($this->samples, $samples);
$this->targets = array_merge($this->targets, $targets);
@ -64,7 +64,7 @@ class LeastSquares implements Regression
/**
* coefficient(b) = (X'X)-1X'Y.
*/
private function computeCoefficients()
private function computeCoefficients(): void
{
$samplesMatrix = $this->getSamplesMatrix();
$targetsMatrix = $this->getTargetsMatrix();

View File

@ -15,7 +15,7 @@ class SVR extends SupportVectorMachine implements Regression
int $degree = 3,
float $epsilon = 0.1,
float $cost = 1.0,
float $gamma = null,
?float $gamma = null,
float $coef0 = 0.0,
float $tolerance = 0.001,
int $cacheSize = 100,

View File

@ -9,20 +9,20 @@ abstract class Kernel
/**
* u'*v.
*/
const LINEAR = 0;
public const LINEAR = 0;
/**
* (gamma*u'*v + coef0)^degree.
*/
const POLYNOMIAL = 1;
public const POLYNOMIAL = 1;
/**
* exp(-gamma*|u-v|^2).
*/
const RBF = 2;
public const RBF = 2;
/**
* tanh(gamma*u'*v + coef0).
*/
const SIGMOID = 3;
public const SIGMOID = 3;
}

View File

@ -97,7 +97,7 @@ class SupportVectorMachine
float $cost = 1.0,
float $nu = 0.5,
int $degree = 3,
float $gamma = null,
?float $gamma = null,
float $coef0 = 0.0,
float $epsilon = 0.1,
float $tolerance = 0.001,
@ -124,7 +124,7 @@ class SupportVectorMachine
$this->varPath = $rootPath.'var'.DIRECTORY_SEPARATOR;
}
public function setBinPath(string $binPath)
public function setBinPath(string $binPath): void
{
$this->ensureDirectorySeparator($binPath);
$this->verifyBinPath($binPath);
@ -132,7 +132,7 @@ class SupportVectorMachine
$this->binPath = $binPath;
}
public function setVarPath(string $varPath)
public function setVarPath(string $varPath): void
{
if (!is_writable($varPath)) {
throw InvalidArgumentException::pathNotWritable($varPath);
@ -142,7 +142,7 @@ class SupportVectorMachine
$this->varPath = $varPath;
}
public function train(array $samples, array $targets)
public function train(array $samples, array $targets): void
{
$this->samples = array_merge($this->samples, $samples);
$this->targets = array_merge($this->targets, $targets);
@ -234,14 +234,14 @@ class SupportVectorMachine
);
}
private function ensureDirectorySeparator(string &$path)
private function ensureDirectorySeparator(string &$path): void
{
if (substr($path, -1) !== DIRECTORY_SEPARATOR) {
$path .= DIRECTORY_SEPARATOR;
}
}
private function verifyBinPath(string $path)
private function verifyBinPath(string $path): void
{
if (!is_dir($path)) {
throw InvalidArgumentException::pathNotFound($path);

View File

@ -9,25 +9,25 @@ abstract class Type
/**
* classification.
*/
const C_SVC = 0;
public const C_SVC = 0;
/**
* classification.
*/
const NU_SVC = 1;
public const NU_SVC = 1;
/**
* distribution estimation.
*/
const ONE_CLASS_SVM = 2;
public const ONE_CLASS_SVM = 2;
/**
* regression.
*/
const EPSILON_SVR = 3;
public const EPSILON_SVR = 3;
/**
* regression.
*/
const NU_SVR = 4;
public const NU_SVR = 4;
}

View File

@ -40,7 +40,7 @@ class AprioriTest extends TestCase
[2, 4],
];
public function testGreek()
public function testGreek(): void
{
$apriori = new Apriori(0.5, 0.5);
$apriori->train($this->sampleGreek, []);
@ -49,14 +49,14 @@ class AprioriTest extends TestCase
$this->assertEquals('alpha', $apriori->predict([['alpha', 'epsilon'], ['beta', 'theta']])[1][0][0]);
}
public function testPowerSet()
public function testPowerSet(): void
{
$apriori = new Apriori();
$this->assertCount(8, $this->invoke($apriori, 'powerSet', [['a', 'b', 'c']]));
}
public function testApriori()
public function testApriori(): void
{
$apriori = new Apriori(3 / 7);
$apriori->train($this->sampleBasket, []);
@ -73,7 +73,7 @@ class AprioriTest extends TestCase
$this->assertTrue($this->invoke($apriori, 'contains', [$L[2], [3, 4]]));
}
public function testGetRules()
public function testGetRules(): void
{
$apriori = new Apriori(0.4, 0.8);
$apriori->train($this->sampleChars, []);
@ -81,21 +81,21 @@ class AprioriTest extends TestCase
$this->assertCount(19, $apriori->getRules());
}
public function testAntecedents()
public function testAntecedents(): void
{
$apriori = new Apriori();
$this->assertCount(6, $this->invoke($apriori, 'antecedents', [['a', 'b', 'c']]));
}
public function testItems()
public function testItems(): void
{
$apriori = new Apriori();
$apriori->train($this->sampleGreek, []);
$this->assertCount(4, $this->invoke($apriori, 'items', []));
}
public function testFrequent()
public function testFrequent(): void
{
$apriori = new Apriori(0.51);
$apriori->train($this->sampleGreek, []);
@ -104,7 +104,7 @@ class AprioriTest extends TestCase
$this->assertCount(2, $this->invoke($apriori, 'frequent', [[['alpha'], ['beta']]]));
}
public function testCandidates()
public function testCandidates(): void
{
$apriori = new Apriori();
$apriori->train($this->sampleGreek, []);
@ -115,7 +115,7 @@ class AprioriTest extends TestCase
$this->assertCount(3, $this->invoke($apriori, 'candidates', [[['alpha'], ['beta'], ['theta']]]));
}
public function testConfidence()
public function testConfidence(): void
{
$apriori = new Apriori();
$apriori->train($this->sampleGreek, []);
@ -124,7 +124,7 @@ class AprioriTest extends TestCase
$this->assertEquals(1, $this->invoke($apriori, 'confidence', [['alpha', 'beta'], ['alpha']]));
}
public function testSupport()
public function testSupport(): void
{
$apriori = new Apriori();
$apriori->train($this->sampleGreek, []);
@ -133,7 +133,7 @@ class AprioriTest extends TestCase
$this->assertEquals(0.5, $this->invoke($apriori, 'support', [['epsilon']]));
}
public function testFrequency()
public function testFrequency(): void
{
$apriori = new Apriori();
$apriori->train($this->sampleGreek, []);
@ -142,7 +142,7 @@ class AprioriTest extends TestCase
$this->assertEquals(2, $this->invoke($apriori, 'frequency', [['epsilon']]));
}
public function testContains()
public function testContains(): void
{
$apriori = new Apriori();
@ -151,7 +151,7 @@ class AprioriTest extends TestCase
$this->assertFalse($this->invoke($apriori, 'contains', [[['a'], ['b']], ['c']]));
}
public function testSubset()
public function testSubset(): void
{
$apriori = new Apriori();
@ -160,7 +160,7 @@ class AprioriTest extends TestCase
$this->assertFalse($this->invoke($apriori, 'subset', [['a'], ['a', 'b']]));
}
public function testEquals()
public function testEquals(): void
{
$apriori = new Apriori();
@ -187,7 +187,7 @@ class AprioriTest extends TestCase
return $method->invokeArgs($object, $params);
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
$classifier = new Apriori(0.5, 0.5);
$classifier->train($this->sampleGreek, []);

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class DecisionTreeLeafTest extends TestCase
{
public function testHTMLOutput()
public function testHTMLOutput(): void
{
$leaf = new DecisionTreeLeaf();
$leaf->value = 1;

View File

@ -35,7 +35,7 @@ class DecisionTreeTest extends TestCase
private function getData($input)
{
$targets = array_column($input, 4);
array_walk($input, function (&$v) {
array_walk($input, function (&$v): void {
array_splice($v, 4, 1);
});
@ -44,14 +44,14 @@ class DecisionTreeTest extends TestCase
public function testPredictSingleSample()
{
list($data, $targets) = $this->getData($this->data);
[$data, $targets] = $this->getData($this->data);
$classifier = new DecisionTree(5);
$classifier->train($data, $targets);
$this->assertEquals('Dont_play', $classifier->predict(['sunny', 78, 72, 'false']));
$this->assertEquals('Play', $classifier->predict(['overcast', 60, 60, 'false']));
$this->assertEquals('Dont_play', $classifier->predict(['rain', 60, 60, 'true']));
list($data, $targets) = $this->getData($this->extraData);
[$data, $targets] = $this->getData($this->extraData);
$classifier->train($data, $targets);
$this->assertEquals('Dont_play', $classifier->predict(['scorching', 95, 90, 'true']));
$this->assertEquals('Play', $classifier->predict(['overcast', 60, 60, 'false']));
@ -59,9 +59,9 @@ class DecisionTreeTest extends TestCase
return $classifier;
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
list($data, $targets) = $this->getData($this->data);
[$data, $targets] = $this->getData($this->data);
$classifier = new DecisionTree(5);
$classifier->train($data, $targets);
@ -78,9 +78,9 @@ class DecisionTreeTest extends TestCase
$this->assertEquals($predicted, $restoredClassifier->predict($testSamples));
}
public function testTreeDepth()
public function testTreeDepth(): void
{
list($data, $targets) = $this->getData($this->data);
[$data, $targets] = $this->getData($this->data);
$classifier = new DecisionTree(5);
$classifier->train($data, $targets);
$this->assertTrue(5 >= $classifier->actualDepth);

View File

@ -42,7 +42,7 @@ class AdaBoostTest extends TestCase
return $classifier;
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
// Instantinate new Percetron trained for OR problem
$samples = [[0, 0], [1, 0], [0, 1], [1, 1]];

View File

@ -36,7 +36,7 @@ class BaggingTest extends TestCase
public function testPredictSingleSample()
{
list($data, $targets) = $this->getData($this->data);
[$data, $targets] = $this->getData($this->data);
$classifier = $this->getClassifier();
// Testing with default options
$classifier->train($data, $targets);
@ -44,7 +44,7 @@ class BaggingTest extends TestCase
$this->assertEquals('Play', $classifier->predict(['overcast', 60, 60, 'false']));
$this->assertEquals('Dont_play', $classifier->predict(['rain', 60, 60, 'true']));
list($data, $targets) = $this->getData($this->extraData);
[$data, $targets] = $this->getData($this->extraData);
$classifier->train($data, $targets);
$this->assertEquals('Dont_play', $classifier->predict(['scorching', 95, 90, 'true']));
$this->assertEquals('Play', $classifier->predict(['overcast', 60, 60, 'false']));
@ -52,9 +52,9 @@ class BaggingTest extends TestCase
return $classifier;
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
list($data, $targets) = $this->getData($this->data);
[$data, $targets] = $this->getData($this->data);
$classifier = $this->getClassifier(5);
$classifier->train($data, $targets);
@ -71,9 +71,9 @@ class BaggingTest extends TestCase
$this->assertEquals($predicted, $restoredClassifier->predict($testSamples));
}
public function testBaseClassifiers()
public function testBaseClassifiers(): void
{
list($data, $targets) = $this->getData($this->data);
[$data, $targets] = $this->getData($this->data);
$baseClassifiers = $this->getAvailableBaseClassifiers();
foreach ($baseClassifiers as $base => $params) {
@ -119,7 +119,7 @@ class BaggingTest extends TestCase
}
shuffle($populated);
$targets = array_column($populated, 4);
array_walk($populated, function (&$v) {
array_walk($populated, function (&$v): void {
array_splice($v, 4, 1);
});

View File

@ -23,7 +23,7 @@ class RandomForestTest extends BaggingTest
return [DecisionTree::class => ['depth' => 5]];
}
public function testOtherBaseClassifier()
public function testOtherBaseClassifier(): void
{
try {
$classifier = new RandomForest();

View File

@ -11,7 +11,7 @@ use PHPUnit\Framework\TestCase;
class KNearestNeighborsTest extends TestCase
{
public function testPredictSingleSampleWithDefaultK()
public function testPredictSingleSampleWithDefaultK(): void
{
$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];
@ -30,7 +30,7 @@ class KNearestNeighborsTest extends TestCase
$this->assertEquals('a', $classifier->predict([3, 10]));
}
public function testPredictArrayOfSamples()
public function testPredictArrayOfSamples(): void
{
$trainSamples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$trainLabels = ['a', 'a', 'a', 'b', 'b', 'b'];
@ -45,7 +45,7 @@ class KNearestNeighborsTest extends TestCase
$this->assertEquals($testLabels, $predicted);
}
public function testPredictArrayOfSamplesUsingChebyshevDistanceMetric()
public function testPredictArrayOfSamplesUsingChebyshevDistanceMetric(): void
{
$trainSamples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$trainLabels = ['a', 'a', 'a', 'b', 'b', 'b'];
@ -60,7 +60,7 @@ class KNearestNeighborsTest extends TestCase
$this->assertEquals($testLabels, $predicted);
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
$trainSamples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$trainLabels = ['a', 'a', 'a', 'b', 'b', 'b'];

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\TestCase;
class AdalineTest extends TestCase
{
public function testPredictSingleSample()
public function testPredictSingleSample(): void
{
// AND problem
$samples = [[0, 0], [1, 0], [0, 1], [1, 1]];
@ -64,7 +64,7 @@ class AdalineTest extends TestCase
$this->assertEquals(1, $classifier->predict([3.0, 9.5]));
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
// Instantinate new Percetron trained for OR problem
$samples = [[0, 0], [1, 0], [0, 1], [1, 1]];

View File

@ -53,7 +53,7 @@ class DecisionStumpTest extends TestCase
return $classifier;
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
// Instantinate new Percetron trained for OR problem
$samples = [[0, 0], [1, 0], [0, 1], [1, 1]];

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\TestCase;
class PerceptronTest extends TestCase
{
public function testPredictSingleSample()
public function testPredictSingleSample(): void
{
// AND problem
$samples = [[0, 0], [1, 0], [0, 1], [1, 1], [0.6, 0.6]];
@ -67,7 +67,7 @@ class PerceptronTest extends TestCase
$this->assertEquals(1, $classifier->predict([3.0, 9.5]));
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
// Instantinate new Percetron trained for OR problem
$samples = [[0, 0], [1, 0], [0, 1], [1, 1]];

View File

@ -11,7 +11,7 @@ use PHPUnit\Framework\TestCase;
class MLPClassifierTest extends TestCase
{
public function testMLPClassifierLayersInitialization()
public function testMLPClassifierLayersInitialization(): void
{
$mlp = new MLPClassifier(2, [2], [0, 1]);
@ -32,7 +32,7 @@ class MLPClassifierTest extends TestCase
$this->assertContainsOnly(Neuron::class, $layers[2]->getNodes());
}
public function testSynapsesGeneration()
public function testSynapsesGeneration(): void
{
$mlp = new MLPClassifier(2, [2], [0, 1]);
$layers = $mlp->getLayers();
@ -50,7 +50,7 @@ class MLPClassifierTest extends TestCase
}
}
public function testBackpropagationLearning()
public function testBackpropagationLearning(): void
{
// Single layer 2 classes.
$network = new MLPClassifier(2, [2], ['a', 'b']);
@ -65,7 +65,7 @@ class MLPClassifierTest extends TestCase
$this->assertEquals('b', $network->predict([0, 0]));
}
public function testBackpropagationTrainingReset()
public function testBackpropagationTrainingReset(): void
{
// Single layer 2 classes.
$network = new MLPClassifier(2, [2], ['a', 'b'], 1000);
@ -86,7 +86,7 @@ class MLPClassifierTest extends TestCase
$this->assertEquals('a', $network->predict([0, 1]));
}
public function testBackpropagationPartialTraining()
public function testBackpropagationPartialTraining(): void
{
// Single layer 2 classes.
$network = new MLPClassifier(2, [2], ['a', 'b'], 1000);
@ -109,7 +109,7 @@ class MLPClassifierTest extends TestCase
$this->assertEquals('b', $network->predict([0, 0]));
}
public function testBackpropagationLearningMultilayer()
public function testBackpropagationLearningMultilayer(): void
{
// Multi-layer 2 classes.
$network = new MLPClassifier(5, [3, 2], ['a', 'b']);
@ -124,7 +124,7 @@ class MLPClassifierTest extends TestCase
$this->assertEquals('b', $network->predict([0, 0, 0, 0, 0]));
}
public function testBackpropagationLearningMulticlass()
public function testBackpropagationLearningMulticlass(): void
{
// Multi-layer more than 2 classes.
$network = new MLPClassifier(5, [3, 2], ['a', 'b', 4]);
@ -140,7 +140,7 @@ class MLPClassifierTest extends TestCase
$this->assertEquals(4, $network->predict([0, 0, 0, 0, 0]));
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
// Instantinate new Percetron trained for OR problem
$samples = [[0, 0], [1, 0], [0, 1], [1, 1]];
@ -163,7 +163,7 @@ class MLPClassifierTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidLayersNumber()
public function testThrowExceptionOnInvalidLayersNumber(): void
{
new MLPClassifier(2, [], [0, 1]);
}
@ -171,7 +171,7 @@ class MLPClassifierTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidPartialTrainingClasses()
public function testThrowExceptionOnInvalidPartialTrainingClasses(): void
{
$classifier = new MLPClassifier(2, [2], [0, 1]);
$classifier->partialTrain(
@ -184,7 +184,7 @@ class MLPClassifierTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidClassesNumber()
public function testThrowExceptionOnInvalidClassesNumber(): void
{
new MLPClassifier(2, [2], [0]);
}

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\TestCase;
class NaiveBayesTest extends TestCase
{
public function testPredictSingleSample()
public function testPredictSingleSample(): void
{
$samples = [[5, 1, 1], [1, 5, 1], [1, 1, 5]];
$labels = ['a', 'b', 'c'];
@ -23,7 +23,7 @@ class NaiveBayesTest extends TestCase
$this->assertEquals('c', $classifier->predict([1, 1, 6]));
}
public function testPredictArrayOfSamples()
public function testPredictArrayOfSamples(): void
{
$trainSamples = [[5, 1, 1], [1, 5, 1], [1, 1, 5]];
$trainLabels = ['a', 'b', 'c'];
@ -47,7 +47,7 @@ class NaiveBayesTest extends TestCase
$this->assertEquals($testLabels, $classifier->predict($testSamples));
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
$trainSamples = [[5, 1, 1], [1, 5, 1], [1, 1, 5]];
$trainLabels = ['a', 'b', 'c'];

View File

@ -11,7 +11,7 @@ use PHPUnit\Framework\TestCase;
class SVCTest extends TestCase
{
public function testPredictSingleSampleWithLinearKernel()
public function testPredictSingleSampleWithLinearKernel(): void
{
$samples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$labels = ['a', 'a', 'a', 'b', 'b', 'b'];
@ -30,7 +30,7 @@ class SVCTest extends TestCase
$this->assertEquals('a', $classifier->predict([3, 10]));
}
public function testPredictArrayOfSamplesWithLinearKernel()
public function testPredictArrayOfSamplesWithLinearKernel(): void
{
$trainSamples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$trainLabels = ['a', 'a', 'a', 'b', 'b', 'b'];
@ -45,7 +45,7 @@ class SVCTest extends TestCase
$this->assertEquals($testLabels, $predictions);
}
public function testSaveAndRestore()
public function testSaveAndRestore(): void
{
$trainSamples = [[1, 3], [1, 4], [2, 4], [3, 1], [4, 1], [4, 2]];
$trainLabels = ['a', 'a', 'a', 'b', 'b', 'b'];

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class DBSCANTest extends TestCase
{
public function testDBSCANSamplesClustering()
public function testDBSCANSamplesClustering(): void
{
$samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]];
$clustered = [
@ -32,7 +32,7 @@ class DBSCANTest extends TestCase
$this->assertEquals($clustered, $dbscan->cluster($samples));
}
public function testDBSCANSamplesClusteringAssociative()
public function testDBSCANSamplesClusteringAssociative(): void
{
$samples = ['a' => [1, 1], 'b' => [9, 9], 'c' => [1, 2], 'd' => [9, 8], 'e' => [7, 7], 'f' => [8, 7]];
$clustered = [

View File

@ -25,7 +25,7 @@ class FuzzyCMeansTest extends TestCase
return $fcm;
}
public function testMembershipMatrix()
public function testMembershipMatrix(): void
{
$fcm = $this->testFCMSamplesClustering();
$clusterCount = 2;

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class KMeansTest extends TestCase
{
public function testKMeansSamplesClustering()
public function testKMeansSamplesClustering(): void
{
$samples = [[1, 1], [8, 7], [1, 2], [7, 8], [2, 1], [8, 9]];
@ -26,7 +26,7 @@ class KMeansTest extends TestCase
$this->assertCount(0, $samples);
}
public function testKMeansInitializationMethods()
public function testKMeansInitializationMethods(): void
{
$samples = [
[180, 155], [186, 159], [119, 185], [141, 147], [157, 158],
@ -53,7 +53,7 @@ class KMeansTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidClusterNumber()
public function testThrowExceptionOnInvalidClusterNumber(): void
{
new KMeans(0);
}

View File

@ -13,7 +13,7 @@ class RandomSplitTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnToSmallTestSize()
public function testThrowExceptionOnToSmallTestSize(): void
{
new RandomSplit(new ArrayDataset([], []), 0);
}
@ -21,12 +21,12 @@ class RandomSplitTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnToBigTestSize()
public function testThrowExceptionOnToBigTestSize(): void
{
new RandomSplit(new ArrayDataset([], []), 1);
}
public function testDatasetRandomSplitWithoutSeed()
public function testDatasetRandomSplitWithoutSeed(): void
{
$dataset = new ArrayDataset(
$samples = [[1], [2], [3], [4]],
@ -44,7 +44,7 @@ class RandomSplitTest extends TestCase
$this->assertCount(3, $randomSplit2->getTrainSamples());
}
public function testDatasetRandomSplitWithSameSeed()
public function testDatasetRandomSplitWithSameSeed(): void
{
$dataset = new ArrayDataset(
$samples = [[1], [2], [3], [4], [5], [6], [7], [8]],
@ -62,7 +62,7 @@ class RandomSplitTest extends TestCase
$this->assertEquals($randomSplit1->getTrainSamples(), $randomSplit2->getTrainSamples());
}
public function testDatasetRandomSplitWithDifferentSeed()
public function testDatasetRandomSplitWithDifferentSeed(): void
{
$dataset = new ArrayDataset(
$samples = [[1], [2], [3], [4], [5], [6], [7], [8]],
@ -78,7 +78,7 @@ class RandomSplitTest extends TestCase
$this->assertNotEquals($randomSplit1->getTrainSamples(), $randomSplit2->getTrainSamples());
}
public function testRandomSplitCorrectSampleAndLabelPosition()
public function testRandomSplitCorrectSampleAndLabelPosition(): void
{
$dataset = new ArrayDataset(
$samples = [[1], [2], [3], [4]],

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\TestCase;
class StratifiedRandomSplitTest extends TestCase
{
public function testDatasetStratifiedRandomSplitWithEvenDistribution()
public function testDatasetStratifiedRandomSplitWithEvenDistribution(): void
{
$dataset = new ArrayDataset(
$samples = [[1], [2], [3], [4], [5], [6], [7], [8]],
@ -28,7 +28,7 @@ class StratifiedRandomSplitTest extends TestCase
$this->assertEquals(1, $this->countSamplesByTarget($split->getTestLabels(), 'b'));
}
public function testDatasetStratifiedRandomSplitWithEvenDistributionAndNumericTargets()
public function testDatasetStratifiedRandomSplitWithEvenDistributionAndNumericTargets(): void
{
$dataset = new ArrayDataset(
$samples = [[1], [2], [3], [4], [5], [6], [7], [8]],

View File

@ -12,12 +12,12 @@ class ArrayDatasetTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidArgumentsSize()
public function testThrowExceptionOnInvalidArgumentsSize(): void
{
new ArrayDataset([0, 1], [0]);
}
public function testArrayDataset()
public function testArrayDataset(): void
{
$dataset = new ArrayDataset(
$samples = [[1], [2], [3], [4]],

View File

@ -12,12 +12,12 @@ class CsvDatasetTest extends TestCase
/**
* @expectedException \Phpml\Exception\FileException
*/
public function testThrowExceptionOnMissingFile()
public function testThrowExceptionOnMissingFile(): void
{
new CsvDataset('missingFile', 3);
}
public function testSampleCsvDatasetWithHeaderRow()
public function testSampleCsvDatasetWithHeaderRow(): void
{
$filePath = dirname(__FILE__).'/Resources/dataset.csv';
@ -27,7 +27,7 @@ class CsvDatasetTest extends TestCase
$this->assertCount(10, $dataset->getTargets());
}
public function testSampleCsvDatasetWithoutHeaderRow()
public function testSampleCsvDatasetWithoutHeaderRow(): void
{
$filePath = dirname(__FILE__).'/Resources/dataset.csv';
@ -37,7 +37,7 @@ class CsvDatasetTest extends TestCase
$this->assertCount(11, $dataset->getTargets());
}
public function testLongCsvDataset()
public function testLongCsvDataset(): void
{
$filePath = dirname(__FILE__).'/Resources/longdataset.csv';

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class GlassDatasetTest extends TestCase
{
public function testLoadingWineDataset()
public function testLoadingWineDataset(): void
{
$glass = new GlassDataset();

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class IrisDatasetTest extends TestCase
{
public function testLoadingIrisDataset()
public function testLoadingIrisDataset(): void
{
$iris = new IrisDataset();

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class WineDatasetTest extends TestCase
{
public function testLoadingWineDataset()
public function testLoadingWineDataset(): void
{
$wine = new WineDataset();

View File

@ -12,12 +12,12 @@ class FilesDatasetTest extends TestCase
/**
* @expectedException \Phpml\Exception\DatasetException
*/
public function testThrowExceptionOnMissingRootFolder()
public function testThrowExceptionOnMissingRootFolder(): void
{
new FilesDataset('some/not/existed/path');
}
public function testLoadFilesDatasetWithBBCData()
public function testLoadFilesDatasetWithBBCData(): void
{
$rootPath = dirname(__FILE__).'/Resources/bbc';

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class KernelPCATest extends TestCase
{
public function testKernelPCA()
public function testKernelPCA(): void
{
// Acceptable error
$epsilon = 0.001;
@ -37,7 +37,7 @@ class KernelPCATest extends TestCase
// Due to the fact that the sign of values can be flipped
// during the calculation of eigenValues, we have to compare
// absolute value of the values
array_map(function ($val1, $val2) use ($epsilon) {
array_map(function ($val1, $val2) use ($epsilon): void {
$this->assertEquals(abs($val1), abs($val2), '', $epsilon);
}, $transformed, $reducedData);

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\TestCase;
class LDATest extends TestCase
{
public function testLDA()
public function testLDA(): void
{
// Acceptable error
$epsilon = 0.001;
@ -43,7 +43,7 @@ class LDATest extends TestCase
$control = array_merge($control, array_slice($transformed, 0, 3));
$control = array_merge($control, array_slice($transformed, -3));
$check = function ($row1, $row2) use ($epsilon) {
$check = function ($row1, $row2) use ($epsilon): void {
// Due to the fact that the sign of values can be flipped
// during the calculation of eigenValues, we have to compare
// absolute value of the values

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class PCATest extends TestCase
{
public function testPCA()
public function testPCA(): void
{
// Acceptable error
$epsilon = 0.001;
@ -39,7 +39,7 @@ class PCATest extends TestCase
// Due to the fact that the sign of values can be flipped
// during the calculation of eigenValues, we have to compare
// absolute value of the values
array_map(function ($val1, $val2) use ($epsilon) {
array_map(function ($val1, $val2) use ($epsilon): void {
$this->assertEquals(abs($val1), abs($val2), '', $epsilon);
}, $transformed, $reducedData);
@ -49,7 +49,7 @@ class PCATest extends TestCase
$newRow = [[$transformed[$i]]];
$newRow2 = $pca->transform($row);
array_map(function ($val1, $val2) use ($epsilon) {
array_map(function ($val1, $val2) use ($epsilon): void {
$this->assertEquals(abs($val1), abs($val2), '', $epsilon);
}, $newRow, $newRow2);
}

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class StopWordsTest extends TestCase
{
public function testCustomStopWords()
public function testCustomStopWords(): void
{
$stopWords = new StopWords(['lorem', 'ipsum', 'dolor']);
@ -25,12 +25,12 @@ class StopWordsTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidLanguage()
public function testThrowExceptionOnInvalidLanguage(): void
{
StopWords::factory('Lorem');
}
public function testEnglishStopWords()
public function testEnglishStopWords(): void
{
$stopWords = StopWords::factory('English');
@ -38,7 +38,7 @@ class StopWordsTest extends TestCase
$this->assertFalse($stopWords->isStopWord('strategy'));
}
public function testPolishStopWords()
public function testPolishStopWords(): void
{
$stopWords = StopWords::factory('Polish');
@ -46,7 +46,7 @@ class StopWordsTest extends TestCase
$this->assertFalse($stopWords->isStopWord('transhumanizm'));
}
public function testFrenchStopWords()
public function testFrenchStopWords(): void
{
$stopWords = StopWords::factory('French');

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class TfIdfTransformerTest extends TestCase
{
public function testTfIdfTransformation()
public function testTfIdfTransformation(): void
{
// https://en.wikipedia.org/wiki/Tf-idf

View File

@ -11,7 +11,7 @@ use PHPUnit\Framework\TestCase;
class TokenCountVectorizerTest extends TestCase
{
public function testTransformationWithWhitespaceTokenizer()
public function testTransformationWithWhitespaceTokenizer(): void
{
$samples = [
'Lorem ipsum dolor sit amet dolor',
@ -47,7 +47,7 @@ class TokenCountVectorizerTest extends TestCase
$this->assertSame($tokensCounts, $samples);
}
public function testTransformationWithMinimumDocumentTokenCountFrequency()
public function testTransformationWithMinimumDocumentTokenCountFrequency(): void
{
// word at least in half samples
$samples = [
@ -100,7 +100,7 @@ class TokenCountVectorizerTest extends TestCase
$this->assertSame($tokensCounts, $samples);
}
public function testTransformationWithStopWords()
public function testTransformationWithStopWords(): void
{
$samples = [
'Lorem ipsum dolor sit amet dolor',

View File

@ -15,7 +15,7 @@ class ComparisonTest extends TestCase
*
* @dataProvider provideData
*/
public function testResult($a, $b, string $operator, bool $expected)
public function testResult($a, $b, string $operator, bool $expected): void
{
$result = Comparison::compare($a, $b, $operator);
@ -26,7 +26,7 @@ class ComparisonTest extends TestCase
* @expectedException \Phpml\Exception\InvalidArgumentException
* @expectedExceptionMessage Invalid operator "~=" provided
*/
public function testThrowExceptionWhenOperatorIsInvalid()
public function testThrowExceptionWhenOperatorIsInvalid(): void
{
Comparison::compare(1, 1, '~=');
}

View File

@ -14,7 +14,7 @@ class ChebyshevTest extends TestCase
*/
private $distanceMetric;
public function setUp()
public function setUp(): void
{
$this->distanceMetric = new Chebyshev();
}
@ -22,7 +22,7 @@ class ChebyshevTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidArguments()
public function testThrowExceptionOnInvalidArguments(): void
{
$a = [0, 1, 2];
$b = [0, 2];
@ -30,7 +30,7 @@ class ChebyshevTest extends TestCase
$this->distanceMetric->distance($a, $b);
}
public function testCalculateDistanceForOneDimension()
public function testCalculateDistanceForOneDimension(): void
{
$a = [4];
$b = [2];
@ -41,7 +41,7 @@ class ChebyshevTest extends TestCase
$this->assertEquals($expectedDistance, $actualDistance);
}
public function testCalculateDistanceForTwoDimensions()
public function testCalculateDistanceForTwoDimensions(): void
{
$a = [4, 6];
$b = [2, 5];
@ -52,7 +52,7 @@ class ChebyshevTest extends TestCase
$this->assertEquals($expectedDistance, $actualDistance);
}
public function testCalculateDistanceForThreeDimensions()
public function testCalculateDistanceForThreeDimensions(): void
{
$a = [6, 10, 3];
$b = [2, 5, 5];

View File

@ -14,7 +14,7 @@ class EuclideanTest extends TestCase
*/
private $distanceMetric;
public function setUp()
public function setUp(): void
{
$this->distanceMetric = new Euclidean();
}
@ -22,7 +22,7 @@ class EuclideanTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidArguments()
public function testThrowExceptionOnInvalidArguments(): void
{
$a = [0, 1, 2];
$b = [0, 2];
@ -30,7 +30,7 @@ class EuclideanTest extends TestCase
$this->distanceMetric->distance($a, $b);
}
public function testCalculateDistanceForOneDimension()
public function testCalculateDistanceForOneDimension(): void
{
$a = [4];
$b = [2];
@ -41,7 +41,7 @@ class EuclideanTest extends TestCase
$this->assertEquals($expectedDistance, $actualDistance);
}
public function testCalculateDistanceForTwoDimensions()
public function testCalculateDistanceForTwoDimensions(): void
{
$a = [4, 6];
$b = [2, 5];
@ -52,7 +52,7 @@ class EuclideanTest extends TestCase
$this->assertEquals($expectedDistance, $actualDistance);
}
public function testCalculateDistanceForThreeDimensions()
public function testCalculateDistanceForThreeDimensions(): void
{
$a = [6, 10, 3];
$b = [2, 5, 5];

View File

@ -14,7 +14,7 @@ class ManhattanTest extends TestCase
*/
private $distanceMetric;
public function setUp()
public function setUp(): void
{
$this->distanceMetric = new Manhattan();
}
@ -22,7 +22,7 @@ class ManhattanTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidArguments()
public function testThrowExceptionOnInvalidArguments(): void
{
$a = [0, 1, 2];
$b = [0, 2];
@ -30,7 +30,7 @@ class ManhattanTest extends TestCase
$this->distanceMetric->distance($a, $b);
}
public function testCalculateDistanceForOneDimension()
public function testCalculateDistanceForOneDimension(): void
{
$a = [4];
$b = [2];
@ -41,7 +41,7 @@ class ManhattanTest extends TestCase
$this->assertEquals($expectedDistance, $actualDistance);
}
public function testCalculateDistanceForTwoDimensions()
public function testCalculateDistanceForTwoDimensions(): void
{
$a = [4, 6];
$b = [2, 5];
@ -52,7 +52,7 @@ class ManhattanTest extends TestCase
$this->assertEquals($expectedDistance, $actualDistance);
}
public function testCalculateDistanceForThreeDimensions()
public function testCalculateDistanceForThreeDimensions(): void
{
$a = [6, 10, 3];
$b = [2, 5, 5];

View File

@ -14,7 +14,7 @@ class MinkowskiTest extends TestCase
*/
private $distanceMetric;
public function setUp()
public function setUp(): void
{
$this->distanceMetric = new Minkowski();
}
@ -22,7 +22,7 @@ class MinkowskiTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidArguments()
public function testThrowExceptionOnInvalidArguments(): void
{
$a = [0, 1, 2];
$b = [0, 2];
@ -30,7 +30,7 @@ class MinkowskiTest extends TestCase
$this->distanceMetric->distance($a, $b);
}
public function testCalculateDistanceForOneDimension()
public function testCalculateDistanceForOneDimension(): void
{
$a = [4];
$b = [2];
@ -41,7 +41,7 @@ class MinkowskiTest extends TestCase
$this->assertEquals($expectedDistance, $actualDistance);
}
public function testCalculateDistanceForTwoDimensions()
public function testCalculateDistanceForTwoDimensions(): void
{
$a = [4, 6];
$b = [2, 5];
@ -52,7 +52,7 @@ class MinkowskiTest extends TestCase
$this->assertEquals($expectedDistance, $actualDistance, '', $delta = 0.001);
}
public function testCalculateDistanceForThreeDimensions()
public function testCalculateDistanceForThreeDimensions(): void
{
$a = [6, 10, 3];
$b = [2, 5, 5];
@ -63,7 +63,7 @@ class MinkowskiTest extends TestCase
$this->assertEquals($expectedDistance, $actualDistance, '', $delta = 0.001);
}
public function testCalculateDistanceForThreeDimensionsWithDifferentLambda()
public function testCalculateDistanceForThreeDimensionsWithDifferentLambda(): void
{
$distanceMetric = new Minkowski($lambda = 5);

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class RBFTest extends TestCase
{
public function testComputeRBFKernelFunction()
public function testComputeRBFKernelFunction(): void
{
$rbf = new RBF($gamma = 0.001);

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\TestCase;
class EigenDecompositionTest extends TestCase
{
public function testSymmetricMatrixEigenPairs()
public function testSymmetricMatrixEigenPairs(): void
{
// Acceptable error
$epsilon = 0.001;

View File

@ -12,12 +12,12 @@ class MatrixTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidMatrixSupplied()
public function testThrowExceptionOnInvalidMatrixSupplied(): void
{
new Matrix([[1, 2], [3]]);
}
public function testCreateMatrixFromFlatArray()
public function testCreateMatrixFromFlatArray(): void
{
$flatArray = [1, 2, 3, 4];
$matrix = Matrix::fromFlatArray($flatArray);
@ -32,7 +32,7 @@ class MatrixTest extends TestCase
/**
* @expectedException \Phpml\Exception\MatrixException
*/
public function testThrowExceptionOnInvalidColumnNumber()
public function testThrowExceptionOnInvalidColumnNumber(): void
{
$matrix = new Matrix([[1, 2, 3], [4, 5, 6]]);
$matrix->getColumnValues(4);
@ -41,13 +41,13 @@ class MatrixTest extends TestCase
/**
* @expectedException \Phpml\Exception\MatrixException
*/
public function testThrowExceptionOnGetDeterminantIfArrayIsNotSquare()
public function testThrowExceptionOnGetDeterminantIfArrayIsNotSquare(): void
{
$matrix = new Matrix([[1, 2, 3], [4, 5, 6]]);
$matrix->getDeterminant();
}
public function testGetMatrixDeterminant()
public function testGetMatrixDeterminant(): void
{
//http://matrix.reshish.com/determinant.php
$matrix = new Matrix([
@ -68,7 +68,7 @@ class MatrixTest extends TestCase
$this->assertEquals(1116.5035, $matrix->getDeterminant(), '', $delta = 0.0001);
}
public function testMatrixTranspose()
public function testMatrixTranspose(): void
{
$matrix = new Matrix([
[3, 3, 3],
@ -88,7 +88,7 @@ class MatrixTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnMultiplyWhenInconsistentMatrixSupplied()
public function testThrowExceptionOnMultiplyWhenInconsistentMatrixSupplied(): void
{
$matrix1 = new Matrix([[1, 2, 3], [4, 5, 6]]);
$matrix2 = new Matrix([[3, 2, 1], [6, 5, 4]]);
@ -96,7 +96,7 @@ class MatrixTest extends TestCase
$matrix1->multiply($matrix2);
}
public function testMatrixMultiplyByMatrix()
public function testMatrixMultiplyByMatrix(): void
{
$matrix1 = new Matrix([
[1, 2, 3],
@ -117,7 +117,7 @@ class MatrixTest extends TestCase
$this->assertEquals($product, $matrix1->multiply($matrix2)->toArray());
}
public function testDivideByScalar()
public function testDivideByScalar(): void
{
$matrix = new Matrix([
[4, 6, 8],
@ -135,7 +135,7 @@ class MatrixTest extends TestCase
/**
* @expectedException \Phpml\Exception\MatrixException
*/
public function testThrowExceptionWhenInverseIfArrayIsNotSquare()
public function testThrowExceptionWhenInverseIfArrayIsNotSquare(): void
{
$matrix = new Matrix([[1, 2, 3], [4, 5, 6]]);
$matrix->inverse();
@ -144,7 +144,7 @@ class MatrixTest extends TestCase
/**
* @expectedException \Phpml\Exception\MatrixException
*/
public function testThrowExceptionWhenInverseIfMatrixIsSingular()
public function testThrowExceptionWhenInverseIfMatrixIsSingular(): void
{
$matrix = new Matrix([
[0, 0, 0],
@ -155,7 +155,7 @@ class MatrixTest extends TestCase
$matrix->inverse();
}
public function testInverseMatrix()
public function testInverseMatrix(): void
{
//http://ncalculators.com/matrix/inverse-matrix.htm
$matrix = new Matrix([
@ -173,7 +173,7 @@ class MatrixTest extends TestCase
$this->assertEquals($inverseMatrix, $matrix->inverse()->toArray(), '', $delta = 0.0001);
}
public function testCrossOutMatrix()
public function testCrossOutMatrix(): void
{
$matrix = new Matrix([
[3, 4, 2],
@ -189,14 +189,14 @@ class MatrixTest extends TestCase
$this->assertEquals($crossOuted, $matrix->crossOut(1, 1)->toArray());
}
public function testToScalar()
public function testToScalar(): void
{
$matrix = new Matrix([[1, 2, 3], [3, 2, 3]]);
$this->assertEquals($matrix->toScalar(), 1);
}
public function testMultiplyByScalar()
public function testMultiplyByScalar(): void
{
$matrix = new Matrix([
[4, 6, 8],
@ -211,7 +211,7 @@ class MatrixTest extends TestCase
$this->assertEquals($result, $matrix->multiplyByScalar(-2)->toArray());
}
public function testAdd()
public function testAdd(): void
{
$array1 = [1, 1, 1];
$array2 = [2, 2, 2];
@ -223,7 +223,7 @@ class MatrixTest extends TestCase
$this->assertEquals($result, $m1->add($m2)->toArray()[0]);
}
public function testSubtract()
public function testSubtract(): void
{
$array1 = [1, 1, 1];
$array2 = [2, 2, 2];
@ -235,7 +235,7 @@ class MatrixTest extends TestCase
$this->assertEquals($result, $m1->subtract($m2)->toArray()[0]);
}
public function testTransposeArray()
public function testTransposeArray(): void
{
$array = [
[1, 1, 1],
@ -250,7 +250,7 @@ class MatrixTest extends TestCase
$this->assertEquals($transposed, Matrix::transposeArray($array));
}
public function testDot()
public function testDot(): void
{
$vect1 = [2, 2, 2];
$vect2 = [3, 3, 3];

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class ProductTest extends TestCase
{
public function testScalarProduct()
public function testScalarProduct(): void
{
$this->assertEquals(10, Product::scalar([2, 3], [-1, 4]));
$this->assertEquals(-0.1, Product::scalar([1, 4, 1], [-2, 0.5, -0.1]));

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class SetTest extends TestCase
{
public function testUnion()
public function testUnion(): void
{
$union = Set::union(new Set([3, 1]), new Set([3, 2, 2]));
@ -18,7 +18,7 @@ class SetTest extends TestCase
$this->assertEquals(3, $union->cardinality());
}
public function testIntersection()
public function testIntersection(): void
{
$intersection = Set::intersection(new Set(['C', 'A']), new Set(['B', 'C']));
@ -27,7 +27,7 @@ class SetTest extends TestCase
$this->assertEquals(1, $intersection->cardinality());
}
public function testDifference()
public function testDifference(): void
{
$difference = Set::difference(new Set(['C', 'A', 'B']), new Set(['A']));
@ -36,7 +36,7 @@ class SetTest extends TestCase
$this->assertEquals(2, $difference->cardinality());
}
public function testPower()
public function testPower(): void
{
$power = Set::power(new Set(['A', 'B']));
@ -45,7 +45,7 @@ class SetTest extends TestCase
$this->assertCount(4, $power);
}
public function testCartesian()
public function testCartesian(): void
{
$cartesian = Set::cartesian(new Set(['A']), new Set([1, 2]));
@ -54,7 +54,7 @@ class SetTest extends TestCase
$this->assertCount(2, $cartesian);
}
public function testContains()
public function testContains(): void
{
$set = new Set(['B', 'A', 2, 1]);
@ -65,21 +65,21 @@ class SetTest extends TestCase
$this->assertFalse($set->containsAll(['A', 'B', 'C']));
}
public function testRemove()
public function testRemove(): void
{
$set = new Set(['B', 'A', 2, 1]);
$this->assertEquals((new Set([1, 2, 2, 2, 'B']))->toArray(), $set->remove('A')->toArray());
}
public function testAdd()
public function testAdd(): void
{
$set = new Set(['B', 'A', 2, 1]);
$set->addAll(['foo', 'bar']);
$this->assertEquals(6, $set->cardinality());
}
public function testEmpty()
public function testEmpty(): void
{
$set = new Set([1, 2]);
$set->removeAll([2, 1]);
@ -87,7 +87,7 @@ class SetTest extends TestCase
$this->assertTrue($set->isEmpty());
}
public function testToArray()
public function testToArray(): void
{
$set = new Set([1, 2, 2, 3, 'A', false, '', 1.1, -1, -10, 'B']);

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class CorrelationTest extends TestCase
{
public function testPearsonCorrelation()
public function testPearsonCorrelation(): void
{
//http://www.stat.wmich.edu/s216/book/node126.html
$delta = 0.001;
@ -32,7 +32,7 @@ class CorrelationTest extends TestCase
/**
* @expectedException \Phpml\Exception\InvalidArgumentException
*/
public function testThrowExceptionOnInvalidArgumentsForPearsonCorrelation()
public function testThrowExceptionOnInvalidArgumentsForPearsonCorrelation(): void
{
Correlation::pearson([1, 2, 4], [3, 5]);
}

View File

@ -10,7 +10,7 @@ use PHPUnit\Framework\TestCase;
class CovarianceTest extends TestCase
{
public function testSimpleCovariance()
public function testSimpleCovariance(): void
{
// Acceptable error
$epsilon = 0.001;

View File

@ -9,7 +9,7 @@ use PHPUnit\Framework\TestCase;
class GaussianTest extends TestCase
{
public function testPdf()
public function testPdf(): void
{
$std = 1.0;
$mean = 0.0;

Some files were not shown because too many files have changed in this diff Show More