module Numeric.Optimization.Algorithms.HagerZhang05.AD
(
optimize
, Simple
, Mutable
, Result(..)
, Statistics(..)
, defaultParameters
, Parameters(..)
, Verbose(..)
, LineSearch(..)
, StopRules(..)
, EstimateError(..)
, TechParameters(..)
) where
import Prelude hiding (mapM)
import Data.Foldable (foldlM)
import Data.Traversable (Traversable (..), mapAccumL, mapM)
import qualified Data.Vector.Storable as S
import qualified Data.Vector.Storable.Mutable as SM
import Numeric.AD
import Numeric.AD.Types
import Numeric.Optimization.Algorithms.HagerZhang05 hiding (optimize)
import qualified Numeric.Optimization.Algorithms.HagerZhang05 as HagerZhang05
optimize
:: forall f. Traversable f
=> Parameters
-> Double
-> f Double
-> (forall s. Mode s => f (AD s Double) -> AD s Double)
-> IO (f Double, Result, Statistics)
optimize params grad_tol initial f = do
let size :: Int
template :: f Int
(size, template) = mapAccumL (\i _ -> i `seq` (i+1, i)) 0 initial
readFromMVec mx = mapM (SM.read mx) template
writeToMVec x mx = do
_ <- foldlM (\i v -> SM.write mx i v >> return (i+1)) 0 x
return ()
readFromVec :: S.Vector Double -> f Double
readFromVec x = fmap (x S.!) template
mf mx = do
x <- readFromMVec mx
return $ lowerFU f x
mg mx mret = do
x <- readFromMVec mx
writeToMVec (grad f x) mret
mc mx mret = do
x <- readFromMVec mx
let (y,g) = grad' f x
writeToMVec g mret
return y
vx0 :: S.Vector Double
vx0 = S.create $ do
mx <- SM.new size
writeToMVec initial mx
return mx
(vx, result, stat) <- HagerZhang05.optimize params grad_tol vx0 (MFunction mf) (MGradient mg) (Just (MCombined mc))
return (readFromVec vx, result, stat)