optimization-0.1: src/Optimization/LineSearch/BarzilaiBorwein.hs
module Optimization.LineSearch.BarzilaiBorwein
( barzilaiBorwein
) where
import Linear
-- | Barzilai-Borwein 1988 is a non-monotonic optimization method
barzilaiBorwein :: (Additive f, Metric f, Functor f, Fractional a, Epsilon a)
=> (f a -> f a) -> f a -> f a -> [f a]
barzilaiBorwein df = go
where go x0 x1 = let s = x1 ^-^ x0
z = df x1 ^-^ df x0
alpha = (s `dot` z) / (z `dot` z)
x2 = x1 ^-^ alpha *^ df x1
in if nearZero (z `dot` z)
then [x2]
else x2 : go x1 x2