package dist.hmm; import shared.DataSet; import shared.Instance; import dist.ConditionalDistribution; /** * A wrapper class that turns a regular conditional distribution * into a conditional state distribution (at some computational * cost) * @author Andrew Guillory gtg008g@mail.gatech.edu * @version 1.0 */ public class ConditionalStateDistributionWrapper implements StateDistribution { /** * The conditional distribution being wrapped */ private ConditionalDistribution cd; /** * Make a new state distribution * @param dist the conditional distribution to wrap */ public ConditionalStateDistributionWrapper(ConditionalDistribution dist) { cd = dist; } /** * @see dist.hmm.StateDistribution#p(int, shared.Instance) */ public double p(int nextState, Instance observ) { return cd.distributionFor(observ).p(new Instance(nextState)); } /** * @see dist.hmm.StateDistribution#generateRandomState(shared.Instance) */ public int generateRandomState(Instance o) { return cd.sample(o).getDiscrete(); } /** * @see dist.hmm.StateDistribution#mostLikelyState(shared.Instance) */ public int mostLikelyState(Instance o) { return cd.mode(o).getDiscrete(); } /** * @see dist.hmm.StateDistribution#estimate(double[][], shared.DataSet) */ public void estimate(double[][] expectations, DataSet sequence) { Instance[] instances = new Instance[expectations.length * expectations[0].length]; for (int i = 0; i < expectations.length; i++) { for (int j = 0; j < expectations[i].length; j++) { Instance instance = new Instance(sequence.get(i).getData(), new Instance(j)); instances[i * expectations[0].length + j] = instance; instance.setWeight(expectations[i][j]); } } cd.estimate(new DataSet(instances)); } }