// @(#)root/tmva $Id$
// Author: Omar Zapata, Thomas James Stevenson.


#ifndef ROOT_TMVA_HyperParameterOptimisation
#define ROOT_TMVA_HyperParameterOptimisation


#ifndef ROOT_TString
#include "TString.h"
#endif

#ifndef ROOT_TMultiGraph
#include "TMultiGraph.h"
#endif

#ifndef ROOT_TMVA_IMethod
#include "TMVA/IMethod.h"
#endif
#ifndef ROOT_TMVA_Configurable
#include "TMVA/Configurable.h"
#endif
#ifndef ROOT_TMVA_Types
#include "TMVA/Types.h"
#endif
#ifndef ROOT_TMVA_DataSet
#include "TMVA/DataSet.h"
#endif
#ifndef ROOT_TMVA_Event
#include "TMVA/Event.h"
#endif
#ifndef ROOT_TMVA_Results
#include<TMVA/Results.h>
#endif

#ifndef ROOT_TMVA_Factory
#include<TMVA/Factory.h>
#endif

#ifndef ROOT_TMVA_DataLoader
#include<TMVA/DataLoader.h>
#endif

#ifndef ROOT_TMVA_Envelope
#include<TMVA/Envelope.h>
#endif

namespace TMVA {

   class HyperParameterOptimisationResult
   {
     friend class HyperParameterOptimisation;
   private:
       std::vector<Float_t> fROCs;
       Float_t              fROCAVG;
       std::shared_ptr<TMultiGraph>    fROCCurves;

       std::vector<Double_t> fSigs;
       std::vector<Double_t> fSeps;
       std::vector<Double_t> fEff01s;
       std::vector<Double_t> fEff10s;
       std::vector<Double_t> fEff30s;
       std::vector<Double_t> fEffAreas;
       std::vector<Double_t> fTrainEff01s;
       std::vector<Double_t> fTrainEff10s;
       std::vector<Double_t> fTrainEff30s;
       TString               fMethodName;

   public:
       HyperParameterOptimisationResult();
       ~HyperParameterOptimisationResult();

       std::vector<std::map<TString,Double_t> > fFoldParameters;
       
       std::vector<Float_t> GetROCValues(){return fROCs;}
       Float_t GetROCAverage(){return fROCAVG;}
       TMultiGraph *GetROCCurves(Bool_t fLegend=kTRUE);

       void Print() const ;       
//        TCanvas* Draw(const TString name="HyperParameterOptimisation") const;
       
       std::vector<Double_t> GetSigValues(){return fSigs;}
       std::vector<Double_t> GetSepValues(){return fSeps;}
       std::vector<Double_t> GetEff01Values(){return fEff01s;}
       std::vector<Double_t> GetEff10Values(){return fEff10s;}
       std::vector<Double_t> GetEff30Values(){return fEff30s;}
       std::vector<Double_t> GetEffAreaValues(){return fEffAreas;}
       std::vector<Double_t> GetTrainEff01Values(){return fTrainEff01s;}
       std::vector<Double_t> GetTrainEff10Values(){return fTrainEff10s;}
       std::vector<Double_t> GetTrainEff30Values(){return fTrainEff30s;}

   };
    
   class HyperParameterOptimisation : public Envelope {
   public:

       HyperParameterOptimisation(DataLoader *dataloader);
       ~HyperParameterOptimisation();
       
       void SetFitter(TString fitType){fFitType=fitType;}
       TString GetFiiter(){return fFitType;}
       
       
       //Figure of Merit (FOM) default Separation
       void SetFOMType(TString ftype){fFomType=ftype;}
       TString GetFOMType(){return fFitType;}
       
       void SetNumFolds(UInt_t folds);
       UInt_t GetNumFolds(){return fNumFolds;}
       
       virtual void Evaluate();
       const HyperParameterOptimisationResult& GetResults() const {return fResults;}
       
       
   private:
       TString                           fFomType;     //!
       TString                           fFitType;     //!
       UInt_t                            fNumFolds;    //!
       Bool_t                            fFoldStatus;  //!
       HyperParameterOptimisationResult  fResults;     //!
       std::unique_ptr<Factory>          fClassifier;  //!

   public:
       ClassDef(HyperParameterOptimisation,0);  
   };
} 


#endif



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