package aima.core.probability.hmm;
import java.util.List;
import java.util.Map;
import aima.core.probability.CategoricalDistribution;
import aima.core.probability.RandomVariable;
import aima.core.probability.proposition.AssignmentProposition;
import aima.core.util.math.Matrix;
/**
* Artificial Intelligence A Modern Approach (3rd Edition): page 578.<br>
* <br>
*
* The hidden Markov model, or HMM. An HMM is a temporal probabilistic model in
* which the state of the process is described by a single discrete random
* variable. The possible values of the variable are the possible states of the
* world.
*
* @author Ciaran O'Reilly
* @author Ravi Mohan
*
*/
public interface HiddenMarkovModel {
/**
* Return the single discrete random variable used to describe the process
* state.
*
* @return the single discrete random variable used to describe the process
* state.
*/
RandomVariable getStateVariable();
/**
* Return the transition model:<br>
* <b>P</b>(X<sub>t</sub> | X<sub>t-1</sub>)<br>
* is represented by an S * S matrix <b>T</b> where<br>
* <b>T</b><sub>ij</sub> = P(X<sub>t</sub> = j | X<sub>t-1</sub> = i).
*
* @return the transition model in Matrix form.
*/
Matrix getTransitionModel();
/**
* Return the sensor model in matrix form:<br>
* P(e<sub>t</sub> | X<sub>t</sub> = i) for each state i.<br>
* For mathematical convenience we place each of these values into an S * S
* diagonal matrix.
*
* @return the sensor model in matrix form.
*/
Map<Object, Matrix> getSensorModel();
/**
* Return the prior distribution represented as a column vector in Matrix
* form.
*
* @return the prior distribution represented as a column vector in Matrix
* form.
*/
Matrix getPrior();
/**
* Get the specific evidence matrix based on assigned evidence value.
*
* @param evidence
* the evidence assignment e.
* @return the Matrix representation of this evidence assignment from the
* sensor model.
*/
Matrix getEvidence(List<AssignmentProposition> evidence);
/**
* Return a new column vector in matrix form with all values set to 1.0.
*
* @return a new column vector in matrix form with all values set to 1.0.
*/
Matrix createUnitMessage();
/**
* Convert a Categorical Distribution into a column vector in Matrix form.
*
* @param fromCD
* the categorical distribution to be converted.
* @return a column vector in Matrix form of the passed in categorical
* distribution.
*/
Matrix convert(CategoricalDistribution fromCD);
/**
* Convert a column vector in Matrix form to a Categorical Distribution.
*
* @param fromMessage
* the column vector in Matrix form to be converted.
* @return a categorical distribution representation of the passed in column
* vector.
*/
CategoricalDistribution convert(Matrix fromMessage);
/**
* Convert a list of column vectors in Matrix form into a corresponding list
* of Categorical Distributions.
*
* @param matrixs
* the column vectors in matrix form to be converted.
* @return a corresponding list of Categorical Distribution representation
* of the passed in column vectors.
*/
List<CategoricalDistribution> convert(List<Matrix> matrixs);
/**
* Create a normalized column vector in matrix form of the passed in column
* vector.
*
* @param m
* a column vector representation in matrix form.
* @return a normalized column vector of the passed in column vector.
*/
Matrix normalize(Matrix m);
}