/** 
* @file ParameterizedKernel.h
* @brief Interface for parameterized kernel functions
* @author Erik Rodner
* @date 12/04/2009

*/
#ifndef PARAMETERIZEDKERNELINCLUDE
#define PARAMETERIZEDKERNELINCLUDE

#include "Kernel.h"
#include "KernelData.h"

namespace OBJREC {
  
/** Interface for parameterized kernel functions */
class ParameterizedKernel : public Kernel
{

    protected:

    public:
  
	/** simple constructor */
	ParameterizedKernel();
      
	/** simple destructor */
	virtual ~ParameterizedKernel();

	/** 
	 * update kernelMatrix (and maybe other caching stuff) in kernelData using new parameters
	 * of the kernel function
	 */
	virtual void updateKernelData ( KernelData *kernelData ) const = 0;

	/** get the size of the parameter vector */
	virtual size_t getParameterSize () const = 0;

	/** compute the jacobi matrix of the parameter with index \c parameter by using \c parameters as an argument and the matrix \c kernelMatrix
	 * as the pre-computed kernel values */
	virtual void getKernelJacobi ( size_t parameter, const NICE::Vector & parameters, const KernelData *kernelData, NICE::Matrix & jacobiMatrix ) const = 0;

	virtual void setParameters( const NICE::Vector & newParameters ) = 0;
	
	virtual void getParameters( NICE::Vector & newParameters ) const = 0;
     
};

}

#endif
