package org.ga.imp;

//import sof.mpeg21.settings.KernelAdt;
import java.util.ArrayList;
import java.util.Vector;

import org.jgap.*;

//import sof.mpeg21.structures.*;
import org.ga.kernel.KernelGA;

public class GARunner
    implements Runnable {
  private KernelGA kernelGA;
  private int numberOfGenes = 3; //until we see where to set
  //private int pathNum;

  static public ArrayList <Chromosome> FittestChromos = new ArrayList<Chromosome>();
  static public double fitnessResult = 0;
  static public double globalFitnessResult = 0;
	
  static public Vector fitnessInfo = new Vector();
  
  public GARunner(KernelGA kernelGA) {
    this.kernelGA = kernelGA;
  }

  //public GARunner(KernelGA kernelGA,int path) {
//	    this.kernelGA = kernelGA;
//	    pathNum = path;
//	  }
  
  public void run() {

    kernelGA.doProGAProcess();
    // ExtractOperators extractOperators = new ExtractOperators(); //exctracts and sets to kernel
    Configuration conf = kernelGA.getConfiguration();
    // FitnessFunction myFunc = kernelGA.getFitnessfunction();
    /*try {
      conf.setFitnessFunction(myFunc);
         }
         catch (InvalidConfigurationException ex1) {
      ex1.printStackTrace();
         }*/
    //intialize numberOfGenes=extractOperators.operatorDomainVec.length
    try {
     // Gene sampleGenes[] = kernelGA.getNewSampleGenes(numberOfGenes);
      /* for (int x = 0; x < numberOfGenes; x++) {
         sampleGenes[x] = new AUGene(kernel.UFSTypeVec, x);
         RandomGenerator generator =
             conf.getRandomGenerator();
         sampleGenes[x].setToRandomValue(generator);

       }*/

      //  AUGene gene=new AUGene(null,0);
      //   gene.setAllele(sampleGenes[0].getAllele());
      Chromosome sampleChromosome = kernelGA.getTemplateChromosome();// new Chromosome(sampleGenes);
      conf.setSampleChromosome(sampleChromosome);
      conf.setPopulationSize(kernelGA.getPopulSize());
      //problem
      Genotype gpopulation = Genotype.randomInitialGenotype(conf);
      kernelGA.setGenotype(gpopulation);

      for (int i = 0; i < kernelGA.getEvolNo(); i++) {
    	  //System.out.println("Evolution "+i);
        gpopulation.evolve();
        //FitnessFunction a = gpopulation.getConfiguration().getFitnessFunction();
        
        if (kernelGA.getStopWhenCoverCriteria()) {
          if (kernelGA.getHasCoverCriteria()) {
            System.out.println("Stopping - CoverCriteria");
            break;
          }
        }
      }
      Chromosome bestSolutionSoFar = gpopulation.getFittestChromosome();
      System.out.println("bestSolutionSoFar= " + bestSolutionSoFar);
     
      if (bestSolutionSoFar.getFitnessValue()>0.99)
      {
    	  //kernelGA.doAfterGAProcess(bestSolutionSoFar);
    	  FittestChromos.add(bestSolutionSoFar);
    	  globalFitnessResult = globalFitnessResult + bestSolutionSoFar.getFitnessValue();
    	  fitnessInfo.addElement(globalFitnessResult);
      }
      else
      {
    	  fitnessResult = globalFitnessResult + bestSolutionSoFar.getFitnessValue();
    	  fitnessInfo.addElement(fitnessResult);
    	  fitnessResult = 0;
      }
    }
    catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}
