46 ClassImp(TMVA::MCFitter);
51 TMVA::MCFitter::MCFitter( IFitterTarget& target,
53 const std::vector<Interval*>& ranges,
54 const TString& theOption )
55 : TMVA::FitterBase( target, name, ranges, theOption ),
67 void TMVA::MCFitter::DeclareOptions()
69 DeclareOptionRef( fSamples = 100000,
"SampleSize",
"Number of Monte Carlo events in toy sample" );
70 DeclareOptionRef( fSigma = -1.0,
"Sigma",
71 "If > 0: new points are generated according to Gauss around best value and with \"Sigma\" in units of interval length" );
72 DeclareOptionRef( fSeed = 100,
"Seed",
"Seed for the random generator (0 takes random seeds)" );
78 void TMVA::MCFitter::SetParameters( Int_t samples )
86 Double_t TMVA::MCFitter::Run( std::vector<Double_t>& pars )
88 Log() << kHEADER <<
"<MCFitter> Sampling, please be patient ..." << Endl;
91 if ((Int_t)pars.size() != GetNpars())
92 Log() << kFATAL <<
"<Run> Mismatch in number of parameters: "
93 << GetNpars() <<
" != " << pars.size() << Endl;
96 Timer timer( fSamples, GetName() );
97 if (fIPyMaxIter) *fIPyMaxIter = fSamples;
99 std::vector<Double_t> parameters;
100 std::vector<Double_t> bestParameters;
102 TRandom3*rnd =
new TRandom3( fSeed );
105 std::vector<TMVA::GeneticRange*> rndRanges;
108 std::vector< TMVA::Interval* >::const_iterator rIt;
110 for (rIt = fRanges.begin(); rIt<fRanges.end(); ++rIt) {
111 rndRanges.push_back(
new TMVA::GeneticRange( rnd, (*rIt) ) );
112 val = rndRanges.back()->Random();
113 parameters.push_back( val );
114 bestParameters.push_back( val );
117 std::vector<Double_t>::iterator parIt;
118 std::vector<Double_t>::iterator parBestIt;
120 Double_t estimator = 0;
121 Double_t bestFit = 0;
124 for (Int_t sample = 0; sample < fSamples; sample++) {
125 if (fIPyCurrentIter) *fIPyCurrentIter = sample;
126 if (fExitFromTraining && *fExitFromTraining)
break;
129 parIt = parameters.begin();
131 parBestIt = bestParameters.begin();
132 for (std::vector<TMVA::GeneticRange*>::iterator rndIt = rndRanges.begin(); rndIt<rndRanges.end(); ++rndIt) {
133 (*parIt) = (*rndIt)->Random( kTRUE, (*parBestIt), fSigma );
139 for (std::vector<TMVA::GeneticRange*>::iterator rndIt = rndRanges.begin(); rndIt<rndRanges.end(); ++rndIt) {
140 (*parIt) = (*rndIt)->Random();
146 estimator = EstimatorFunction( parameters );
149 if (estimator < bestFit || sample==0) {
151 bestParameters.swap( parameters );
155 if ((fSamples<100) || sample%Int_t(fSamples/100.0) == 0) timer.DrawProgressBar( sample );
157 pars.swap( bestParameters );
160 Log() << kINFO <<
"Elapsed time: " << timer.GetElapsedTime()