commit 2c72f387f130d4db53d8316f5bfea52aeb3d97af
parent 3497d940f55edd5e6e745dd96559b0b440b9a82e
Author: Jared Tobin <jared@jtobin.ca>
Date: Mon, 12 Nov 2012 10:33:30 +1300
Add burn-in option to runChain.
Diffstat:
6 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/Examples/code/BNN_Flat.hs b/Examples/code/BNN_Flat.hs
@@ -28,7 +28,7 @@ main = do
config = MarkovChain inits 0
g <- create
- results <- runChain params nepochs 1 config g
+ results <- runChain params nepochs 0 1 config g
hPutStrLn stderr $
let nAcc = accepts results
diff --git a/Examples/code/Booth_Flat.hs b/Examples/code/Booth_Flat.hs
@@ -28,7 +28,7 @@ main = do
config = MarkovChain inits 0
g <- create
- results <- runChain params nepochs 1 config g
+ results <- runChain params nepochs 0 1 config g
hPutStrLn stderr $
let nAcc = accepts results
diff --git a/Examples/code/Himmelblau_Flat.hs b/Examples/code/Himmelblau_Flat.hs
@@ -14,21 +14,23 @@ main = do
args <- getArgs
when (args == []) $ do
putStrLn "(flat-mcmc) Himmelblau density "
- putStrLn "Usage: ./Himmelblau_Flat <numSteps> <inits> "
+ putStrLn "Usage: ./Himmelblau_Flat <numSteps> <burnIn> <inits> "
putStrLn " "
putStrLn "numSteps : Number of Markov chain iterations to run."
+ putStrLn "burnIn : Number of burn-in steps to perform. "
putStrLn "inits : Filepath containing points at which to "
putStrLn " initialize the ensemble. "
exitSuccess
- inits <- readInits (args !! 1)
+ inits <- readInits (args !! 2)
let nepochs = read (head args) :: Int
+ burnIn = read (args !! 1) :: Int
params = Options target (V.length inits) 30
config = MarkovChain inits 0
g <- create
- results <- runChain params nepochs 1 config g
+ results <- runChain params nepochs burnIn 1 config g
hPutStrLn stderr $
let nAcc = accepts results
diff --git a/Examples/code/Rosenbrock_Flat.hs b/Examples/code/Rosenbrock_Flat.hs
@@ -28,7 +28,7 @@ main = do
config = MarkovChain inits 0
g <- create
- results <- runChain params nepochs 1 config g
+ results <- runChain params nepochs 0 1 config g
hPutStrLn stderr $
let nAcc = accepts results
diff --git a/Examples/code/SPDE_Flat.hs b/Examples/code/SPDE_Flat.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE BangPatterns #-}
-
import System.IO
import System.Exit
import System.Environment
@@ -20,12 +18,13 @@ main = do
args <- getArgs
when (args == []) $ do
putStrLn "(flat-mcmc) Stochastic partial differential equation "
- putStrLn "Usage: ./SPDE_Flat <numSteps> <inits> <thinEvery> <granularity> "
+ putStrLn "Usage: ./SPDE_Flat <numSteps> <inits> <thinEvery> <burnIn> <granularity> "
putStrLn " "
putStrLn "numSteps : Number of Markov chain iterations to run."
putStrLn "inits : Filepath containing points at which to "
putStrLn " initialize the ensemble. "
putStrLn "thinEvery : Print every n^th iteration. "
+ putStrLn "burnIn : Number of burn-in steps. "
putStrLn "granularity : Parallel granularity (smaller is finer). "
exitSuccess
@@ -33,12 +32,13 @@ main = do
let nepochs = read (head args) :: Int
thinEvery = read (args !! 2) :: Int
- gran = read (args !! 3) :: Int
+ burnIn = read (args !! 3) :: Int
+ gran = read (args !! 4) :: Int
params = Options target (V.length inits) gran
config = MarkovChain inits 0
g <- create
- results <- runChain params nepochs thinEvery config g
+ results <- runChain params nepochs burnIn thinEvery config g
hPutStrLn stderr $
let nAcc = accepts results
diff --git a/Numeric/MCMC/Flat.hs b/Numeric/MCMC/Flat.hs
@@ -124,21 +124,26 @@ metropolisStep state g = do
-- | Diffuse through states.
runChain :: Options -- Options of the Markov chain
-> Int -- Number of epochs to iterate the chain
+ -> Int -- Burn-in period
-> Int -- Print every nth iteration.
-> MarkovChain -- Initial state of the Markov chain
-> Gen RealWorld -- MWC PRNG
-> IO MarkovChain -- End state of the Markov chain, wrapped in IO
-runChain opts nepochs thinEvery initConfig g
+runChain opts nepochs burnIn thinEvery initConfig g
| l == 0
= error "runChain: ensemble must contain at least one particle"
| l < (length . V.head) (ensemble initConfig)
= do hPutStrLn stderr $ "runChain: ensemble should be twice as large as "
++ "the target's dimension. Continuing anyway."
go opts nepochs thinEvery initConfig g
+ | burnIn < 0 || thinEvery < 0 = error "runChain: nonsensical burn-in or thinning input."
| otherwise = go opts nepochs thinEvery initConfig g
where
l = V.length (ensemble initConfig)
go o n t !c g0 | n == 0 = return c
+ | n > (nepochs - burnIn) = do
+ r <- runReaderT (metropolisStep c g0) o
+ go o (n - 1) t r g0
| n `rem` t /= 0 = do
r <- runReaderT (metropolisStep c g0) o
go o (n - 1) t r g0