diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d63879ebd..7883bb169 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -78,9 +78,10 @@ jobs:
run: composer phplint
- name: Static Analysis
- run: composer analyze
+ run: composer analyze-ci
- name: Unit Tests
+ #run: vendor/bin/phpunit --display-warning --display-deprecations --display-notices --testsuite="Anomaly Detectors,Backends,Base,Classifiers,Clusterers,Cross Validation,Datasets,Extractors,Graph,Helpers,Kernels,Loggers,NeuralNet,Persisters,Regressors,Serializers,Specifications,Strategies,Tokenizers,Transformers"
run: composer test
- name: Check Coding Style
diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php
index 4b937f950..388deb0c2 100644
--- a/.php-cs-fixer.dist.php
+++ b/.php-cs-fixer.dist.php
@@ -58,6 +58,7 @@
],
'native_function_casing' => true,
'native_type_declaration_casing' => true,
+ 'new_expression_parentheses' => false,
'new_with_parentheses' => true,
'no_alternative_syntax' => true,
'no_blank_lines_after_class_opening' => true,
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ba75cc2ef..6f8d9dbd7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,10 @@
- RBX Serializer only tracks major library version number
- Convert NeuralNet classes to use NDArray instead of Matrix
- Converted Network back from a class to an interface
+ - Added array_pack() function to replace array_map('array_values', $samples)
+ - Converted Regressor classes to use NDArray instead of Matrix
+ - Added benchmark tests for Activation Functions, based on NDArray
+ - Added benchmark tests for Regressors, based on NDArray
- 2.5.0
- Added Vantage Point Spatial tree
diff --git a/benchmarks/NeuralNet/ActivationFunctions/ELUBench.php b/benchmarks/NeuralNet/ActivationFunctions/ELUBench.php
new file mode 100644
index 000000000..13f46df62
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/ELUBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new ELU();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->z, $this->computed);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/GELUBench.php b/benchmarks/NeuralNet/ActivationFunctions/GELUBench.php
new file mode 100644
index 000000000..f6ab44788
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/GELUBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new GELU();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->z);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/HyperbolicTangentBench.php b/benchmarks/NeuralNet/ActivationFunctions/HyperbolicTangentBench.php
new file mode 100644
index 000000000..bddddcb6a
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/HyperbolicTangentBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new HyperbolicTangent();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->computed);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/LeakyReLUBench.php b/benchmarks/NeuralNet/ActivationFunctions/LeakyReLUBench.php
new file mode 100644
index 000000000..db9fb2b92
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/LeakyReLUBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new LeakyReLU();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->z);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/ReLUBench.php b/benchmarks/NeuralNet/ActivationFunctions/ReLUBench.php
new file mode 100644
index 000000000..c50f8708a
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/ReLUBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new ReLU();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->z);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/SELUBench.php b/benchmarks/NeuralNet/ActivationFunctions/SELUBench.php
new file mode 100644
index 000000000..dda5cc85c
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/SELUBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new SELU();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->z);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/SiLUBench.php b/benchmarks/NeuralNet/ActivationFunctions/SiLUBench.php
new file mode 100644
index 000000000..2e262b3d3
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/SiLUBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new SiLU();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function compute() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->z);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/SigmoidBench.php b/benchmarks/NeuralNet/ActivationFunctions/SigmoidBench.php
new file mode 100644
index 000000000..2ecbea632
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/SigmoidBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new Sigmoid();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->computed);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/SoftPlusBench.php b/benchmarks/NeuralNet/ActivationFunctions/SoftPlusBench.php
new file mode 100644
index 000000000..e19d25c27
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/SoftPlusBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new Softplus();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->computed);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/SoftmaxBench.php b/benchmarks/NeuralNet/ActivationFunctions/SoftmaxBench.php
new file mode 100644
index 000000000..7475b340d
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/SoftmaxBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([100, 100], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([100, 100], low: -1.0, high: 1.0);
+
+ $this->activationFn = new Softmax();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->computed);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/SoftsignBench.php b/benchmarks/NeuralNet/ActivationFunctions/SoftsignBench.php
new file mode 100644
index 000000000..c571cc0c7
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/SoftsignBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new Softsign();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->computed);
+ }
+}
diff --git a/benchmarks/NeuralNet/ActivationFunctions/ThresholdedReLUBench.php b/benchmarks/NeuralNet/ActivationFunctions/ThresholdedReLUBench.php
new file mode 100644
index 000000000..800d51e6f
--- /dev/null
+++ b/benchmarks/NeuralNet/ActivationFunctions/ThresholdedReLUBench.php
@@ -0,0 +1,58 @@
+z = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->computed = NumPower::uniform([500, 500], low: -1.0, high: 1.0);
+
+ $this->activationFn = new ThresholdedReLU();
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function activate() : void
+ {
+ $this->activationFn->activate($this->z);
+ }
+
+ /**
+ * @Subject
+ * @Iterations(3)
+ * @OutputTimeUnit("milliseconds", precision=3)
+ */
+ public function differentiate() : void
+ {
+ $this->activationFn->differentiate($this->computed);
+ }
+}
diff --git a/benchmarks/Regressors/AdalineBench.php b/benchmarks/Regressors/AdalineBench.php
index 71e4a125f..b81fdf8e3 100644
--- a/benchmarks/Regressors/AdalineBench.php
+++ b/benchmarks/Regressors/AdalineBench.php
@@ -2,9 +2,9 @@
namespace Rubix\ML\Benchmarks\Regressors;
+use Rubix\ML\Datasets\Generators\Hyperplane;
use Rubix\ML\Datasets\Labeled;
use Rubix\ML\Regressors\Adaline;
-use Rubix\ML\Datasets\Generators\Hyperplane;
/**
* @Groups({"Regressors"})
diff --git a/benchmarks/Regressors/ExtraTreeRegressorBench.php b/benchmarks/Regressors/ExtraTreeRegressorBench.php
index 51e5e71e1..89a0e04e4 100644
--- a/benchmarks/Regressors/ExtraTreeRegressorBench.php
+++ b/benchmarks/Regressors/ExtraTreeRegressorBench.php
@@ -2,9 +2,9 @@
namespace Rubix\ML\Benchmarks\Regressors;
+use Rubix\ML\Datasets\Generators\Hyperplane;
use Rubix\ML\Datasets\Labeled;
use Rubix\ML\Regressors\ExtraTreeRegressor;
-use Rubix\ML\Datasets\Generators\Hyperplane;
/**
* @Groups({"Regressors"})
diff --git a/benchmarks/Regressors/GradientBoostBench.php b/benchmarks/Regressors/GradientBoostBench.php
index 0c374ab8c..4685cd225 100644
--- a/benchmarks/Regressors/GradientBoostBench.php
+++ b/benchmarks/Regressors/GradientBoostBench.php
@@ -2,9 +2,9 @@
namespace Rubix\ML\Benchmarks\Regressors;
+use Rubix\ML\Datasets\Generators\Hyperplane;
use Rubix\ML\Datasets\Labeled;
use Rubix\ML\Regressors\GradientBoost;
-use Rubix\ML\Datasets\Generators\Hyperplane;
use Rubix\ML\Transformers\IntervalDiscretizer;
/**
@@ -12,9 +12,9 @@
*/
class GradientBoostBench
{
- protected const int TRAINING_SIZE = 10000;
+ protected const int TRAINING_SIZE = 1000;
- protected const int TESTING_SIZE = 10000;
+ protected const int TESTING_SIZE = 1000;
protected Labeled $training;
diff --git a/benchmarks/Regressors/MLPRegressorBench.php b/benchmarks/Regressors/MLPRegressorBench.php
index 552f2f805..7844ea903 100644
--- a/benchmarks/Regressors/MLPRegressorBench.php
+++ b/benchmarks/Regressors/MLPRegressorBench.php
@@ -2,12 +2,12 @@
namespace Rubix\ML\Benchmarks\Regressors;
+use Rubix\ML\Datasets\Generators\Hyperplane;
use Rubix\ML\Datasets\Labeled;
+use Rubix\ML\NeuralNet\ActivationFunctions\ReLU;
+use Rubix\ML\NeuralNet\Layers\Activation;
use Rubix\ML\NeuralNet\Layers\Dense;
use Rubix\ML\Regressors\MLPRegressor;
-use Rubix\ML\NeuralNet\Layers\Activation;
-use Rubix\ML\Datasets\Generators\Hyperplane;
-use Rubix\ML\NeuralNet\ActivationFunctions\ReLU;
/**
* @Groups({"Regressors"})
diff --git a/benchmarks/Regressors/RadiusNeighborsRegressorBench.php b/benchmarks/Regressors/RadiusNeighborsRegressorBench.php
index 4b6f4d5aa..8be43b53b 100644
--- a/benchmarks/Regressors/RadiusNeighborsRegressorBench.php
+++ b/benchmarks/Regressors/RadiusNeighborsRegressorBench.php
@@ -2,9 +2,9 @@
namespace Rubix\ML\Benchmarks\Regressors;
+use Rubix\ML\Datasets\Generators\Hyperplane;
use Rubix\ML\Datasets\Labeled;
use Rubix\ML\Regressors\RadiusNeighborsRegressor;
-use Rubix\ML\Datasets\Generators\Hyperplane;
/**
* @Groups({"Regressors"})
diff --git a/benchmarks/Regressors/RidgeBench.php b/benchmarks/Regressors/RidgeBench.php
index fb0e0653a..82aee785c 100644
--- a/benchmarks/Regressors/RidgeBench.php
+++ b/benchmarks/Regressors/RidgeBench.php
@@ -2,9 +2,9 @@
namespace Rubix\ML\Benchmarks\Regressors;
+use Rubix\ML\Datasets\Generators\Hyperplane;
use Rubix\ML\Datasets\Labeled;
use Rubix\ML\Regressors\Ridge;
-use Rubix\ML\Datasets\Generators\Hyperplane;
/**
* @Groups({"Regressors"})
diff --git a/benchmarks/Regressors/SVRBench.php b/benchmarks/Regressors/SVRBench.php
index 3e2fb40bd..0cf919e93 100644
--- a/benchmarks/Regressors/SVRBench.php
+++ b/benchmarks/Regressors/SVRBench.php
@@ -2,9 +2,9 @@
namespace Rubix\ML\Benchmarks\Regressors;
+use Rubix\ML\Datasets\Generators\Hyperplane;
use Rubix\ML\Datasets\Labeled;
use Rubix\ML\Regressors\SVR;
-use Rubix\ML\Datasets\Generators\Hyperplane;
/**
* @Groups({"Regressors"})
diff --git a/composer.json b/composer.json
index 689cb8b0d..36464906d 100644
--- a/composer.json
+++ b/composer.json
@@ -37,6 +37,7 @@
"andrewdalpino/okbloomer": "^1.0",
"psr/log": "^1.1|^2.0|^3.0",
"rubix/tensor": "^3.0",
+ "rubixml/numpower": "dev-main",
"symfony/polyfill-mbstring": "^1.0",
"wamania/php-stemmer": "^4.0"
},
@@ -48,7 +49,8 @@
"phpstan/phpstan": "^2.0",
"phpstan/phpstan-phpunit": "^2.0",
"phpunit/phpunit": "^12.0",
- "swoole/ide-helper": "^5.1"
+ "swoole/ide-helper": "^5.1",
+ "apphp/pretty-print": "^0.6.0"
},
"suggest": {
"ext-tensor": "For fast Matrix/Vector computing",
@@ -80,6 +82,7 @@
"@check"
],
"analyze": "phpstan analyse -c phpstan.neon --memory-limit 1G",
+ "analyze-ci": "phpstan analyse -c phpstan-ci.neon --memory-limit 1G",
"benchmark": "phpbench run --report=aggregate",
"check": [
"php-cs-fixer fix --config=.php-cs-fixer.dist.php -vvv --dry-run --using-cache=no --sequential --show-progress=dots --stop-on-violation"
diff --git a/docs/datasets/generators/agglomerate.md b/docs/datasets/generators/agglomerate.md
index 9361869f5..2ec4706b0 100644
--- a/docs/datasets/generators/agglomerate.md
+++ b/docs/datasets/generators/agglomerate.md
@@ -17,8 +17,8 @@ An Agglomerate is a collection of generators with each of them given a user-defi
```php
use Rubix\ML\Datasets\Generators\Agglomerate;
use Rubix\ML\Datasets\Generators\Blob;
-use Rubix\ML\Datasets\Generators\HalfMoon;
use Rubix\ML\Datasets\Generators\Circle;
+use Rubix\ML\Datasets\Generators\HalfMoon;
$generator = new Agglomerate([
'foo' => new Blob([5, 2], 1.0),
diff --git a/docs/neural-network/hidden-layers/activation.md b/docs/neural-network/hidden-layers/activation.md
index 57d4dc46c..f9562ee7c 100644
--- a/docs/neural-network/hidden-layers/activation.md
+++ b/docs/neural-network/hidden-layers/activation.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Activation
Activation layers apply a user-defined non-linear activation function to their inputs. They often work in conjunction with [Dense](dense.md) layers as a way to transform their output.
@@ -10,8 +10,8 @@ Activation layers apply a user-defined non-linear activation function to their i
## Example
```php
-use Rubix\ML\NeuralNet\Layers\Activation\Activation;
-use Rubix\ML\NeuralNet\ActivationFunctions\ReLU\ReLU;
+use Rubix\ML\NeuralNet\Layers\Activation;
+use Rubix\ML\NeuralNet\ActivationFunctions\ReLU;
$layer = new Activation(new ReLU());
```
diff --git a/docs/neural-network/hidden-layers/batch-norm.md b/docs/neural-network/hidden-layers/batch-norm.md
index 373113e14..baa2b6b93 100644
--- a/docs/neural-network/hidden-layers/batch-norm.md
+++ b/docs/neural-network/hidden-layers/batch-norm.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Batch Norm
Batch Norm layers normalize the activations of the previous layer such that the mean activation is *close* to 0 and the standard deviation is *close* to 1. Adding Batch Norm reduces the amount of covariate shift within the network which makes it possible to use higher learning rates and thus converge faster under some circumstances.
@@ -12,9 +12,9 @@ Batch Norm layers normalize the activations of the previous layer such that the
## Example
```php
-use Rubix\ML\NeuralNet\Layers\BatchNorm\BatchNorm;
-use Rubix\ML\NeuralNet\Initializers\Constant\Constant;
-use Rubix\ML\NeuralNet\Initializers\Normal\Normal;
+use Rubix\ML\NeuralNet\Layers\BatchNorm;
+use Rubix\ML\NeuralNet\Initializers\Constant;
+use Rubix\ML\NeuralNet\Initializers\Normal;
$layer = new BatchNorm(0.7, new Constant(0.), new Normal(1.));
```
diff --git a/docs/neural-network/hidden-layers/dense.md b/docs/neural-network/hidden-layers/dense.md
index db382d0a0..6813e4645 100644
--- a/docs/neural-network/hidden-layers/dense.md
+++ b/docs/neural-network/hidden-layers/dense.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Dense
Dense (or *fully connected*) hidden layers are layers of neurons that connect to each node in the previous layer by a parameterized synapse. They perform a linear transformation on their input and are usually followed by an [Activation](activation.md) layer. The majority of the trainable parameters in a standard feed forward neural network are contained within Dense hidden layers.
@@ -14,7 +14,7 @@ Dense (or *fully connected*) hidden layers are layers of neurons that connect to
## Example
```php
-use Rubix\ML\NeuralNet\Layers\Dense\Dense;
+use Rubix\ML\NeuralNet\Layers\Dense;
use Rubix\ML\NeuralNet\Initializers\He;
use Rubix\ML\NeuralNet\Initializers\Constant;
diff --git a/docs/neural-network/hidden-layers/dropout.md b/docs/neural-network/hidden-layers/dropout.md
index 28414f8ca..4288b49e3 100644
--- a/docs/neural-network/hidden-layers/dropout.md
+++ b/docs/neural-network/hidden-layers/dropout.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Dropout
Dropout is a regularization technique to reduce overfitting in neural networks by preventing complex co-adaptations on training data. It works by temporarily disabling output nodes during each training pass. It also acts as an efficient way of performing model averaging with the parameters of neural networks.
@@ -10,7 +10,7 @@ Dropout is a regularization technique to reduce overfitting in neural networks b
## Example
```php
-use Rubix\ML\NeuralNet\Layers\Dropout\Dropout;
+use Rubix\ML\NeuralNet\Layers\Dropout;
$layer = new Dropout(0.2);
```
diff --git a/docs/neural-network/hidden-layers/noise.md b/docs/neural-network/hidden-layers/noise.md
index 4d29732cb..d226df067 100644
--- a/docs/neural-network/hidden-layers/noise.md
+++ b/docs/neural-network/hidden-layers/noise.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Noise
This layer adds random Gaussian noise to the inputs with a user-defined standard deviation. Noise added to neural network activations acts as a regularizer by indirectly adding a penalty to the weights through the cost function in the output layer.
@@ -10,7 +10,7 @@ This layer adds random Gaussian noise to the inputs with a user-defined standard
## Example
```php
-use Rubix\ML\NeuralNet\Layers\Noise\Noise;
+use Rubix\ML\NeuralNet\Layers\Noise;
$layer = new Noise(1e-3);
```
diff --git a/docs/neural-network/hidden-layers/placeholder1d.md b/docs/neural-network/hidden-layers/placeholder1d.md
index f70575eee..f499b6e87 100644
--- a/docs/neural-network/hidden-layers/placeholder1d.md
+++ b/docs/neural-network/hidden-layers/placeholder1d.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Placeholder 1D
@@ -11,7 +11,7 @@ The Placeholder 1D input layer represents the future input values of a mini batc
## Example
```php
-use Rubix\ML\NeuralNet\Layers\Placeholder1D\Placeholder1D;
+use Rubix\ML\NeuralNet\Layers\Placeholder1D;
$layer = new Placeholder1D(10);
```
diff --git a/docs/neural-network/hidden-layers/prelu.md b/docs/neural-network/hidden-layers/prelu.md
index 22a5b4762..baaef2f32 100644
--- a/docs/neural-network/hidden-layers/prelu.md
+++ b/docs/neural-network/hidden-layers/prelu.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# PReLU
Parametric Rectified Linear Units are leaky rectifiers whose *leakage* coefficient is learned during training. Unlike standard [Leaky ReLUs](../activation-functions/leaky-relu.md) whose leakage remains constant, PReLU layers can adjust the leakage to better suite the model on a per node basis.
@@ -14,8 +14,8 @@ $$
## Example
```php
-use Rubix\ML\NeuralNet\Layers\PReLU\PReLU;
-use Rubix\ML\NeuralNet\Initializers\Normal\Normal;
+use Rubix\ML\NeuralNet\Layers\PReLU;
+use Rubix\ML\NeuralNet\Initializers\Normal;
$layer = new PReLU(new Normal(0.5));
```
diff --git a/docs/neural-network/hidden-layers/swish.md b/docs/neural-network/hidden-layers/swish.md
index 29e6677f7..e91138566 100644
--- a/docs/neural-network/hidden-layers/swish.md
+++ b/docs/neural-network/hidden-layers/swish.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Swish
Swish is a parametric activation layer that utilizes smooth rectified activation functions. The trainable *beta* parameter allows each activation function in the layer to tailor its output to the training set by interpolating between the linear function and ReLU.
@@ -10,8 +10,8 @@ Swish is a parametric activation layer that utilizes smooth rectified activation
## Example
```php
-use Rubix\ML\NeuralNet\Layers\Swish\Swish;
-use Rubix\ML\NeuralNet\Initializers\Constant\Constant;
+use Rubix\ML\NeuralNet\Layers\Swish;
+use Rubix\ML\NeuralNet\Initializers\Constant;
$layer = new Swish(new Constant(1.0));
```
diff --git a/docs/neural-network/initializers/xavier-1.md b/docs/neural-network/initializers/xavier-1.md
index 6a6646e17..c6cbb9979 100644
--- a/docs/neural-network/initializers/xavier-1.md
+++ b/docs/neural-network/initializers/xavier-1.md
@@ -1,17 +1,17 @@
-[source]
+[source]
-# Xavier 1
-The Xavier 1 initializer draws from a uniform distribution [-limit, limit] where *limit* is equal to sqrt(6 / (fanIn + fanOut)). This initializer is best suited for layers that feed into an activation layer that outputs a value between 0 and 1 such as [Softmax](../activation-functions/softmax.md) or [Sigmoid](../activation-functions/sigmoid.md).
+# Xavier Normal
+The Xavier Normal initializer draws from a uniform distribution [-limit, limit] where *limit* is equal to sqrt(6 / (fanIn + fanOut)). This initializer is best suited for layers that feed into an activation layer that outputs a value between 0 and 1 such as [Softmax](../activation-functions/softmax.md) or [Sigmoid](../activation-functions/sigmoid.md).
## Parameters
This initializer does not have any parameters.
## Example
```php
-use Rubix\ML\NeuralNet\Initializers\Xavier1;
+use Rubix\ML\NeuralNet\Initializers\XavierNormal;
-$initializer = new Xavier1();
+$initializer = new XavierNormal();
```
## References
-[^1]: X. Glorot et al. (2010). Understanding the Difficulty of Training Deep Feedforward Neural Networks.
\ No newline at end of file
+[^1]: X. Glorot et al. (2010). Understanding the Difficulty of Training Deep Feedforward Neural Networks.
diff --git a/docs/neural-network/optimizers/adam.md b/docs/neural-network/optimizers/adam.md
index d10a469f3..b2528ea9a 100644
--- a/docs/neural-network/optimizers/adam.md
+++ b/docs/neural-network/optimizers/adam.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Adam
Short for *Adaptive Moment Estimation*, the Adam Optimizer combines both Momentum and RMS properties. In addition to storing an exponentially decaying average of past squared gradients like [RMSprop](rms-prop.md), Adam also keeps an exponentially decaying average of past gradients, similar to [Momentum](momentum.md). Whereas Momentum can be seen as a ball running down a slope, Adam behaves like a heavy ball with friction.
@@ -31,7 +31,7 @@ where:
## Example
```php
-use Rubix\ML\NeuralNet\Optimizers\Adam\Adam;
+use Rubix\ML\NeuralNet\Optimizers\Adam;
$optimizer = new Adam(0.0001, 0.1, 0.001);
```
diff --git a/docs/neural-network/optimizers/adamax.md b/docs/neural-network/optimizers/adamax.md
index ff02f925a..91f5f3cf8 100644
--- a/docs/neural-network/optimizers/adamax.md
+++ b/docs/neural-network/optimizers/adamax.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# AdaMax
A version of the [Adam](adam.md) optimizer that replaces the RMS property with the infinity norm of the past gradients. As such, AdaMax is generally more suitable for sparse parameter updates and noisy gradients.
@@ -31,7 +31,7 @@ where:
## Example
```php
-use Rubix\ML\NeuralNet\Optimizers\AdaMax\AdaMax;
+use Rubix\ML\NeuralNet\Optimizers\AdaMax;
$optimizer = new AdaMax(0.0001, 0.1, 0.001);
```
diff --git a/docs/neural-network/optimizers/cyclical.md b/docs/neural-network/optimizers/cyclical.md
index 02622461b..a0ff47f4f 100644
--- a/docs/neural-network/optimizers/cyclical.md
+++ b/docs/neural-network/optimizers/cyclical.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Cyclical
The Cyclical optimizer uses a global learning rate that cycles between the lower and upper bound over a designated period while also decaying the upper bound by a factor at each step. Cyclical learning rates have been shown to help escape bad local minima and saddle points of the gradient.
@@ -33,7 +33,7 @@ where:
## Example
```php
-use Rubix\ML\NeuralNet\Optimizers\Cyclical\Cyclical;
+use Rubix\ML\NeuralNet\Optimizers\Cyclical;
$optimizer = new Cyclical(0.001, 0.005, 1000);
```
diff --git a/docs/neural-network/optimizers/momentum.md b/docs/neural-network/optimizers/momentum.md
index e9c787a2f..ed027ae88 100644
--- a/docs/neural-network/optimizers/momentum.md
+++ b/docs/neural-network/optimizers/momentum.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Momentum
Momentum accelerates each update step by accumulating velocity from past updates and adding a factor of the previous velocity to the current step. Momentum can help speed up training and escape bad local minima when compared with [Stochastic](stochastic.md) Gradient Descent.
@@ -37,7 +37,7 @@ where:
## Example
```php
-use Rubix\ML\NeuralNet\Optimizers\Momentum\Momentum;
+use Rubix\ML\NeuralNet\Optimizers\Momentum;
$optimizer = new Momentum(0.01, 0.1, true);
```
diff --git a/docs/neural-network/optimizers/rms-prop.md b/docs/neural-network/optimizers/rms-prop.md
index 3b0f87757..8a28b9b02 100644
--- a/docs/neural-network/optimizers/rms-prop.md
+++ b/docs/neural-network/optimizers/rms-prop.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# RMS Prop
An adaptive gradient technique that divides the current gradient over a rolling window of magnitudes of recent gradients. Unlike [AdaGrad](adagrad.md), RMS Prop does not suffer from an infinitely decaying step size.
@@ -29,7 +29,7 @@ where:
## Example
```php
-use Rubix\ML\NeuralNet\Optimizers\RMSProp\RMSProp;
+use Rubix\ML\NeuralNet\Optimizers\RMSProp;
$optimizer = new RMSProp(0.01, 0.1);
```
diff --git a/docs/neural-network/optimizers/step-decay.md b/docs/neural-network/optimizers/step-decay.md
index f5da99c8b..26b878de2 100644
--- a/docs/neural-network/optimizers/step-decay.md
+++ b/docs/neural-network/optimizers/step-decay.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Step Decay
A learning rate decay optimizer that reduces the global learning rate by a factor whenever it reaches a new *floor*. The number of steps needed to reach a new floor is defined by the *steps* hyper-parameter.
@@ -30,7 +30,7 @@ where:
## Example
```php
-use Rubix\ML\NeuralNet\Optimizers\StepDecay\StepDecay;
+use Rubix\ML\NeuralNet\Optimizers\StepDecay;
$optimizer = new StepDecay(0.1, 50, 1e-3);
```
diff --git a/docs/neural-network/optimizers/stochastic.md b/docs/neural-network/optimizers/stochastic.md
index bb0096b87..3e72be15a 100644
--- a/docs/neural-network/optimizers/stochastic.md
+++ b/docs/neural-network/optimizers/stochastic.md
@@ -1,4 +1,4 @@
-[source]
+[source]
# Stochastic
A constant learning rate optimizer based on vanilla Stochastic Gradient Descent (SGD).
@@ -24,7 +24,7 @@ where:
## Example
```php
-use Rubix\ML\NeuralNet\Optimizers\Stochastic\Stochastic;
+use Rubix\ML\NeuralNet\Optimizers\Stochastic;
$optimizer = new Stochastic(0.01);
```
diff --git a/docs/regressors/adaline.md b/docs/regressors/adaline.md
index 3d1722ebe..74f2d0225 100644
--- a/docs/regressors/adaline.md
+++ b/docs/regressors/adaline.md
@@ -20,9 +20,9 @@
## Example
```php
-use Rubix\ML\Regressors\Adaline;
-use Rubix\ML\NeuralNet\Optimizers\Adam;
use Rubix\ML\NeuralNet\CostFunctions\HuberLoss;
+use Rubix\ML\NeuralNet\Optimizers\Adam;
+use Rubix\ML\Regressors\Adaline;
$estimator = new Adaline(256, new Adam(0.001), 1e-4, 500, 1e-6, 5, new HuberLoss(2.5));
```
diff --git a/docs/regressors/gradient-boost.md b/docs/regressors/gradient-boost.md
index 43c52db19..692156e47 100644
--- a/docs/regressors/gradient-boost.md
+++ b/docs/regressors/gradient-boost.md
@@ -28,9 +28,9 @@ Gradient Boost (GBM) is a stage-wise additive ensemble that uses a Gradient Desc
## Example
```php
+use Rubix\ML\CrossValidation\Metrics\SMAPE;
use Rubix\ML\Regressors\GradientBoost;
use Rubix\ML\Regressors\RegressionTree;
-use Rubix\ML\CrossValidation\Metrics\SMAPE;
$estimator = new GradientBoost(new RegressionTree(3), 0.1, 0.8, 1000, 1e-4, 3, 10, 0.1, new SMAPE());
```
diff --git a/docs/regressors/mlp-regressor.md b/docs/regressors/mlp-regressor.md
index bff693bc1..0242a9696 100644
--- a/docs/regressors/mlp-regressor.md
+++ b/docs/regressors/mlp-regressor.md
@@ -26,13 +26,13 @@ A multilayer feed-forward neural network with a continuous output layer suitable
## Example
```php
-use Rubix\ML\Regressors\MLPRegressor;
+use Rubix\ML\CrossValidation\Metrics\RSquared;
+use Rubix\ML\NeuralNet\ActivationFunctions\ReLU;
use Rubix\ML\NeuralNet\CostFunctions\LeastSquares;
-use Rubix\ML\NeuralNet\Layers\Dense;
use Rubix\ML\NeuralNet\Layers\Activation;
-use Rubix\ML\NeuralNet\ActivationFunctions\ReLU;
+use Rubix\ML\NeuralNet\Layers\Dense;
use Rubix\ML\NeuralNet\Optimizers\RMSProp;
-use Rubix\ML\CrossValidation\Metrics\RSquared;
+use Rubix\ML\Regressors\MLPRegressor;
$estimator = new MLPRegressor([
new Dense(100),
diff --git a/docs/regressors/radius-neighbors-regressor.md b/docs/regressors/radius-neighbors-regressor.md
index 153bacf72..6fc19186f 100644
--- a/docs/regressors/radius-neighbors-regressor.md
+++ b/docs/regressors/radius-neighbors-regressor.md
@@ -18,9 +18,9 @@ This is the regressor version of [Radius Neighbors](../classifiers/radius-neighb
## Example
```php
-use Rubix\ML\Regressors\RadiusNeighborsRegressor;
use Rubix\ML\Graph\Trees\BallTree;
use Rubix\ML\Kernels\Distance\Diagonal;
+use Rubix\ML\Regressors\RadiusNeighborsRegressor;
$estimator = new RadiusNeighborsRegressor(0.5, false, new BallTree(30, new Diagonal()));
```
diff --git a/docs/regressors/regression-tree.md b/docs/regressors/regression-tree.md
index c60bdcc38..0676a721f 100644
--- a/docs/regressors/regression-tree.md
+++ b/docs/regressors/regression-tree.md
@@ -50,4 +50,4 @@ public balance() : ?int
## References:
[^1]: W. Y. Loh. (2011). Classification and Regression Trees.
-[^2]: K. Alsabti. et al. (1998). CLOUDS: A Decision Tree Classifier for Large Datasets.
\ No newline at end of file
+[^2]: K. Alsabti. et al. (1998). CLOUDS: A Decision Tree Classifier for Large Datasets.
diff --git a/docs/regressors/svr.md b/docs/regressors/svr.md
index f364b3a6b..703de444e 100644
--- a/docs/regressors/svr.md
+++ b/docs/regressors/svr.md
@@ -33,8 +33,8 @@ public load(string $path) : void
## Example
```php
-use Rubix\ML\Regressors\SVR;
use Rubix\ML\Kernels\SVM\RBF;
+use Rubix\ML\Regressors\SVR;
$estimator = new SVR(1.0, 0.03, new RBF(), true, 1e-3, 256.0);
```
diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
new file mode 100644
index 000000000..1b337d52f
--- /dev/null
+++ b/phpstan-baseline.neon
@@ -0,0 +1,1621 @@
+parameters:
+ ignoreErrors:
+ -
+ message: '#^Method Rubix\\ML\\BootstrapAggregator\:\:params\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: src/BootstrapAggregator.php
+
+ -
+ message: '#^Method Rubix\\ML\\BootstrapAggregator\:\:predict\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: src/BootstrapAggregator.php
+
+ -
+ message: '#^Method Rubix\\ML\\Classifiers\\AdaBoost\:\:losses\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: src/Classifiers/AdaBoost.php
+
+ -
+ message: '#^PHPDoc tag @return contains unresolvable type\.$#'
+ identifier: return.unresolvableType
+ count: 1
+ path: src/Classifiers/AdaBoost.php
+
+ -
+ message: '#^PHPDoc tag @var for property Rubix\\ML\\Classifiers\\AdaBoost\:\:\$losses contains unresolvable type\.$#'
+ identifier: property.unresolvableType
+ count: 1
+ path: src/Classifiers/AdaBoost.php
+
+ -
+ message: '#^PHPDoc tag @var for property Rubix\\ML\\Classifiers\\AdaBoost\:\:\$losses with type mixed is not subtype of native type array\|null\.$#'
+ identifier: property.phpDocType
+ count: 1
+ path: src/Classifiers/AdaBoost.php
+
+ -
+ message: '#^Property Rubix\\ML\\Classifiers\\AdaBoost\:\:\$losses type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: src/Classifiers/AdaBoost.php
+
+ -
+ message: '#^Property Rubix\\ML\\Classifiers\\ClassificationTree\:\:\$classes \(list\\) does not accept array\\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Classifiers/ClassificationTree.php
+
+ -
+ message: '#^Parameter \#1 \$sample of method Rubix\\ML\\Classifiers\\GaussianNB\:\:jointLogLikelihood\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 2
+ path: src/Classifiers/GaussianNB.php
+
+ -
+ message: '#^Method Rubix\\ML\\Classifiers\\KNearestNeighbors\:\:nearest\(\) should return array\{list\, list\\} but returns array\{array\, string\>, array\, float\>\}\.$#'
+ identifier: return.type
+ count: 1
+ path: src/Classifiers/KNearestNeighbors.php
+
+ -
+ message: '#^Parameter \#2 \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\Metric\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Classifiers/LogitBoost.php
+
+ -
+ message: '#^Instanceof between Rubix\\ML\\NeuralNet\\Layers\\Hidden and Rubix\\ML\\NeuralNet\\Layers\\Hidden will always evaluate to true\.$#'
+ identifier: instanceof.alwaysTrue
+ count: 1
+ path: src/Classifiers/MultilayerPerceptron.php
+
+ -
+ message: '#^Parameter \#2 \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\Metric\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Classifiers/MultilayerPerceptron.php
+
+ -
+ message: '#^Method Rubix\\ML\\Classifiers\\NaiveBayes\:\:counts\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: src/Classifiers/NaiveBayes.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(array\\>\>\>\>\|null\)\: Unexpected token "\>", expected TOKEN_HORIZONTAL_WS at offset 121 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/Classifiers/NaiveBayes.php
+
+ -
+ message: '#^Property Rubix\\ML\\Classifiers\\NaiveBayes\:\:\$counts \(array\\>\>\>\) does not accept non\-empty\-array\\>\>\>\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Classifiers/NaiveBayes.php
+
+ -
+ message: '#^Property Rubix\\ML\\Classifiers\\NaiveBayes\:\:\$probs \(array\\>\>\) does not accept non\-empty\-array\\>\>\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Classifiers/NaiveBayes.php
+
+ -
+ message: '#^PHPDoc tag @var with type array\ is not subtype of native type array\\>\.$#'
+ identifier: varTag.nativeType
+ count: 1
+ path: src/Classifiers/RandomForest.php
+
+ -
+ message: '#^Property Rubix\\ML\\Classifiers\\RandomForest\:\:\$trees \(list\\|null\) does not accept array\\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Classifiers/RandomForest.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function min expects non\-empty\-array, array\\> given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Classifiers/RandomForest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Clusterers\\DBSCAN\:\:predict\(\) should return list\ but returns array\\>\.$#'
+ identifier: return.type
+ count: 1
+ path: src/Clusterers/DBSCAN.php
+
+ -
+ message: '#^Parameter \#1 \$sample of method Rubix\\ML\\Clusterers\\FuzzyCMeans\:\:probaSample\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Clusterers/FuzzyCMeans.php
+
+ -
+ message: '#^Parameter \#2 \$memberships of method Rubix\\ML\\Clusterers\\FuzzyCMeans\:\:inertia\(\) expects list\\>, list\\> given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Clusterers/FuzzyCMeans.php
+
+ -
+ message: '#^Parameter \#2 \$labels of method Rubix\\ML\\Clusterers\\KMeans\:\:inertia\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Clusterers/KMeans.php
+
+ -
+ message: '#^Property Rubix\\ML\\Clusterers\\Seeders\\Preset\:\:\$centroids \(list\\>\) does not accept non\-empty\-list\\>\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Clusterers/Seeders/Preset.php
+
+ -
+ message: '#^Instanceof between Rubix\\ML\\Learner and Rubix\\ML\\Learner will always evaluate to true\.$#'
+ identifier: instanceof.alwaysTrue
+ count: 1
+ path: src/CommitteeMachine.php
+
+ -
+ message: '#^Property Rubix\\ML\\CommitteeMachine\:\:\$experts \(list\\) does not accept array\\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/CommitteeMachine.php
+
+ -
+ message: '#^Parameter \#2 \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\Metric\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/CrossValidation/HoldOut.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/Accuracy.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/Completeness.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/FBeta.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/Homogeneity.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/Informedness.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/MCC.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/MeanAbsoluteError.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/MeanSquaredError.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/MedianAbsoluteError.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 105 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/Metric.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 105 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/ProbabilisticMetric.php
+
+ -
+ message: '#^Parameter \#1 \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\MeanSquaredError\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/CrossValidation/Metrics/RMSE.php
+
+ -
+ message: '#^Parameter \#2 \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\MeanSquaredError\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/CrossValidation/Metrics/RMSE.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/RSquared.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/RandIndex.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/SMAPE.php
+
+ -
+ message: '#^PHPDoc tag @return has invalid value \(\\Rubix\\ML\\Tuple\{float,float\}\)\: Unexpected token "\{", expected TOKEN_HORIZONTAL_WS at offset 112 on line 4$#'
+ identifier: phpDoc.parseError
+ count: 1
+ path: src/CrossValidation/Metrics/VMeasure.php
+
+ -
+ message: '#^Instanceof between Rubix\\ML\\CrossValidation\\Reports\\ReportGenerator and Rubix\\ML\\CrossValidation\\Reports\\ReportGenerator will always evaluate to true\.$#'
+ identifier: instanceof.alwaysTrue
+ count: 1
+ path: src/CrossValidation/Reports/AggregateReport.php
+
+ -
+ message: '#^Method Rubix\\ML\\CrossValidation\\Reports\\AggregateReport\:\:compatibility\(\) should return list\ but returns array\\.$#'
+ identifier: return.type
+ count: 1
+ path: src/CrossValidation/Reports/AggregateReport.php
+
+ -
+ message: '#^Method Rubix\\ML\\Datasets\\Dataset\:\:types\(\) should return list\ but returns array\\.$#'
+ identifier: return.type
+ count: 1
+ path: src/Datasets/Dataset.php
+
+ -
+ message: '#^Method Rubix\\ML\\Datasets\\Dataset\:\:uniqueTypes\(\) should return list\ but returns array\, Rubix\\ML\\DataType\>\.$#'
+ identifier: return.type
+ count: 1
+ path: src/Datasets/Dataset.php
+
+ -
+ message: '#^Property Rubix\\ML\\Datasets\\Dataset\:\:\$samples \(list\\>\) does not accept array\\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Datasets/Dataset.php
+
+ -
+ message: '#^Instanceof between Rubix\\ML\\Datasets\\Generators\\Generator and Rubix\\ML\\Datasets\\Generators\\Generator will always evaluate to true\.$#'
+ identifier: instanceof.alwaysTrue
+ count: 1
+ path: src/Datasets/Generators/Agglomerate.php
+
+ -
+ message: '#^Instanceof between Rubix\\ML\\Datasets\\Labeled and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: instanceof.alwaysTrue
+ count: 1
+ path: src/Datasets/Labeled.php
+
+ -
+ message: '#^Parameter \#2 \$b of method Rubix\\ML\\Kernels\\Distance\\Distance\:\:compute\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 2
+ path: src/Datasets/Labeled.php
+
+ -
+ message: '#^Property Rubix\\ML\\Datasets\\Labeled\:\:\$labels \(list\\) does not accept array\\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Datasets/Labeled.php
+
+ -
+ message: '#^Instanceof between Rubix\\ML\\Datasets\\Dataset and Rubix\\ML\\Datasets\\Dataset will always evaluate to true\.$#'
+ identifier: instanceof.alwaysTrue
+ count: 1
+ path: src/Datasets/Unlabeled.php
+
+ -
+ message: '#^Parameter \#2 \$b of method Rubix\\ML\\Kernels\\Distance\\Distance\:\:compute\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 2
+ path: src/Datasets/Unlabeled.php
+
+ -
+ message: '#^Parameter \#1 \$keys of function array_combine expects array\, list\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Extractors/CSV.php
+
+ -
+ message: '#^Parameter \#2 \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\Metric\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Regressors/GradientBoost.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function max expects non\-empty\-array, list\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Graph/Nodes/Ball.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function max expects non\-empty\-array, list\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Graph/Nodes/Clique.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function max expects non\-empty\-array, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Graph/Nodes/Isolator.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function min expects non\-empty\-array, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Graph/Nodes/Isolator.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function max expects non\-empty\-array, list\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Graph/Nodes/VantagePoint.php
+
+ -
+ message: '#^Method Rubix\\ML\\Graph\\Trees\\BallTree\:\:nearest\(\) should return array\{list\\>, list\, list\\} but returns array\{list\\>, array\, list\\}\.$#'
+ identifier: return.type
+ count: 1
+ path: src/Graph/Trees/BallTree.php
+
+ -
+ message: '#^Parameter \#1 \$labels of method Rubix\\ML\\Graph\\Trees\\DecisionTree\:\:impurity\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Graph/Trees/DecisionTree.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function max expects non\-empty\-array, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Graph/Trees/ExtraTree.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function min expects non\-empty\-array, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Graph/Trees/ExtraTree.php
+
+ -
+ message: '#^Method Rubix\\ML\\Graph\\Trees\\KDTree\:\:nearest\(\) should return array\{list\\>, list\, list\\} but returns array\{list\\>, array\, list\\}\.$#'
+ identifier: return.type
+ count: 1
+ path: src/Graph/Trees/KDTree.php
+
+ -
+ message: '#^Instanceof between Rubix\\ML\\Datasets\\Labeled and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: instanceof.alwaysTrue
+ count: 1
+ path: src/Graph/Trees/VantageTree.php
+
+ -
+ message: '#^Parameter \#1 \$a of method Rubix\\ML\\Kernels\\Distance\\Distance\:\:compute\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 5
+ path: src/Graph/Trees/VantageTree.php
+
+ -
+ message: '#^Method Rubix\\ML\\GridSearch\:\:combine\(\) should return list\\> but returns list\, mixed\>\>\.$#'
+ identifier: return.type
+ count: 1
+ path: src/GridSearch.php
+
+ -
+ message: '#^Parameter \#1 \$array \(list\\) of array_values is already a list, call has no effect\.$#'
+ identifier: arrayValues.list
+ count: 1
+ path: src/GridSearch.php
+
+ -
+ message: '#^Property Rubix\\ML\\GridSearch\:\:\$params \(list\\>\) does not accept list\\>\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/GridSearch.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function max expects non\-empty\-array, list\\> given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Kernels/Distance/Diagonal.php
+
+ -
+ message: '#^Instanceof between Rubix\\ML\\Transformers\\Transformer and Rubix\\ML\\Transformers\\Transformer will always evaluate to true\.$#'
+ identifier: instanceof.alwaysTrue
+ count: 1
+ path: src/Pipeline.php
+
+ -
+ message: '#^Parameter \#1 \$a of method Rubix\\ML\\Kernels\\Distance\\Distance\:\:compute\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Regressors/KNNRegressor.php
+
+ -
+ message: '#^Parameter \#1 \$array \(list\\) of array_values is already a list, call has no effect\.$#'
+ identifier: arrayValues.list
+ count: 1
+ path: src/Regressors/KNNRegressor.php
+
+ -
+ message: '#^Parameter \#2 \$b of method Rubix\\ML\\Kernels\\Distance\\Distance\:\:compute\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Regressors/KNNRegressor.php
+
+ -
+ message: '#^Property Rubix\\ML\\Regressors\\KNNRegressor\:\:\$labels \(list\\) does not accept array\\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Regressors/KNNRegressor.php
+
+ -
+ message: '#^Method Rubix\\ML\\Regressors\\KNNRegressor\:\:nearest\(\) should return array\{list\, list\\} but returns array\{array\, float\|int\>, array\, float\>\}\.$#'
+ identifier: return.type
+ count: 1
+ path: src/Regressors/KNNRegressor.php
+
+ -
+ message: '#^Parameter \#2 \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\Metric\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Regressors/MLPRegressor.php
+
+ -
+ message: '#^Parameter \#2 \$callback of function array_walk expects callable\(array\, int\|string\)\: mixed, array\{\$this\(Rubix\\ML\\Transformers\\BooleanConverter\), ''convert''\} given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/BooleanConverter.php
+
+ -
+ message: '#^Parameter \#1 \$width of function imagecreatetruecolor expects int\<1, max\>, int given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/ImageResizer.php
+
+ -
+ message: '#^Parameter \#2 \$callback of function array_walk expects callable\(array\, int\|string\)\: mixed, array\{\$this\(Rubix\\ML\\Transformers\\ImageResizer\), ''resize''\} given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/ImageResizer.php
+
+ -
+ message: '#^Parameter \#2 \$height of function imagecreatetruecolor expects int\<1, max\>, int given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/ImageResizer.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function max expects non\-empty\-array, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/IntervalDiscretizer.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function min expects non\-empty\-array, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/IntervalDiscretizer.php
+
+ -
+ message: '#^Property Rubix\\ML\\Transformers\\MissingDataImputer\:\:\$strategies \(list\\|null\) does not accept non\-empty\-array\, Rubix\\ML\\Strategies\\Strategy\>\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Transformers/MissingDataImputer.php
+
+ -
+ message: '#^Property Rubix\\ML\\Transformers\\MissingDataImputer\:\:\$types \(list\\|null\) does not accept non\-empty\-array\, Rubix\\ML\\DataType\>\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Transformers/MissingDataImputer.php
+
+ -
+ message: '#^Parameter \#2 \$callback of function array_walk expects callable\(array\, int\|string\)\: mixed, array\{\$this\(Rubix\\ML\\Transformers\\MultibyteTextNormalizer\), ''normalize''\} given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/MultibyteTextNormalizer.php
+
+ -
+ message: '#^Call to function is_string\(\) with string will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Transformers/RegexFilter.php
+
+ -
+ message: '#^Call to function is_string\(\) with string will always evaluate to true\.$#'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: src/Transformers/StopWordFilter.php
+
+ -
+ message: '#^Parameter \#1 \$a of method Rubix\\ML\\Kernels\\Distance\\Distance\:\:compute\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/TSNE.php
+
+ -
+ message: '#^Parameter \#2 \$b of method Rubix\\ML\\Kernels\\Distance\\Distance\:\:compute\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/TSNE.php
+
+ -
+ message: '#^Parameter \#2 \$callback of function array_walk expects callable\(array\, int\|string\)\: mixed, array\{\$this\(Rubix\\ML\\Transformers\\TextNormalizer\), ''normalize''\} given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/TextNormalizer.php
+
+ -
+ message: '#^Parameter \#2 \$callback of function array_walk expects callable\(array\, int\|string\)\: mixed, array\{\$this\(Rubix\\ML\\Transformers\\TokenHashingVectorizer\), ''vectorize''\} given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Transformers/TokenHashingVectorizer.php
+
+ -
+ message: '#^Parameter &\$sample by\-ref type of method Rubix\\ML\\Transformers\\TokenHashingVectorizer\:\:vectorize\(\) expects list\, array\, mixed\> given\.$#'
+ identifier: parameterByRef.type
+ count: 1
+ path: src/Transformers/TokenHashingVectorizer.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function max expects non\-empty\-array, array\<\(int&T\)\|\(string&T\), float\|int\> given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/functions.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function min expects non\-empty\-array, array\<\(int&T\)\|\(string&T\), float\|int\> given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/functions.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/AnomalyDetectors/LodaTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\RSquared\:\:score\(\) expects list\, array given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Base/BootstrapAggregatorTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Encoding'' and Rubix\\ML\\Encoding will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Base/ReportTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/AdaBoostTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Encoding'' and Rubix\\ML\\Encoding will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 2
+ path: tests/Classifiers/ClassificationTreeTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with array\ will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Classifiers/ClassificationTreeTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 2
+ path: tests/Classifiers/ClassificationTreeTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with array\ will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Classifiers/ExtraTreeClassifierTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 2
+ path: tests/Classifiers/ExtraTreeClassifierTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/GaussianNBTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/KDNeighborsTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/KNearestNeighborsTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/KNearestNeighborsTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with array\ will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Classifiers/LogisticRegressionTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/LogisticRegressionTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with array\ will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Classifiers/LogitBoostTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/LogitBoostTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Encoding'' and Rubix\\ML\\Encoding will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Classifiers/MultilayerPerceptronTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/MultilayerPerceptronTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/NaiveBayesTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/OneVsRestTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/RadiusNeighborsTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with array\ will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Classifiers/RandomForestTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/RandomForestTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/SVCTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Classifiers/SoftmaxClassifierTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\VMeasure\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Clusterers/DBSCANTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with list\\> will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Clusterers/FuzzyCMeansTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\VMeasure\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Clusterers/FuzzyCMeansTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with array\ will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Clusterers/GaussianMixtureTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with list\\> will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 2
+ path: tests/Clusterers/GaussianMixtureTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\VMeasure\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Clusterers/GaussianMixtureTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with array\ will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Clusterers/KMeansTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with list\\> will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Clusterers/KMeansTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\VMeasure\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Clusterers/KMeansTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsArray\(\) with list\\> will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Clusterers/MeanShiftTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertIsFloat\(\) with float will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Clusterers/MeanShiftTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\VMeasure\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/Clusterers/MeanShiftTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/AccuracyTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\AccuracyTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/AccuracyTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\Accuracy\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/AccuracyTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\Accuracy\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/AccuracyTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/BrierScoreTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\BrierScoreTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/BrierScoreTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/CompletenessTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\CompletenessTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/CompletenessTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\Completeness\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/CompletenessTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\Completeness\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/CompletenessTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/FBetaTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\FBetaTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/FBetaTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/FBetaTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\FBeta\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/FBetaTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/HomogeneityTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\HomogeneityTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/HomogeneityTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\Homogeneity\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/HomogeneityTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\Homogeneity\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/HomogeneityTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/InformednessTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\InformednessTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/InformednessTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\Informedness\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/InformednessTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\Informedness\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/InformednessTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/MCCTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\MCCTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/MCCTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\MCC\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/MCCTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\MCC\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/MCCTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/MeanAbsoluteErrorTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\MeanAbsoluteErrorTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/MeanAbsoluteErrorTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\MeanAbsoluteError\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/MeanAbsoluteErrorTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\MeanAbsoluteError\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/MeanAbsoluteErrorTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/MeanSquaredErrorTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\MeanSquaredErrorTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/MeanSquaredErrorTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\MeanSquaredError\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/MeanSquaredErrorTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\MeanSquaredError\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/MeanSquaredErrorTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/MedianAbsoluteErrorTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\MedianAbsoluteErrorTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/MedianAbsoluteErrorTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\MedianAbsoluteError\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/MedianAbsoluteErrorTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\MedianAbsoluteError\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/MedianAbsoluteErrorTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/ProbabilisticAccuracyTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\ProbabilisticAccuracyTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/ProbabilisticAccuracyTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/RMSETest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\RMSETest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/RMSETest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/RSquaredTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\RSquaredTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/RSquaredTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\RSquared\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/RSquaredTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\RSquared\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/RSquaredTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/RandIndexTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\RandIndexTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/RandIndexTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\RandIndex\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/RandIndexTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\RandIndex\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/RandIndexTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/SMAPETest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\SMAPETest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/SMAPETest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\SMAPETest\:\:testScore\(\) has parameter \$labels with no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/SMAPETest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\SMAPETest\:\:testScore\(\) has parameter \$predictions with no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/SMAPETest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\SMAPE\:\:score\(\) expects list\, array given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/SMAPETest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\SMAPE\:\:score\(\) expects list\, array given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/SMAPETest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/TopKAccuracyTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\TopKAccuracyTest\:\:score\(\) has parameter \$labels with no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/TopKAccuracyTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\TopKAccuracyTest\:\:score\(\) has parameter \$probabilities with no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/TopKAccuracyTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\TopKAccuracyTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/TopKAccuracyTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\TopKAccuracy\:\:score\(\) expects list\, array given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/TopKAccuracyTest.php
+
+ -
+ message: '#^Parameter \$probabilities of method Rubix\\ML\\CrossValidation\\Metrics\\TopKAccuracy\:\:score\(\) expects list\\>, array given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/TopKAccuracyTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Tuple'' and Rubix\\ML\\Tuple will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Metrics/VMeasureTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Metrics\\VMeasureTest\:\:scoreProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Metrics/VMeasureTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Metrics\\VMeasure\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/VMeasureTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Metrics\\VMeasure\:\:score\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Metrics/VMeasureTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Report'' and Rubix\\ML\\Report will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Reports/AggregateReportTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Report'' and Rubix\\ML\\Report will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Reports/ConfusionMatrixTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Reports\\ConfusionMatrixTest\:\:generateProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Reports/ConfusionMatrixTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Reports\\ConfusionMatrixTest\:\:testGenerate\(\) has parameter \$expected with no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Reports/ConfusionMatrixTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Reports\\ConfusionMatrix\:\:generate\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Reports/ConfusionMatrixTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Reports\\ConfusionMatrix\:\:generate\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Reports/ConfusionMatrixTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Report'' and Rubix\\ML\\Report will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Reports/ContingencyTableTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Reports\\ContingencyTableTest\:\:generateProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Reports/ContingencyTableTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Reports\\ContingencyTableTest\:\:testGenerate\(\) has parameter \$expected with no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Reports/ContingencyTableTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Reports\\ContingencyTable\:\:generate\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Reports/ContingencyTableTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Reports\\ContingencyTable\:\:generate\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Reports/ContingencyTableTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Report'' and Rubix\\ML\\Report will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Reports/ErrorAnalysisTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Reports\\ErrorAnalysisTest\:\:generateProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Reports/ErrorAnalysisTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Reports\\ErrorAnalysis\:\:generate\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Reports/ErrorAnalysisTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Reports\\ErrorAnalysis\:\:generate\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Reports/ErrorAnalysisTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Report'' and Rubix\\ML\\Report will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/CrossValidation/Reports/MulticlassBreakdownTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Reports\\MulticlassBreakdownTest\:\:generateProvider\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Reports/MulticlassBreakdownTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\CrossValidation\\Reports\\MulticlassBreakdownTest\:\:testGenerate\(\) has parameter \$expected with no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/CrossValidation/Reports/MulticlassBreakdownTest.php
+
+ -
+ message: '#^Parameter \$labels of method Rubix\\ML\\CrossValidation\\Reports\\MulticlassBreakdown\:\:generate\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Reports/MulticlassBreakdownTest.php
+
+ -
+ message: '#^Parameter \$predictions of method Rubix\\ML\\CrossValidation\\Reports\\MulticlassBreakdown\:\:generate\(\) expects list\, array\ given\.$#'
+ identifier: argument.type
+ count: 1
+ path: tests/CrossValidation/Reports/MulticlassBreakdownTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Dataset'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/AgglomerateTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Labeled'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/AgglomerateTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Dataset'' and Rubix\\ML\\Datasets\\Unlabeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/BlobTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Generators\\\\Blob'' and Rubix\\ML\\Datasets\\Generators\\Blob will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/BlobTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Generators\\\\Generator'' and Rubix\\ML\\Datasets\\Generators\\Blob will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/BlobTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Unlabeled'' and Rubix\\ML\\Datasets\\Unlabeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/BlobTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Dataset'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/CircleTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Labeled'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/CircleTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Dataset'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/HalfMoonTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Labeled'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/HalfMoonTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Dataset'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/HyperplaneTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Labeled'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/HyperplaneTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Dataset'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/SwissRollTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Labeled'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Datasets/Generators/SwissRollTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Datasets\\\\Labeled'' and Rubix\\ML\\Datasets\\Labeled will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 8
+ path: tests/Datasets/LabeledTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Report'' and Rubix\\ML\\Report will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 2
+ path: tests/Datasets/LabeledTest.php
+
+ -
+ message: '#^Parameter \#1 \$array \(list\\>\) of array_values is already a list, call has no effect\.$#'
+ identifier: arrayValues.list
+ count: 1
+ path: tests/Extractors/NDJSONTest.php
+
+ -
+ message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Rubix\\\\ML\\\\Encoding'' and Rubix\\ML\\Encoding will always evaluate to true\.$#'
+ identifier: method.alreadyNarrowedType
+ count: 1
+ path: tests/Helpers/GraphvizTest.php
+
+ -
+ message: '#^Method Rubix\\ML\\Tests\\Helpers\\ParamsTest\:\:stringify\(\) has parameter \$params with no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: tests/Helpers/ParamsTest.php
+
+ -
+ message: '#^Possibly invalid array key type float\|int\|string\.$#'
+ identifier: offsetAccess.invalidOffset
+ count: 1
+ path: src/AnomalyDetectors/LocalOutlierFactor.php
+
+ -
+ message: '#^Possibly invalid array key type float\|int\|string\.$#'
+ identifier: offsetAccess.invalidOffset
+ count: 1
+ path: src/Classifiers/AdaBoost.php
+
+ -
+ message: '#^Possibly invalid array key type float\|int\|string\.$#'
+ identifier: offsetAccess.invalidOffset
+ count: 3
+ path: src/Classifiers/KNearestNeighbors.php
+
+ -
+ message: '#^Invalid array key type float\.$#'
+ identifier: offsetAccess.invalidOffset
+ count: 1
+ path: src/Classifiers/SVC.php
+
+ -
+ message: '#^Empty array passed to foreach\.$#'
+ identifier: foreach.emptyArray
+ count: 1
+ path: src/Classifiers/NaiveBayes.php
+
+ -
+ message: '#^Property Rubix\\ML\\Graph\\Nodes\\Ball\:\:\$subsets in isset\(\) is not nullable nor uninitialized\.$#'
+ identifier: isset.initializedProperty
+ count: 1
+ path: src/Graph/Nodes/Ball.php
+
+ -
+ message: '#^Property Rubix\\ML\\Graph\\Nodes\\Split\:\:\$subsets in isset\(\) is not nullable nor uninitialized\.$#'
+ identifier: isset.initializedProperty
+ count: 1
+ path: src/Graph/Nodes/Split.php
+
+ -
+ message: '#^Property Rubix\\ML\\Graph\\Nodes\\Box\:\:\$subsets in isset\(\) is not nullable nor uninitialized\.$#'
+ identifier: isset.initializedProperty
+ count: 1
+ path: src/Graph/Nodes/Box.php
+
+ -
+ message: '#^Property Rubix\\ML\\Datasets\\Dataset\:\:\$samples on left side of \?\? is not nullable nor uninitialized\.$#'
+ identifier: nullCoalesce.initializedProperty
+ count: 1
+ path: src/Datasets/Dataset.php
+
+ -
+ message: '#^Property Rubix\\ML\\Graph\\Nodes\\Isolator\:\:\$subsets in isset\(\) is not nullable nor uninitialized\.$#'
+ identifier: isset.initializedProperty
+ count: 1
+ path: src/Graph/Nodes/Isolator.php
+
+ -
+ message: '#^Parameter \#1 \$labels of method Rubix\\ML\\NeuralNet\\FeedForward::backpropagate\(\) expects list, array given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/NeuralNet/FeedForward.php
+
+ -
+ message: '#^Method Rubix\\ML\\NeuralNet\\FeedForward::prepareSamples\(\) return type has no value type specified in iterable type array\.$#'
+ identifier: missingType.iterableValue
+ count: 1
+ path: src/NeuralNet/FeedForward.php
+
+ -
+ message: '#^Parameter \#1 \$array \(list>\) of array_values is already a list, call has no effect\.$#'
+ identifier: arrayValues.list
+ count: 1
+ path: src/NeuralNet/FeedForward.php
+
+ -
+ message: '#^Parameter \#1 \$sample of method Rubix\\ML\\Graph\\Trees\\Spatial::range\(\) expects list, array, float|int> given\.$#'
+ identifier: argument.type
+ count: 4
+ path: src/Clusterers/MeanShift.php
+
+ -
+ message: '#^Parameter \#1 \$b of method Tensor\\Matrix::matmul\(\) expects Tensor\\Matrix, Tensor\\Matrix|null given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/AnomalyDetectors/Loda.php
+
+ -
+ message: '#^Parameter \#1 \$sample of method Rubix\\ML\\Clusterers\\GaussianMixture::jointLogLikelihood\(\) expects list, array given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Clusterers/GaussianMixture.php
+
+ -
+ message: '#^Call to an undefined method Rubix\\ML\\NeuralNet\\ActivationFunctions\\ActivationFunction::differentiate\(\)\.$#'
+ identifier: method.notFound
+ count: 1
+ path: src/NeuralNet/Layers/Activation.php
+
+ -
+ message: '#^Call to an undefined method NDArray::rowAsVector\(\)\.$#'
+ identifier: method.notFound
+ count: 1
+ path: src/Classifiers/LogisticRegression.php
+
+ -
+ message: '#^Cannot unset property Rubix\\ML\\Graph\\Nodes\\VantagePoint::\$subsets because it might have hooks in a subclass\.$#'
+ identifier: unset.possiblyHookedProperty
+ count: 1
+ path: src/Graph/Nodes/VantagePoint.php
+
+ -
+ message: '#^Cannot unset property Rubix\\ML\\Graph\\Nodes\\Split::\$subsets because it might have hooks in a subclass\.$#'
+ identifier: unset.possiblyHookedProperty
+ count: 1
+ path: src/Graph/Nodes/Split.php
+
+ -
+ message: '#^Cannot unset property Rubix\\ML\\Graph\\Nodes\\Isolator::\$subsets because it might have hooks in a subclass\.$#'
+ identifier: unset.possiblyHookedProperty
+ count: 1
+ path: src/Graph/Nodes/Isolator.php
+
+ -
+ message: '#^Cannot unset property Rubix\\ML\\Graph\\Nodes\\Box::\$subsets because it might have hooks in a subclass\.$#'
+ identifier: unset.possiblyHookedProperty
+ count: 1
+ path: src/Graph/Nodes/Box.php
+
+ -
+ message: '#^Cannot unset property Rubix\\ML\\Graph\\Nodes\\Ball::\$subsets because it might have hooks in a subclass\.$#'
+ identifier: unset.possiblyHookedProperty
+ count: 1
+ path: src/Graph/Nodes/Ball.php
+
+ -
+ message: '#^Cannot unset property Rubix\\ML\\Graph\\Trees\\VantageTree::\$root because it might have hooks in a subclass\.$#'
+ identifier: unset.possiblyHookedProperty
+ count: 1
+ path: src/Graph/Trees/VantageTree.php
+
+ -
+ message: '#^Possibly invalid array key type float|int|string\.$#'
+ identifier: offsetAccess.invalidOffset
+ count: 1
+ path: src/Datasets/Labeled.php
+
+ -
+ # Temporary fix for NumPower::array() 2nd parameter missing until it is fixed
+ message: '#^Static method NumPower\:\:array\(\) invoked with 1 parameter, 2 required\.$#'
+ identifier: arguments.count
+ path: src/**
+
+ -
+ # Temporary fix for NumPower::zeros() extra required params until signatures are aligned
+ message: '#^Static method NumPower\:\:zeros\(\) invoked with 1 parameter, 3 required\.$#'
+ identifier: arguments.count
+ path: src/**
+
+ -
+ # Temporary fix for NumPower::ones() extra required params until signatures are aligned
+ message: '#^Static method NumPower\:\:ones\(\) invoked with 1 parameter, 3 required\.$#'
+ identifier: arguments.count
+ path: src/**
diff --git a/phpstan-bootstrap.php b/phpstan-bootstrap.php
new file mode 100644
index 000000000..cb89647ec
--- /dev/null
+++ b/phpstan-bootstrap.php
@@ -0,0 +1,23 @@
+>>>\) does not accept non\-empty\-array>>>\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Classifiers/NaiveBayes.php
+
+ -
+ message: '#^Property Rubix\\ML\\Classifiers\\NaiveBayes\:\:\$probs \(array>>\) does not accept non\-empty\-array>>\.$#'
+ identifier: assign.propertyType
+ count: 1
+ path: src/Classifiers/NaiveBayes.php
+
+ -
+ message: '#^Parameter \#1 \.\.\.\$arg1 of function min expects non\-empty\-array, array> given\.$#'
+ identifier: argument.type
+ count: 1
+ path: src/Classifiers/RandomForest.php
+
+ -
+ message: '#^Property Rubix\\ML\\Classifiers\\ClassificationTree\:\:\$classes \(list\) in isset\(\) is not nullable\.$#'
+ identifier: isset.property
+ count: 1
+ path: src/Classifiers/ClassificationTree.php
+
+ -
+ message: '#^Property Rubix\\ML\\Classifiers\\ExtraTreeClassifier\:\:\$classes \(array