#ifndef _NICE_OBJREC_GENERICFPCLASSIFIERSELECTION_INCLUDE
#define _NICE_OBJREC_GENERICFPCLASSIFIERSELECTION_INCLUDE

//STL
#include <vector>

//core
#include "core/basics/StringTools.h"

//vislearning -- feature pool classifier
#include "vislearning/classifier/fpclassifier/boosting/FPCBoosting.h"
#include "vislearning/classifier/fpclassifier/randomforest/FPCRandomForests.h"
#include "vislearning/classifier/fpclassifier/randomforest/FPCDecisionTree.h"
#include "vislearning/classifier/fpclassifier/logisticregression/FPCSMLR.h"
#include "vislearning/classifier/fpclassifier/FPCGPHIK.h"








namespace OBJREC {

  class GenericFPClassifierSelection
  {
    public:

      static FeaturePoolClassifier *selectFPClassifier ( const NICE::Config *conf, std::string classifier_type )
      {
        std::vector<std::string> submatches;
        OBJREC::FeaturePoolClassifier *classifier = NULL;

        ////////////////////////////////////////
        //                                    //
        //    all Feature Pool Classifiers    //
        //                                    //
        ////////////////////////////////////////
        if ( classifier_type == "GPHIK" )
        {
          classifier = new OBJREC::FPCGPHIK ( conf, "GPHIK" );
        }      
        else if ( classifier_type == "random_forest" ) {
          classifier = new OBJREC::FPCRandomForests ( conf, "RandomForest" );
        }
        else if ( classifier_type == "sparse_logistic_regression" )
        {
          classifier = new OBJREC::FPCSMLR ( conf, "SparseLogisticRegression" );
        }
        else if ( classifier_type == "boost" )
        {
          classifier = new OBJREC::FPCBoosting ( conf, "Boost" );
        }
        else if ( classifier_type == "decision_tree" )
        {
          classifier = new OBJREC::FPCDecisionTree ( conf, "DecisionTree" );
        } else
        {
          fthrow ( NICE::Exception, "Classifier type " << classifier_type << " not (yet) supported." << std::endl <<
                  "(genericFPClassifierSelection.h contains a list of classifiers to choose from)" );
        }

        return classifier;
      }

  };

}

#endif
