docs: private void backpropagation(Instance inst)
  	{
  		double [] attributeValues = new double[this.numAttributes];
  		
  		for(int i = 0 ; i < this.numAttributes ; i++)
  		{
  			attributeValues[i] = inst.value(i);
  		}
  		
  		RealMatrix input = new Array2DRowRealMatrix(attributeValues);
  		RealMatrix hidden = firstLayer(input);
  		RealMatrix output = secondLayer(hidden);
  		
  		RealMatrix delta = new Array2DRowRealMatrix(this.numAttributes,1);
  
  		double adjustBiasTwo = 0.0;
  		
  		// Backpropagation to adjust the weights in layer two
  		for(int i = 0 ; i < this.numAttributes ; i++)
  		{
  			double inputVal = input.getEntry(i, 0);
  			double outputVal = output.getEntry(i, 0);
  			delta.setEntry(i, 0, (outputVal-inputVal)*outputVal*(1.0-outputVal));
  			//squaredError += 0.5*Math.pow((outputVal-inputVal), 2.0);
  			adjustBiasTwo -= this.learningRate*delta.getEntry(i, 0)*this.biasTwo;
  		}
  		
  		RealMatrix adjustmentTwo = (delta.multiply(hidden.transpose())).scalarMultiply(-1.0*this.learningRate);
  				
  		// Back propagation to adjust the weights in layer one
  		RealMatrix hidden2 = hidden.scalarMultiply(-1.0).scalarAdd(1.0);
  		RealMatrix delta2 = delta.transpose().multiply(this.weightsTwo);
  		double adjustBiasOne = 0.0;
  		
  		for (int i = 0 ; i < this.hiddenLayerSize ; i++)
  		{
  			delta2.setEntry(0, i, delta2.getEntry(0, i)*hidden2.getEntry(i, 0)*hidden.getEntry(i, 0));
  			adjustBiasOne -= this.learningRate*delta2.getEntry(0, i)*this.biasOne;
  		}
  		
  		RealMatrix adjustmentOne = delta2.transpose().multiply(input.transpose()).scalarMultiply(-1.0*this.learningRate);
  		
  		this.weightsOne = this.weightsOne.add(adjustmentOne);
  		this.biasOne += adjustBiasOne;
  		this.weightsTwo = this.weightsTwo.add(adjustmentTwo);
  		this.biasTwo += adjustBiasTwo;
  	}