module Math.Optimization.LossFunctions ( absSum, rosenbrock ) where import Numeric.LinearAlgebra (Vector,dim,subVector,foldVector,mul) import Math.Optimization.SPSA.Types (LossFn) absSum :: LossFn absSum = sumVector . abs sumVector :: Vector Double -> Double sumVector = foldVector (+) 0 square :: Vector Double -> Vector Double square x = mul x x rosenbrock :: LossFn rosenbrock v = sumVector $ 100 * (square $ (square x) - y) + (square (x - 1)) where sz = (dim v) `quot` 2 x = subVector 0 sz v y = subVector sz sz v