// @(#)root/tmva:$Id$
// Author: Omar Zapata   2016

/*************************************************************************
 * Copyright (C) 2016, Omar Andres Zapata Mesa                           *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/
#ifndef ROOT_TMVA_Envelope
#define ROOT_TMVA_Envelope

#include <sstream>
#include<iostream>
#include <memory>

#ifndef ROOT_TROOT
#include<TROOT.h>
#endif

#ifndef ROOT_TStopwatch
#include<TStopwatch.h>
#endif

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

#ifndef ROOT_TMVA_Config
#include "TMVA/Config.h"
#endif

#ifndef ROOT_TMVA_Tools
#include "TMVA/Tools.h"
#endif

#ifndef ROOT_TMVA_DataLoader
#include "TMVA/DataLoader.h"
#endif

#ifndef ROOT_TMVA_ROCCurve
#include "TMVA/DataLoader.h"
#endif


namespace TMVA {    
    
       /**
        *      \class Envelope
        *         Base class for all machine learning algorithms
        *      \ingroup TMVA
        */
      
      class Envelope:public Configurable
      {
      protected:
          OptionMap                    fMethod;           //Booked method information
          std::shared_ptr<DataLoader>  fDataLoader;       //data 
          std::shared_ptr<TFile>       fFile;             //!file to save the results
          Bool_t                       fModelPersistence; //flag to save the trained model
          Bool_t                       fVerbose;          //flag for extra information
          
          /**
           Constructor for the initialization of Envelopes,
           differents Envelopes may needs differents constructors then
           this is a generic one protected.
           \param name the name algorithm.
           \param dataloader TMVA::DataLoader object with the data.
           \param file optional file to save the results.
           \param options extra options for the algorithm.
          */

          Envelope(const TString &name,DataLoader *dataloader=nullptr,TFile *file=nullptr,const TString options="");
          
      public:
          /**
           Default destructor
           */
          ~Envelope();
          
          /**
            Method to book the machine learning method to perform the algorithm.
            \param methodname String with the name of the mva method
            \param methodtitle String with the method title.
            \param options String with the options for the method.
          */
          virtual void BookMethod( TString methodname, TString methodtitle, TString options = "");
          /**
            Method to book the machine learning method to perform the algorithm.
            \param method enum TMVA::Types::EMVA with the type of the mva method
            \param methodtitle String with the method title.
            \param options String with the options for the method.
          */
          virtual void BookMethod( Types::EMVA method,  TString methodtitle, TString options = "");

          /**
            Method to see if a file is available to save results
            \return Boolean with the status.
          */
          Bool_t  IsSilentFile();
          /**
            Method to get the pointer to TFile object.
            \return pointer to TFile object.
          */
          TFile* GetFile();
          /**
            Method to set the pointer to TFile object,
            with a writable file.
            \param file pointer to TFile object.
          */
          void   SetFile(TFile *file);
          
          /**
            Method to get the pointer to TMVA::DataLoader object.
            \return  pointer to TMVA::DataLoader object.
          */
          DataLoader *GetDataLoader();
          
          /**
            Method to set the pointer to TMVA::DataLoader object.
            \param file pointer to TFile object.
          */
          void SetDataLoader(DataLoader *dalaloader);

          /**
            Method to see if the algorithm model is saved in xml or serialized files.
            \return Boolean with the status.
          */
          Bool_t IsModelPersistence();
          
          /**
            Method enable model persistence, then algorithms model is saved in xml or serialized files.
            \param status Boolean with the status.
          */
          void SetModelPersistence(Bool_t status=kTRUE);
          
          /**
            Method to see if the algorithm should print extra information.
            \return Boolean with the status.
          */
          Bool_t IsVerbose();
          
          /**
            Method enable print extra information in the algorithms.
            \param status Boolean with the status.
          */
          void SetVerbose(Bool_t status);
          
          /**
            Virtual method to be implmented with your algorithm.
          */
          virtual void Evaluate() = 0;
          
      protected:
          /**
            Method get the Booked method in a option map object.
            \return TMVA::OptionMap with the information of the Booked method
          */
          OptionMap &GetMethod();
          
          /**
            Utility method to get TMVA::DataInputHandler reference from the DataLoader.
            \return TMVA::DataInputHandler reference.
          */
          DataInputHandler&        GetDataLoaderDataInput() { return *fDataLoader->fDataInputHandler; }
          
          /**
            Utility method to get TMVA::DataSetInfo reference from the DataLoader.
            \return TMVA::DataSetInfo reference.
          */
          DataSetInfo&             GetDataLoaderDataSetInfo(){return fDataLoader->DefaultDataSetInfo();}
          
          /**
            Utility method to get TMVA::DataSetManager pointer from the DataLoader.
            \return TMVA::DataSetManager pointer.
          */
          DataSetManager*          GetDataLoaderDataSetManager(){return fDataLoader->fDataSetManager;}
          ClassDef(Envelope,0);
          
      };
}

#endif
 Envelope.h:1
 Envelope.h:2
 Envelope.h:3
 Envelope.h:4
 Envelope.h:5
 Envelope.h:6
 Envelope.h:7
 Envelope.h:8
 Envelope.h:9
 Envelope.h:10
 Envelope.h:11
 Envelope.h:12
 Envelope.h:13
 Envelope.h:14
 Envelope.h:15
 Envelope.h:16
 Envelope.h:17
 Envelope.h:18
 Envelope.h:19
 Envelope.h:20
 Envelope.h:21
 Envelope.h:22
 Envelope.h:23
 Envelope.h:24
 Envelope.h:25
 Envelope.h:26
 Envelope.h:27
 Envelope.h:28
 Envelope.h:29
 Envelope.h:30
 Envelope.h:31
 Envelope.h:32
 Envelope.h:33
 Envelope.h:34
 Envelope.h:35
 Envelope.h:36
 Envelope.h:37
 Envelope.h:38
 Envelope.h:39
 Envelope.h:40
 Envelope.h:41
 Envelope.h:42
 Envelope.h:43
 Envelope.h:44
 Envelope.h:45
 Envelope.h:46
 Envelope.h:47
 Envelope.h:48
 Envelope.h:49
 Envelope.h:50
 Envelope.h:51
 Envelope.h:52
 Envelope.h:53
 Envelope.h:54
 Envelope.h:55
 Envelope.h:56
 Envelope.h:57
 Envelope.h:58
 Envelope.h:59
 Envelope.h:60
 Envelope.h:61
 Envelope.h:62
 Envelope.h:63
 Envelope.h:64
 Envelope.h:65
 Envelope.h:66
 Envelope.h:67
 Envelope.h:68
 Envelope.h:69
 Envelope.h:70
 Envelope.h:71
 Envelope.h:72
 Envelope.h:73
 Envelope.h:74
 Envelope.h:75
 Envelope.h:76
 Envelope.h:77
 Envelope.h:78
 Envelope.h:79
 Envelope.h:80
 Envelope.h:81
 Envelope.h:82
 Envelope.h:83
 Envelope.h:84
 Envelope.h:85
 Envelope.h:86
 Envelope.h:87
 Envelope.h:88
 Envelope.h:89
 Envelope.h:90
 Envelope.h:91
 Envelope.h:92
 Envelope.h:93
 Envelope.h:94
 Envelope.h:95
 Envelope.h:96
 Envelope.h:97
 Envelope.h:98
 Envelope.h:99
 Envelope.h:100
 Envelope.h:101
 Envelope.h:102
 Envelope.h:103
 Envelope.h:104
 Envelope.h:105
 Envelope.h:106
 Envelope.h:107
 Envelope.h:108
 Envelope.h:109
 Envelope.h:110
 Envelope.h:111
 Envelope.h:112
 Envelope.h:113
 Envelope.h:114
 Envelope.h:115
 Envelope.h:116
 Envelope.h:117
 Envelope.h:118
 Envelope.h:119
 Envelope.h:120
 Envelope.h:121
 Envelope.h:122
 Envelope.h:123
 Envelope.h:124
 Envelope.h:125
 Envelope.h:126
 Envelope.h:127
 Envelope.h:128
 Envelope.h:129
 Envelope.h:130
 Envelope.h:131
 Envelope.h:132
 Envelope.h:133
 Envelope.h:134
 Envelope.h:135
 Envelope.h:136
 Envelope.h:137
 Envelope.h:138
 Envelope.h:139
 Envelope.h:140
 Envelope.h:141
 Envelope.h:142
 Envelope.h:143
 Envelope.h:144
 Envelope.h:145
 Envelope.h:146
 Envelope.h:147
 Envelope.h:148
 Envelope.h:149
 Envelope.h:150
 Envelope.h:151
 Envelope.h:152
 Envelope.h:153
 Envelope.h:154
 Envelope.h:155
 Envelope.h:156
 Envelope.h:157
 Envelope.h:158
 Envelope.h:159
 Envelope.h:160
 Envelope.h:161
 Envelope.h:162
 Envelope.h:163
 Envelope.h:164
 Envelope.h:165
 Envelope.h:166
 Envelope.h:167
 Envelope.h:168
 Envelope.h:169
 Envelope.h:170
 Envelope.h:171
 Envelope.h:172
 Envelope.h:173
 Envelope.h:174
 Envelope.h:175
 Envelope.h:176
 Envelope.h:177
 Envelope.h:178
 Envelope.h:179
 Envelope.h:180
 Envelope.h:181
 Envelope.h:182
 Envelope.h:183
 Envelope.h:184