import Test.Hspec import Test.Hspec.QuickCheck import Test.QuickCheck import qualified TestWeighted import qualified TestEnumerator import qualified TestPopulation import qualified TestSequential import qualified TestInference main :: IO () main = hspec $ do describe "Weighted" $ it "accumulates likelihood correctly" $ do passed <- TestWeighted.passed passed `shouldBe` True describe "Dist" $ do it "sorts samples and aggregates weights" $ TestEnumerator.passed2 `shouldBe` True it "gives correct answer for the sprinkler model" $ TestEnumerator.passed3 `shouldBe` True it "computes expectation correctly" $ TestEnumerator.passed4 `shouldBe` True describe "Population" $ do context "controlling population" $ do it "preserves the population when not expicitly altered" $ do popSize <- TestPopulation.popSize popSize `shouldBe` 5 it "multiplies the number of samples when spawn invoked twice" $ do manySize <- TestPopulation.manySize manySize `shouldBe` 15 it "correctly computes population average" $ TestPopulation.popAvgCheck `shouldBe` True context "distribution-preserving transformations" $ do it "collapse preserves the distribution" $ do TestPopulation.transCheck1 `shouldBe` True TestPopulation.transCheck2 `shouldBe` True it "resample preserves the distribution" $ do TestPopulation.resampleCheck 1 `shouldBe` True TestPopulation.resampleCheck 2 `shouldBe` True describe "Sequential" $ do it "stops at every factor" $ do TestSequential.checkTwoSync 0 `shouldBe` True TestSequential.checkTwoSync 1 `shouldBe` True TestSequential.checkTwoSync 2 `shouldBe` True it "preserves the distribution" $ TestSequential.checkPreserve `shouldBe` True it "produces correct intermediate weights" $ do TestSequential.checkSync 0 `shouldBe` True TestSequential.checkSync 1 `shouldBe` True TestSequential.checkSync 2 `shouldBe` True describe "SMC" $ do it "terminates" $ seq TestInference.checkTerminateSMC () `shouldBe` () it "preserves the distribution on the sprinkler model" $ TestInference.checkPreserveSMC `shouldBe` True prop "number of particles is equal to its second parameter" $ \observations particles -> observations >= 0 && particles >= 1 ==> ioProperty $ do checkParticles <- TestInference.checkParticles observations particles return $ checkParticles == particles describe "SMC with systematic resampling" $ do prop "number of particles is equal to its second parameter" $ \observations particles -> observations >= 0 && particles >= 1 ==> ioProperty $ do checkParticles <- TestInference.checkParticlesSystematic observations particles return $ checkParticles == particles