00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef ROOT_TMVA_SimulatedAnnealing
00029 #define ROOT_TMVA_SimulatedAnnealing
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <vector>
00040 #include <list>
00041
00042 #ifndef ROOT_TMVA_Types
00043 #include "TMVA/Types.h"
00044 #endif
00045
00046 class TRandom;
00047
00048 namespace TMVA {
00049
00050 class IFitterTarget;
00051 class Interval;
00052 class MsgLogger;
00053
00054 class SimulatedAnnealing {
00055
00056 public:
00057
00058 SimulatedAnnealing( IFitterTarget& target, const std::vector<TMVA::Interval*>& ranges );
00059 virtual ~SimulatedAnnealing();
00060
00061
00062 Double_t Minimize( std::vector<Double_t>& parameters );
00063
00064
00065 void SetMaxCalls ( Int_t mc ) { fMaxCalls = mc; }
00066 void SetInitTemp ( Double_t it ) { fInitialTemperature = it; }
00067 void SetMinTemp ( Double_t min ) { fMinTemperature = min; }
00068 void SetAccuracy ( Double_t eps ) { fEps = eps; }
00069 void SetTemperatureScale ( Double_t scale ) { fTemperatureScale = scale; }
00070 void SetAdaptiveSpeed ( Double_t speed ) { fAdaptiveSpeed = speed; }
00071
00072 void SetOptions( Int_t maxCalls, Double_t initialTemperature, Double_t minTemperature, Double_t eps,
00073 TString kernelTemperatureS, Double_t temperatureScale, Double_t adaptiveSpeed,
00074 Double_t temperatureAdaptiveStep, Bool_t useDefaultScale, Bool_t useDefaultTemperature );
00075
00076
00077 private:
00078
00079 enum EKernelTemperature {
00080 kSqrt = 0,
00081 kIncreasingAdaptive,
00082 kDecreasingAdaptive,
00083 kLog,
00084 kHomo,
00085 kSin,
00086 kGeo
00087 } fKernelTemperature;
00088
00089 void FillWithRandomValues( std::vector<Double_t>& parameters );
00090 void ReWriteParameters( std::vector<Double_t>& from, std::vector<Double_t>& to );
00091 void GenerateNewTemperature(Double_t& currentTemperature, Int_t Iter );
00092 void GenerateNeighbour( std::vector<Double_t>& parameters, std::vector<Double_t>& oldParameters, Double_t currentTemperature );
00093 Bool_t ShouldGoIn( Double_t currentFit, Double_t localFit, Double_t currentTemperature );
00094 void SetDefaultScale();
00095 Double_t GenerateMaxTemperature( std::vector<Double_t>& parameters );
00096 std::vector<Double_t> GenerateNeighbour( std::vector<Double_t>& parameters, Double_t currentTemperature );
00097
00098 IFitterTarget& fFitterTarget;
00099 TRandom* fRandom;
00100 const std::vector<TMVA::Interval*>& fRanges;
00101
00102
00103 Int_t fMaxCalls;
00104 Double_t fInitialTemperature;
00105 Double_t fMinTemperature;
00106 Double_t fEps;
00107 Double_t fTemperatureScale;
00108 Double_t fAdaptiveSpeed;
00109
00110
00111 Double_t fTemperatureAdaptiveStep;
00112
00113 Bool_t fUseDefaultScale;
00114 Bool_t fUseDefaultTemperature;
00115
00116 mutable MsgLogger* fLogger;
00117 MsgLogger& Log() const { return *fLogger; }
00118
00119 Double_t fProgress;
00120
00121 ClassDef(SimulatedAnnealing,0)
00122 };
00123
00124 }
00125
00126 #endif
00127