/*
 *  main.cc    sample program file
 */
 
#include <iostream>
#include <ctime> 
#include <string>
#include "Population.h" 
#include "Automaton.h"
using namespace std;



const int POPULATION_SIZE = 100;
const int GENERATIONS = 50000; 
const int NUMBER_OF_TRIALS = 100; 

double generationalCount[GENERATIONS]; 

int main() {
   srand(time(0));

   Population<Automaton,Automaton::Pack> P;   
   P.create(POPULATION_SIZE);    
   int genCt = 0;          
   
   double niceOnes = 0.0;   
   double nicePct;          
   
   cout <<        
         "  Gen      Fitnesses       Pct   |       Game Outcome Totals\n"  
       << "   #     (Max)    (Avg)    Nice  |   (CC)    (CD)    (DC)    (DD) \n"
       << "  ----   -----   -------   ----  |  ------  ------  ------  ------\n";
   
   while (true) {      
      double niceOnes = 0.0;       
      cout << "  ";      
      cout.width(4);       
      cout.setf(ios::right);      
      cout << genCt;       
      cout << "   ";      
      cout.width(5);       
      cout.setf(ios::left);      
      cout << P.getMaximumFitness();       
      cout << "   ";      
      cout.width(7);       
      cout.setf(ios::left);      
      cout << P.getAverageFitness();       
      cout << "   ";      
      for (int i = 0; i < POPULATION_SIZE; i++) {          
         Automaton *individual = P.getIndividual(i);         
         if (individual->isNice())             
            niceOnes++;      
      }       
      double pct = ((niceOnes/static_cast<double>(POPULATION_SIZE))*100.0);      
      cout.width(3);       
      cout.setf(ios::right);      
      cout << pct;       
      cout << "%  |  ";      
      cout.width(8);
      cout.setf(ios::right);      
      cout << cc_count;       
      cout << "  ";      
      cout.width(8);       
      cout.setf(ios::right);      
      cout << cd_count;       
      cout << "  ";      
      cout.width(8);       
      cout.setf(ios::right);      
      cout << dc_count;       
      cout << "  ";      
      cout.width(8);       
      cout.setf(ios::right);      
      cout << dd_count;       
      cout << "\n";                   
      
      genCt++;      
      cc_count = 0;       
      cd_count = 0;      
      dc_count = 0;       
      dd_count = 0;      
      if (genCt % 20 == 0) {   
         
         // Print out best individual's move and nextState data                   
         // P.getBestIndividual()->printStates(0,true);          
         
         // Print determination of whether or not best individual is nice         
         // cout << P.getBestIndividual()->isNice();                   
         
         cout << "\nPress return, or enter Q to quit: ";          
         string line;         
         getline(cin,line);          
         if (line == "q" || line == "Q")            
            exit(0);          
         cout << endl;         
         cout <<           
            "  Gen      Fitnesses       Pct   |       Game Outcome Totals\n"      
         << "   #     (Max)    (Avg)    Nice  |   (CC)    (CD)    (DC)    (DD) \n"
         << "  ----   -----   -------   ----  |  ------  ------  ------  ------\n";
      }                
      P.breed();             
      
   }            
   cout << endl << endl;    

}
