/**
 * @file NoveltyDetector.h
 * @brief abstract interface for novelty detection algorithms
 * @author Alexander Freytag
 * @date 02-05-2013 (dd-mm-yyyy)
*/
#ifndef _INCLUDENOVELTYDETECTOR
#define _INCLUDENOVELTYDETECTOR

#define ROADWORKSNOVDET fthrow(NICE::Exception, "Novelty Detector -- not yet implemented!");

// STL
#include <string>

//core
#include <core/basics/Config.h>


namespace OBJREC
{

  /**
   * @class NoveltyDetector
   * @brief abstract interface for novelty detection algorithms
   * @author Alexander Freytag
   * @date 02-05-2013 (dd-mm-yyyy)
  */
  class NoveltyDetector
  {

    protected:   
      
      /************************
       * 
       *   protected variables
       * 
       **************************/       
      
      //! section information for parsing config files
      std::string section;      
      
      //! Configuration File
      const NICE::Config *conf;    
           
      
      /************************
       * 
       *   protected methods
       * 
       **************************/      
            

    public:

      /**
       * @brief  simple constructor
       * @author Alexander Freytag
       * @date 02-05-2013 (dd-mm-yyyy)
       * @param _conf global settings
       * @param _section section information for parsing config files
      */
      NoveltyDetector ( const NICE::Config *_conf, const std::string & _section = "noveltyDetector" );

      /** simple destructor */
      virtual ~NoveltyDetector();

      
      /** 
       * @brief  Evaluate whether or not the image of the specified filename is novel with respect to the current known examples or not
       * @author Alexander Freytag
       * @date 02-05-2013 (dd-mm-yyyy)
       * @param _filename of the new image 
       * @return bool (true: class/content/... of image is novel, false: class/content/... of image is known)
       * @note This function has to be overloaded by all subclasses!          
      */
      virtual bool evaluateNoveltyOfImage ( const std::string & _filename) = 0;  
      

  };


} // namespace

#endif
