/* Domain.java */

/* This file was originally part of Sane.java.  The Evaluate_net */
/* function and all other domain-specific files reside here; in  */
/* theory, no other Sane files except Config.java should need to */
/* be modified in order to implement a new domain.               */
/* Cyndy Matuszek, 1998 */

import java.util.Random;
import java.lang.Integer;
import java.io.*;

// These imported classes contain data structures.
import Config;
import Neuron;
import Network;
import Best_net_structure;

// Import the various pieces of Sane.  Usually mostly unnecessary.
import Sane;
import Sane_EA;
import Sane_Util;
import Sane_NN;
import Sane_Seed;

public class Domain {


/**********************************************************/
/* Evaluate_net is the user_defined method that is called */
/* from Sane.java for each network to determine its       */
/* fitness.                                               */
/**********************************************************/


  static float Evaluate_net(Network net) {

    float returnVal = 0.0F;
    
    /* 3-XOR */
    
    float in[][] = { {0.0F, 0.0F, 0.0F}, {0.0F, 1.0F, 0.0F}, {0.0F,0.0F, 1.0F}, {0.0F,1.0F, 1.0F},
		     {1.0F,0.0F, 0.0F}, {1.0F,1.0F, 0.0F}, {1.0F,0.0F, 1.0F}, {1.0F,1.0F, 1.0F}};
    float out[] = {0.0f, 1.0F, 1.0F, 0.0F, 1.0F, 0.0F, 0.0F, 1.0F};

    for(int i=0; i<8; i++)
    {
	net.input[0] = in[i][0];
	net.input[1] = in[i][1];
	net.input[2] = in[i][2];

	// activate the net
	Sane_NN.Activate_net(net);

	returnVal += Math.abs(out[i] - net.sigout[0]);

	// For debugging, list out returnvals as we go 
	System.out.print("net.input[0]: " + net.input[0]);
	System.out.print("\tnet.input[1]: " + net.input[1]);
	System.out.print("\tnet.input[2]: " + net.input[2]);
	System.out.println("\tnet.sigout[0]: " + net.sigout[0]);
    }
    returnVal = 8 - returnVal;
    
    System.out.println("\tReturnVal: " + returnVal);
    System.out.println("");

    return returnVal;
 
  }  /* end Evaluate_net */

/**********************************************************/

}  /* end class Domain */


