001 package calhoun.analysis.crf.test;
002
003 import java.io.IOException;
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.solver.MaximumLikelihoodGradient;
010 import calhoun.analysis.crf.solver.MaximumLikelihoodSemiMarkovGradient;
011 import calhoun.analysis.crf.solver.StandardOptimizer;
012 import calhoun.util.AbstractTestCase;
013 import calhoun.util.Assert;
014
015 public class Interval29BaselineTest extends AbstractTestCase {
016 private static final Log log = LogFactory.getLog(Interval29BaselineTest.class);
017 public void testDummy() throws Exception {
018
019 }
020 public void testMarkov13VsSemiMarkov29() throws Exception {
021 String fileModel1 = "test/input/interval13/config/markov.xml";
022 String fileModel2 = "test/input/interval29/config/semiMarkovZeroPad.xml";
023 String fileData = "test/input/interval13/data/oneGeneTrain.interval13.txt";
024
025 compareTwoEquivalentModelsTrainTestSameDataWithDifferentStates(fileModel1,fileModel2,fileData,0.01);
026 }
027
028 public void testMarkov13VsMarkov29() throws Exception {
029 String fileModel1 = "test/input/interval13/config/strictMarkovCPD.xml";
030 String fileModel2 = "test/input/interval29/config/strictMarkovCPDInt29.xml";
031 String fileData = "test/input/interval13/data/oneGeneTrain.interval13.txt";
032
033 compareTwoEquivalentModelsTrainTestSameDataJustFeatureSums(fileModel1,fileModel2,fileData,0.0001);
034 }
035
036 //public void testSemiMarkov13VsSemiMarkov29() throws Exception {
037 // // This is a great test, but it's really slow and shouldn't give us any more
038 // // information than the Markov test above
039 // String fileModel1 = "test/input/interval13/config/strictMarkovCPD2.xml";
040 // String fileModel2 = "test/input/interval29/config/strictMarkovCPD2Int29.xml";
041 // String fileData = "test/input/interval13/data/oneGeneTrain.interval13.txt";
042 //
043 // compareTwoEquivalentModelsTrainTestSameDataJustFeatureSums(fileModel1,fileModel2,fileData,0.001);
044 //}
045
046 public void compareTwoEquivalentModelsTrainTestSameDataJustFeatureSums( String fileModel1, String fileModel2, String fileData, double tolerance ) throws IOException {
047 Conrad cr1 = new Conrad(fileModel1);
048 cr1.train(fileData);
049 double[] weights1 = cr1.getWeights();
050
051 double[] sums1;
052 StandardOptimizer stdOpt = (StandardOptimizer)cr1.getOptimizer();
053 if (stdOpt.getObjectiveFunction() instanceof MaximumLikelihoodGradient) {
054 MaximumLikelihoodGradient grad = (MaximumLikelihoodGradient)stdOpt.getObjectiveFunction();
055 sums1 = grad.getFeatureSums();
056 } else {
057 Assert.a(stdOpt.getObjectiveFunction() instanceof MaximumLikelihoodSemiMarkovGradient);
058 MaximumLikelihoodSemiMarkovGradient grad = (MaximumLikelihoodSemiMarkovGradient)stdOpt.getObjectiveFunction();
059 sums1 = grad.getFeatureSums();
060 }
061
062 cr1.test(fileData);
063
064 String s1 = cr1.getOutputHandler().toString();
065 System.out.println("String of output from result1 is");
066 System.out.println(s1);
067
068 cr1 = null;
069
070 Conrad cr2 = new Conrad(fileModel2);
071 cr2.train(fileData);
072 double[] weights2 = cr2.getWeights();
073
074 double[] sums2;
075 stdOpt = (StandardOptimizer)cr2.getOptimizer();
076 if (stdOpt.getObjectiveFunction() instanceof MaximumLikelihoodGradient) {
077 MaximumLikelihoodGradient grad = (MaximumLikelihoodGradient)stdOpt.getObjectiveFunction();
078 sums2 = grad.getFeatureSums();
079 } else {
080 Assert.a(stdOpt.getObjectiveFunction() instanceof MaximumLikelihoodSemiMarkovGradient);
081 MaximumLikelihoodSemiMarkovGradient grad = (MaximumLikelihoodSemiMarkovGradient)stdOpt.getObjectiveFunction();
082 sums2 = grad.getFeatureSums();
083 }
084
085 cr2.test(fileData);
086
087 String s2 = cr2.getOutputHandler().toString();
088 System.out.println("String of output from result2 is");
089 System.out.println(s2);
090
091 Assert.a(weights2.length == weights1.length,"length1 is " + weights1.length + " and weights2 is " + weights2.length);
092
093 assertArrayEquals(sums2,sums1, tolerance);
094 }
095
096 public void compareTwoEquivalentModelsTrainTestSameData( String fileModel1, String fileModel2, String fileData, double tolerance ) throws IOException {
097 Conrad cr1 = new Conrad(fileModel1);
098 cr1.train(fileData);
099 double[] weights1 = cr1.getWeights();
100
101 cr1.test(fileData);
102
103 String s1 = cr1.getOutputHandler().toString();
104 System.out.println("String of output from result1 is");
105 System.out.println(s1);
106
107 cr1 = null;
108
109 Conrad cr2 = new Conrad(fileModel2);
110 cr2.train(fileData);
111 double[] weights2 = cr2.getWeights();
112
113 cr2.test(fileData);
114
115 String s2 = cr2.getOutputHandler().toString();
116 System.out.println("String of output from result2 is");
117 System.out.println(s2);
118
119 Assert.a(weights2.length == weights1.length,"length1 is " + weights1.length + " and weights2 is " + weights2.length);
120 assertArrayEquals(weights2,weights1, tolerance);
121
122 assertEquals(s1,s2);
123 }
124
125 public void compareTwoEquivalentModelsTrainTestSameDataWithDifferentStates(String fileModel1, String fileModel2, String fileData, double tolerance ) throws IOException {
126 Conrad cr1 = new Conrad(fileModel1);
127 cr1.train(fileData);
128 double[] weights1 = cr1.getWeights();
129
130 cr1.test(fileData);
131
132 String s1 = cr1.getOutputHandler().toString();
133 System.out.println("String of output from result1 is");
134 System.out.println(s1);
135
136 cr1 = null;
137
138 Conrad cr2 = new Conrad(fileModel2);
139 cr2.train(fileData);
140 double[] weights2 = cr2.getWeights();
141
142 cr2.test(fileData);
143
144 String s2 = cr2.getOutputHandler().toString();
145 System.out.println("String of output from result2 is");
146 System.out.println(s2);
147
148 Assert.a(weights2.length == weights1.length,"length1 is " + weights1.length + " and weights2 is " + weights2.length);
149 assertArrayEquals(weights2,weights1, tolerance);
150 }
151
152 }