81 Bool_t useDefaultTemperature)
84 fInitialTemperature = initialTemperature;
85 fMinTemperature = minTemperature;
88 if (kernelTemperatureS ==
"IncreasingAdaptive") {
89 fKernelTemperature = kIncreasingAdaptive;
90 Log() << kINFO <<
"Using increasing adaptive algorithm" <<
Endl;
92 else if (kernelTemperatureS ==
"DecreasingAdaptive") {
93 fKernelTemperature = kDecreasingAdaptive;
94 Log() << kINFO <<
"Using decreasing adaptive algorithm" <<
Endl;
96 else if (kernelTemperatureS ==
"Sqrt") {
97 fKernelTemperature = kSqrt;
98 Log() << kINFO <<
"Using \"Sqrt\" algorithm" <<
Endl;
100 else if (kernelTemperatureS ==
"Homo") {
101 fKernelTemperature = kHomo;
102 Log() << kINFO <<
"Using \"Homo\" algorithm" <<
Endl;
104 else if (kernelTemperatureS ==
"Log") {
105 fKernelTemperature = kLog;
106 Log() << kINFO <<
"Using \"Log\" algorithm" <<
Endl;
108 else if (kernelTemperatureS ==
"Sin") {
109 fKernelTemperature = kSin;
110 Log() << kINFO <<
"Using \"Sin\" algorithm" <<
Endl;
113 fTemperatureScale = temperatureScale;
114 fAdaptiveSpeed = adaptiveSpeed;
115 fTemperatureAdaptiveStep = temperatureAdaptiveStep;
117 fUseDefaultScale = useDefaultScale;
118 fUseDefaultTemperature = useDefaultTemperature;
152 ReWriteParameters( parameters, oldParameters );
154 for (
UInt_t rIter=0;rIter<parameters.size();rIter++) {
157 uni = fRandom->Uniform(0.0,1.0);
158 sign = (uni - 0.5 >= 0.0) ? (1.0) : (-1.0);
159 distribution = currentTemperature * (
TMath::Power(1.0 + 1.0/currentTemperature,
TMath::Abs(2.0*uni - 1.0)) -1.0)*sign;
160 parameters[rIter] = oldParameters[rIter] + (fRanges[rIter]->GetMax()-fRanges[rIter]->GetMin())*0.1*distribution;
162 while (parameters[rIter] < fRanges[rIter]->GetMin() || parameters[rIter] > fRanges[rIter]->GetMax() );
170 std::vector<Double_t> newParameters( fRanges.size() );
172 for (
UInt_t rIter=0; rIter<parameters.size(); rIter++) {
175 uni = fRandom->Uniform(0.0,1.0);
176 sign = (uni - 0.5 >= 0.0) ? (1.0) : (-1.0);
177 distribution = currentTemperature * (
TMath::Power(1.0 + 1.0/currentTemperature,
TMath::Abs(2.0*uni - 1.0)) -1.0)*sign;
178 newParameters[rIter] = parameters[rIter] + (fRanges[rIter]->GetMax()-fRanges[rIter]->GetMin())*0.1*distribution;
180 while (newParameters[rIter] < fRanges[rIter]->GetMin() || newParameters[rIter] > fRanges[rIter]->GetMax() );
183 return newParameters;
191 if (fKernelTemperature == kSqrt) {
192 currentTemperature = fInitialTemperature/(
Double_t)
TMath::Sqrt(Iter+2) * fTemperatureScale;
194 else if (fKernelTemperature == kLog) {
195 currentTemperature = fInitialTemperature/(
Double_t)
TMath::Log(Iter+2) * fTemperatureScale;
197 else if (fKernelTemperature == kHomo) {
198 currentTemperature = fInitialTemperature/(
Double_t)(Iter+2) * fTemperatureScale;
200 else if (fKernelTemperature == kSin) {
201 currentTemperature = (
TMath::Sin( (
Double_t)Iter / fTemperatureScale ) + 1.0 )/ (
Double_t)(Iter+1.0) * fInitialTemperature + fEps;
203 else if (fKernelTemperature == kGeo) {
204 currentTemperature = currentTemperature*fTemperatureScale;
206 else if (fKernelTemperature == kIncreasingAdaptive) {
207 currentTemperature = fMinTemperature + fTemperatureScale*
TMath::Log(1.0+fProgress*fAdaptiveSpeed);
209 else if (fKernelTemperature == kDecreasingAdaptive) {
210 currentTemperature = currentTemperature*fTemperatureScale;
212 else Log() << kFATAL <<
"No such kernel!" <<
Endl;
231 if (fKernelTemperature == kSqrt) fTemperatureScale = 1.0;
232 else if (fKernelTemperature == kLog) fTemperatureScale = 1.0;
233 else if (fKernelTemperature == kHomo) fTemperatureScale = 1.0;
234 else if (fKernelTemperature == kSin) fTemperatureScale = 20.0;
235 else if (fKernelTemperature == kGeo) fTemperatureScale = 0.99997;
236 else if (fKernelTemperature == kDecreasingAdaptive) {
237 fTemperatureScale = 1.0;
240 fTemperatureScale -= 0.000001;
243 else if (fKernelTemperature == kIncreasingAdaptive) fTemperatureScale = 0.15*( 1.0 / (
Double_t)(fRanges.size() ) );
244 else Log() << kFATAL <<
"No such kernel!" <<
Endl;
254 Double_t t, dT, cold, delta, deltaY,
y, yNew, yBest, yOld;
255 std::vector<Double_t>
x( fRanges.size() ), xNew( fRanges.size() ), xBest( fRanges.size() ), xOld( fRanges.size() );
258 dT = fTemperatureAdaptiveStep;
259 for (
UInt_t rIter = 0; rIter <
x.size(); rIter++)
260 x[rIter] = ( fRanges[rIter]->GetMax() + fRanges[rIter]->GetMin() ) / 2.0;
262 for (
Int_t i=0; i<fMaxCalls/50; i++) {
263 if ((i>0) && (deltaY>0.0)) {
268 x = xOld = GenerateNeighbour(
x,t);
269 y = yOld = fFitterTarget.EstimatorFunction( xOld );
271 for (
Int_t k=0; (k<30) && (equilibrium<=12); k++ ) {
272 xNew = GenerateNeighbour(
x,t);
274 yNew = fFitterTarget.EstimatorFunction( xNew );
284 if (
y != 0.0) delta /=
y;
285 else if (yNew != 0.0) delta /=
y;
288 if (delta < 0.1) equilibrium++;
289 else equilibrium = 0;
295 yNew = fFitterTarget.EstimatorFunction( xNew );
296 deltaY = yNew - yOld;
297 if ( (deltaY < 0.0 )&&( yNew < yBest)) {
302 if ((stopper) && (deltaY >= (100.0 * cold)))
break;
313 std::vector<Double_t> bestParameters(fRanges.size());
314 std::vector<Double_t> oldParameters (fRanges.size());
316 Double_t currentTemperature, bestFit, currentFit;
317 Int_t optimizeCalls, generalCalls, equals;
321 if (fUseDefaultTemperature) {
322 if (fKernelTemperature == kIncreasingAdaptive) {
323 fMinTemperature = currentTemperature = 1
e-06;
324 FillWithRandomValues( parameters );
326 else fInitialTemperature = currentTemperature = GenerateMaxTemperature( parameters );
329 if (fKernelTemperature == kIncreasingAdaptive)
330 currentTemperature = fMinTemperature;
332 currentTemperature = fInitialTemperature;
333 FillWithRandomValues( parameters );
336 if (fUseDefaultScale) SetDefaultScale();
339 <<
"Temperatur scale = " << fTemperatureScale
340 <<
", current temperature = " << currentTemperature <<
Endl;
342 bestParameters = parameters;
343 bestFit = currentFit = fFitterTarget.EstimatorFunction( bestParameters );
345 optimizeCalls = fMaxCalls/100;
346 generalCalls = fMaxCalls - optimizeCalls;
349 Timer timer( fMaxCalls, fLogger->GetSource().c_str() );
351 for (
Int_t sample = 0; sample < generalCalls; sample++) {
352 GenerateNeighbour( parameters, oldParameters, currentTemperature );
353 Double_t localFit = fFitterTarget.EstimatorFunction( parameters );
355 if (localFit < currentFit ||
TMath::Abs(currentFit-localFit) < fEps) {
366 currentFit = localFit;
368 if (currentFit < bestFit) {
369 ReWriteParameters( parameters, bestParameters );
370 bestFit = currentFit;
374 if (!ShouldGoIn(localFit, currentFit, currentTemperature))
375 ReWriteParameters( oldParameters, parameters );
377 currentFit = localFit;
383 GenerateNewTemperature( currentTemperature, sample );
394 Double_t startingTemperature = fMinTemperature*(fRanges.size())*2.0;
395 currentTemperature = startingTemperature;
397 for (
Int_t sample=0;sample<optimizeCalls;sample++) {
398 GenerateNeighbour( parameters, oldParameters, currentTemperature );
399 Double_t localFit = fFitterTarget.EstimatorFunction( parameters );
401 if (localFit < currentFit) {
402 currentFit = localFit;
404 if (currentFit < bestFit) {
405 ReWriteParameters( parameters, bestParameters );
406 bestFit = currentFit;
409 else ReWriteParameters( oldParameters, parameters );
411 currentTemperature-=(startingTemperature - fEps)/optimizeCalls;
414 ReWriteParameters( bestParameters, parameters );
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