package aima.core.probability.temporal;
import java.util.List;
import aima.core.probability.CategoricalDistribution;
import aima.core.probability.proposition.AssignmentProposition;
/**
* * The FORWARD operator is defined by Equation (15.5).<br>
*
* <pre>
* <b>P</b>(<b>X</b><sub>t+1</sub> | <b>e</b><sub>1:t+1</sub>)
* = α<b>P</b>(<b>e</b><sub>t+1</sub> | <b>X</b><sub>t+1</sub>)∑<sub><b>x</b><sub>t</sub></sub><b>P</b>(<b>X</b><sub>t+1</sub> | <b>x</b><sub>t</sub>, <b>e</b><sub>1:t</sub>)P(<b>x</b><sub>t</sub> | <b>e</b><sub>1:t</sub>)
* = α<b>P</b>(<b>e</b><sub>t+1</sub> | <b>X</b><sub>t+1</sub>)∑<sub><b>x</b><sub>t</sub></sub><b>P</b>(<b>X</b><sub>t+1</sub> | <b>x</b><sub>t</sub>)P(<b>x</b><sub>t</sub> | <b>e</b><sub>1:t</sub>) (Markov Assumption)
* </pre>
*
* @author Ciaran O'Reilly
*
*/
public interface ForwardStepInference {
/**
* The FORWARD operator is defined by Equation (15.5).<br>
*
* <pre>
* <b>P</b>(<b>X</b><sub>t+1</sub> | <b>e</b><sub>1:t+1</sub>)
* = α<b>P</b>(<b>e</b><sub>t+1</sub> | <b>X</b><sub>t+1</sub>)∑<sub><b>x</b><sub>t</sub></sub><b>P</b>(<b>X</b><sub>t+1</sub> | <b>x</b><sub>t</sub>, <b>e</b><sub>1:t</sub>)P(<b>x</b><sub>t</sub> | <b>e</b><sub>1:t</sub>)
* = α<b>P</b>(<b>e</b><sub>t+1</sub> | <b>X</b><sub>t+1</sub>)∑<sub><b>x</b><sub>t</sub></sub><b>P</b>(<b>X</b><sub>t+1</sub> | <b>x</b><sub>t</sub>)P(<b>x</b><sub>t</sub> | <b>e</b><sub>1:t</sub>) (Markov Assumption)
* </pre>
*
* @param f1_t
* f<sub>1:t</sub>
* @param e_tp1
* <b>e</b><sub>t+1</sub>
* @return f<sub>1:t+1</sub>
*/
CategoricalDistribution forward(CategoricalDistribution f1_t,
List<AssignmentProposition> e_tp1);
}