packages feed

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 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