function testLayers()
 {
     $newLayer = new Layer(1);
     $this->network->addLayer($newLayer);
     $layersCount = count($this->network->getLayers());
     $this->assertEquals($layersCount, 3);
     $this->assertEquals($this->network->getLayers()[$layersCount - 1], $this->network->getOutputLayer());
     $this->assertEquals($this->network->getOutputLayer(), $newLayer);
 }
 public function teach(array $input, array $expectation)
 {
     $this->perceptron->input($input)->output();
     $nFilter = function ($node) {
         return $node instanceof Neuron;
     };
     $childLayer = null;
     $sigmas = [];
     /** @var ILayer $layer */
     foreach (array_reverse($this->perceptron->getLayers()) as $layer) {
         if ($this->perceptron->getLayers()[0] == $layer) {
             continue;
         }
         foreach ($layer->getNodes($nFilter) as $nk => $neuron) {
             $neuronOutput = $neuron->output();
             $sigma = !empty($childLayer) ? $neuronOutput * (1 - $neuronOutput) * $this->getChildSigmas($sigmas, $neuron) : $neuronOutput * (1 - $neuronOutput) * ($expectation[$nk] - $neuronOutput);
             $sigmas[] = new NeuronsSigma($neuron, $sigma);
             foreach ($neuron->getSynapses() as $synapse) {
                 $synapse->changeWeight($this->theta * $sigma * $synapse->getParentNode()->output());
             }
         }
         $childLayer = $layer;
     }
 }
<?php

use Neural\Layer;
use Neural\MultilayerPerceptron;
use Neural\Node\Bias;
use Neural\Node\Input;
use Neural\Node\Neuron;
use Neural\Synapse;
require_once '../vendor/autoload.php';
$p = new MultilayerPerceptron([2, 2, 1]);
//Equivalent to:
$p = new MultilayerPerceptron();
$p->addLayer(new Layer())->toLastLayer()->addNode(new Input())->addNode(new Input())->addNode(new Bias());
$p->addLayer(new Layer())->toLastLayer()->addNode(new Neuron())->addNode(new Neuron())->addNode(new Bias());
$p->addLayer(new Layer())->toLastLayer()->addNode(new Neuron());
//Do not forget to add synapses:
$p->generateSynapses();
//Or you may direct the process:
$neuronFilter = function ($node) {
    return $node instanceof Neuron;
};
/** @var Neuron $secondLayerNeuron */
$secondLayerNeuron = iterator_to_array($p->getLayers()[1]->getNodes($neuronFilter))[0];
$input = iterator_to_array($p->getLayers()[0]->getNodes())[0];
$secondLayerNeuron->addSynapse(new Synapse($input));
//and so on...