/** 
* @file GenericKernelFunction.h
* @author Alexander Freytag
* @brief Abstract class for all kernels (Interface - abstract)
* @date 12/08/2011
*/
#ifndef _NICE_GENERICKERNELFUNCTION
#define _NICE_GENERICKERNELFUNCTION

#include <vector>
#include <core/vector/VectorT.h>

namespace NICE {
  
 /** 
 * @class GenericKernelFunction
 * @brief Abstract class for all kernels
 * @author Alexander Freytag
 */

template<class T> class GenericKernelFunction 
{

    protected:

    public:
  
    /** simple constructor */
    GenericKernelFunction(){};
      
    /** simple destructor */
    ~GenericKernelFunction(){};


    virtual double measureDistance ( const std::vector<T> & a, const std::vector<T> & b  )=0;
    virtual NICE::Matrix computeKernelMatrix ( const std::vector<std::vector<T> > & X )=0;
    virtual NICE::Matrix computeKernelMatrix ( const std::vector<std::vector<T> > & X , const double & noise)=0;
    virtual std::vector<double> computeKernelVector ( const std::vector<std::vector<T> > & X , const NICE::Vector & xstar)=0;
    virtual void sayYourName()=0;

};

}

#endif