// @(#)root/tmva $Id$ 
// Author: Andraes Hoecker, Kamil Kraszewski, Maciej Kruk

/**********************************************************************************
 * Project: TMVA - a Root-integrated toolkit for multivariate data analysis       *
 * Package: TMVA                                                                  *
 * Class  : SimulatedAnnealingFitter                                              *
 * Web    : http://tmva.sourceforge.net                                           *
 *                                                                                *
 * Description:                                                                   *
 *      Implementation                                                            *
 *                                                                                *
 * Authors (alphabetical):                                                        *
 *      Krzysztof Danielowski <danielow@cern.ch>       - IFJ & AGH, Poland        *
 *      Andreas Hoecker       <Andreas.Hocker@cern.ch> - CERN, Switzerland        *
 *      Kamil Kraszewski      <kalq@cern.ch>           - IFJ & UJ, Poland         *
 *      Maciej Kruk           <mkruk@cern.ch>          - IFJ & AGH, Poland        *
 *                                                                                *
 * Copyright (c) 2008:                                                            *
 *      IFJ-Krakow, Poland                                                        *
 *      CERN, Switzerland                                                         * 
 *      MPI-K Heidelberg, Germany                                                 * 
 *                                                                                *
 * Redistribution and use in source and binary forms, with or without             *
 * modification, are permitted according to the terms listed in LICENSE           *
 * (http://tmva.sourceforge.net/LICENSE)                                          *
 **********************************************************************************/

//_______________________________________________________________________
//                                                                      
// Fitter using a Simulated Annealing Algorithm
//_______________________________________________________________________

#include "TMVA/SimulatedAnnealingFitter.h"
#include "TMVA/SimulatedAnnealing.h"
#include "TMVA/Interval.h"

ClassImp(TMVA::SimulatedAnnealingFitter)

//_______________________________________________________________________
TMVA::SimulatedAnnealingFitter::SimulatedAnnealingFitter( IFitterTarget& target, 
                                                          const TString& name, 
                                                          const std::vector<Interval*>& ranges, 
                                                          const TString& theOption ) 
   : TMVA::FitterBase( target, name, ranges, theOption )
{
   // constructor

   // default parameters settings for Simulated Annealing algorithm
   DeclareOptions();
   ParseOptions();
}

//_______________________________________________________________________
void TMVA::SimulatedAnnealingFitter::DeclareOptions() 
{
   // declare SA options

   // MaxCalls                 <int>      maximum number of calls for simulated annealing
   // TemperatureGradient      <float>    temperature gradient for simulated annealing
   // UseAdaptiveTemperature   <bool>     use of adaptive temperature for simulated annealing
   // InitialTemperature       <float>    initial temperature for simulated annealing
   // MinTemperature           <float>    minimum temperature for simulated annealing 
   // Eps                      <int>      number of epochs for simulated annealing
   // NFunLoops                <int>      number of loops for simulated annealing      
   // NEps                     <int>      number of epochs for simulated annealing

   // default settings
   fMaxCalls                = 100000;
   fInitialTemperature      = 1e+6;
   fMinTemperature          = 1e-6;
   fEps                     = 1e-10;
   fTemperatureScale        = 1.0;
   fAdaptiveSpeed           = 1.0;
   fTemperatureAdaptiveStep = 0.009875;
   fKernelTemperatureS      = "IncAdaptive";
   fUseDefaultScale         = kFALSE;
   fUseDefaultTemperature   = kFALSE;

   DeclareOptionRef(fMaxCalls,               "MaxCalls",              "Maximum number of minimisation calls");
   DeclareOptionRef(fInitialTemperature,     "InitialTemp",           "Initial temperature");  
   DeclareOptionRef(fMinTemperature,         "MinTemp",               "Mimimum temperature");
   DeclareOptionRef(fEps,                    "Eps",                   "Epsilon");  
   DeclareOptionRef(fTemperatureScale,       "TempScale",             "Temperature scale");
   DeclareOptionRef(fAdaptiveSpeed,          "AdaptiveSpeed",         "Adaptive speed");
   DeclareOptionRef(fTemperatureAdaptiveStep,"TempAdaptiveStep",      "Step made in each generation temperature adaptive");
   DeclareOptionRef(fUseDefaultScale,        "UseDefaultScale",       "Use default temperature scale for temperature minimisation algorithm");
   DeclareOptionRef(fUseDefaultTemperature,  "UseDefaultTemp",        "Use default initial temperature");

   DeclareOptionRef(fKernelTemperatureS,     "KernelTemp",            "Temperature minimisation algorithm");
   AddPreDefVal(TString("IncAdaptive"));
   AddPreDefVal(TString("DecAdaptive"));
   AddPreDefVal(TString("Sqrt"));
   AddPreDefVal(TString("Log"));
   AddPreDefVal(TString("Sin"));
   AddPreDefVal(TString("Homo"));
   AddPreDefVal(TString("Geo"));
}

//_______________________________________________________________________
void TMVA::SimulatedAnnealingFitter::SetParameters( Int_t    maxCalls,
                                                    Double_t initialTemperature,
                                                    Double_t minTemperature,
                                                    Double_t eps,
                                                    TString  kernelTemperatureS,
                                                    Double_t temperatureScale,
                                                    Double_t temperatureAdaptiveStep,
                                                    Bool_t   useDefaultScale,
                                                    Bool_t   useDefaultTemperature)
{
   // set SA configuration parameters
   fMaxCalls                 = maxCalls;
   fInitialTemperature       = initialTemperature;
   fMinTemperature           = minTemperature; 
   fEps                      = eps;
   fKernelTemperatureS       = kernelTemperatureS;
   fTemperatureScale         = temperatureScale;
   fTemperatureAdaptiveStep = temperatureAdaptiveStep;
   fUseDefaultScale          = useDefaultScale;
   fUseDefaultTemperature    = useDefaultTemperature;
}

//_______________________________________________________________________
Double_t TMVA::SimulatedAnnealingFitter::Run( std::vector<Double_t>& pars )
{
   // Execute fitting
   Log() << kINFO << "<SimulatedAnnealingFitter> Optimisation, please be patient ... " << Endl;
   Log() << kINFO << "(progress timing may be inaccurate for SA)" << Endl;

   SimulatedAnnealing sa( GetFitterTarget(), fRanges );

   // set driving parameters
   sa.SetOptions( fMaxCalls, fInitialTemperature, fMinTemperature, fEps, fKernelTemperatureS,
                  fTemperatureScale, fAdaptiveSpeed, fTemperatureAdaptiveStep, 
                  fUseDefaultScale, fUseDefaultTemperature );
   // minimise
   Double_t fcn = sa.Minimize( pars );

   return fcn;
}
 SimulatedAnnealingFitter.cxx:1
 SimulatedAnnealingFitter.cxx:2
 SimulatedAnnealingFitter.cxx:3
 SimulatedAnnealingFitter.cxx:4
 SimulatedAnnealingFitter.cxx:5
 SimulatedAnnealingFitter.cxx:6
 SimulatedAnnealingFitter.cxx:7
 SimulatedAnnealingFitter.cxx:8
 SimulatedAnnealingFitter.cxx:9
 SimulatedAnnealingFitter.cxx:10
 SimulatedAnnealingFitter.cxx:11
 SimulatedAnnealingFitter.cxx:12
 SimulatedAnnealingFitter.cxx:13
 SimulatedAnnealingFitter.cxx:14
 SimulatedAnnealingFitter.cxx:15
 SimulatedAnnealingFitter.cxx:16
 SimulatedAnnealingFitter.cxx:17
 SimulatedAnnealingFitter.cxx:18
 SimulatedAnnealingFitter.cxx:19
 SimulatedAnnealingFitter.cxx:20
 SimulatedAnnealingFitter.cxx:21
 SimulatedAnnealingFitter.cxx:22
 SimulatedAnnealingFitter.cxx:23
 SimulatedAnnealingFitter.cxx:24
 SimulatedAnnealingFitter.cxx:25
 SimulatedAnnealingFitter.cxx:26
 SimulatedAnnealingFitter.cxx:27
 SimulatedAnnealingFitter.cxx:28
 SimulatedAnnealingFitter.cxx:29
 SimulatedAnnealingFitter.cxx:30
 SimulatedAnnealingFitter.cxx:31
 SimulatedAnnealingFitter.cxx:32
 SimulatedAnnealingFitter.cxx:33
 SimulatedAnnealingFitter.cxx:34
 SimulatedAnnealingFitter.cxx:35
 SimulatedAnnealingFitter.cxx:36
 SimulatedAnnealingFitter.cxx:37
 SimulatedAnnealingFitter.cxx:38
 SimulatedAnnealingFitter.cxx:39
 SimulatedAnnealingFitter.cxx:40
 SimulatedAnnealingFitter.cxx:41
 SimulatedAnnealingFitter.cxx:42
 SimulatedAnnealingFitter.cxx:43
 SimulatedAnnealingFitter.cxx:44
 SimulatedAnnealingFitter.cxx:45
 SimulatedAnnealingFitter.cxx:46
 SimulatedAnnealingFitter.cxx:47
 SimulatedAnnealingFitter.cxx:48
 SimulatedAnnealingFitter.cxx:49
 SimulatedAnnealingFitter.cxx:50
 SimulatedAnnealingFitter.cxx:51
 SimulatedAnnealingFitter.cxx:52
 SimulatedAnnealingFitter.cxx:53
 SimulatedAnnealingFitter.cxx:54
 SimulatedAnnealingFitter.cxx:55
 SimulatedAnnealingFitter.cxx:56
 SimulatedAnnealingFitter.cxx:57
 SimulatedAnnealingFitter.cxx:58
 SimulatedAnnealingFitter.cxx:59
 SimulatedAnnealingFitter.cxx:60
 SimulatedAnnealingFitter.cxx:61
 SimulatedAnnealingFitter.cxx:62
 SimulatedAnnealingFitter.cxx:63
 SimulatedAnnealingFitter.cxx:64
 SimulatedAnnealingFitter.cxx:65
 SimulatedAnnealingFitter.cxx:66
 SimulatedAnnealingFitter.cxx:67
 SimulatedAnnealingFitter.cxx:68
 SimulatedAnnealingFitter.cxx:69
 SimulatedAnnealingFitter.cxx:70
 SimulatedAnnealingFitter.cxx:71
 SimulatedAnnealingFitter.cxx:72
 SimulatedAnnealingFitter.cxx:73
 SimulatedAnnealingFitter.cxx:74
 SimulatedAnnealingFitter.cxx:75
 SimulatedAnnealingFitter.cxx:76
 SimulatedAnnealingFitter.cxx:77
 SimulatedAnnealingFitter.cxx:78
 SimulatedAnnealingFitter.cxx:79
 SimulatedAnnealingFitter.cxx:80
 SimulatedAnnealingFitter.cxx:81
 SimulatedAnnealingFitter.cxx:82
 SimulatedAnnealingFitter.cxx:83
 SimulatedAnnealingFitter.cxx:84
 SimulatedAnnealingFitter.cxx:85
 SimulatedAnnealingFitter.cxx:86
 SimulatedAnnealingFitter.cxx:87
 SimulatedAnnealingFitter.cxx:88
 SimulatedAnnealingFitter.cxx:89
 SimulatedAnnealingFitter.cxx:90
 SimulatedAnnealingFitter.cxx:91
 SimulatedAnnealingFitter.cxx:92
 SimulatedAnnealingFitter.cxx:93
 SimulatedAnnealingFitter.cxx:94
 SimulatedAnnealingFitter.cxx:95
 SimulatedAnnealingFitter.cxx:96
 SimulatedAnnealingFitter.cxx:97
 SimulatedAnnealingFitter.cxx:98
 SimulatedAnnealingFitter.cxx:99
 SimulatedAnnealingFitter.cxx:100
 SimulatedAnnealingFitter.cxx:101
 SimulatedAnnealingFitter.cxx:102
 SimulatedAnnealingFitter.cxx:103
 SimulatedAnnealingFitter.cxx:104
 SimulatedAnnealingFitter.cxx:105
 SimulatedAnnealingFitter.cxx:106
 SimulatedAnnealingFitter.cxx:107
 SimulatedAnnealingFitter.cxx:108
 SimulatedAnnealingFitter.cxx:109
 SimulatedAnnealingFitter.cxx:110
 SimulatedAnnealingFitter.cxx:111
 SimulatedAnnealingFitter.cxx:112
 SimulatedAnnealingFitter.cxx:113
 SimulatedAnnealingFitter.cxx:114
 SimulatedAnnealingFitter.cxx:115
 SimulatedAnnealingFitter.cxx:116
 SimulatedAnnealingFitter.cxx:117
 SimulatedAnnealingFitter.cxx:118
 SimulatedAnnealingFitter.cxx:119
 SimulatedAnnealingFitter.cxx:120
 SimulatedAnnealingFitter.cxx:121
 SimulatedAnnealingFitter.cxx:122
 SimulatedAnnealingFitter.cxx:123
 SimulatedAnnealingFitter.cxx:124
 SimulatedAnnealingFitter.cxx:125
 SimulatedAnnealingFitter.cxx:126
 SimulatedAnnealingFitter.cxx:127
 SimulatedAnnealingFitter.cxx:128
 SimulatedAnnealingFitter.cxx:129
 SimulatedAnnealingFitter.cxx:130
 SimulatedAnnealingFitter.cxx:131
 SimulatedAnnealingFitter.cxx:132
 SimulatedAnnealingFitter.cxx:133
 SimulatedAnnealingFitter.cxx:134
 SimulatedAnnealingFitter.cxx:135
 SimulatedAnnealingFitter.cxx:136
 SimulatedAnnealingFitter.cxx:137
 SimulatedAnnealingFitter.cxx:138
 SimulatedAnnealingFitter.cxx:139
 SimulatedAnnealingFitter.cxx:140