@hackage numeric-optimization0.1.0.0

Unified interface to various numerical optimization algorithms

numeric-optimization

Unified interface to various numerical optimization algorithms.

Note that the package name is numeric-optimization and not numerical-optimization. The name numeric-optimization comes from the module name Numeric.Optimization.

Example Usage

{-# LANGUAGE OverloadedLists #-}
import Data.Vector.Storable (Vector)
import Numeric.Optimization

main :: IO ()
main = do
  result <- minimize LBFGS def (WithGrad rosenbrock rosenbrock') [-3,-4]
  print (resultSuccess result)  -- True
  print (resultSolution result)  -- [0.999999999009131,0.9999999981094296]
  print (resultValue result)  -- 1.8129771632403013e-18

-- https://en.wikipedia.org/wiki/Rosenbrock_function
rosenbrock :: Vector Double -> Double
rosenbrock [x,y] = sq (1 - x) + 100 * sq (y - sq x)

rosenbrock' :: Vector Double -> Vector Double
rosenbrock' [x,y] =
  [ 2 * (1 - x) * (-1) + 100 * 2 * (y - sq x) * (-2) * x
  , 100 * 2 * (y - sq x)
  ]

sq :: Floating a => a -> a
sq x = x ** 2

Supported Algorithms

Algorithm Solver implemention Haskell binding
CG_DESCENT CG_DESCENT-C nonlinear-optimization Requires with-cg-descent flag
Limited memory BFGS (L-BFGS) liblbfgs lbfgs
Newton's method Pure Haskell implementation using HMatrix -

LICENSE

The code in thie packaged is licensed under BSD-3-Clause.

If you enable with-cg-descent flag, it uses GPL-licensed packages and the resulting binary should be distributed under GPL.