* *
**********************************************************************************/
#include "TMVA/GeneticPopulation.h"
#include "TMVA/GeneticGenes.h"
#include "Riostream.h"
#include "Rstrstream.h"
#include "TSystem.h"
#include "TRandom3.h"
#include "TH1.h"
using namespace std;
ClassImp(TMVA::GeneticPopulation)
TMVA::GeneticPopulation::GeneticPopulation()
{
fRandomGenerator = new TRandom3(0);
fRandomGenerator->Uniform(0.,1.);
fGenePool = new multimap<Double_t, TMVA::GeneticGenes>();
fNewGenePool = new multimap<Double_t, TMVA::GeneticGenes>();
fCounterFitness = 0;
}
void TMVA::GeneticPopulation::CreatePopulation( Int_t size )
{
fPopulationSize = size;
fGenePool->clear();
fNewGenePool->clear();
vector< TMVA::GeneticRange* >::iterator rIt;
vector< Double_t > newEntry;
for( Int_t i=0; i<fPopulationSize; i++ ){
newEntry.clear();
for( rIt = fRanges.begin(); rIt<fRanges.end(); rIt++ ){
newEntry.push_back( (*rIt)->Random() );
}
entry e(0, TMVA::GeneticGenes( newEntry) );
fGenePool->insert( e );
}
fCounter = fGenePool->begin();
}
void TMVA::GeneticPopulation::AddPopulation( TMVA::GeneticPopulation *strangers )
{
multimap<Double_t, TMVA::GeneticGenes >::iterator it;
for( it = strangers->fGenePool->begin(); it != strangers->fGenePool->end(); it++ ) {
GiveHint( it->second.GetFactors(), it->first );
}
}
void TMVA::GeneticPopulation::TrimPopulation( )
{
multimap<Double_t, TMVA::GeneticGenes >::iterator it = fGenePool->begin() ;
for( Int_t i=0; i<fPopulationSize; i++ ) it++;
fGenePool->erase( it, fGenePool->end()-- );
}
void TMVA::GeneticPopulation::MakeChildren()
{
multimap<Double_t, TMVA::GeneticGenes >::iterator it;
multimap<Double_t, TMVA::GeneticGenes >::iterator it2;
Int_t pos = 0;
Int_t n = 0;
for( it = fGenePool->begin(); it != fGenePool->end(); it++ ){
if( n< (Int_t)(fGenePool->size()/2) ){
fNewGenePool->insert( entry(0, it->second) );
pos = (Int_t)fRandomGenerator->Integer( fGenePool->size()/2 );
it2 = fGenePool->begin();
for( Int_t i=0; i<pos; i++) it2++;
fNewGenePool->insert( entry( 0, MakeSex( it->second, it2->second ) ) );
} else continue;
n++;
}
fGenePool->swap( (*fNewGenePool) );
fNewGenePool->clear();
}
TMVA::GeneticGenes TMVA::GeneticPopulation::MakeSex( TMVA::GeneticGenes male,
TMVA::GeneticGenes female )
{
vector< Double_t > child;
vector< Double_t >::iterator itM;
vector< Double_t >::iterator itF = female.GetFactors().begin();
for( itM = male.GetFactors().begin(); itM < male.GetFactors().end(); itM++ ){
if( fRandomGenerator->Integer( 2 ) == 0 ){
child.push_back( (*itM) );
}else{
child.push_back( (*itF) );
}
itF++;
}
return TMVA::GeneticGenes( child );
}
void TMVA::GeneticPopulation::MakeMutants( Double_t probability, Bool_t near,
Double_t spread, Bool_t mirror )
{
multimap<Double_t, TMVA::GeneticGenes >::iterator it;
Int_t n = 0;
for( it = fGenePool->begin(); it != fGenePool->end(); it++ ){
if( n< (fPopulationSize/2) ){
fNewGenePool->insert( entry(0, it->second) );
fNewGenePool->insert( entry(1, it->second) );
} else continue;
n++;
}
fGenePool->swap( (*fNewGenePool) );
Mutate( probability, fPopulationSize/2, near, spread, mirror );
fNewGenePool->clear();
}
void TMVA::GeneticPopulation::Mutate( Double_t probability , Int_t startIndex,
Bool_t near, Double_t spread, Bool_t mirror )
{
multimap<Double_t, TMVA::GeneticGenes >::iterator it;
Int_t index = 0;
vector< Double_t >::iterator vec;
vector< TMVA::GeneticRange* >::iterator vecRange;
for( it = fGenePool->begin(); it != fGenePool->end(); it++ ){
if( index >= startIndex ){
vecRange = fRanges.begin();
for( vec = (it->second.GetFactors()).begin(); vec < (it->second.GetFactors()).end(); vec++ ){
if( fRandomGenerator->Uniform( 100 ) <= probability ){
(*vec) = (*vecRange)->Random( near, (*vec), spread, mirror );
}
vecRange++;
}
}
index++;
}
}
void TMVA::GeneticPopulation::AddFactor( Double_t from, Double_t to )
{
fRanges.push_back( new TMVA::GeneticRange( fRandomGenerator, from, to ) );
}
TMVA::GeneticGenes* TMVA::GeneticPopulation::GetGenes( Int_t index )
{
multimap<Double_t, TMVA::GeneticGenes >::iterator it = fGenePool->begin();
for( Int_t i=0; i<index; i++) it++;
return &(it->second);
}
Double_t TMVA::GeneticPopulation::GetFitness( Int_t index )
{
multimap<Double_t, TMVA::GeneticGenes >::iterator it = fGenePool->begin();
for( Int_t i=0; i<index; i++) it++;
return it->first;
}
void TMVA::GeneticPopulation::ClearResults()
{
multimap<Double_t, TMVA::GeneticGenes >::iterator it;
for( it = fGenePool->begin(); it!=fGenePool->end(); it++ ){
it->second.ClearResults();
}
}
TMVA::GeneticGenes* TMVA::GeneticPopulation::GetGenes()
{
TMVA::GeneticGenes *g;
if( fCounter == fGenePool->end() ) {
g = new TMVA::GeneticGenes();
return g;
}
g = &(fCounter->second);
fCounterFitness = fCounter->first;
return g;
}
Double_t TMVA::GeneticPopulation::GetFitness()
{
if( fCounter == fGenePool->end() ) {
Reset();
return -1.;
}
return fCounter->first;
}
void TMVA::GeneticPopulation::Reset()
{
fCounter = fGenePool->begin();
fNewGenePool->clear();
}
Bool_t TMVA::GeneticPopulation::SetFitness( TMVA::GeneticGenes *g, Double_t fitness, Bool_t add )
{
if (add) g->GetResults().push_back( fitness );
fNewGenePool->insert( entry( fitness, *g) );
fCounter++;
if( fCounter == fGenePool->end() ){
fGenePool->swap( (*fNewGenePool) );
fCounter = fGenePool->begin();
Reset();
return kFALSE;
}
return kTRUE;
}
void TMVA::GeneticPopulation::GiveHint( vector< Double_t > hint, Double_t fitness )
{
TMVA::GeneticGenes g;
g.GetFactors().assign( hint.begin(), hint.end() );
fGenePool->insert( entry( fitness, g ) );
}
void TMVA::GeneticPopulation::Print( Int_t untilIndex)
{
multimap<Double_t, TMVA::GeneticGenes >::iterator it;
Int_t n;
for( it = fGenePool->begin(); it != fGenePool->end(); it++ ){
if( untilIndex >= -1 ) {
if( untilIndex == -1 ) return;
untilIndex--;
}
n = 0;
for( vector< Double_t >::iterator vec = it->second.GetFactors().begin();
vec < it->second.GetFactors().end(); vec++ ) {
cout << "f_" << n++ << ": " << (*vec) << " ";
}
cout << endl;
}
}
void TMVA::GeneticPopulation::Print( ostream & out, Int_t untilIndex )
{
multimap<Double_t, TMVA::GeneticGenes >::iterator it;
Int_t n;
for( it = fGenePool->begin(); it != fGenePool->end(); it++ ){
if( untilIndex > -1 ) {
untilIndex--;
if( untilIndex == -1 ) return;
}
n = 0;
out << "fitness: " << it->first << " ";
for( vector< Double_t >::iterator vec = it->second.GetFactors().begin();
vec < it->second.GetFactors().end(); vec++ ){
out << "f_" << n++ << ": " << (*vec) << " ";
}
out << endl;
}
}
TH1F* TMVA::GeneticPopulation::VariableDistribution( Int_t varNumber, Int_t bins,
Int_t min, Int_t max )
{
std::stringstream histName;
histName.clear();
histName.str("v");
histName << varNumber;
TH1F *hist = new TH1F( histName.str().c_str(),histName.str().c_str(), bins,min,max );
hist->SetBit(TH1::kCanRebin);
multimap<Double_t, TMVA::GeneticGenes >::iterator it;
for( it = fGenePool->begin(); it != fGenePool->end(); it++ ){
hist->Fill( it->second.GetFactors().at(varNumber));
}
return hist;
}
vector<Double_t> TMVA::GeneticPopulation::VariableDistribution( Int_t varNumber )
{
vector< Double_t > varDist;
multimap<Double_t, TMVA::GeneticGenes >::iterator it;
for( it = fGenePool->begin(); it != fGenePool->end(); it++ ){
varDist.push_back( it->second.GetFactors().at( varNumber ) );
}
return varDist;
}
TMVA::GeneticPopulation::~GeneticPopulation()
{
if( fRandomGenerator != NULL ) delete fRandomGenerator;
if( fGenePool != NULL ) delete fGenePool;
if( fNewGenePool != NULL ) delete fNewGenePool;
std::vector<GeneticRange*>::iterator it = fRanges.begin();
for(;it!=fRanges.end(); it++) {
delete *it;
}
}
ROOT page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.