optimization 0.1.4 → 0.1.5
raw patch · 3 files changed
+12/−9 lines, 3 filesdep ~ad
Dependency ranges changed: ad
Files
- optimization.cabal +2/−2
- src/Optimization/Constrained/Penalty.hs +4/−4
- src/Optimization/LineSearch.hs +6/−3
optimization.cabal view
@@ -1,6 +1,6 @@ name: optimization category: Math-version: 0.1.4+version: 0.1.5 license: BSD3 cabal-version: >= 1.10 license-file: LICENSE@@ -51,7 +51,7 @@ build-depends: base >= 4.4 && < 5, vector >= 0.10 && < 1.0,- ad >= 3.4 && < 4.0,+ ad >= 3.4 && < 4.3, linear >= 1.0 && < 2.0, semigroupoids >= 3.0 && < 5.0, distributive >= 0.3 && < 0.5
src/Optimization/Constrained/Penalty.hs view
@@ -17,7 +17,7 @@ , lagrangian ) where -import Numeric.AD.Types+import Numeric.AD import qualified Data.Vector as V @@ -50,7 +50,7 @@ -- | Minimize the given constrained optimization problem -- This is a basic penalty method approach-minimize :: (Functor f, Num a, Ord a, g ~ V)+minimize :: (Functor f, RealFrac a, Ord a, g ~ V) => (FU f a -> f a -> [f a]) -- ^ Primal minimizer -> Opt f a -- ^ The optimization problem of interest -> a -- ^ The penalty increase factor@@ -59,12 +59,12 @@ -> [f a] -- ^ Optimizing iterates minimize minX opt alpha = go where go x0 l0 = let l1 = fmap (*alpha) l0- x1 = head $ drop 100 $ minX (FU $ \x -> augLagrangian opt x (fmap auto l1)) x0+ x1 = head $ drop 100 $ minX (FU $ \x -> augLagrangian opt x (fmap realToFrac l1)) x0 in x1 : go x1 l1 {-# INLINEABLE minimize #-} -- | Maximize the given constrained optimization problem-maximize :: (Functor f, Num a, Ord a, g ~ V)+maximize :: (Functor f, RealFrac a, Ord a, g ~ V) => (FU f a -> f a -> [f a]) -- ^ Primal minimizer -> Opt f a -- ^ The optimization problem of interest -> a -- ^ The penalty increase factor
src/Optimization/LineSearch.hs view
@@ -36,6 +36,7 @@ import Prelude hiding (pred) import Linear+import Debug.Trace -- | A line search method @search df p x@ determines a step size -- in direction @p@ from point @x@ for function @f@ with gradient @df@@@ -63,7 +64,7 @@ {-# INLINE armijo #-} -- | Curvature condition-curvature :: (Num a, Ord a, Additive f, Metric f)+curvature :: (Num a, Ord a, Additive f, Metric f, Show a, Show (f a)) => a -- ^ curvature condition strength c2 -> (f a -> f a) -- ^ gradient of function -> f a -- ^ point to evaluate at@@ -71,6 +72,7 @@ -> a -- ^ search step size -> Bool -- ^ is curvature condition satisfied curvature c2 df x p a =+ traceShow (df (x ^+^ a *^ p) `dot` p, c2 * (df x `dot` p), p) $ df (x ^+^ a *^ p) `dot` p >= c2 * (df x `dot` p) {-# INLINE curvature #-} @@ -115,7 +117,7 @@ -- @wolfeSearch gamma alpha c1@ starts with the given step size @alpha@ -- and reduces it by a factor of @gamma@ until both the Armijo and -- curvature conditions is satisfied.-wolfeSearch :: (Num a, Ord a, Metric f)+wolfeSearch :: (Show a, Num a, Ord a, Metric f, Show (f a)) => a -- ^ step size reduction factor gamma -> a -- ^ initial step size alpha -> a -- ^ Armijo condition strength c1@@ -124,7 +126,8 @@ -> LineSearch f a wolfeSearch gamma alpha c1 c2 f df p x = backtrackingSearch gamma alpha wolfe df p x- where wolfe a = armijo c1 f df p x a && curvature c2 df x p a+ where wolfe a = traceShow (a, armijo c1 f df p x a, curvature c2 df x p a)+ $ armijo c1 f df p x a && curvature c2 df x p a {-# INLINEABLE wolfeSearch #-} -- | Line search by Newton's method