// @(#)root/tmva $Id$
// Author: Omar Zapata and Sergei Gleyzer. 2016


#ifndef ROOT_TMVA_VariableImportance
#define ROOT_TMVA_VariableImportance


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


#ifndef ROOT_TMVA_Configurable
#include "TMVA/Configurable.h"
#endif
#ifndef ROOT_TMVA_Types
#include "TMVA/Types.h"
#endif

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

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

#ifndef ROOT_TMVA_OptionMap
#include<TMVA/OptionMap.h>
#endif

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

namespace TMVA {

   class VariableImportanceResult
   {
     friend class VariableImportance;
   private:
       OptionMap              fImportanceValues;
       std::shared_ptr<TH1F>  fImportanceHist;
       VIType                 fType;
   public:
       VariableImportanceResult();
       VariableImportanceResult(const VariableImportanceResult &);
       ~VariableImportanceResult(){fImportanceHist=nullptr;}
       
       OptionMap &GetImportanceValues(){return fImportanceValues;}
       TH1F *GetImportanceHist(){return fImportanceHist.get();}
       void Print() const ;
       
       TCanvas* Draw(const TString name="VariableImportance") const;
   };
   
    
   class VariableImportance : public Envelope {
   private:
       UInt_t                    fNumFolds;
       VariableImportanceResult  fResults;
       VIType                    fType;
   public:
       explicit VariableImportance(DataLoader *loader);
       ~VariableImportance();
       
       virtual void Evaluate();
       
       void SetType(VIType type){fType=type;}
       VIType GetType(){return fType;}
       
       const VariableImportanceResult& GetResults() const {return fResults;}//I need to think about this, which is the best way to get the results?
   protected:
       //evaluate the simple case that is removing 1 variable at time
       void EvaluateImportanceShort();
       //evaluate all variables combinations NOTE: use with care in huge datasets with a huge number of variables
       void EvaluateImportanceAll();
       //evaluate randomly given a number of seeds
       void EvaluateImportanceRandom(UInt_t nseeds);
       
       //method to return a nice histogram with the results ;)
       TH1F* GetImportance(const UInt_t nbits,std::vector<Float_t> &importances,std::vector<TString> &varNames);

       //method to compute the range(number total of operations for every bit configuration)
       ULong_t Sum(ULong_t i);
       
   private:
       std::unique_ptr<Factory>     fClassifier;
       ClassDef(VariableImportance,0);
   };
} 


#endif



 VariableImportance.h:1
 VariableImportance.h:2
 VariableImportance.h:3
 VariableImportance.h:4
 VariableImportance.h:5
 VariableImportance.h:6
 VariableImportance.h:7
 VariableImportance.h:8
 VariableImportance.h:9
 VariableImportance.h:10
 VariableImportance.h:11
 VariableImportance.h:12
 VariableImportance.h:13
 VariableImportance.h:14
 VariableImportance.h:15
 VariableImportance.h:16
 VariableImportance.h:17
 VariableImportance.h:18
 VariableImportance.h:19
 VariableImportance.h:20
 VariableImportance.h:21
 VariableImportance.h:22
 VariableImportance.h:23
 VariableImportance.h:24
 VariableImportance.h:25
 VariableImportance.h:26
 VariableImportance.h:27
 VariableImportance.h:28
 VariableImportance.h:29
 VariableImportance.h:30
 VariableImportance.h:31
 VariableImportance.h:32
 VariableImportance.h:33
 VariableImportance.h:34
 VariableImportance.h:35
 VariableImportance.h:36
 VariableImportance.h:37
 VariableImportance.h:38
 VariableImportance.h:39
 VariableImportance.h:40
 VariableImportance.h:41
 VariableImportance.h:42
 VariableImportance.h:43
 VariableImportance.h:44
 VariableImportance.h:45
 VariableImportance.h:46
 VariableImportance.h:47
 VariableImportance.h:48
 VariableImportance.h:49
 VariableImportance.h:50
 VariableImportance.h:51
 VariableImportance.h:52
 VariableImportance.h:53
 VariableImportance.h:54
 VariableImportance.h:55
 VariableImportance.h:56
 VariableImportance.h:57
 VariableImportance.h:58
 VariableImportance.h:59
 VariableImportance.h:60
 VariableImportance.h:61
 VariableImportance.h:62
 VariableImportance.h:63
 VariableImportance.h:64
 VariableImportance.h:65
 VariableImportance.h:66
 VariableImportance.h:67
 VariableImportance.h:68
 VariableImportance.h:69
 VariableImportance.h:70
 VariableImportance.h:71
 VariableImportance.h:72
 VariableImportance.h:73
 VariableImportance.h:74
 VariableImportance.h:75
 VariableImportance.h:76
 VariableImportance.h:77
 VariableImportance.h:78
 VariableImportance.h:79
 VariableImportance.h:80
 VariableImportance.h:81
 VariableImportance.h:82
 VariableImportance.h:83
 VariableImportance.h:84
 VariableImportance.h:85
 VariableImportance.h:86
 VariableImportance.h:87
 VariableImportance.h:88
 VariableImportance.h:89
 VariableImportance.h:90
 VariableImportance.h:91
 VariableImportance.h:92
 VariableImportance.h:93
 VariableImportance.h:94
 VariableImportance.h:95
 VariableImportance.h:96
 VariableImportance.h:97
 VariableImportance.h:98