First parallel version of PhyloMOEA

git-svn-id: svn://scm.gforge.inria.fr/svnroot/paradiseo@1390 331e1502-861f-0410-8da2-ba01fb791d7f
This commit is contained in:
wcancino 2009-02-03 14:26:35 +00:00
commit 7feb972a77

View file

@ -1,11 +1,13 @@
#include <eo> #include <eo>
#include <moeo> #include <moeo>
#include <peo>
#include <PhyloMOEO.h> #include <PhyloMOEO.h>
#include <PhyloMOEO_operators.h> #include <PhyloMOEO_operators.h>
#include <PhyloMOEO_init.h> #include <PhyloMOEO_init.h>
#include <PhyloMOEO_eval.h> #include <PhyloMOEO_eval.h>
#include <PhyloMOEO_archive.h> #include <PhyloMOEO_archive.h>
#include <PhyloMOEOProbMatrixContainerUpdater.h> #include <PhyloMOEOProbMatrixContainerUpdater.h>
#include <PhyloMOEO_packunpack.h>
#include <moeoNSGAII2.h> #include <moeoNSGAII2.h>
#include <utils/moeoBestObjVecStat.h> #include <utils/moeoBestObjVecStat.h>
#include <utils/moeoAverageObjVecStat.h> #include <utils/moeoAverageObjVecStat.h>
@ -13,6 +15,7 @@
#include <eoCountedFileMonitor.h> #include <eoCountedFileMonitor.h>
#include <eoSingleFileCountedStateSaver.h> #include <eoSingleFileCountedStateSaver.h>
#include <vectorSortIndex.h> #include <vectorSortIndex.h>
#include <utils.h> #include <utils.h>
#include <ctime> #include <ctime>
#include <apply.h> #include <apply.h>
@ -28,13 +31,17 @@ unsigned int ngenerations, popsize, ncats;
ofstream exp_data,evolution_data, best_media_scores, final_trees, final_pareto_trees, clades_pareto, clades_final,final_scores,pareto_scores; ofstream exp_data,evolution_data, best_media_scores, final_trees, final_pareto_trees, clades_pareto, clades_final,final_scores,pareto_scores;
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
welcome_message();
peo :: init( argc, argv );
eoParser parser(argc, argv); eoParser parser(argc, argv);
seed = parser.createParam((unsigned int)(time(NULL)), "seed", "Random Seed", 's',"Param").value(); seed = parser.createParam((unsigned int)(time(NULL)), "seed", "Random Seed", 's',"Param").value();
popsize = parser.createParam((unsigned int)(50), "popSize", "Population size", 'n',"Param").value(); popsize = parser.createParam((unsigned int)(50), "popSize", "Population size", 'n',"Param").value();
@ -52,18 +59,22 @@ int main(int argc, char *argv[])
convert << seed; convert << seed;
expid = parser.createParam(convert.str(), "expid", "Experiment ID", 'e',"Param").value(); expid = parser.createParam(convert.str(), "expid", "Experiment ID", 'e',"Param").value();
if(getNodeRank()==1) welcome_message();
if( datafile.size()==0 ) if( datafile.size()==0 )
{ {
parser.printHelp( cout );
if(getNodeRank()==1) parser.printHelp( cout );
return(-1); return(-1);
} }
// all nodes read datafile and prepares likelihood and parsimony calculation
string filename = path + datafile; string filename = path + datafile;
cout << "\n\nReading Sequence Datafile..."; cout << "\n\nReading Sequence Datafile...";
Sequences seq(filename.c_str()); Sequences seq(filename.c_str());
cout << " done.\n"; cout << " done.\n";
// calculate datafile // calculate datafile
cout << "calculating pattersn..." << getNodeRank() << endl;
seq.calculate_patterns(); seq.calculate_patterns();
seq.calculate_frequences(); seq.calculate_frequences();
@ -73,22 +84,19 @@ int main(int argc, char *argv[])
ParsimonyCalculator parsi_calc(templatetree); ParsimonyCalculator parsi_calc(templatetree);
SubstModel modelHKY( seq, SubstModel::HKY85); SubstModel modelHKY( seq, SubstModel::HKY85);
modelHKY.init(); modelHKY.init();
modelHKY.set_kappa(kappa); // banco_grande modelHKY.set_kappa(kappa);
ProbMatrixContainer probmatrixs(modelHKY); ProbMatrixContainer probmatrixs(modelHKY);
LikelihoodCalculator lik_calc(templatetree, modelHKY, probmatrixs,ncats); LikelihoodCalculator lik_calc(templatetree, modelHKY, probmatrixs,ncats);
lik_calc.set_alpha(alpha); lik_calc.set_alpha(alpha);
modelHKY.init(); modelHKY.init();
PhyloEval byobj( parsi_calc, lik_calc ); PhyloEval byobj( parsi_calc, lik_calc );
Phyloraninit initializer(templatetree); Phyloraninit initializer(templatetree);
eoState state;
//eoPop <PhyloMOEO> &population = state.takeOwnership(eoPop<PhyloMOEO>(popsize, initializer));
eoPop<PhyloMOEO> population(popsize, initializer); eoPop<PhyloMOEO> population(popsize, initializer);
//state.registerObject( population ); peoMoeoPopEval <PhyloMOEO> eval(byobj);
// Only the master node read the initial trees and writes ouput files
if(getNodeRank()==1)
{
cout << "\n\nReading Initial Trees..."; cout << "\n\nReading Initial Trees...";
if( usertree.size() >0) if( usertree.size() >0)
{ {
@ -97,7 +105,6 @@ int main(int argc, char *argv[])
} }
cout << " done.\n"; cout << " done.\n";
cout << "\n\nCreating output files..."; cout << "\n\nCreating output files...";
try{ try{
@ -118,62 +125,96 @@ int main(int argc, char *argv[])
{ {
e.Report(); e.Report();
} }
// create the moea // create the moea <
save_exp_params(exp_data); save_exp_params(exp_data);
seq.save_seq_data(exp_data); seq.save_seq_data(exp_data);
moeoAverageObjVecStat <PhyloMOEO> bestfit; }
moeoBestObjVecStat <PhyloMOEO> avgfit;
eoPopStat<PhyloMOEO> popstats;
eoCountedFileMonitor media_scores( 2, path + datafile + "_media_scores_" + expid + ".txt", "\t", true,true );
media_scores.add( bestfit);
media_scores.add( avgfit) ;
eoCountedFileMonitor evolution_scores( 2, path + datafile + "_evolution_data_" + expid + ".txt", "\n", true,true );
evolution_scores.add( popstats);
//cout << "\n\nRunning NSGA-II ..." << endl;
eoGenContinue<PhyloMOEO> continuator(ngenerations); eoGenContinue<PhyloMOEO> continuator(ngenerations);
eoCheckPoint<PhyloMOEO> cp(continuator); eoCheckPoint<PhyloMOEO> cp(continuator);
eoValueParam<unsigned> generationCounter(0, "Gen.");
eoIncrementor<unsigned> increment(generationCounter.value());
cp.add(increment);
eoStdoutMonitor monitor(false);
monitor.add(generationCounter);
cp.add(monitor);
Phylomutate mutator; Phylomutate mutator;
Phylocross crossover; Phylocross crossover;
eoSequentialOp<PhyloMOEO> operadores; eoSequentialOp<PhyloMOEO> operadores;
operadores.add(crossover,pcrossover); operadores.add(crossover,pcrossover);
operadores.add(mutator,pmutation); operadores.add(mutator,pmutation);
PhyloMOEOProbMatrixContainerUpdater probmatrixupdater(probmatrixs); PhyloMOEOProbMatrixContainerUpdater probmatrixupdater(probmatrixs);
cp.add( bestfit);
cp.add( avgfit);
cp.add( media_scores);
cp.add( evolution_scores );
cp.add( popstats);
cp.add( probmatrixupdater ); cp.add( probmatrixupdater );
// apply<PhyloMOEO> ( byobj, population ); moeoAverageObjVecStat <PhyloMOEO> *bestfit;
// population.printOn(cout); moeoBestObjVecStat <PhyloMOEO> *avgfit;
eoPopStat<PhyloMOEO> *popstats;
eoCountedFileMonitor *media_scores, *evolution_scores;
eoStdoutMonitor *monitor;
eoValueParam<unsigned> *generationCounter;
eoIncrementor<unsigned> *increment;
// only the master output files
if(getNodeRank()==1){
generationCounter = new eoValueParam<unsigned> (0, "Gen.");
increment = new eoIncrementor<unsigned>(generationCounter->value());
cp.add(*increment);
monitor = new eoStdoutMonitor(false);
monitor->add(*generationCounter);
bestfit = new moeoAverageObjVecStat <PhyloMOEO>();
avgfit = new moeoBestObjVecStat <PhyloMOEO>();
popstats = new eoPopStat<PhyloMOEO> ();
media_scores = new eoCountedFileMonitor( 2, path + datafile + "_media_scores_" + expid + ".txt", "\t", true,true );
media_scores->add( *avgfit) ;
media_scores->add( *bestfit );
evolution_scores = new eoCountedFileMonitor( 2, path + datafile + "_evolution_data_" + expid + ".txt", "\n", true,true );
evolution_scores->add( *popstats);
cp.add( *media_scores);
cp.add( *evolution_scores );
cp.add( *popstats);
cp.add( *bestfit);
cp.add( *avgfit);
cp.add( *monitor);
}
if(algotype == "ibea") if(algotype == "ibea")
{ {
moeoAdditiveEpsilonBinaryMetric < ObjectiveVector > metric; moeoAdditiveEpsilonBinaryMetric < ObjectiveVector > metric;
moeoIBEA < PhyloMOEO > algo (cp, byobj, operadores, metric); moeoIBEA < PhyloMOEO > algo (cp, byobj, operadores, metric);
cout << "\n\nRunning IBEA ..." << endl; if(getNodeRank()==1){
algo(population); cout << "\n\nRunning IBEA ..." << endl; }
peoWrapper parallelEA( algo, population);
eval.setOwner(parallelEA);
peo :: run();
peo :: finalize();
//algo(population);
} }
else else
{ {
moeoNSGAII < PhyloMOEO > algo (cp, byobj, operadores); moeoNSGAII < PhyloMOEO > algo (cp, byobj, operadores);
cout << "\n\nRunning NSGA-II ..." << endl; if(getNodeRank()==1){
algo(population); cout << "\n\nRunning NSGA-II ..." << endl; }
peoWrapper parallelEA( algo, population);
eval.setOwner(parallelEA);
peo :: run();
peo :: finalize();
//algo(population);
} }
if (getNodeRank()==1)
{
delete media_scores;
delete evolution_scores;
delete bestfit;
delete avgfit;
delete popstats;
delete monitor;
delete generationCounter;
delete increment;
cout << "\nCalculating Final Solutions..."; cout << "\nCalculating Final Solutions...";
cout << " done\n"; cout << " done\n";
@ -184,7 +225,7 @@ int main(int argc, char *argv[])
// optimize remaining solutions // optimize remaining solutions
cout << "\nOptimizing tree branch lenghts...\n"; cout << "\nOptimizing tree branch lenghts...\n";
optimize_solutions( finalsolutions, lik_calc ); //optimize_solutions( finalsolutions, lik_calc );
cout << "\nReevaluating individuals \n"; cout << "\nReevaluating individuals \n";
apply<PhyloMOEO> ( byobj, finalsolutions ); apply<PhyloMOEO> ( byobj, finalsolutions );
@ -228,7 +269,7 @@ int main(int argc, char *argv[])
paretosplitstatsaver.add(splitstats); paretosplitstatsaver.add(splitstats);
paretosplitstatsaver(); paretosplitstatsaver();
// save_partitions(splitstats.value(), clades_pareto); // save_partitions(splitstats.value(), clades_pareto);
//split_frequences.clear(); //split_frequences.clear();
cout << " done\n"; cout << " done\n";
exp_data.close(); exp_data.close();
@ -240,10 +281,11 @@ int main(int argc, char *argv[])
final_pareto_trees.close(); final_pareto_trees.close();
clades_pareto.close(); clades_pareto.close();
clades_final.close(); clades_final.close();
gsl_rng_free(rn2);
// delete probmatrixs;
delete rn;
cout << "\nPhyloMOEA execution finishes !\n"; cout << "\nPhyloMOEA execution finishes !\n";
}
gsl_rng_free(rn2);
// delete probmatrixs;
delete rn;
return 0; return 0;
} }