{-# LINE 1 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
module Numeric.Optimization.Algorithms.HagerZhang05
(
optimize
, Function(..)
, Gradient(..)
, Combined(..)
, PointMVector
, GradientMVector
, Simple
, Mutable
, Result(..)
, Statistics(..)
, defaultParameters
, Parameters(..)
, Verbose(..)
, LineSearch(..)
, StopRules(..)
, EstimateError(..)
, TechParameters(..)
) where
import qualified Data.Vector.Generic as G
import qualified Data.Vector.Generic.Mutable as GM
import qualified Data.Vector.Storable as S
import qualified Data.Vector.Storable.Mutable as SM
import Control.Applicative
import Control.Exception (bracket)
import Control.Monad.Primitive (PrimMonad(..))
import Foreign
import Foreign.C
import qualified System.IO.Unsafe as Unsafe
import Prelude
{-# LINE 67 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
trace :: String -> a -> a
trace _ x = x
{-# LINE 70 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
optimize :: (G.Vector v Double)
=> Parameters
-> Double
-> v Double
-> Function t1
-> Gradient t2
-> Maybe (Combined t3)
-> IO (S.Vector Double, Result, Statistics)
optimize params grad_tol initial f g c = do
let n = G.length initial
x <- GM.unstream $ G.stream initial
let mf = mutableF f
mg = mutableG g
mc = maybe (combine mf mg) mutableC c
cf = prepareF mf
cg = prepareG mg
cc = prepareC mc
(ret, stats) <-
SM.unsafeWith x $ \x_ptr ->
allocaSet (Statistics 0 0 0 0 0) $ \stats_ptr ->
allocaSet params $ \param_ptr ->
bracket (mkCFunction cf) freeHaskellFunPtr $ \cf_ptr ->
bracket (mkCGradient cg) freeHaskellFunPtr $ \cg_ptr ->
bracket (mkCCombined cc) freeHaskellFunPtr $ \cc_ptr ->
allocateWorkSpace n $ \work_ptr -> do
ret <- cg_descent x_ptr (fromIntegral n)
stats_ptr param_ptr grad_tol
cf_ptr cg_ptr cc_ptr work_ptr
stats <- peek stats_ptr
return (intToResult ret, stats)
x' <- G.unsafeFreeze x
return $ ret `seq` (x', ret, stats)
allocaSet :: Storable a => a -> (Ptr a -> IO b) -> IO b
allocaSet x f = alloca $ \x_ptr -> do
poke x_ptr x
f x_ptr
allocateWorkSpace :: Int -> (Ptr Double -> IO a) -> IO a
allocateWorkSpace n
| size < threshold = allocaBytes size
| otherwise = bracket (mallocBytes size) free
where
size = 4 * n * sizeOf (undefined :: Double)
threshold = 4096
type CFunction = Ptr Double -> CInt -> IO Double
type CGradient = Ptr Double -> Ptr Double -> CInt -> IO ()
type CCombined = Ptr Double -> Ptr Double -> CInt -> IO Double
foreign import ccall safe "cg_user.h"
cg_descent :: Ptr Double
-> CInt
-> Ptr Statistics
-> Ptr Parameters
-> Double
-> FunPtr CFunction
-> FunPtr CGradient
-> FunPtr CCombined
-> Ptr Double
-> IO CInt
foreign import ccall "wrapper" mkCFunction :: CFunction -> IO (FunPtr CFunction)
foreign import ccall "wrapper" mkCGradient :: CGradient -> IO (FunPtr CGradient)
foreign import ccall "wrapper" mkCCombined :: CCombined -> IO (FunPtr CCombined)
data Simple
data Mutable
type PointMVector m = SM.MVector (PrimState m) Double
type GradientMVector m = SM.MVector (PrimState m) Double
data Function t where
VFunction :: G.Vector v Double
=> (v Double -> Double)
-> Function Simple
MFunction :: (forall m. (PrimMonad m, Functor m)
=> PointMVector m
-> m Double)
-> Function Mutable
copyInput :: (PrimMonad m, G.Vector v Double)
=> SM.MVector (PrimState m) Double
-> m (v Double)
copyInput mx = do
let s = trace " copyInput start" $ GM.length mx
mz <- GM.new s
let go i | i >= s = return ()
| otherwise = GM.unsafeRead mx i >>=
GM.unsafeWrite mz i >> go (i+1)
go 0
trace " stop" $ G.unsafeFreeze mz
copyOutput :: (PrimMonad m, G.Vector v Double)
=> SM.MVector (PrimState m) Double
-> v Double
-> m ()
copyOutput mret r = go $ trace " copyOutput start" $ 0
where
s = min (GM.length mret) (G.length r)
go i | i >= s = trace " stop" $ return ()
| otherwise = let !x = G.unsafeIndex r i
in GM.unsafeWrite mret i x >> go (i+1)
mutableF :: Function t -> Function Mutable
mutableF (VFunction f) = MFunction (\mx -> f <$> copyInput mx)
mutableF (MFunction f) = MFunction f
prepareF :: Function Mutable -> CFunction
prepareF (MFunction f) =
\x_ptr n -> do
let n' = fromIntegral n
x_fptr <- newForeignPtr_ x_ptr
let x = SM.unsafeFromForeignPtr x_fptr 0 n'
{-# LINE 235 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
r <- f x
{-# LINE 239 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
return r
{-# LINE 249 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
data Gradient t where
VGradient :: G.Vector v Double
=> (v Double -> v Double)
-> Gradient Simple
MGradient :: (forall m. (PrimMonad m, Functor m)
=> PointMVector m
-> GradientMVector m
-> m ())
-> Gradient Mutable
mutableG :: Gradient t -> Gradient Mutable
mutableG (VGradient f) = MGradient f'
where
f' :: (PrimMonad m, Functor m) =>
PointMVector m
-> GradientMVector m
-> m ()
f' mx mret = f <$> copyInput mx >>= copyOutput mret
mutableG (MGradient f) = MGradient f
prepareG :: Gradient Mutable -> CGradient
prepareG (MGradient f) =
\ret_ptr x_ptr n -> do
let n' = fromIntegral n
x_fptr <- newForeignPtr_ x_ptr
ret_fptr <- newForeignPtr_ ret_ptr
let x = SM.unsafeFromForeignPtr x_fptr 0 n'
r = SM.unsafeFromForeignPtr ret_fptr 0 n'
{-# LINE 293 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
f x r
{-# LINE 297 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
data Combined t where
VCombined :: G.Vector v Double
=> (v Double -> (Double, v Double))
-> Combined Simple
MCombined :: (forall m. (PrimMonad m, Functor m)
=> PointMVector m
-> GradientMVector m
-> m Double)
-> Combined Mutable
mutableC :: Combined t -> Combined Mutable
mutableC (VCombined f) = MCombined f'
where
f' :: (PrimMonad m, Functor m) =>
PointMVector m
-> GradientMVector m
-> m Double
f' mx mret = do
(v,r) <- f <$> copyInput mx
copyOutput mret r
return v
mutableC (MCombined f) = MCombined f
prepareC :: Combined Mutable -> CCombined
prepareC (MCombined f) =
\ret_ptr x_ptr n -> do
let n' = fromIntegral n
x_fptr <- newForeignPtr_ x_ptr
ret_fptr <- newForeignPtr_ ret_ptr
let x = SM.unsafeFromForeignPtr x_fptr 0 n'
r = SM.unsafeFromForeignPtr ret_fptr 0 n'
{-# LINE 343 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v <- f x r
{-# LINE 347 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
return v
combine :: Function Mutable -> Gradient Mutable -> Combined Mutable
combine (MFunction f) (MGradient g) =
MCombined $ \mx mret -> g mx mret >> f mx
data Result =
ToleranceStatisfied
| FunctionChange
| MaxTotalIter
| NegativeSlope
| MaxSecantIter
| NotDescent
| LineSearchFailsInitial
| LineSearchFailsBisection
| LineSearchFailsUpdate
| DebugTol
| FunctionValueNaN
| StartFunctionValueNaN
deriving (Eq, Ord, Show, Read, Enum)
intToResult :: CInt -> Result
intToResult (-2) = FunctionValueNaN
intToResult (-1) = StartFunctionValueNaN
intToResult 0 = ToleranceStatisfied
intToResult 1 = FunctionChange
intToResult 2 = MaxTotalIter
intToResult 3 = NegativeSlope
intToResult 4 = MaxSecantIter
intToResult 5 = NotDescent
intToResult 6 = LineSearchFailsInitial
intToResult 7 = LineSearchFailsBisection
intToResult 8 = LineSearchFailsUpdate
intToResult 9 = DebugTol
intToResult 10 = error $ "HagerZhang05.intToResult: out of memory?! how?!"
intToResult x = error $ "HagerZhang05.intToResult: unknown value " ++ show x
data Statistics = Statistics {
finalValue :: Double
,gradNorm :: Double
,totalIters :: CInt
,funcEvals :: CInt
,gradEvals :: CInt
} deriving (Eq, Ord, Show, Read)
instance Storable Statistics where
sizeOf _ = (40)
{-# LINE 420 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
alignment _ = alignment (undefined :: Double)
peek ptr = do
v_finalValue <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 423 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_gradNorm <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 424 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_totalIters <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 425 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_funcEvals <- (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 426 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_gradEvals <- (\hsc_ptr -> peekByteOff hsc_ptr 32) ptr
{-# LINE 427 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
return Statistics {finalValue = v_finalValue
,gradNorm = v_gradNorm
,totalIters = v_totalIters
,funcEvals = v_funcEvals
,gradEvals = v_gradEvals}
poke ptr s = do
(\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (finalValue s)
{-# LINE 434 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 8) ptr (gradNorm s)
{-# LINE 435 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr (totalIters s)
{-# LINE 436 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 24) ptr (funcEvals s)
{-# LINE 437 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 32) ptr (gradEvals s)
{-# LINE 438 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
defaultParameters :: Parameters
defaultParameters =
Unsafe.unsafePerformIO $ do
alloca $ \ptr -> do
cg_default ptr
peek ptr
{-# NOINLINE defaultParameters #-}
foreign import ccall unsafe "cg_user.h"
cg_default :: Ptr Parameters -> IO ()
data Parameters = Parameters {
printFinal :: Bool
,printParams :: Bool
,verbose :: Verbose
,lineSearch :: LineSearch
,qdecay :: Double
,stopRules :: StopRules
,estimateError :: EstimateError
,quadraticStep :: Maybe Double
,debugTol :: Maybe Double
,initialStep :: Maybe Double
,maxItersFac :: Double
,nexpand :: CInt
,nsecant :: CInt
,restartFac :: Double
,funcEpsilon :: Double
,nanRho :: Double
,techParameters :: TechParameters
} deriving (Eq, Ord, Show, Read)
instance Storable Parameters where
sizeOf _ = (208)
{-# LINE 539 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
alignment _ = alignment (undefined :: Double)
peek ptr = do
v_printFinal <- (\hsc_ptr -> peekByteOff hsc_ptr 0) ptr
{-# LINE 542 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_printParams <- (\hsc_ptr -> peekByteOff hsc_ptr 8) ptr
{-# LINE 543 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_verbose <- (\hsc_ptr -> peekByteOff hsc_ptr 4) ptr
{-# LINE 544 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_awolfe <- (\hsc_ptr -> peekByteOff hsc_ptr 12) ptr
{-# LINE 545 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_awolfefac <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr
{-# LINE 546 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_qdecay <- (\hsc_ptr -> peekByteOff hsc_ptr 24) ptr
{-# LINE 547 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_stopRule <- (\hsc_ptr -> peekByteOff hsc_ptr 32) ptr
{-# LINE 548 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_stopRuleFac <- (\hsc_ptr -> peekByteOff hsc_ptr 40) ptr
{-# LINE 549 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_estimateError <- (\hsc_ptr -> peekByteOff hsc_ptr 48) ptr
{-# LINE 550 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_estimateEps <- (\hsc_ptr -> peekByteOff hsc_ptr 56) ptr
{-# LINE 551 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_quadraticStep <- (\hsc_ptr -> peekByteOff hsc_ptr 64) ptr
{-# LINE 552 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_quadraticCut <- (\hsc_ptr -> peekByteOff hsc_ptr 72) ptr
{-# LINE 553 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_debug <- (\hsc_ptr -> peekByteOff hsc_ptr 80) ptr
{-# LINE 554 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_debugTol <- (\hsc_ptr -> peekByteOff hsc_ptr 88) ptr
{-# LINE 555 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_initialStep <- (\hsc_ptr -> peekByteOff hsc_ptr 96) ptr
{-# LINE 556 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_maxItersFac <- (\hsc_ptr -> peekByteOff hsc_ptr 104) ptr
{-# LINE 557 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_nexpand <- (\hsc_ptr -> peekByteOff hsc_ptr 112) ptr
{-# LINE 558 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_nsecant <- (\hsc_ptr -> peekByteOff hsc_ptr 116) ptr
{-# LINE 559 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_restartFac <- (\hsc_ptr -> peekByteOff hsc_ptr 120) ptr
{-# LINE 560 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_funcEpsilon <- (\hsc_ptr -> peekByteOff hsc_ptr 128) ptr
{-# LINE 561 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_nanRho <- (\hsc_ptr -> peekByteOff hsc_ptr 136) ptr
{-# LINE 562 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_delta <- (\hsc_ptr -> peekByteOff hsc_ptr 144) ptr
{-# LINE 564 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_sigma <- (\hsc_ptr -> peekByteOff hsc_ptr 152) ptr
{-# LINE 565 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_gamma <- (\hsc_ptr -> peekByteOff hsc_ptr 160) ptr
{-# LINE 566 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_rho <- (\hsc_ptr -> peekByteOff hsc_ptr 168) ptr
{-# LINE 567 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_eta <- (\hsc_ptr -> peekByteOff hsc_ptr 176) ptr
{-# LINE 568 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_psi0 <- (\hsc_ptr -> peekByteOff hsc_ptr 184) ptr
{-# LINE 569 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_psi1 <- (\hsc_ptr -> peekByteOff hsc_ptr 192) ptr
{-# LINE 570 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
v_psi2 <- (\hsc_ptr -> peekByteOff hsc_ptr 200) ptr
{-# LINE 571 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
let tech = TechParameters {techDelta = v_delta
,techSigma = v_sigma
,techGamma = v_gamma
,techRho = v_rho
,techEta = v_eta
,techPsi0 = v_psi0
,techPsi1 = v_psi1
,techPsi2 = v_psi2}
let b :: CInt -> Bool; b = (/= 0)
return Parameters {printFinal = b v_printFinal
,printParams = b v_printParams
,verbose = case v_verbose :: CInt of
0 -> Quiet
1 -> Verbose
_ -> VeryVerbose
,lineSearch = if b v_awolfe
then ApproximateWolfe
else AutoSwitch v_awolfefac
,qdecay = v_qdecay
,stopRules = if b v_stopRule
then DefaultStopRule v_stopRuleFac
else AlternativeStopRule
,estimateError = if b v_estimateError
then RelativeEpsilon v_estimateEps
else AbsoluteEpsilon v_estimateEps
,quadraticStep = if b v_quadraticStep
then Just v_quadraticCut
else Nothing
,debugTol = if b v_debug
then Just v_debugTol
else Nothing
,initialStep = case v_initialStep of
0 -> Nothing
x -> Just x
,maxItersFac = v_maxItersFac
,nexpand = v_nexpand
,nsecant = v_nsecant
,restartFac = v_restartFac
,funcEpsilon = v_funcEpsilon
,nanRho = v_nanRho
,techParameters = tech}
poke ptr p = do
let i b = if b p then 1 else (0 :: CInt)
m b = maybe (0 :: CInt) (const 1) (b p)
(\hsc_ptr -> pokeByteOff hsc_ptr 0) ptr (i printFinal)
{-# LINE 619 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 8) ptr (i printParams)
{-# LINE 620 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 4) ptr (case verbose p of
{-# LINE 621 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
Quiet -> 0 :: CInt
Verbose -> 1
VeryVerbose -> 3)
let (awolfe, awolfefac) = case lineSearch p of
ApproximateWolfe -> (1, 0)
AutoSwitch x -> (0, x)
(\hsc_ptr -> pokeByteOff hsc_ptr 12) ptr (awolfe :: CInt)
{-# LINE 628 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr awolfefac
{-# LINE 629 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 24) ptr (qdecay p)
{-# LINE 630 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
let (stopRule, stopRuleFac) = case stopRules p of
DefaultStopRule x -> (1, x)
AlternativeStopRule -> (0, 0)
(\hsc_ptr -> pokeByteOff hsc_ptr 32) ptr (stopRule :: CInt)
{-# LINE 634 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 40) ptr stopRuleFac
{-# LINE 635 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
let (pertRule, eps) = case estimateError p of
RelativeEpsilon x -> (1,x)
AbsoluteEpsilon x -> (0,x)
(\hsc_ptr -> pokeByteOff hsc_ptr 48) ptr (pertRule :: CInt)
{-# LINE 639 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 56) ptr eps
{-# LINE 640 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 64) ptr (m quadraticStep)
{-# LINE 641 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 72) ptr (maybe 0 id $ quadraticStep p)
{-# LINE 642 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 80) ptr (m debugTol)
{-# LINE 643 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 88) ptr (maybe 0 id $ debugTol p)
{-# LINE 644 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 96) ptr (maybe 0 id $ initialStep p)
{-# LINE 645 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 104) ptr (maxItersFac p)
{-# LINE 646 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 112) ptr (nexpand p)
{-# LINE 647 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 116) ptr (nsecant p)
{-# LINE 648 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 120) ptr (restartFac p)
{-# LINE 649 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 128) ptr (funcEpsilon p)
{-# LINE 650 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 136) ptr (nanRho p)
{-# LINE 651 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 144) ptr (techDelta $ techParameters p)
{-# LINE 653 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 152) ptr (techSigma $ techParameters p)
{-# LINE 654 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 160) ptr (techGamma $ techParameters p)
{-# LINE 655 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 168) ptr (techRho $ techParameters p)
{-# LINE 656 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 176) ptr (techEta $ techParameters p)
{-# LINE 657 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 184) ptr (techPsi0 $ techParameters p)
{-# LINE 658 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 192) ptr (techPsi1 $ techParameters p)
{-# LINE 659 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
(\hsc_ptr -> pokeByteOff hsc_ptr 200) ptr (techPsi2 $ techParameters p)
{-# LINE 660 "src/Numeric/Optimization/Algorithms/HagerZhang05.hsc" #-}
data TechParameters = TechParameters {
techDelta :: Double
,techSigma :: Double
,techGamma :: Double
,techRho :: Double
,techEta :: Double
,techPsi0 :: Double
,techPsi1 :: Double
,techPsi2 :: Double
} deriving (Eq, Ord, Show, Read)
data Verbose =
Quiet
| Verbose
| VeryVerbose
deriving (Eq, Ord, Show, Read, Enum)
data LineSearch =
ApproximateWolfe
| AutoSwitch Double
deriving (Eq, Ord, Show, Read)
data StopRules =
DefaultStopRule Double
| AlternativeStopRule
deriving (Eq, Ord, Show, Read)
data EstimateError =
AbsoluteEpsilon Double
| RelativeEpsilon Double
deriving (Eq, Ord, Show, Read)