/* Copyright (C) 2002 Univ. of Massachusetts Amherst, Computer Science Dept.
This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit).
http://www.cs.umass.edu/~mccallum/mallet
This software is provided under the terms of the Common Public License,
version 1.0, as published by http://www.opensource.org. For further
information, see the file `LICENSE' included with this distribution. */
/**
@author Andrew McCallum <a href="mailto:mccallum@cs.umass.edu">mccallum@cs.umass.edu</a>
*/
package cc.mallet.fst;
import java.util.logging.Logger;
import cc.mallet.types.InstanceList;
import cc.mallet.optimize.Optimizable;
import cc.mallet.util.MalletLogger;
/**
* An abstract class to evaluate a transducer model.
*/
public abstract class TransducerEvaluator
{
private static Logger logger = MalletLogger.getLogger(TransducerEvaluator.class.getName());
// TODO consider storing the TransducerTrainer here also? Methods like precondition() will be shorter and easier.
protected InstanceList[] instanceLists;
protected String[] instanceListDescriptions;
public TransducerEvaluator () {
instanceLists = new InstanceList[0];
instanceListDescriptions = new String[0];
}
public TransducerEvaluator (InstanceList[] instanceLists, String[] instanceListDescriptions) {
this.instanceLists = instanceLists;
this.instanceListDescriptions = instanceListDescriptions;
}
/**
* Evaluates a TransducerTrainer and its Transducer on the instance lists specified in the constructor. .
* <P>
* The default implementation calls the evaluator's <TT>evaluateInstanceList</TT> on each instance list.
*
* @param tt The TransducerTrainer to evaluate.
*/
public void evaluate (TransducerTrainer tt) {
if (!precondition(tt))
return;
this.preamble(tt);
for (int k = 0; k < instanceLists.length; k++)
if (instanceLists[k] != null)
evaluateInstanceList (tt, instanceLists[k], instanceListDescriptions[k]);
}
protected void preamble (TransducerTrainer tt) {
int iteration = tt.getIteration();
Optimizable opt;
if (tt instanceof TransducerTrainer.ByOptimization
&& (opt = ((TransducerTrainer.ByOptimization)tt).getOptimizer().getOptimizable()) instanceof Optimizable.ByValue)
logger.info ("Evaluator iteration="+iteration+" cost="+((Optimizable.ByValue)opt).getValue());
else
logger.info ("Evaluator iteration="+iteration+" cost=NA (not Optimizable.ByValue)");
}
/** If this returns false, then the body of the evaluate(TransducerTrainer) method will not run.
* Use this method to implement behaviors such as only evaluating every 5 iterations with
* <code>
* new TokenAccuracyEvaluator (crft) { public boolean precondition (TransducerTrainer tt) { return tt.getIteration() % 5 == 0; };
* </code>*/
public boolean precondition (TransducerTrainer tt) {
return true;
}
public abstract void evaluateInstanceList (TransducerTrainer transducer, InstanceList instances, String description);
}