content: package aima.test.core.unit.probability.hmm.exact;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import org.junit.Assert;
  import org.junit.Test;
  
  import aima.core.probability.CategoricalDistribution;
  import aima.core.probability.example.ExampleRV;
  import aima.core.probability.example.HMMExampleFactory;
  import aima.core.probability.hmm.exact.FixedLagSmoothing;
  import aima.core.probability.proposition.AssignmentProposition;
  
  /**
   * 
   * @author Ciaran O'Reilly
   *
   */
  public class FixedLagSmoothingTest {
  	public static final double DELTA_THRESHOLD = 1e-3;
  
  	@Test
  	public void testFixedLagSmoothing_lag_1_UmbrellaWorld() {
  		FixedLagSmoothing uw = new FixedLagSmoothing(HMMExampleFactory
  				.getUmbrellaWorldModel(), 1);
  
  		// Day 1 - Lag 1
  		List<AssignmentProposition> e1 = new ArrayList<AssignmentProposition>();
  		e1
  				.add(new AssignmentProposition(ExampleRV.UMBREALLA_t_RV,
  						Boolean.TRUE));
  
  		CategoricalDistribution smoothed = uw.fixedLagSmoothing(e1);
  		Assert.assertNull(smoothed);
  		
  		// Day 2 - Lag 1
  		List<AssignmentProposition> e2 = new ArrayList<AssignmentProposition>();
  		e2
  				.add(new AssignmentProposition(ExampleRV.UMBREALLA_t_RV,
  						Boolean.TRUE));
  
  		smoothed = uw.fixedLagSmoothing(e2);
  
  		// Day 1 smoothed probabilities based on 2 days of evidence
  		Assert.assertNotNull(smoothed);
  		Assert.assertArrayEquals(new double[] { 0.883, 0.117 }, smoothed
  				.getValues(), DELTA_THRESHOLD);
  
  		// Day 3 - Lag 1
  		List<AssignmentProposition> e3 = new ArrayList<AssignmentProposition>();
  		e3.add(new AssignmentProposition(ExampleRV.UMBREALLA_t_RV,
  				Boolean.FALSE));
  
  		smoothed = uw.fixedLagSmoothing(e3);
  
  		// Day 2 smoothed probabilities based on 3 days of evidence
  		Assert.assertNotNull(smoothed);
  		Assert.assertArrayEquals(new double[] { 0.799, 0.201 }, smoothed
  				.getValues(), DELTA_THRESHOLD);
  	}
  
  	@Test
  	public void testFixedLagSmoothing_lag_2_UmbrellaWorld() {
  		FixedLagSmoothing uw = new FixedLagSmoothing(HMMExampleFactory
  				.getUmbrellaWorldModel(), 2);
  
  		// Day 1 - Lag 2
  		List<AssignmentProposition> e1 = new ArrayList<AssignmentProposition>();
  		e1
  				.add(new AssignmentProposition(ExampleRV.UMBREALLA_t_RV,
  						Boolean.TRUE));
  
  		CategoricalDistribution smoothed = uw.fixedLagSmoothing(e1);
  		Assert.assertNull(smoothed);
  
  		// Day 2 - Lag 2
  		List<AssignmentProposition> e2 = new ArrayList<AssignmentProposition>();
  		e2
  				.add(new AssignmentProposition(ExampleRV.UMBREALLA_t_RV,
  						Boolean.TRUE));
  
  		smoothed = uw.fixedLagSmoothing(e2);
  		Assert.assertNull(smoothed);
  
  		// Day 3 - Lag 2
  		List<AssignmentProposition> e3 = new ArrayList<AssignmentProposition>();
  		e3.add(new AssignmentProposition(ExampleRV.UMBREALLA_t_RV,
  				Boolean.FALSE));
  
  		smoothed = uw.fixedLagSmoothing(e3);
  
  		Assert.assertNotNull(smoothed);
  		Assert.assertArrayEquals(new double[] { 0.861, 0.138 }, smoothed
  				.getValues(), DELTA_THRESHOLD);
  	}
  }
  