package aima.test.core.unit.probability.bayes.approx; import org.junit.Assert; import org.junit.Test; import aima.core.probability.bayes.approx.ParticleFiltering; import aima.core.probability.example.DynamicBayesNetExampleFactory; import aima.core.probability.example.ExampleRV; import aima.core.probability.proposition.AssignmentProposition; import aima.core.util.MockRandomizer; /** * @author Ciaran O'Reilly * @author Ravi Mohan */ public class ParticleFilterTest { @Test public void test_AIMA3e_Fig15_18() { MockRandomizer mr = new MockRandomizer(new double[] { // Prior Sample: // 8 with Rain_t-1=true from prior distribution 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, // 2 with Rain_t-1=false from prior distribution 0.6, 0.6, // (a) Propagate 6 samples Rain_t=true 0.7, 0.7, 0.7, 0.7, 0.7, 0.7, // 4 samples Rain_t=false 0.71, 0.71, 0.31, 0.31, // (b) Weight should be for first 6 samples: // Rain_t-1=true, Rain_t=true, Umbrella_t=false = 0.1 // Next 2 samples: // Rain_t-1=true, Rain_t=false, Umbrealla_t=false= 0.8 // Final 2 samples: // Rain_t-1=false, Rain_t=false, Umbrella_t=false = 0.8 // gives W[] = // [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.8, 0.8, 0.8, 0.8] // normalized = // [0.026, ...., 0.211, ....] is approx. 0.156 = true // the remainder is false // (c) Resample 2 Rain_t=true, 8 Rain_t=false 0.15, 0.15, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, // // Next Sample: // (a) Propagate 1 samples Rain_t=true 0.7, // 9 samples Rain_t=false 0.71, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, 0.31, // (c) resample 1 Rain_t=true, 9 Rain_t=false 0.0001, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2, 0.2 }); int N = 10; ParticleFiltering pf = new ParticleFiltering(N, DynamicBayesNetExampleFactory.getUmbrellaWorldNetwork(), mr); AssignmentProposition[] e = new AssignmentProposition[] { new AssignmentProposition( ExampleRV.UMBREALLA_t_RV, false) }; AssignmentProposition[][] S = pf.particleFiltering(e); Assert.assertEquals(N, S.length); for (int i = 0; i < N; i++) { Assert.assertEquals(1, S[i].length); AssignmentProposition ap = S[i][0]; Assert.assertEquals(ExampleRV.RAIN_t_RV, ap.getTermVariable()); if (i < 2) { Assert.assertEquals(true, ap.getValue()); } else { Assert.assertEquals(false, ap.getValue()); } } // Generate next sample to ensure everything roles forward ok // in this case with prefixed probabilities only expect 1 Rain_t=true S = pf.particleFiltering(e); Assert.assertEquals(N, S.length); for (int i = 0; i < N; i++) { Assert.assertEquals(1, S[i].length); AssignmentProposition ap = S[i][0]; Assert.assertEquals(ExampleRV.RAIN_t_RV, ap.getTermVariable()); if (i < 1) { Assert.assertEquals(true, ap.getValue()); } else { Assert.assertEquals(false, ap.getValue()); } } } }