50 : fKernelTemperature (kIncreasingAdaptive),
51 fFitterTarget ( target ),
55 fInitialTemperature ( 1000 ),
56 fMinTemperature ( 0 ),
58 fTemperatureScale ( 0.06 ),
59 fAdaptiveSpeed ( 1.0 ),
60 fTemperatureAdaptiveStep( 0.0 ),
61 fUseDefaultScale (
kFALSE ),
62 fUseDefaultTemperature ( kFALSE ),
66 fKernelTemperature = kIncreasingAdaptive;
81 Bool_t useDefaultTemperature)
88 if (kernelTemperatureS ==
"IncreasingAdaptive") {
90 Log() <<
kINFO <<
"Using increasing adaptive algorithm" <<
Endl;
92 else if (kernelTemperatureS ==
"DecreasingAdaptive") {
94 Log() <<
kINFO <<
"Using decreasing adaptive algorithm" <<
Endl;
96 else if (kernelTemperatureS ==
"Sqrt") {
100 else if (kernelTemperatureS ==
"Homo") {
104 else if (kernelTemperatureS ==
"Log") {
108 else if (kernelTemperatureS ==
"Sin") {
132 for (
UInt_t rIter = 0; rIter < parameters.size(); rIter++) {
142 for (
UInt_t rIter = 0; rIter < from.size(); rIter++) to[rIter] = from[rIter];
153 for (
UInt_t rIter=0;rIter<parameters.size();rIter++) {
157 sign = (uni - 0.5 >= 0.0) ? (1.0) : (-1.0);
159 parameters[rIter] = oldParameters[rIter] + (
fRanges[rIter]->GetMax()-
fRanges[rIter]->GetMin())*0.1*distribution;
161 while (parameters[rIter] <
fRanges[rIter]->GetMin() || parameters[rIter] >
fRanges[rIter]->GetMax() );
169 std::vector<Double_t> newParameters(
fRanges.size() );
171 for (
UInt_t rIter=0; rIter<parameters.size(); rIter++) {
175 sign = (uni - 0.5 >= 0.0) ? (1.0) : (-1.0);
177 newParameters[rIter] = parameters[rIter] + (
fRanges[rIter]->GetMax()-
fRanges[rIter]->GetMin())*0.1*distribution;
179 while (newParameters[rIter] <
fRanges[rIter]->GetMin() || newParameters[rIter] >
fRanges[rIter]->GetMax() );
182 return newParameters;
253 Double_t t, dT, cold, delta, deltaY,
y, yNew, yBest, yOld;
258 for (
UInt_t rIter = 0; rIter <
x.size(); rIter++)
259 x[rIter] = (
fRanges[rIter]->GetMax() +
fRanges[rIter]->GetMin() ) / 2.0;
262 if ((i>0) && (deltaY>0.0)) {
270 for (
Int_t k=0; (k<30) && (equilibrium<=12); k++ ) {
283 if (y != 0.0) delta /=
y;
284 else if (yNew != 0.0) delta /=
y;
287 if (delta < 0.1) equilibrium++;
288 else equilibrium = 0;
295 deltaY = yNew - yOld;
296 if ( (deltaY < 0.0 )&&( yNew < yBest)) {
301 if ((stopper) && (deltaY >= (100.0 * cold)))
break;
312 std::vector<Double_t> bestParameters(
fRanges.size());
313 std::vector<Double_t> oldParameters (
fRanges.size());
315 Double_t currentTemperature, bestFit, currentFit;
339 <<
", current temperature = " << currentTemperature <<
Endl;
341 bestParameters = parameters;
345 generalCalls =
fMaxCalls - optimizeCalls;
350 for (
Int_t sample = 0; sample < generalCalls; sample++) {
354 if (localFit < currentFit ||
TMath::Abs(currentFit-localFit) <
fEps) {
365 currentFit = localFit;
367 if (currentFit < bestFit) {
369 bestFit = currentFit;
373 if (!
ShouldGoIn(localFit, currentFit, currentTemperature))
376 currentFit = localFit;
394 currentTemperature = startingTemperature;
397 for (
Int_t sample=0;sample<optimizeCalls;sample++) {
401 if (localFit < currentFit) {
402 currentFit = localFit;
405 if (currentFit < bestFit) {
407 bestFit = currentFit;
412 currentTemperature-=(startingTemperature -
fEps)/optimizeCalls;
Double_t GenerateMaxTemperature(std::vector< Double_t > ¶meters)
maximum temperature
void FillWithRandomValues(std::vector< Double_t > ¶meters)
random starting parameters
virtual Double_t EstimatorFunction(std::vector< Double_t > ¶meters)=0
void GenerateNewTemperature(Double_t ¤tTemperature, Int_t Iter)
generate new temperature
Random number generator class based on M.
MsgLogger & Endl(MsgLogger &ml)
const std::vector< TMVA::Interval * > & fRanges
void swap(ROOT::THist< DIMENSIONS, PRECISION > &a, ROOT::THist< DIMENSIONS, PRECISION > &b) noexcept
Swap two histograms.
IFitterTarget & fFitterTarget
int equals(Double_t n1, Double_t n2, double ERRORLIMIT=1.E-10)
LongDouble_t Power(LongDouble_t x, LongDouble_t y)
void GenerateNeighbour(std::vector< Double_t > ¶meters, std::vector< Double_t > &oldParameters, Double_t currentTemperature)
generate adjacent parameters
Double_t fTemperatureAdaptiveStep
Bool_t fUseDefaultTemperature
virtual ~SimulatedAnnealing()
destructor
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
virtual Double_t Uniform(Double_t x1=1)
Returns a uniform deviate on the interval (0, x1).
Bool_t ShouldGoIn(Double_t currentFit, Double_t localFit, Double_t currentTemperature)
result checker
enum TMVA::SimulatedAnnealing::EKernelTemperature fKernelTemperature
Abstract ClassifierFactory template that handles arbitrary types.
std::string GetSource() const
Double_t Minimize(std::vector< Double_t > ¶meters)
minimisation algorithm
Double_t fInitialTemperature
Double_t Sqrt(Double_t x)
Double_t fTemperatureScale
void ReWriteParameters(std::vector< Double_t > &from, std::vector< Double_t > &to)
copy parameters