packages feed

hlbfgsb-0.0.1.0: test/Tests.hs

import Test.Framework (defaultMain, testGroup)
import Test.Framework.Providers.HUnit

import Test.HUnit

import Numeric.Lbfgsb

import Control.Monad
import Control.Arrow
import qualified Data.Vector.Generic as V

main = defaultMain tests

tests = [
        testGroup "Basic tests" [
                testCase "list" test1,
                testCase "vector" test2
            ]
{- perhaps make this work some day
 - or create different tests?
        testGroup "Tests from Nocedal" [
                testCase "n=25,m=5" (testNoced 25)
            ] -}
    ]

bisquare [x,y] = ((x-4)*(x-3) + (y-2)*(y-1), [(x-4)+(x-3), (y-2)+(y-1)])

vectorize fg = second V.fromList . fg . V.toList

test1 = [3.5, 1.5] @=? minimize 3 1e3 1e-20 [47, 47] [] bisquare

test2 = [3.5, 1.5] @=? (V.toList $ minimizeV 3 1e3 1e-20 (V.fromList [47, 47]) [] (vectorize bisquare))

testNoced n = [] @=? (minimize 5 1e3 1e-5 (start n) (bounds n) (calcF n &&& calcG n))

bnd i |     odd i = (Just    1, Just 100)
      |    even i = (Just (-1), Just 100)

bounds n = map bnd [1..n]

start n = replicate n 3

{-
init        f=.25d0*( x(1)-1.d0 )**2
do12        do 20 i=2, n
step           f = f + ( x(i)-x(i-1 )**2 )**2
continue    continue
end         f = 4.d0*f
-}
calcF n x' = init
  where
    x = 0:x'
    init         = do1 (0.25 * ((x !! 1) - 1) ** 2)
    do1      f   = do2 f 2
    do2      f i
     | i <= n    = step f i
     | otherwise = end  f
    step     f i = continue (f + ( (x!!i)-(x !! (i-1) )**2 )**2) i
    continue f i = do2 f (i+1)
    end      f = 4 * f

{-
init     t1=x(2)-x(1)**2
line1    g(1)=2.d0*(x(1)-1.d0)-1.6d1*x(1)*t1
do12     do 22 i=2,n-1
step1       t2=t1
step2       t1=x(i+1)-x(i)**2
step3       g(i)=8.d0*t2-1.6d1*x(i)*t1
continue continue
end      g(n)=8.d0*t1
-}


xs =!! (i, x) = take i (xs ++ repeat 0) ++ (x : drop (i+1) xs)

calcG n x' = init
  where
    x = 0:x'
    init               = line1 ((x!!2)-(x!!1)**2)
    line1    t1        = do1 t1 ([] =!! (1,2*((x!!1)-1)-16*(x!!1)*t1))
    do1      t1 g      = do2 t1 g 2
    do2      t1 g i
           | i <= n-1  = step1 t1 g i
           | otherwise = end t1 g
    step1    t1 g i    = step2 t1 g i t1
    step2    t1 g i t2 = step3 ((x !! (i+1)) - (x !! i) ** 2) g i t2
    step3    t1 g i t2 = continue t1 (g =!! (i, (8*t2-16*(x!!i)*t1))) i
    continue t1 g i    = do2 t1 g (i+1)
    end      t1 g = tail $ (g =!! (n, 8*t1))