/** 
* @file KCGPApproxOneClass.h
* @brief One-Class Gaussian Process Regression for Classification: we approximate the inverse of the regularized kernel matrix using a diagonal matrix
* @author Alexander Lütz
* @date 22-05-2012 (dd-mm-yyyy)

*/
#ifndef KCGPAPPROXONECLASSINCLUDE
#define KCGPAPPROXONECLASSINCLUDE

#include "vislearning/cbaselib/ClassificationResult.h"

#include "vislearning/classifier/classifierbase/KernelClassifier.h"

#include "vislearning/math/kernels/Kernel.h"


#define VARIANCE_DETECTION_MODE 1
#define MEAN_DETECTION_MODE 2

namespace OBJREC {
 
  class KCGPApproxOneClass : public KernelClassifier
  {

      protected:
        NICE::Vector matrixDInv;
        NICE::Vector InvDY;
        int mode;
        double staticNoise;
      

      public:
    
        /** simple constructor */
        KCGPApproxOneClass( const NICE::Config *conf, Kernel *kernel = NULL, const std::string & section = "OneClassGP" );

        /** copy constructor */
        KCGPApproxOneClass( const KCGPApproxOneClass & src );
            
        /** simple destructor */
        virtual ~KCGPApproxOneClass();
          
        /** teach the classifier with a kernel matrix and the corresponding class labels @param y ! */
        void teach ( KernelData *kernelData, const NICE::Vector & y );
        
        void teach (const LabeledSetVector &teachSet);
          
        /** classify an example by using its kernel values with the training set,
          be careful with the order in @param kernelVector */
        virtual ClassificationResult classifyKernel ( const NICE::Vector & kernelVector, double kernelSelf ) const;
        
          /** clone this object */
        KCGPApproxOneClass *clone() const;

        void restore(std::istream&, int);
        void store(std::ostream&, int) const;
        void clear();

  };

}

#endif
