text: /*
   * ASCLITE
   * Author: Jerome Ajot, Jon Fiscus, Nicolas Radde, Chris Laprun
   *
   * This software was developed at the National Institute of Standards and Technology by 
   * employees of the Federal Government in the course of their official duties. Pursuant
   * to title 17 Section 105 of the United States Code this software is not subject to
   * copyright protection and is in the public domain. ASCLITE is an experimental system.
   * NIST assumes no responsibility whatsoever for its use by other parties, and makes no
   * guarantees, expressed or implied, about its quality, reliability, or any other
   * characteristic. We would appreciate acknowledgement if the software is used.
   *
   * THIS SOFTWARE IS PROVIDED "AS IS."  With regard to this software, NIST MAKES NO EXPRESS
   * OR IMPLIED WARRANTY AS TO ANY MATTER WHATSOEVER, INCLUDING MERCHANTABILITY,
   * OR FITNESS FOR A PARTICULAR PURPOSE.
   */
  
  #include "tokenalignment.h"
  
  // Initialize the static variables
  const TokenAlignment::AlignmentResult TokenAlignment::CORRECT(string("C"), string("Correct Alignment"));
  const TokenAlignment::AlignmentResult TokenAlignment::SUBSTITUTION(string("S"), string("Substitution: The hypothesis token aligns to a reference token but was not correctly recognized."));
  const TokenAlignment::AlignmentResult TokenAlignment::SPEAKERSUB(string("P"), string("Speaker Substitution: The hypothesis token aligns to a reference token, the text matches but the speaker assignment was incorrect."));
  const TokenAlignment::AlignmentResult TokenAlignment::DELETION(string("D"), string("Deletion: A reference token was not recognized by the system output."));
  const TokenAlignment::AlignmentResult TokenAlignment::INSERTION(string("I"), string("Insertion: The system output a token that didn't exist in the reference."));
  const TokenAlignment::AlignmentResult TokenAlignment::REFERENCE(string("R"), string("This token is a reference token."));
  const TokenAlignment::AlignmentResult TokenAlignment::INVALID_SYSTEM(string("X"), string("ERROR: No result exists for the specified system name."));
  const TokenAlignment::AlignmentResult TokenAlignment::UNAVAILABLE(string("U"), string("The evaluation result for this token hasn't been computed yet."));
  
  const string TokenAlignment::REFERENCE_KEY("REFERENCE");
  
  TokenAlignment::TokenAlignment(Token* refToken) 
  {	
  	m_alignmentEvaluations[TokenAlignment::REFERENCE_KEY] = new AlignmentEvaluation(refToken, TokenAlignment::REFERENCE);
  }
  
  TokenAlignment::~TokenAlignment()
  {
  	map< string, AlignmentEvaluation* >::iterator i, ei;
  	
  	i = m_alignmentEvaluations.begin();
  	ei = m_alignmentEvaluations.end();
  	
  	while(i != ei)
  	{
  		AlignmentEvaluation* ptr_elt = i->second;
  		
  		if(ptr_elt)
  			delete ptr_elt;
  		
  		++i;
  	}
  	
  	m_alignmentEvaluations.clear();
  }
  
  
  int TokenAlignment::AddAlignmentFor(const string & hypothesisKey, Token* hypothesisToken) 
  {
  	// an alignment already exists for this key, don't do anything
  	if(m_alignmentEvaluations[hypothesisKey] != NULL)
  		return 0;
  	
  	m_alignmentEvaluations[hypothesisKey] = new AlignmentEvaluation(hypothesisToken);
  	return 1;
  }
  
  TokenAlignment::AlignmentResult TokenAlignment::GetResultFor(const string & system)
  {
  	AlignmentEvaluation* res = GetAlignmentFor(system);
  	return (res != NULL) ? res->GetResult() : TokenAlignment::INVALID_SYSTEM;
  }
  
  Token* TokenAlignment::GetTokenFor(const string & system) 
  {
  	AlignmentEvaluation* res = GetAlignmentFor(system);
  	return (res != NULL) ? res->GetToken() : NULL;
  }
  
  Token* TokenAlignment::GetReferenceToken() 
  {
  	return m_alignmentEvaluations[TokenAlignment::REFERENCE_KEY]->GetToken();
  }
  
  string TokenAlignment::ToString() 
  {
  	t_alignmentMap::iterator
      iter = m_alignmentEvaluations.begin(),
      iter_end = m_alignmentEvaluations.end();
  	
  	string result;
  	
  	while( iter != iter_end )
      {
  		result += iter->first + " | " + ((AlignmentEvaluation *)iter->second)->ToString() + '\n';
  		++iter;
  	}
  	
  	return result;
  }
  
  TokenAlignment::AlignmentEvaluation::AlignmentEvaluation(Token* token, const AlignmentResult& result) 
  {
  	m_token = token;
  	m_result = result;
  }
  
  string TokenAlignment::AlignmentEvaluation::ToString()
  {
  	return ((m_token != NULL) ? m_token->GetText() : "*") + " | " + m_result.GetShortName();
  }
  
  bool TokenAlignment::AlignmentEvaluation::Equals(AlignmentEvaluation* other)
  {
  	if(this == other)
  		return true;
  	if(other == NULL)
  		return false;
  	return m_token->Equals(other->m_token) && m_result.GetShortName() == other->m_result.GetShortName();
  }
  
  TokenAlignment::AlignmentResult::AlignmentResult(const string& shortName, const string& description)
  {
  	m_shortName = shortName;
  	m_description = description;
  }
  