/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaml;

import org.encog.Encog;
import org.encog.engine.network.activation.ActivationReLU;
import org.encog.engine.network.activation.ActivationSigmoid;
import org.encog.ml.data.MLData;
import org.encog.ml.data.MLDataPair;
import org.encog.ml.data.MLDataSet;
import org.encog.ml.data.basic.BasicMLDataSet;
import org.encog.neural.networks.BasicNetwork;
import org.encog.neural.networks.layers.BasicLayer;
import org.encog.neural.networks.training.propagation.back.Backpropagation;
import org.encog.neural.networks.training.propagation.resilient.ResilientPropagation;
import org.encog.neural.networks.training.strategy.SmartMomentum;

/**
 *
 * @author u6033451
 */
public class Inicio {
       
	/**
	 * The main method.
	 * @param args No arguments are used.
	 */
	public static void main(final String args[]) {
            
            
                JAVAML jml = new JAVAML();                
		
		// create a neural network, without using a factory
		BasicNetwork network = new BasicNetwork();
		network.addLayer(new BasicLayer(null,true,3));
		network.addLayer(new BasicLayer(new ActivationReLU(),true,200));               
		network.addLayer(new BasicLayer(new ActivationSigmoid(),false,2));
		network.getStructure().finalizeStructure();
		network.reset();

		// create training data
		MLDataSet dataSet = new BasicMLDataSet(jml.getX(), jml.getY());
		
		// train the neural network
//		final ResilientPropagation train = new ResilientPropagation(network, dataSet);
                Backpropagation train = new Backpropagation(network, dataSet);   
                train.addStrategy(new SmartMomentum());
                

		int epoch = 1;

		do {
			train.iteration();
			System.out.println("Epoch #" + epoch + " Error:" + train.getError());
			epoch++;
		} while(train.getError() > 0.01 & epoch < 500000);
		train.finishTraining();

		// test the neural network
		System.out.println("Neural Network Results:");
		for(MLDataPair pair: dataSet ) {
			final MLData output = network.compute(pair.getInput());
			System.out.println(pair.getInput().getData(0) + ", " + pair.getInput().getData(1)+ ", " + pair.getInput().getData(2)
					+ ", actual=" + output.getData(0) +", "+ output.getData(1) 
                                        + ", ideal=" + pair.getIdeal().getData(0)+", "+ pair.getIdeal().getData(1));
		}
		
		Encog.getInstance().shutdown();
                        
    }
}
