package context.arch.enactor; import java.util.List; import be.ac.ulg.montefiore.run.jahmm.Observation; //import be.ac.ulg.montefiore.run.jahmm.ObservationVector; import context.arch.discoverer.ComponentDescription; import context.arch.discoverer.query.HmmQueryItem; import context.arch.discoverer.query.HmmWrapper; /** * An EnactorReference that uses a Hidden Markov Model (HMM) for inference. * Similar to {@link ClassifierEnactorReference}, but also deals with handling sequential output. * * @author Brian Y. Lim * */ public class HmmEnactorReference<O extends Observation> extends EnactorReference { protected HmmWrapper hmmWrapper; protected HmmEnactor<O> hmmEnactor; public HmmEnactorReference(HmmEnactor<O> enactor) { super(enactor, new HmmQueryItem(enactor.getHMM()), "HmmOutcomeValue"); // not associated with any single outcomeValue this.hmmEnactor = enactor; this.hmmWrapper = enactor.getHMM(); } /** * Since this is tied to multiple outcomeValues, * need to extract current value from the EnactorComponentInfo * that was just stored during the comparison. */ @Override public void evaluateComponent(EnactorComponentInfo eci) { ComponentDescription widgetState = eci.getCurrentState(); enactor.setInWidgetState(widgetState); List<String> valueSequence = ((HmmQueryItem)conditionQuery).getLastOutcomeValueSequence(); hmmEnactor.setOutcomeValueSequence(valueSequence); outcomeValue = valueSequence.get(valueSequence.size() - 1); // just the last value of the sequence enactor.setOutcomeValue(outcomeValue); this.setOutcomeValue(outcomeValue); conditionSatisfied(eci); // subclass can do whatever enactor.fireComponentEvaluated(eci); // notify listeners after reacting } }