content: module NonlinearSSM.Algorithms where
  
  import Control.Monad.Bayes.Class (MonadDistribution)
  import Control.Monad.Bayes.Inference.MCMC
  import Control.Monad.Bayes.Inference.PMMH as PMMH (pmmh)
  import Control.Monad.Bayes.Inference.RMSMC (rmsmc, rmsmcBasic, rmsmcDynamic)
  import Control.Monad.Bayes.Inference.SMC
  import Control.Monad.Bayes.Inference.SMC2 as SMC2 (smc2)
  import Control.Monad.Bayes.Population
  import Control.Monad.Bayes.Weighted (unweighted)
  import NonlinearSSM
  
  data Alg = SMC | RMSMC | RMSMCDynamic | RMSMCBasic | PMMH | SMC2
    deriving (Show, Read, Eq, Ord, Enum, Bounded)
  
  algs :: [Alg]
  algs = [minBound .. maxBound]
  
  type SSMData = [Double]
  
  t :: Int
  t = 5
  
  -- FIXME refactor such that it can be reused in ssm benchmark
  runAlgFixed :: (MonadDistribution m) => SSMData -> Alg -> m String
  runAlgFixed ys SMC = fmap show $ runPopulationT $ smc SMCConfig {numSteps = t, numParticles = 10, resampler = resampleMultinomial} (param >>= model ys)
  runAlgFixed ys RMSMC =
    fmap show $
      runPopulationT $
        rmsmc
          MCMCConfig {numMCMCSteps = 10, numBurnIn = 0, proposal = SingleSiteMH}
          SMCConfig {numSteps = t, numParticles = 10, resampler = resampleSystematic}
          (param >>= model ys)
  runAlgFixed ys RMSMCBasic =
    fmap show $
      runPopulationT $
        rmsmcBasic
          MCMCConfig {numMCMCSteps = 10, numBurnIn = 0, proposal = SingleSiteMH}
          SMCConfig {numSteps = t, numParticles = 10, resampler = resampleSystematic}
          (param >>= model ys)
  runAlgFixed ys RMSMCDynamic =
    fmap show $
      runPopulationT $
        rmsmcDynamic
          MCMCConfig {numMCMCSteps = 10, numBurnIn = 0, proposal = SingleSiteMH}
          SMCConfig {numSteps = t, numParticles = 10, resampler = resampleSystematic}
          (param >>= model ys)
  runAlgFixed ys PMMH =
    fmap show $
      unweighted $
        pmmh
          MCMCConfig {numMCMCSteps = 2, numBurnIn = 0, proposal = SingleSiteMH}
          SMCConfig {numSteps = t, numParticles = 3, resampler = resampleSystematic}
          param
          (model ys)
  runAlgFixed ys SMC2 = fmap show $ runPopulationT $ smc2 t 3 2 1 param (model ys)
  