001 package calhoun.analysis.crf.solver;
002
003 import java.io.File;
004 import java.util.List;
005
006 import calhoun.analysis.crf.CRFTraining;
007 import calhoun.analysis.crf.Conrad;
008 import calhoun.analysis.crf.ModelManager;
009 import calhoun.analysis.crf.io.TrainingSequence;
010
011 /** an optimizer that uses the weights from another model as the seed for a new optimization. Allows a second pass optimization on an already trained model. */
012 public class SeededOptimizer implements CRFTraining {
013
014 CRFTraining seededOptimizer;
015 File seedModel;
016
017 public double[] optimize(ModelManager fm, List<? extends TrainingSequence<?>> data) {
018 try {
019 Conrad seed = Conrad.read(seedModel.getPath());
020 seededOptimizer.setStarts(seed.getWeights());
021 return seededOptimizer.optimize(fm ,data);
022 }
023 catch(Exception ex) {
024 throw new RuntimeException(ex);
025 }
026 }
027
028 /** starting weights are ignored for a SeededOptimizer, since they are always taken from the seeded model. */
029 public void setStarts(double[] weights) {
030 throw new UnsupportedOperationException("Cannot set starts on a SeededOptimizer.");
031 }
032
033 /**
034 * @return the seededOptimizer
035 */
036 public CRFTraining getSeededOptimizer() {
037 return seededOptimizer;
038 }
039
040 /**
041 * @param seededOptimizer the seededOptimizer to set
042 */
043 public void setSeededOptimizer(CRFTraining seededOptimizer) {
044 this.seededOptimizer = seededOptimizer;
045 }
046
047 /**
048 * @return the seedModel
049 */
050 public File getSeedModel() {
051 return seedModel;
052 }
053
054 /**
055 * @param seedModel the seedModel to set
056 */
057 public void setSeedModel(File seedModel) {
058 this.seedModel = seedModel;
059 }
060 }