packages feed

hanalyze-0.1.0.0: bench/haskell/BenchMemBO.hs

{-# LANGUAGE OverloadedStrings #-}
-- | Memory audit Q2-B: Bayesian Optimization (1D + multi-D).
--
--   ./bench-mem-bo <iters>            # 1D Forrester
--   ./bench-mem-bo <iters> <dim>      # ND sphere
module Main where

import           Data.Time.Clock       (getCurrentTime, diffUTCTime)
import           System.Environment    (getArgs)
import           System.IO             (hSetBuffering, BufferMode (..), stdout)
import           System.Random.MWC     (createSystemRandom)

import           Hanalyze.Optim.BayesOpt
                  (BayesOptConfig (..), defaultBayesOptConfig, bayesOpt,
                   bayesOptND)

-- 1D Forrester (canonical BO benchmark).
forrester :: Double -> IO Double
forrester x =
  let v = (6 * x - 2) ** 2 * sin (12 * x - 4)
  in return v

sphere :: [Double] -> IO Double
sphere xs = return $ sum [ (x - 0.3) * (x - 0.3) | x <- xs ]

main :: IO ()
main = do
  hSetBuffering stdout NoBuffering
  args <- getArgs
  gen <- createSystemRandom
  case args of
    [it]     -> do
      let iters = read it :: Int
          cfg = defaultBayesOptConfig { boIterations = iters }
      putStrLn $ "BenchMemBO  iters=" ++ show iters ++ "  (1D Forrester)"
      t0 <- getCurrentTime
      (hist, (xb, yb)) <- bayesOpt cfg forrester (0.0, 1.0) gen
      t1 <- getCurrentTime
      putStrLn $ "  best=(" ++ show xb ++ ", " ++ show yb ++ ")"
              ++ "  histLen=" ++ show (length hist)
              ++ "  elapsed=" ++ show (diffUTCTime t1 t0)
    [it, d] -> do
      let iters = read it :: Int
          dim   = read d  :: Int
          cfg = defaultBayesOptConfig { boIterations = iters }
          bs = replicate dim (-1.0 :: Double, 1.0 :: Double)
      putStrLn $ "BenchMemBO  iters=" ++ show iters
                          ++ "  dim=" ++ show dim ++ "  (sphere)"
      t0 <- getCurrentTime
      (hist, (xb, yb)) <- bayesOptND cfg 5 sphere bs gen
      t1 <- getCurrentTime
      putStrLn $ "  best=" ++ show (xb, yb)
              ++ "  histLen=" ++ show (length hist)
              ++ "  elapsed=" ++ show (diffUTCTime t1 t0)
    _ -> putStrLn "usage: bench-mem-bo <iters> [dim]"