001    package calhoun.analysis.crf;
002    
003    /** holds additional configuration information used in semi-Markov CRFs.  
004     */
005    public class SemiMarkovSetup {
006            boolean ignoreSemiMarkovSelfTransitions;
007            private short[] maxLengths;
008            private short[] minLengths;
009    
010            /** default constructor used by Spring during automatic configuration */
011            public SemiMarkovSetup() { }
012            /** constructs using this set of maximum lengths. */
013            public SemiMarkovSetup(short[] lengths) { this.maxLengths = lengths; }
014            /** constructs using this set of maximum lengths and value for the ignore flag. */
015            public SemiMarkovSetup(short[] lengths, boolean ignore) { 
016                    this(lengths);
017                    ignoreSemiMarkovSelfTransitions = ignore;
018            }
019            
020            /** constructs will all parameters. */
021            public SemiMarkovSetup(short[] minLen, short maxLen[], boolean ignore) {
022                    this.minLengths = minLen;
023                    this.maxLengths = maxLen;
024                    this.ignoreSemiMarkovSelfTransitions = ignore;
025            }
026            
027            /** gets the minimum lengths for each state.  The minimum value is 1.  This array defaults to
028             * all 1's if it was not set explicitly.
029             * @return an array of the minimum lengths of each state.
030             */  
031            public short[] getMinLengths() {
032                    // Default minLengths to all zeros (and the same size as maxLengths).
033                    if(minLengths == null)
034                            minLengths = new short[maxLengths.length];
035                    return minLengths;
036            }
037    
038            /** sets the minimum lengths for each state.
039             * @param lengths an array of the minimum lengths of each state.
040             */  
041            public void setMinLengths(short[] lengths) {
042                    this.minLengths = lengths;
043            }
044    
045            /** gets the maximum lengths for each state.  The minimum value is 1, which corresponds to the 
046             * special case of a Markov feature.  This value has no default.  It is usually configured through the XML model file.
047             * @return an array of the maximum lengths of each state.
048             */  
049            public short[] getMaxLengths() {
050                    return maxLengths;
051            }
052    
053            /** sets the maximum lengths for each state.
054             * @param lengths an array of the minimum lengths of each state.
055             */  
056            public void setMaxLengths(short[] lengths) {
057                    this.maxLengths = lengths;
058            }
059    
060            /** gets the flag indicating that self-transition edges for the semi-Markov states should be ignored.  This flag is useful
061             * if you are using the same model definition for both Markov and semi-Markov models.  In a Markov model a self-transition 
062             * means that a state can be repeated multiple times, essentially forming a segment.  However, in a semi-Markov a self-transition 
063             * means a transition between two segments with the same state.  This distinction means that the same state transition graph
064             * will mean different things under the two models.  If this flag is set to true, which is the 
065             * default, then it is assumed that no two segments in the semi-Markov model can have the same state, and so self-transitions in
066             * the semi-Markov states are ignored.  This forces the state transition graph to have the same meaning for both cases.
067             * <p>
068             * This flag does not affect Markov states, those with a max length of 1.  This means that a state may legally occur in consecutive
069             * positions if the maximum length for that state is one and the graph contains a self-transition for that state.
070             * @return true if self-transition edges in the model should be ignored.
071             */  
072            public boolean isIgnoreSemiMarkovSelfTransitions() {
073                    return ignoreSemiMarkovSelfTransitions;
074            }
075    
076            /** sets the flag indicating that self-transition edges for the semi-Markov states should be ignored.
077             * @param ignoreSemiMarkovSelfTransitions true if self-transition edges for the semi-Markov states should be ignored.
078             */  
079            public void setIgnoreSemiMarkovSelfTransitions(
080                            boolean ignoreSemiMarkovSelfTransitions) {
081                    this.ignoreSemiMarkovSelfTransitions = ignoreSemiMarkovSelfTransitions;
082            }
083    }