package statalign.base.hmm;

/**
 * The abstract class of Hidden Markov Models.
 * 
 * @author novak
 *
 */
public abstract class Hmm {

	/**
	 * HMM model parameters. Implementing classes can use their own assignment and
	 * any number of parameters.
	 * In the case of the TKF92 model (HmmTkf92), values are: r, lambda and mu.
	 */
	public double[] params;
	
   /**
    * Abstract function that specifies the emission of each state in the HMM in the form
    * of an array A: A[s][i]=1 iff state i emits into sequence s (s=0 is the parent sequence;
    * for pair-HMMs s=1 is the child sequence, for 3-seq HMMs s=1 is left and s=2 is right
    * child).
    * HMM implementations must override this and return their own emission patterns.
    * @return array specifying emission patterns as described above
    */
	public abstract int[][] getStateEmit();
	
	/**
	 * Abstract function returning an array A that helps identify the state with some
	 * emission pattern. The emission pattern is coded as a single integer: e.g. for a 3-seq
	 * HMM, emission into the parent sequence and right child only is coded as 101 binary,
	 * i.e. 4+1=5. Then, A[5] gives the index of the state with the above emission pattern.
	 * HMM implementations must override this and return an array corresponding to their own
	 * state - emission pattern assignment.
	 * @return array describing the emission pattern to state conversion
	 */
	public abstract int[] getEmitPatt2State();
	
	/**
	 * Returns the index of the start state.
	 * 
	 * @return The index of the start state;
	 */
	public abstract int getStart();
	
	/**
	 * Returns the index of the end state.
	 * 
	 * @return The index of the end state;
	 */
	public abstract int getEnd();
	
	/**
	 * Returns the logarithm of the stationary probability of generating
	 * a sequence of <code>length</code> characters under the HMM.
	 * @param length The length of the sequence whose stationary
	 * probability is to be computed.
	 * @return The logarithm of the stationary probability under the HMM.
	 */
	public double getLogStationaryProb(int length) { return 0.0; }
	
}
