/*
  $Id$

  Copyright (C) 2007 by The Regents of the University of California
	
  Redistribution of this file is permitted under
  the terms of the BSD license
    
  Date: 09/17/2007
  Author: Alexander Behm <abehm (at) ics.uci.edu>
*/

#include "statsutil.h"

StatsUtil::
StatsUtil(TimeFormat t) {
  resetFilterTreeStats(&filterTreeStats);
  resetSearchStats(&searchStats);
  tformat = t;
}

      
void 
StatsUtil::
resetFilterTreeStats(FilterTreeStats* target) {
  memset(target, 0, sizeof(FilterTreeStats));
}

void 
StatsUtil::
resetSearchStats(SearchStats* target) {
  memset(target, 0, sizeof(SearchStats));
}

double
StatsUtil::
getTimeMeasurement(TimeFormat format) {
  unsigned totalTime = (t2.tv_sec - t1.tv_sec) * 1000000 + (t2.tv_usec - t1.tv_usec);
  double tval = 0;

  switch(format) {
  case TFSEC: tval = static_cast<double>(totalTime) / 1000000; break;
  case TFMSEC: tval = static_cast<double>(totalTime) / 1000; break;
  case TFUSEC: tval = static_cast<double>(totalTime); break;
  }

  return tval;
}

double
StatsUtil::
getTimeMeasurement() {
  unsigned totalTime = (t2.tv_sec - t1.tv_sec) * 1000000 + (t2.tv_usec - t1.tv_usec);
  double tval = 0;

  switch(tformat) {
  case TFSEC: tval = static_cast<double>(totalTime) / 1000000; break;
  case TFMSEC: tval = static_cast<double>(totalTime) / 1000; break;
  case TFUSEC: tval = static_cast<double>(totalTime); break;
  }

  return tval;
}

void 
StatsUtil::
addSearchStats(SearchStats* target) {
  target->thresholdTime += searchStats.thresholdTime;
  target->preprocessTime += searchStats.preprocessTime;
  target->mergeTime += searchStats.mergeTime;
  target->postprocessTime += searchStats.postprocessTime;
  target->totalSearchTime += searchStats.totalSearchTime;
  target->candidateStrings += searchStats.candidateStrings;
  target->panicTime += searchStats.panicTime;
  target->numberPanics += searchStats.numberPanics;
  target->threshold += searchStats.threshold;  
}

void 
StatsUtil::
avgSearchStats(SearchStats* target, float n) {
  target->thresholdTime /= n;
  target->preprocessTime /= n;
  target->mergeTime /= n;
  target->postprocessTime /= n;
  target->totalSearchTime /= n;
  target->candidateStrings /= n;
  target->panicTime /= n;
  target->threshold /= n;  
  //target->numberPanics = (unsigned) ceil( (float)target->numberPanics / n );
}

void 
StatsUtil::
writeSearchStats(ofstream& fp_out, FilterTreeStats* fts, SearchStats* ss) {
  fp_out 
    << fts->dictionarySize << ";" 
    << fts->maxChildren << ";"
    << ss->thresholdTime << ";"
    << ss->preprocessTime << ";"
    << ss->mergeTime << ";"
    << ss->postprocessTime << ";"
    << ss->panicTime << ";"
    << ss->totalSearchTime << ";"
    << ss->candidateStrings << ";"
    //<< ss->numberPanics << endl;
    << ss->numberPanics << ";"
    << fts->buildFilterTreeTime << endl;  
}
