package com.kloover.ai.joone;

import org.joone.helpers.factory.JooneTools;
import org.joone.net.NeuralNet;
public class XORExample {
    
    // XOR input
    private static double[][] inputArray = new double[][] {
        {0.0, 0.0},
        {0.0, 1.0},
        {1.0, 0.0},
        {1.0, 1.0}
    };
    
    // XOR desired output
    private static double[][] desiredArray = new double[][] {
        {0.0},
        {1.0},
        {1.0},
        {0.0}
    };

    public static void main(String[] args) {
        	NeuralNet nnet = JooneTools.create_standard(new int[]{ 2, 2, 1 }, JooneTools.LOGISTIC);
            double rmse = JooneTools.train(nnet, inputArray, desiredArray,
                    100, 0.01,
                    1, System.out, false);
            
            System.out.println("\nLast RMSE = " + rmse + "\nResults:");
            for (int i=0; i < inputArray.length; i++) {
                double[] output = JooneTools.interrogate(nnet, inputArray[i]);
                System.out.println("f(" + inputArray[i][0] + ", " + inputArray[i][1] + ") = " + output[0] + " ~= " + Math.round(output[0]));
            }
            
            double[] output = JooneTools.interrogate(nnet, new double[]{0.5, 0.5});
            System.out.println("f(0.5, 0.5) = " + output[0] + " ~= " + Math.round(output[0]));
            
            double testRMSE = JooneTools.test(nnet, inputArray, desiredArray);
            System.out.println("\nTest error = " + testRMSE);
    }
}
