82 Bool_t useDefaultTemperature)
89 if (kernelTemperatureS ==
"IncreasingAdaptive") {
91 Log() << kINFO <<
"Using increasing adaptive algorithm" <<
Endl;
93 else if (kernelTemperatureS ==
"DecreasingAdaptive") {
95 Log() << kINFO <<
"Using decreasing adaptive algorithm" <<
Endl;
97 else if (kernelTemperatureS ==
"Sqrt") {
99 Log() << kINFO <<
"Using \"Sqrt\" algorithm" <<
Endl;
101 else if (kernelTemperatureS ==
"Homo") {
103 Log() << kINFO <<
"Using \"Homo\" algorithm" <<
Endl;
105 else if (kernelTemperatureS ==
"Log") {
107 Log() << kINFO <<
"Using \"Log\" algorithm" <<
Endl;
109 else if (kernelTemperatureS ==
"Sin") {
111 Log() << kINFO <<
"Using \"Sin\" algorithm" <<
Endl;
134 for (
UInt_t rIter = 0; rIter < parameters.size(); rIter++) {
144 for (
UInt_t rIter = 0; rIter < from.size(); rIter++) to[rIter] = from[rIter];
155 for (
UInt_t rIter=0;rIter<parameters.size();rIter++) {
158 uni =
fRandom->Uniform(0.0,1.0);
159 sign = (uni - 0.5 >= 0.0) ? (1.0) : (-1.0);
160 distribution = currentTemperature * (
TMath::Power(1.0 + 1.0/currentTemperature,
TMath::Abs(2.0*uni - 1.0)) -1.0)*sign;
161 parameters[rIter] = oldParameters[rIter] + (
fRanges[rIter]->GetMax()-
fRanges[rIter]->GetMin())*0.1*distribution;
163 while (parameters[rIter] <
fRanges[rIter]->GetMin() || parameters[rIter] >
fRanges[rIter]->GetMax() );
171 std::vector<Double_t> newParameters(
fRanges.size() );
173 for (
UInt_t rIter=0; rIter<parameters.size(); rIter++) {
176 uni =
fRandom->Uniform(0.0,1.0);
177 sign = (uni - 0.5 >= 0.0) ? (1.0) : (-1.0);
178 distribution = currentTemperature * (
TMath::Power(1.0 + 1.0/currentTemperature,
TMath::Abs(2.0*uni - 1.0)) -1.0)*sign;
179 newParameters[rIter] = parameters[rIter] + (
fRanges[rIter]->GetMax()-
fRanges[rIter]->GetMin())*0.1*distribution;
181 while (newParameters[rIter] <
fRanges[rIter]->GetMin() || newParameters[rIter] >
fRanges[rIter]->GetMax() );
184 return newParameters;
213 else Log() << kFATAL <<
"No such kernel!" <<
Endl;
245 else Log() << kFATAL <<
"No such kernel!" <<
Endl;
255 Double_t t, dT, cold, delta, deltaY,
y, yNew, yBest, yOld;
260 for (
UInt_t rIter = 0; rIter <
x.size(); rIter++)
261 x[rIter] = (
fRanges[rIter]->GetMax() +
fRanges[rIter]->GetMin() ) / 2.0;
264 if ((
i>0) && (deltaY>0.0)) {
272 for (
Int_t k=0; (k<30) && (equilibrium<=12); k++ ) {
285 if (
y != 0.0) delta /=
y;
286 else if (yNew != 0.0) delta /=
y;
289 if (delta < 0.1) equilibrium++;
290 else equilibrium = 0;
297 deltaY = yNew - yOld;
298 if ( (deltaY < 0.0 )&&( yNew < yBest)) {
303 if ((stopper) && (deltaY >= (100.0 * cold)))
break;
314 std::vector<Double_t> bestParameters(
fRanges.size());
315 std::vector<Double_t> oldParameters (
fRanges.size());
317 Double_t currentTemperature, bestFit, currentFit;
318 Int_t optimizeCalls, generalCalls, equals;
341 <<
", current temperature = " << currentTemperature <<
Endl;
343 bestParameters = parameters;
344 bestFit = currentFit =
fFitterTarget.EstimatorFunction( bestParameters );
347 generalCalls =
fMaxCalls - optimizeCalls;
352 for (
Int_t sample = 0; sample < generalCalls; sample++) {
358 if (localFit < currentFit ||
TMath::Abs(currentFit-localFit) <
fEps) {
369 currentFit = localFit;
371 if (currentFit < bestFit) {
373 bestFit = currentFit;
377 if (!
ShouldGoIn(localFit, currentFit, currentTemperature))
380 currentFit = localFit;
398 currentTemperature = startingTemperature;
400 for (
Int_t sample=0;sample<optimizeCalls;sample++) {
404 if (localFit < currentFit) {
405 currentFit = localFit;
407 if (currentFit < bestFit) {
409 bestFit = currentFit;
414 currentTemperature-=(startingTemperature -
fEps)/optimizeCalls;
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t target
Interface for a fitter 'target'.
ostringstream derivative to redirect and format output
Base implementation of simulated annealing fitting procedure.
TRandom * fRandom
random generator
void GenerateNeighbour(std::vector< Double_t > ¶meters, std::vector< Double_t > &oldParameters, Double_t currentTemperature)
generate adjacent parameters
Double_t Minimize(std::vector< Double_t > ¶meters)
minimisation algorithm
Double_t fInitialTemperature
initial temperature
virtual ~SimulatedAnnealing()
destructor
Double_t GenerateMaxTemperature(std::vector< Double_t > ¶meters)
maximum temperature
Double_t fTemperatureScale
how fast temperature change
Bool_t fUseDefaultTemperature
if TRUE, SA calculates its own InitialTemperature (MinTemperautre)
Bool_t fUseDefaultScale
if TRUE, SA calculates its own TemperatureScale
void SetOptions(Int_t maxCalls, Double_t initialTemperature, Double_t minTemperature, Double_t eps, TString kernelTemperatureS, Double_t temperatureScale, Double_t adaptiveSpeed, Double_t temperatureAdaptiveStep, Bool_t useDefaultScale, Bool_t useDefaultTemperature)
option setter
void SetDefaultScale()
setting of default scale
void GenerateNewTemperature(Double_t ¤tTemperature, Int_t Iter)
generate new temperature
void FillWithRandomValues(std::vector< Double_t > ¶meters)
random starting parameters
const std::vector< TMVA::Interval * > & fRanges
parameter ranges
Double_t fTemperatureAdaptiveStep
used to calculate InitialTemperature if fUseDefaultTemperature
void ReWriteParameters(std::vector< Double_t > &from, std::vector< Double_t > &to)
copy parameters
enum TMVA::SimulatedAnnealing::EKernelTemperature fKernelTemperature
IFitterTarget & fFitterTarget
the fitter target
Double_t fAdaptiveSpeed
how fast temperature change in adaptive (in adaptive two variables describe the change of temperature...
Int_t fMaxCalls
maximum number of minimisation calls
MsgLogger * fLogger
! message logger
SimulatedAnnealing(IFitterTarget &target, const std::vector< TMVA::Interval * > &ranges)
constructor
Bool_t ShouldGoIn(Double_t currentFit, Double_t localFit, Double_t currentTemperature)
result checker
Double_t fMinTemperature
minimum temperature
Timing information for training and evaluation of MVA methods.
TString GetElapsedTime(Bool_t Scientific=kTRUE)
returns pretty string with elapsed time
void DrawProgressBar(Int_t, const TString &comment="")
draws progress bar in color or B&W caution:
Random number generator class based on M.
MsgLogger & Endl(MsgLogger &ml)
Double_t Exp(Double_t x)
Returns the base-e exponential function of x, which is e raised to the power x.
Double_t Log(Double_t x)
Returns the natural logarithm of x.
Double_t Sqrt(Double_t x)
Returns the square root of x.
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
Returns x raised to the power y.
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.