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    }