#include "Syslog.h" 
#include <assert.h>


#include "NormalizedBase.hh"

NormalizedBase::NormalizedBase(ArgList const &args) 
  :DeviceClassifier(args), m_avg(args.get("avg")), m_sd(args.get("sd")) {
  // Now I need to build the list of clusters :
  ArgList::range_type rng = args.getRange("cluster");
  
  for( ;rng.second!=rng.first; ++rng.first ) {
    StateVector to_ins(rng.first->second);
    m_clusters.push_back(to_ins);
  }
}

void NormalizedBase::classify(StateVector &v, std::vector<cluster_type> &winners, 
			      dist_type &dist) {
  bool first = true;
  dist_type cur_d;
  std::vector<StateVector>::const_iterator i = m_clusters.begin();
  std::vector<StateVector>::const_iterator const endi = m_clusters.end();
  
  v.normalize(m_avg, m_sd);

  for(size_t cur=1 ;endi!=i ;++i, ++cur) {
    cur_d = distance(*i, v);
      
    if( first || cur_d<dist ) {
      dist = cur_d;
      first = false;
      winners.erase(winners.begin(), winners.end());
    }
    if( dist==cur_d ) {
// #ifdef DEBUG
//       Syslog::write("\t distance to %d is %g", cur, cur_d);
// #endif // DEBUG
      winners.push_back(cur);
    }
  }
}
