lbfgs 0.0.3 → 0.0.5
raw patch · 4 files changed
+59/−25 lines, 4 filesPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
API changes (from Hackage documentation)
+ Numeric.LBFGS: AlreadyMinimized :: LBFGSResult
+ Numeric.LBFGS: Canceled :: LBFGSResult
+ Numeric.LBFGS: IncorrectTMinMax :: LBFGSResult
+ Numeric.LBFGS: IncreaseGradient :: LBFGSResult
+ Numeric.LBFGS: InvalidDelta :: LBFGSResult
+ Numeric.LBFGS: InvalidEpsilon :: LBFGSResult
+ Numeric.LBFGS: InvalidFtol :: LBFGSResult
+ Numeric.LBFGS: InvalidGtol :: LBFGSResult
+ Numeric.LBFGS: InvalidLineSearch :: LBFGSResult
+ Numeric.LBFGS: InvalidMaxLineSearch :: LBFGSResult
+ Numeric.LBFGS: InvalidMaxStep :: LBFGSResult
+ Numeric.LBFGS: InvalidMinStep :: LBFGSResult
+ Numeric.LBFGS: InvalidN :: LBFGSResult
+ Numeric.LBFGS: InvalidNSSE :: LBFGSResult
+ Numeric.LBFGS: InvalidOrthantwise :: LBFGSResult
+ Numeric.LBFGS: InvalidOrthantwiseEnd :: LBFGSResult
+ Numeric.LBFGS: InvalidOrthantwiseStart :: LBFGSResult
+ Numeric.LBFGS: InvalidParameters :: LBFGSResult
+ Numeric.LBFGS: InvalidTestPeriod :: LBFGSResult
+ Numeric.LBFGS: InvalidWolfe :: LBFGSResult
+ Numeric.LBFGS: InvalidXSSE :: LBFGSResult
+ Numeric.LBFGS: InvalidXtol :: LBFGSResult
+ Numeric.LBFGS: LBFGSParameters :: Maybe Int -> Double -> LineSearchAlgorithm -> L1NormCoefficient -> LBFGSParameters
+ Numeric.LBFGS: LogicError :: LBFGSResult
+ Numeric.LBFGS: MaximumIteration :: LBFGSResult
+ Numeric.LBFGS: MaximumLineSearch :: LBFGSResult
+ Numeric.LBFGS: MaximumStep :: LBFGSResult
+ Numeric.LBFGS: MinimumStep :: LBFGSResult
+ Numeric.LBFGS: OutOfInterval :: LBFGSResult
+ Numeric.LBFGS: OutOfMemory :: LBFGSResult
+ Numeric.LBFGS: RoundingError :: LBFGSResult
+ Numeric.LBFGS: Stop :: LBFGSResult
+ Numeric.LBFGS: Success :: LBFGSResult
+ Numeric.LBFGS: UnknownError :: LBFGSResult
+ Numeric.LBFGS: WidthTooSmall :: LBFGSResult
+ Numeric.LBFGS: data LBFGSParameters
+ Numeric.LBFGS: lbfgsDelta :: LBFGSParameters -> Double
+ Numeric.LBFGS: lbfgsL1NormCoefficient :: LBFGSParameters -> L1NormCoefficient
+ Numeric.LBFGS: lbfgsLineSearch :: LBFGSParameters -> LineSearchAlgorithm
+ Numeric.LBFGS: lbfgsPast :: LBFGSParameters -> Maybe Int
- Numeric.LBFGS: lbfgs :: LineSearchAlgorithm -> EvaluateFun a -> ProgressFun a -> a -> [Double] -> IO (LBFGSResult, [Double])
+ Numeric.LBFGS: lbfgs :: LBFGSParameters -> EvaluateFun a -> ProgressFun a -> a -> [Double] -> IO (LBFGSResult, [Double])
- Numeric.LBFGS.Raw: CLBFGSParameter :: CInt -> CDouble -> CInt -> CDouble -> CInt -> CLineSearchAlgorithm -> CInt -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> CLBFGSParameter
+ Numeric.LBFGS.Raw: CLBFGSParameter :: CInt -> CDouble -> CInt -> CDouble -> CInt -> CLineSearchAlgorithm -> CInt -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> CDouble -> CInt -> CInt -> CLBFGSParameter
- Numeric.LBFGS.Raw: orthantwise_end :: CLBFGSParameter -> CDouble
+ Numeric.LBFGS.Raw: orthantwise_end :: CLBFGSParameter -> CInt
- Numeric.LBFGS.Raw: orthantwise_start :: CLBFGSParameter -> CDouble
+ Numeric.LBFGS.Raw: orthantwise_start :: CLBFGSParameter -> CInt
Files
- Numeric/LBFGS.hs +53/−19
- Numeric/LBFGS/Raw.hsc +4/−4
- cbits/lbfgs.c +1/−1
- lbfgs.cabal +1/−1
Numeric/LBFGS.hs view
@@ -15,10 +15,12 @@ -- <http://www.chokkan.org/software/liblbfgs/> module Numeric.LBFGS (LineSearchAlgorithm(..), EvaluateFun,- ProgressFun, LBFGSResult, lbfgs) where+ ProgressFun, LBFGSParameters(..), LBFGSResult(..),+ lbfgs) where -import Data.Array.Storable (StorableArray,- unsafeForeignPtrToStorableArray)+import Data.Array.Storable (StorableArray)+import Data.Array.Unsafe (unsafeForeignPtrToStorableArray)+import Data.Maybe import Foreign.C.Types (CDouble, CInt) import Foreign.ForeignPtr (newForeignPtr_) import Foreign.Marshal.Alloc (malloc, free)@@ -36,6 +38,18 @@ ) -- |+-- Parameters for the LBFGS minimization.+data LBFGSParameters = LBFGSParameters {+ lbfgsPast :: Maybe Int,+ lbfgsDelta :: Double,+ lbfgsLineSearch :: LineSearchAlgorithm,+ lbfgsL1NormCoefficient :: L1NormCoefficient+}++-- | Coefficient for the L1 norm of variables.+type L1NormCoefficient = Maybe Double++-- | -- Various line search algorithms. Wolfe backtracking algorithms require -- a coefficient. data LineSearchAlgorithm = DefaultLineSearch@@ -45,28 +59,47 @@ | BacktrackingWolfe {coeff :: Double } | BacktrackingStrongWolfe {coeff :: Double } -mergeLineSearchAlgorithm :: CLBFGSParameter -> LineSearchAlgorithm ->+mergeLineSearchAlgorithm :: LineSearchAlgorithm -> CLBFGSParameter -> CLBFGSParameter-mergeLineSearchAlgorithm p DefaultLineSearch =+mergeLineSearchAlgorithm DefaultLineSearch p = p {R.linesearch = R.defaultLineSearch}-mergeLineSearchAlgorithm p MoreThuente =+mergeLineSearchAlgorithm MoreThuente p = p { R.linesearch = R.moreThuente }-mergeLineSearchAlgorithm p BacktrackingArmijo =+mergeLineSearchAlgorithm BacktrackingArmijo p = p { R.linesearch = R.backtrackingArmijo }-mergeLineSearchAlgorithm p Backtracking =+mergeLineSearchAlgorithm Backtracking p = p { R.linesearch = R.backtracking }-mergeLineSearchAlgorithm p (BacktrackingWolfe c) =+mergeLineSearchAlgorithm (BacktrackingWolfe c) p = p { R.linesearch = R.backtrackingWolfe, R.wolfe = realToFrac c }-mergeLineSearchAlgorithm p (BacktrackingStrongWolfe c) =+mergeLineSearchAlgorithm (BacktrackingStrongWolfe c) p = p { R.linesearch = R.backtrackingStrongWolfe, R.wolfe = realToFrac c } -withParam :: LineSearchAlgorithm -> CLBFGSParameter-withParam lineSearch =- mergeLineSearchAlgorithm defaultCParam lineSearch+mergeL1NormCoefficient :: L1NormCoefficient -> CInt -> CLBFGSParameter ->+ CLBFGSParameter+mergeL1NormCoefficient Nothing _ p = p+mergeL1NormCoefficient (Just l1) n p =+ p { R.linesearch = R.backtracking,+ R.orthantwise_c = realToFrac l1,+ R.orthantwise_start = 0,+ R.orthantwise_end = n - 1 } +mergePast :: Maybe Int -> Double -> CLBFGSParameter -> CLBFGSParameter+mergePast Nothing delta p = p { R.past = 0 }+mergePast (Just iterations) delta p = p {+ R.past = fromIntegral iterations,+ R.delta = realToFrac delta+ } +withParam :: LBFGSParameters -> CInt -> CLBFGSParameter+withParam (LBFGSParameters past delta lineSearch l1NormCoeff) n =+ mergeL1NormCoefficient l1NormCoeff n $ (mergeLineSearchAlgorithm lineSearch)+ $ mergePast past delta defaultCParam++defaultLBFGSParameters :: LBFGSParameters+defaultLBFGSParameters = LBFGSParameters Nothing 1e-5 DefaultLineSearch Nothing+ data LBFGSResult = Success | Stop@@ -230,20 +263,21 @@ -- | -- Start a L-BFGS optimization. The initial variables should be -- provided as a list of doubles.-lbfgs :: LineSearchAlgorithm -- ^ The line search algorithm+lbfgs :: LBFGSParameters -- ^ Parameters -> EvaluateFun a -- ^ Objective function -> ProgressFun a -- ^ Progress report function -> a -- ^ Instance data -> [Double] -- ^ Initial variable values -> IO(LBFGSResult, [Double]) -- ^ Result and variable values-lbfgs ls evalFun progressFun inst p = lbfgs_ ls (wrapEvaluateFun evalFun)- (wrapProgressFun progressFun) inst p+lbfgs lbfgsParams evalFun progressFun inst p = lbfgs_ lbfgsParams+ (wrapEvaluateFun evalFun)+ (wrapProgressFun progressFun) inst p -lbfgs_ :: LineSearchAlgorithm -> CEvaluateFun a -> CProgressFun a -> a ->+lbfgs_ :: LBFGSParameters -> CEvaluateFun a -> CProgressFun a -> a -> [Double] -> IO(LBFGSResult, [Double])-lbfgs_ ls evalFun progressFun inst p = do+lbfgs_ lbfgsParams evalFun progressFun inst p = do (n, pVec) <- listToVector p- let param = withParam ls+ let param = withParam lbfgsParams n instP <- newStablePtr inst paramP <- malloc poke paramP param
Numeric/LBFGS/Raw.hsc view
@@ -53,7 +53,7 @@ ) where import Foreign.Storable (Storable(..))-import Foreign.C.Types (CDouble, CInt)+import Foreign.C.Types (CDouble(..), CInt(..)) import Foreign.Ptr (FunPtr, Ptr) import Foreign.StablePtr (StablePtr) @@ -108,13 +108,13 @@ gtol :: CDouble, xtol :: CDouble, orthantwise_c :: CDouble,- orthantwise_start :: CDouble,- orthantwise_end :: CDouble+ orthantwise_start :: CInt,+ orthantwise_end :: CInt } deriving Show defaultCParam :: CLBFGSParameter defaultCParam = CLBFGSParameter 6 1e-5 0 1e-5 0 defaultLineSearch 40 1e-20- 1e20 1e-4 0.9 0.9 1.0e-16 0.0 0.0 (-1.0)+ 1e20 1e-4 0.9 0.9 1.0e-16 0.0 0 (-1) instance Storable CLBFGSParameter where sizeOf _ = #{size lbfgs_parameter_t}
cbits/lbfgs.c view
@@ -490,7 +490,7 @@ /* Report the progress. */ if (cd.proc_progress) {- if (ret = cd.proc_progress(cd.instance, x, g, fx, xnorm, gnorm, step, cd.n, k, ls)) {+ if ((ret = cd.proc_progress(cd.instance, x, g, fx, xnorm, gnorm, step, cd.n, k, ls))) { goto lbfgs_exit; } }
lbfgs.cabal view
@@ -1,5 +1,5 @@ Name: lbfgs-Version: 0.0.3+Version: 0.0.5 License: OtherLicense License-File: LICENSE Copyright: Daniël de Kok