#include "Bean.hxx"
#include <fstream>
#include <iostream>
#include <deque>
#include <algorithm>


typedef deque<int>            SequenceVilles;
typedef deque<SequenceVilles> TPopulation;


int main(int,char **)
{
  TPopulation population;
  TGenome     genome;
  int         nbSequences;
  int         nbVilles;

  ifstream fichierVilles("sequences");
  
  fichierVilles >> nbVilles;
  cout << "Les sequences comptent " << nbVilles << " villes"<<endl<<flush;

  fichierVilles >> nbSequences;
  population.resize(nbSequences);
  cout << "Lecture de " << nbSequences << " sequences" << endl << flush;

  istream_iterator<int> itSeq(fichierVilles);
  for (int i=0;i<nbSequences;i++)
  {
    for (int j=0;j<nbVilles;j++)
    {
      population[i].push_back(*itSeq);
      itSeq++;
    }
  }

  cout << "Population initiale :"<< endl << flush;
  for (int i=0;i<nbSequences;i++)
  {
    copy(population[i].begin(),population[i].end(),ostream_iterator<int>(cout," "));
    cout << endl;
  }
  fichierVilles.close();

  genome.resize(nbSequences);

  for (int i=0;i<nbSequences;i++)
  {
    Bean::Encode(population[i].begin(),population[i].end(),genome[i]);
  }

  // On coupe entre la (5eme et la 6eme ville
  // l'operator == a ete redifini sur les paires pour ne tenir 
  // compte que de la ville !

  ChromoBean::iterator z1=find(genome[0].begin(),genome[0].end(),
                               make_pair(5,0.0));
  ChromoBean::iterator z2=find(genome[1].begin(),genome[1].end(),
                               make_pair(5,0.0));

  ChromoBean nouveau1(genome[1]);
  ChromoBean::iterator destination=find(nouveau1.begin(),nouveau1.end(),
                                        make_pair(5,0.0));
  copy(z1,genome[0].end(),destination);

  ChromoBean nouveau2(genome[0]);
  destination=find(nouveau2.begin(),nouveau2.end(),make_pair(5,0.0));
  copy(z2,genome[1].end(),destination);


  cout << "Nouvelle generation !" << endl;

  Bean::Decode(nouveau1,ostream_iterator<int>(cout," "));
  cout << endl;
  Bean::Decode(nouveau2,ostream_iterator<int>(cout," "));
  cout << endl;
  
  return 0;
}
