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