package edu.cmu.minorthird.classify.relational; import java.util.Iterator; import edu.cmu.minorthird.classify.Classifier; import edu.cmu.minorthird.classify.ClassifierLearner; import edu.cmu.minorthird.classify.Example; import edu.cmu.minorthird.classify.Instance; import edu.cmu.minorthird.classify.SGMExample; /** * Abstract ClassifierLearner which instantiates the teacher-learner protocol * so as to implement a stacked batch learner. * * @author Zhenzhen Kou */ public abstract class StackedBatchClassifierLearner implements ClassifierLearner{ /** This variable saves the last classifier produced by batchTrain. * If it is non-null, then it will be returned by class to * getClassifier(). Implementations of batchTrain should save the * returned classifier to avoid extra work. */ protected RealRelationalDataset dataset=new RealRelationalDataset(); protected Classifier classifier=null; @Override final public void reset(){ dataset=new RealRelationalDataset(); classifier=null; } @Override final public void setInstancePool(Iterator<Instance> i){} @Override final public boolean hasNextQuery(){ return false; } @Override final public Instance nextQuery(){ return null; } @Override final public void addExample(Example answeredQuery){ dataset.addSGM((SGMExample)answeredQuery); classifier=null; } @Override final public void completeTraining(){ classifier=batchTrain(dataset); } @Override final public Classifier getClassifier(){ if(classifier==null){ classifier=batchTrain(dataset); } return classifier; } @Override public ClassifierLearner copy(){ StackedBatchClassifierLearner bcl; try{ bcl=(StackedBatchClassifierLearner)this.clone(); bcl.dataset=new RealRelationalDataset(); bcl.classifier=null; }catch(Exception e){ System.err.println("Cannot clone "+this); e.printStackTrace(); bcl=null; } return bcl; } /** subclasses should use this method to implement a batch supervised learning algorithm. */ abstract public Classifier batchTrain(RealRelationalDataset RelDataset); }