/** 
* @file LikelihoodFunction.h
* @author Erik Rodner
* @date 02/17/2010

*/
#ifndef _NICE_OBJREC_LIKELIHOODFUNCTIONINCLUDE
#define _NICE_OBJREC_LIKELIHOODFUNCTIONINCLUDE


namespace OBJREC {
  
/** @class LikelihoodFunction
 * abstract class for squash functions phi(y,f)
 * It can be used to define noise models for Gaussian
 * process classification
 *
 * @author Erik Rodner
 */
class LikelihoodFunction
{

    protected:

    public:
  
		LikelihoodFunction();
		virtual ~LikelihoodFunction();

    /**
    * @brief third derivation of the likelihood function 
    * The third derivation is important for Laplace approximation in 
    * the GP framework.
    *
    * @param y label
    * @param f latent function value
    *
    * @return value of the third derivation
    */
		virtual double thirdgrad ( double y, double f ) const = 0;

    /**
    * @brief second derivation of the likelihood function 
    *
    * @param y label
    * @param f latent function value
    *
    * @return value of the second derivation
    */
		virtual double hessian ( double y, double f ) const = 0;

    /**
    * @brief first derivation of the likelihood function
    *
    * @param y label
    * @param f latent function value
    *
    * @return value of the first derivation 
    */
		virtual double gradient ( double y, double f ) const = 0;

    /**
    * @brief logarithm of the likelihood function
    *
    * @param y label
    * @param f latent function value
    */
		virtual double logLike ( double y, double f ) const = 0;


    /**
    * @brief calculate the likelihood
    *
    * @param y label
    * @param f latent function value
    *
    * @return likelihood value 
    */
		virtual double likelihood ( double y, double f ) const = 0;
};

}

#endif