/**
* @file VCOneVsOne.h
* @brief one-vs.-one svm voting
* @author Erik Rodner
* @date 10/25/2007

*/
#ifndef VCOneVsOneINCLUDE
#define VCOneVsOneINCLUDE

#include "core/vector/VectorT.h"
#include "core/vector/MatrixT.h"

#include "vislearning/classifier/classifierbase/VecClassifier.h"
#include "core/basics/triplet.h"


namespace OBJREC
{

/** one-vs.-one svm voting */
class VCOneVsOne : public VecClassifier
{
  protected:

    VecClassifier *prototype;
    std::vector< NICE::triplet<int, int, VecClassifier *> > classifiers;
    bool use_weighted_voting;

  public:

    /** simple constructor */
    VCOneVsOne ( const NICE::Config *conf, VecClassifier *prototype );

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

    /** classify using simple vector */
    ClassificationResult classify ( const NICE::Vector & x ) const;

    /** classify using a simple vector */
    void teach ( const LabeledSetVector & teachSet );

    void finishTeaching();


    void read ( const std::string& s, int format = 0 );
    void save ( const std::string& s, int format = 0 ) const;

    void clear ()
    {
      classifiers.clear();
    };
    void store ( std::ostream & os, int format = 0 ) const;
    void restore ( std::istream & is, int format = 0 );
};


} // namespace

#endif
