001 package calhoun.analysis.crf.test;
002
003 import java.util.List;
004
005 import org.apache.commons.logging.Log;
006 import org.apache.commons.logging.LogFactory;
007
008 import calhoun.analysis.crf.Conrad;
009 import calhoun.analysis.crf.ModelManager;
010 import calhoun.analysis.crf.io.IntInput;
011 import calhoun.analysis.crf.io.TrainingSequence;
012 import calhoun.analysis.crf.solver.MaximumLikelihoodGradient;
013 import calhoun.analysis.crf.solver.StandardOptimizer;
014 import calhoun.util.AbstractTestCase;
015
016 public class LBFGSTest extends AbstractTestCase {
017 @SuppressWarnings("unused")
018 private static final Log log = LogFactory.getLog(LBFGSTest.class);
019
020 /// Simple model, 2 states, 1 feature that returns log 1/3 and log 2/3 for every position. With weights 1, normalization should be 1.
021 public void testLBFGS() throws Exception {
022 List<? extends TrainingSequence<?>> data = IntInput.prepareData("001111\n001111\n001111\n001111\n001111\n001111\n001111\n001111\n");
023 ModelManager m = new TestFeatureManager(1);
024
025 StandardOptimizer opt = new StandardOptimizer();
026 opt.setStarts(new double[] {0.1});
027 opt.setEpsForConvergence(0.001);
028 opt.setObjectiveFunction(new MaximumLikelihoodGradient());
029 double[] weights = opt.optimize(m, data);
030 assertEquals(2.0, weights[0], 0.01);
031 }
032
033 public void testMainLBGFS() throws Exception {
034 // Create and train the CRF
035 Conrad.main(new String[] {"train", "test/input/zeroOrderLBFGS.xml", "test/input/zeroOrderTest.txt", "test/working/zeroLBGFSModel.ser"});
036 Conrad.main(new String[] {"test", "test/working/zeroLBGFSModel.ser", "test/input/zeroOrderTest.txt", "test/working/zeroOrderMainLBGFSPredicted.txt"});
037 Conrad.main(new String[] {"test", "test/working/zeroLBGFSModel.ser", "test/input/zeroOrderTest2.txt", "test/working/zeroOrder2MainLBGFSPredicted.txt"});
038 assertFilesMatch("test/output/zeroOrder2MainLBGFSPredicted.txt", "test/working/zeroOrder2MainLBGFSPredicted.txt");
039 }
040
041 public void testMainLBGFSCached() throws Exception {
042 // Create and train the CRF
043 Conrad.main(new String[] {"train", "test/input/zeroOrderLBFGSCached.xml", "test/input/zeroOrderTest.txt", "test/working/zeroLBGFSModelCached.ser"});
044 Conrad.main(new String[] {"test", "test/working/zeroLBGFSModelCached.ser", "test/input/zeroOrderTest.txt", "test/working/zeroOrderMainLBGFSCachedPredicted.txt"});
045 Conrad.main(new String[] {"test", "test/working/zeroLBGFSModelCached.ser", "test/input/zeroOrderTest2.txt", "test/working/zeroOrder2MainLBGFSCachedPredicted.txt"});
046 assertFilesMatch("test/output/zeroOrder2MainLBGFSPredicted.txt", "test/working/zeroOrder2MainLBGFSCachedPredicted.txt");
047 }
048
049 public void testMainLBGFSCachedSemiMarkov() throws Exception {
050 // Create and train the CRF
051 Conrad.main(new String[] {"train", "test/input/zeroOrderLBFGSCachedSemiMarkov.xml", "test/input/zeroOrderTestShortMax.txt", "test/working/zeroLBGFSModelCachedSemiMarkov.ser"});
052 Conrad.main(new String[] {"test", "test/working/zeroLBGFSModelCachedSemiMarkov.ser", "test/input/zeroOrderTest.txt", "test/working/zeroOrderMainLBGFSCachedSemiMarkovPredicted.txt"});
053 Conrad.main(new String[] {"test", "test/working/zeroLBGFSModelCachedSemiMarkov.ser", "test/input/zeroOrderTest2.txt", "test/working/zeroOrder2MainLBGFSCachedSemiMarkovPredicted.txt"});
054 assertFilesMatch("test/output/zeroOrder2MainLBGFSCachedSemiMarkovPredicted.txt", "test/working/zeroOrder2MainLBGFSCachedSemiMarkovPredicted.txt");
055 }
056 }