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    }