import java.util.Scanner;

import java.lang.Math;

class Demo {

    // inputs are declared
    private int x[][]=new int[1][2];
    //weights are declared
    private double w[][]=new double[1][2];
    private double temp;

    private double z[]=new double[1];
    private double desiredOutput;
    private double actualOutput;
    private double error;
    private double definedValue=0.004;
    private double weightChange[][]=new double[1][2];
    private double learningRate;
    private double epilision=0.000000001;
    private static double zTotal;

    public static void main(String[] args) {
    	new Demo().getData();
    }

    public void getData(){
    	x[0][0] = 1;
    	w[0][0] = 0.5;
    	x[0][1] = 0;
    	w[0][1] = 0.6;
    	
    	desiredOutput = 0;
    	definedValue = 0.002;
    	learningRate = 0.23;

        calculate();


    }

    public void calculate(){

        for(int j=0;j<x.length;j++){
            for(int i=0; i<w[0].length; i++){
                temp=0;
                temp=x[j][i]*w[j][i];


              z[j]+=temp;

            }
            zTotal+=z[j];
            System.out.println("temp value :"+zTotal);
        }   

        System.out.println("ztotal "+zTotal);

        //double negZ= -zTotal;

        double temp2=1+Math.exp(-zTotal);
        actualOutput=1/temp2;
        //actualOutput=1/(1+Math.exp(-zTot));


        System.out.println("actualOutput "+actualOutput);

        if(Math.abs(actualOutput-desiredOutput)>epilision){

            calculateError();
        }
        else{
            printWeights();
        }






    }


    public void calculateError(){
        System.out.println("desired out put :"+desiredOutput+" actual out put :"+actualOutput);
        error=0.5*((desiredOutput-actualOutput)*(desiredOutput-actualOutput));
        System.out.println("error "+error+"\n\n");

        //error=0.003;



        checkingCondition();

    }

    public void checkingCondition(){

        if(error<definedValue){

            printWeights();
        }
        else{

            balanceWeights();
        }

    }


    public void balanceWeights(){

        //System.out.println("new Weights are");
        for(int j=0;j<w.length;j++){

            for(int i=0;i<w[0].length;i++){

                weightChange[j][i]=(-learningRate)*(desiredOutput-actualOutput)*actualOutput*(1-actualOutput)*x[j][i];
                System.out.println("weight change "+weightChange[j][i]);
                w[j][i]+=weightChange[j][i];

                //System.out.print(w[i]+"\t");
            }

        }
        calculate();




    }

    public void printWeights(){
        System.out.print("The balanced weights are: ");


        for(int j=0;j<x.length;j++){
            for(int i=0;i<x[0].length;i++){
                System.out.println("Neuron "+j+"Weight of input"+i+"=\t"+w[j][i]);
            }

        }


    }



}