{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
{-# LANGUAGE FlexibleContexts #-}
module Numeric.GSL.Minimization (
minimize, minimizeV, MinimizeMethod(..),
minimizeD, minimizeVD, MinimizeMethodD(..),
uniMinimize, UniMinimizeMethod(..),
minimizeNMSimplex,
minimizeConjugateGradient,
minimizeVectorBFGS2
) where
import Numeric.LinearAlgebra.HMatrix hiding(step)
import Numeric.GSL.Internal
import Foreign.Ptr(Ptr, FunPtr, freeHaskellFunPtr)
import Foreign.C.Types
import System.IO.Unsafe(unsafePerformIO)
{-# DEPRECATED minimizeNMSimplex "use minimize NMSimplex2 eps maxit sizes f xi" #-}
minimizeNMSimplex :: ([Double] -> Double)
-> [Double]
-> [Double]
-> Double
-> Int
-> ([Double], Matrix Double)
minimizeNMSimplex [Double] -> Double
f [Double]
xi [Double]
szs Double
eps Int
maxit = MinimizeMethod
-> Double
-> Int
-> [Double]
-> ([Double] -> Double)
-> [Double]
-> ([Double], Matrix Double)
minimize MinimizeMethod
NMSimplex Double
eps Int
maxit [Double]
szs [Double] -> Double
f [Double]
xi
{-# DEPRECATED minimizeConjugateGradient "use minimizeD ConjugateFR eps maxit step tol f g xi" #-}
minimizeConjugateGradient :: Double
-> Double
-> Double
-> Int
-> ([Double] -> Double)
-> ([Double] -> [Double])
-> [Double]
-> ([Double], Matrix Double)
minimizeConjugateGradient Double
step Double
tol Double
eps Int
maxit [Double] -> Double
f [Double] -> [Double]
g [Double]
xi = MinimizeMethodD
-> Double
-> Int
-> Double
-> Double
-> ([Double] -> Double)
-> ([Double] -> [Double])
-> [Double]
-> ([Double], Matrix Double)
minimizeD MinimizeMethodD
ConjugateFR Double
eps Int
maxit Double
step Double
tol [Double] -> Double
f [Double] -> [Double]
g [Double]
xi
{-# DEPRECATED minimizeVectorBFGS2 "use minimizeD VectorBFGS2 eps maxit step tol f g xi" #-}
minimizeVectorBFGS2 :: Double
-> Double
-> Double
-> Int
-> ([Double] -> Double)
-> ([Double] -> [Double])
-> [Double]
-> ([Double], Matrix Double)
minimizeVectorBFGS2 Double
step Double
tol Double
eps Int
maxit [Double] -> Double
f [Double] -> [Double]
g [Double]
xi = MinimizeMethodD
-> Double
-> Int
-> Double
-> Double
-> ([Double] -> Double)
-> ([Double] -> [Double])
-> [Double]
-> ([Double], Matrix Double)
minimizeD MinimizeMethodD
VectorBFGS2 Double
eps Int
maxit Double
step Double
tol [Double] -> Double
f [Double] -> [Double]
g [Double]
xi
data UniMinimizeMethod = GoldenSection
| BrentMini
| QuadGolden
deriving (Int -> UniMinimizeMethod
UniMinimizeMethod -> Int
UniMinimizeMethod -> [UniMinimizeMethod]
UniMinimizeMethod -> UniMinimizeMethod
UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod]
UniMinimizeMethod
-> UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod]
(UniMinimizeMethod -> UniMinimizeMethod)
-> (UniMinimizeMethod -> UniMinimizeMethod)
-> (Int -> UniMinimizeMethod)
-> (UniMinimizeMethod -> Int)
-> (UniMinimizeMethod -> [UniMinimizeMethod])
-> (UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod])
-> (UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod])
-> (UniMinimizeMethod
-> UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod])
-> Enum UniMinimizeMethod
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: UniMinimizeMethod
-> UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod]
$cenumFromThenTo :: UniMinimizeMethod
-> UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod]
enumFromTo :: UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod]
$cenumFromTo :: UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod]
enumFromThen :: UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod]
$cenumFromThen :: UniMinimizeMethod -> UniMinimizeMethod -> [UniMinimizeMethod]
enumFrom :: UniMinimizeMethod -> [UniMinimizeMethod]
$cenumFrom :: UniMinimizeMethod -> [UniMinimizeMethod]
fromEnum :: UniMinimizeMethod -> Int
$cfromEnum :: UniMinimizeMethod -> Int
toEnum :: Int -> UniMinimizeMethod
$ctoEnum :: Int -> UniMinimizeMethod
pred :: UniMinimizeMethod -> UniMinimizeMethod
$cpred :: UniMinimizeMethod -> UniMinimizeMethod
succ :: UniMinimizeMethod -> UniMinimizeMethod
$csucc :: UniMinimizeMethod -> UniMinimizeMethod
Enum, UniMinimizeMethod -> UniMinimizeMethod -> Bool
(UniMinimizeMethod -> UniMinimizeMethod -> Bool)
-> (UniMinimizeMethod -> UniMinimizeMethod -> Bool)
-> Eq UniMinimizeMethod
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: UniMinimizeMethod -> UniMinimizeMethod -> Bool
$c/= :: UniMinimizeMethod -> UniMinimizeMethod -> Bool
== :: UniMinimizeMethod -> UniMinimizeMethod -> Bool
$c== :: UniMinimizeMethod -> UniMinimizeMethod -> Bool
Eq, Int -> UniMinimizeMethod -> ShowS
[UniMinimizeMethod] -> ShowS
UniMinimizeMethod -> String
(Int -> UniMinimizeMethod -> ShowS)
-> (UniMinimizeMethod -> String)
-> ([UniMinimizeMethod] -> ShowS)
-> Show UniMinimizeMethod
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [UniMinimizeMethod] -> ShowS
$cshowList :: [UniMinimizeMethod] -> ShowS
show :: UniMinimizeMethod -> String
$cshow :: UniMinimizeMethod -> String
showsPrec :: Int -> UniMinimizeMethod -> ShowS
$cshowsPrec :: Int -> UniMinimizeMethod -> ShowS
Show, UniMinimizeMethod
UniMinimizeMethod -> UniMinimizeMethod -> Bounded UniMinimizeMethod
forall a. a -> a -> Bounded a
maxBound :: UniMinimizeMethod
$cmaxBound :: UniMinimizeMethod
minBound :: UniMinimizeMethod
$cminBound :: UniMinimizeMethod
Bounded)
uniMinimize :: UniMinimizeMethod
-> Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> Double
-> (Double, Matrix Double)
uniMinimize :: UniMinimizeMethod
-> Double
-> Int
-> (Double -> Double)
-> Double
-> Double
-> Double
-> (Double, Matrix Double)
uniMinimize UniMinimizeMethod
method Double
epsrel Int
maxit Double -> Double
fun Double
xmin Double
xl Double
xu = CInt
-> (Double -> Double)
-> Double
-> Double
-> Double
-> Double
-> Int
-> (Double, Matrix Double)
uniMinimizeGen (Int -> CInt
fi (UniMinimizeMethod -> Int
forall a. Enum a => a -> Int
fromEnum UniMinimizeMethod
method)) Double -> Double
fun Double
xmin Double
xl Double
xu Double
epsrel Int
maxit
uniMinimizeGen :: CInt
-> (Double -> Double)
-> Double
-> Double
-> Double
-> Double
-> Int
-> (Double, Matrix Double)
uniMinimizeGen CInt
m Double -> Double
f Double
xmin Double
xl Double
xu Double
epsrel Int
maxit = IO (Double, Matrix Double) -> (Double, Matrix Double)
forall a. IO a -> a
unsafePerformIO (IO (Double, Matrix Double) -> (Double, Matrix Double))
-> IO (Double, Matrix Double) -> (Double, Matrix Double)
forall a b. (a -> b) -> a -> b
$ do
FunPtr (Double -> Double)
fp <- (Double -> Double) -> IO (FunPtr (Double -> Double))
mkDoublefun Double -> Double
f
Matrix Double
rawpath <- Int
-> Int
-> (CInt -> CInt -> Ptr Double -> IO CInt)
-> String
-> IO (Matrix Double)
forall {a}.
Storable a =>
Int
-> Int
-> (CInt -> CInt -> Ptr a -> IO CInt)
-> String
-> IO (Matrix a)
createMIO Int
maxit Int
4
(CInt
-> FunPtr (Double -> Double)
-> Double
-> CInt
-> Double
-> Double
-> Double
-> CInt
-> CInt
-> Ptr Double
-> IO CInt
c_uniMinize CInt
m FunPtr (Double -> Double)
fp Double
epsrel (Int -> CInt
fi Int
maxit) Double
xmin Double
xl Double
xu)
String
"uniMinimize"
let it :: Int
it = Double -> Int
forall a b. (RealFrac a, Integral b) => a -> b
round (Matrix Double
rawpath Matrix Double -> IndexOf Matrix -> Double
forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (Int
maxitInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1,Int
0))
path :: Matrix Double
path = Int -> Matrix Double -> Matrix Double
forall t. Element t => Int -> Matrix t -> Matrix t
takeRows Int
it Matrix Double
rawpath
[[Double]
sol] = Matrix Double -> [[Double]]
forall t. Element t => Matrix t -> [[t]]
toLists (Matrix Double -> [[Double]]) -> Matrix Double -> [[Double]]
forall a b. (a -> b) -> a -> b
$ Int -> Matrix Double -> Matrix Double
forall t. Element t => Int -> Matrix t -> Matrix t
dropRows (Int
itInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) Matrix Double
path
FunPtr (Double -> Double) -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr (Double -> Double)
fp
(Double, Matrix Double) -> IO (Double, Matrix Double)
forall (m :: * -> *) a. Monad m => a -> m a
return ([Double]
sol [Double] -> Int -> Double
forall a. [a] -> Int -> a
!! Int
1, Matrix Double
path)
foreign import ccall safe "uniMinimize"
c_uniMinize:: CInt -> FunPtr (Double -> Double) -> Double -> CInt -> Double -> Double -> Double -> TM Res
data MinimizeMethod = NMSimplex
| NMSimplex2
deriving (Int -> MinimizeMethod
MinimizeMethod -> Int
MinimizeMethod -> [MinimizeMethod]
MinimizeMethod -> MinimizeMethod
MinimizeMethod -> MinimizeMethod -> [MinimizeMethod]
MinimizeMethod
-> MinimizeMethod -> MinimizeMethod -> [MinimizeMethod]
(MinimizeMethod -> MinimizeMethod)
-> (MinimizeMethod -> MinimizeMethod)
-> (Int -> MinimizeMethod)
-> (MinimizeMethod -> Int)
-> (MinimizeMethod -> [MinimizeMethod])
-> (MinimizeMethod -> MinimizeMethod -> [MinimizeMethod])
-> (MinimizeMethod -> MinimizeMethod -> [MinimizeMethod])
-> (MinimizeMethod
-> MinimizeMethod -> MinimizeMethod -> [MinimizeMethod])
-> Enum MinimizeMethod
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: MinimizeMethod
-> MinimizeMethod -> MinimizeMethod -> [MinimizeMethod]
$cenumFromThenTo :: MinimizeMethod
-> MinimizeMethod -> MinimizeMethod -> [MinimizeMethod]
enumFromTo :: MinimizeMethod -> MinimizeMethod -> [MinimizeMethod]
$cenumFromTo :: MinimizeMethod -> MinimizeMethod -> [MinimizeMethod]
enumFromThen :: MinimizeMethod -> MinimizeMethod -> [MinimizeMethod]
$cenumFromThen :: MinimizeMethod -> MinimizeMethod -> [MinimizeMethod]
enumFrom :: MinimizeMethod -> [MinimizeMethod]
$cenumFrom :: MinimizeMethod -> [MinimizeMethod]
fromEnum :: MinimizeMethod -> Int
$cfromEnum :: MinimizeMethod -> Int
toEnum :: Int -> MinimizeMethod
$ctoEnum :: Int -> MinimizeMethod
pred :: MinimizeMethod -> MinimizeMethod
$cpred :: MinimizeMethod -> MinimizeMethod
succ :: MinimizeMethod -> MinimizeMethod
$csucc :: MinimizeMethod -> MinimizeMethod
Enum,MinimizeMethod -> MinimizeMethod -> Bool
(MinimizeMethod -> MinimizeMethod -> Bool)
-> (MinimizeMethod -> MinimizeMethod -> Bool) -> Eq MinimizeMethod
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MinimizeMethod -> MinimizeMethod -> Bool
$c/= :: MinimizeMethod -> MinimizeMethod -> Bool
== :: MinimizeMethod -> MinimizeMethod -> Bool
$c== :: MinimizeMethod -> MinimizeMethod -> Bool
Eq,Int -> MinimizeMethod -> ShowS
[MinimizeMethod] -> ShowS
MinimizeMethod -> String
(Int -> MinimizeMethod -> ShowS)
-> (MinimizeMethod -> String)
-> ([MinimizeMethod] -> ShowS)
-> Show MinimizeMethod
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MinimizeMethod] -> ShowS
$cshowList :: [MinimizeMethod] -> ShowS
show :: MinimizeMethod -> String
$cshow :: MinimizeMethod -> String
showsPrec :: Int -> MinimizeMethod -> ShowS
$cshowsPrec :: Int -> MinimizeMethod -> ShowS
Show,MinimizeMethod
MinimizeMethod -> MinimizeMethod -> Bounded MinimizeMethod
forall a. a -> a -> Bounded a
maxBound :: MinimizeMethod
$cmaxBound :: MinimizeMethod
minBound :: MinimizeMethod
$cminBound :: MinimizeMethod
Bounded)
minimize :: MinimizeMethod
-> Double
-> Int
-> [Double]
-> ([Double] -> Double)
-> [Double]
-> ([Double], Matrix Double)
minimizeV :: MinimizeMethod
-> Double
-> Int
-> Vector Double
-> (Vector Double -> Double)
-> Vector Double
-> (Vector Double, Matrix Double)
minimize :: MinimizeMethod
-> Double
-> Int
-> [Double]
-> ([Double] -> Double)
-> [Double]
-> ([Double], Matrix Double)
minimize MinimizeMethod
method Double
eps Int
maxit [Double]
sz [Double] -> Double
f [Double]
xi = (Vector Double, Matrix Double) -> ([Double], Matrix Double)
forall {a} {b}. Storable a => (Vector a, b) -> ([a], b)
v2l ((Vector Double, Matrix Double) -> ([Double], Matrix Double))
-> (Vector Double, Matrix Double) -> ([Double], Matrix Double)
forall a b. (a -> b) -> a -> b
$ MinimizeMethod
-> Double
-> Int
-> Vector Double
-> (Vector Double -> Double)
-> Vector Double
-> (Vector Double, Matrix Double)
minimizeV MinimizeMethod
method Double
eps Int
maxit ([Double] -> Vector Double
forall a. Storable a => [a] -> Vector a
fromList [Double]
sz) ([Double] -> Double
f([Double] -> Double)
-> (Vector Double -> [Double]) -> Vector Double -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Vector Double -> [Double]
forall a. Storable a => Vector a -> [a]
toList) ([Double] -> Vector Double
forall a. Storable a => [a] -> Vector a
fromList [Double]
xi)
where v2l :: (Vector a, b) -> ([a], b)
v2l (Vector a
v,b
m) = (Vector a -> [a]
forall a. Storable a => Vector a -> [a]
toList Vector a
v, b
m)
minimizeV :: MinimizeMethod
-> Double
-> Int
-> Vector Double
-> (Vector Double -> Double)
-> Vector Double
-> (Vector Double, Matrix Double)
minimizeV MinimizeMethod
method Double
eps Int
maxit Vector Double
szv Vector Double -> Double
f Vector Double
xiv = IO (Vector Double, Matrix Double) -> (Vector Double, Matrix Double)
forall a. IO a -> a
unsafePerformIO (IO (Vector Double, Matrix Double)
-> (Vector Double, Matrix Double))
-> IO (Vector Double, Matrix Double)
-> (Vector Double, Matrix Double)
forall a b. (a -> b) -> a -> b
$ do
let n :: IndexOf Vector
n = Vector Double -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
size Vector Double
xiv
FunPtr (CInt -> Ptr Double -> Double)
fp <- (CInt -> Ptr Double -> Double)
-> IO (FunPtr (CInt -> Ptr Double -> Double))
mkVecfun ((Vector Double -> Double) -> CInt -> Ptr Double -> Double
iv Vector Double -> Double
f)
Matrix Double
rawpath <- (Vector Double
-> (((CInt
-> Ptr Double -> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> IO (Matrix Double))
-> IO (Matrix Double))
-> Vector Double
-> (Vector Double
-> ((TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt)
-> IO (Matrix Double))
-> IO (Matrix Double))
-> Vector Double
-> (((CInt
-> Ptr Double -> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> (TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt)
-> IO (Matrix Double))
-> IO (Matrix Double)
forall {t1} {t2} {t3} {t4} {t5} {t6} {t7}.
(t1 -> (t2 -> t3) -> t4)
-> t1 -> (t5 -> (t6 -> t7) -> t3) -> t5 -> (t2 -> t6 -> t7) -> t4
ww2 Vector Double
-> (((CInt
-> Ptr Double -> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> IO (Matrix Double))
-> IO (Matrix Double)
forall {a} {t} {b}.
Storable a =>
Vector a -> (((CInt -> Ptr a -> t) -> t) -> IO b) -> IO b
vec Vector Double
xiv Vector Double
-> ((TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt)
-> IO (Matrix Double))
-> IO (Matrix Double)
forall {a} {t} {b}.
Storable a =>
Vector a -> (((CInt -> Ptr a -> t) -> t) -> IO b) -> IO b
vec Vector Double
szv ((((CInt
-> Ptr Double -> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> (TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt)
-> IO (Matrix Double))
-> IO (Matrix Double))
-> (((CInt
-> Ptr Double -> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> (TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt)
-> IO (Matrix Double))
-> IO (Matrix Double)
forall a b. (a -> b) -> a -> b
$ \(CInt -> Ptr Double -> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> TV (CInt -> CInt -> Ptr Double -> IO CInt)
xiv' TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt
szv' ->
Int
-> Int
-> (CInt -> CInt -> Ptr Double -> IO CInt)
-> String
-> IO (Matrix Double)
forall {a}.
Storable a =>
Int
-> Int
-> (CInt -> CInt -> Ptr a -> IO CInt)
-> String
-> IO (Matrix a)
createMIO Int
maxit (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
3)
(CInt
-> FunPtr (CInt -> Ptr Double -> Double)
-> Double
-> CInt
-> CInt
-> Ptr Double
-> TV (CInt -> CInt -> Ptr Double -> IO CInt)
c_minimize (Int -> CInt
fi (MinimizeMethod -> Int
forall a. Enum a => a -> Int
fromEnum MinimizeMethod
method)) FunPtr (CInt -> Ptr Double -> Double)
fp Double
eps (Int -> CInt
fi Int
maxit) (CInt -> Ptr Double -> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> ((CInt
-> Ptr Double -> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> TV (CInt -> CInt -> Ptr Double -> IO CInt)
forall x y. x -> (x -> y) -> y
// (CInt -> Ptr Double -> TV (CInt -> CInt -> Ptr Double -> IO CInt))
-> TV (CInt -> CInt -> Ptr Double -> IO CInt)
xiv' TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> (TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt
-> CInt
-> Ptr Double
-> IO CInt
forall x y. x -> (x -> y) -> y
// TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt
szv')
String
"minimize"
let it :: Int
it = Double -> Int
forall a b. (RealFrac a, Integral b) => a -> b
round (Matrix Double
rawpath Matrix Double -> IndexOf Matrix -> Double
forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (Int
maxitInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1,Int
0))
path :: Matrix Double
path = Int -> Matrix Double -> Matrix Double
forall t. Element t => Int -> Matrix t -> Matrix t
takeRows Int
it Matrix Double
rawpath
sol :: Vector Double
sol = Matrix Double -> Vector Double
forall t. Element t => Matrix t -> Vector t
flatten (Matrix Double -> Vector Double) -> Matrix Double -> Vector Double
forall a b. (a -> b) -> a -> b
$ Int -> Matrix Double -> Matrix Double
forall t. Element t => Int -> Matrix t -> Matrix t
dropColumns Int
3 (Matrix Double -> Matrix Double) -> Matrix Double -> Matrix Double
forall a b. (a -> b) -> a -> b
$ Int -> Matrix Double -> Matrix Double
forall t. Element t => Int -> Matrix t -> Matrix t
dropRows (Int
itInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) Matrix Double
path
FunPtr (CInt -> Ptr Double -> Double) -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr (CInt -> Ptr Double -> Double)
fp
(Vector Double, Matrix Double) -> IO (Vector Double, Matrix Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Vector Double
sol, Matrix Double
path)
foreign import ccall safe "gsl-aux.h minimize"
c_minimize:: CInt -> FunPtr (CInt -> Ptr Double -> Double) -> Double -> CInt -> TV(TV(TM Res))
data MinimizeMethodD = ConjugateFR
| ConjugatePR
| VectorBFGS
| VectorBFGS2
| SteepestDescent
deriving (Int -> MinimizeMethodD
MinimizeMethodD -> Int
MinimizeMethodD -> [MinimizeMethodD]
MinimizeMethodD -> MinimizeMethodD
MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD]
MinimizeMethodD
-> MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD]
(MinimizeMethodD -> MinimizeMethodD)
-> (MinimizeMethodD -> MinimizeMethodD)
-> (Int -> MinimizeMethodD)
-> (MinimizeMethodD -> Int)
-> (MinimizeMethodD -> [MinimizeMethodD])
-> (MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD])
-> (MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD])
-> (MinimizeMethodD
-> MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD])
-> Enum MinimizeMethodD
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: MinimizeMethodD
-> MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD]
$cenumFromThenTo :: MinimizeMethodD
-> MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD]
enumFromTo :: MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD]
$cenumFromTo :: MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD]
enumFromThen :: MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD]
$cenumFromThen :: MinimizeMethodD -> MinimizeMethodD -> [MinimizeMethodD]
enumFrom :: MinimizeMethodD -> [MinimizeMethodD]
$cenumFrom :: MinimizeMethodD -> [MinimizeMethodD]
fromEnum :: MinimizeMethodD -> Int
$cfromEnum :: MinimizeMethodD -> Int
toEnum :: Int -> MinimizeMethodD
$ctoEnum :: Int -> MinimizeMethodD
pred :: MinimizeMethodD -> MinimizeMethodD
$cpred :: MinimizeMethodD -> MinimizeMethodD
succ :: MinimizeMethodD -> MinimizeMethodD
$csucc :: MinimizeMethodD -> MinimizeMethodD
Enum,MinimizeMethodD -> MinimizeMethodD -> Bool
(MinimizeMethodD -> MinimizeMethodD -> Bool)
-> (MinimizeMethodD -> MinimizeMethodD -> Bool)
-> Eq MinimizeMethodD
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MinimizeMethodD -> MinimizeMethodD -> Bool
$c/= :: MinimizeMethodD -> MinimizeMethodD -> Bool
== :: MinimizeMethodD -> MinimizeMethodD -> Bool
$c== :: MinimizeMethodD -> MinimizeMethodD -> Bool
Eq,Int -> MinimizeMethodD -> ShowS
[MinimizeMethodD] -> ShowS
MinimizeMethodD -> String
(Int -> MinimizeMethodD -> ShowS)
-> (MinimizeMethodD -> String)
-> ([MinimizeMethodD] -> ShowS)
-> Show MinimizeMethodD
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MinimizeMethodD] -> ShowS
$cshowList :: [MinimizeMethodD] -> ShowS
show :: MinimizeMethodD -> String
$cshow :: MinimizeMethodD -> String
showsPrec :: Int -> MinimizeMethodD -> ShowS
$cshowsPrec :: Int -> MinimizeMethodD -> ShowS
Show,MinimizeMethodD
MinimizeMethodD -> MinimizeMethodD -> Bounded MinimizeMethodD
forall a. a -> a -> Bounded a
maxBound :: MinimizeMethodD
$cmaxBound :: MinimizeMethodD
minBound :: MinimizeMethodD
$cminBound :: MinimizeMethodD
Bounded)
minimizeD :: MinimizeMethodD
-> Double
-> Int
-> Double
-> Double
-> ([Double] -> Double)
-> ([Double] -> [Double])
-> [Double]
-> ([Double], Matrix Double)
minimizeVD :: MinimizeMethodD
-> Double
-> Int
-> Double
-> Double
-> (Vector Double -> Double)
-> (Vector Double -> Vector Double)
-> Vector Double
-> (Vector Double, Matrix Double)
minimizeD :: MinimizeMethodD
-> Double
-> Int
-> Double
-> Double
-> ([Double] -> Double)
-> ([Double] -> [Double])
-> [Double]
-> ([Double], Matrix Double)
minimizeD MinimizeMethodD
method Double
eps Int
maxit Double
istep Double
tol [Double] -> Double
f [Double] -> [Double]
df [Double]
xi = (Vector Double, Matrix Double) -> ([Double], Matrix Double)
forall {a} {b}. Storable a => (Vector a, b) -> ([a], b)
v2l ((Vector Double, Matrix Double) -> ([Double], Matrix Double))
-> (Vector Double, Matrix Double) -> ([Double], Matrix Double)
forall a b. (a -> b) -> a -> b
$ MinimizeMethodD
-> Double
-> Int
-> Double
-> Double
-> (Vector Double -> Double)
-> (Vector Double -> Vector Double)
-> Vector Double
-> (Vector Double, Matrix Double)
minimizeVD
MinimizeMethodD
method Double
eps Int
maxit Double
istep Double
tol ([Double] -> Double
f([Double] -> Double)
-> (Vector Double -> [Double]) -> Vector Double -> Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Vector Double -> [Double]
forall a. Storable a => Vector a -> [a]
toList) ([Double] -> Vector Double
forall a. Storable a => [a] -> Vector a
fromList([Double] -> Vector Double)
-> (Vector Double -> [Double]) -> Vector Double -> Vector Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
.[Double] -> [Double]
df([Double] -> [Double])
-> (Vector Double -> [Double]) -> Vector Double -> [Double]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Vector Double -> [Double]
forall a. Storable a => Vector a -> [a]
toList) ([Double] -> Vector Double
forall a. Storable a => [a] -> Vector a
fromList [Double]
xi)
where v2l :: (Vector a, b) -> ([a], b)
v2l (Vector a
v,b
m) = (Vector a -> [a]
forall a. Storable a => Vector a -> [a]
toList Vector a
v, b
m)
minimizeVD :: MinimizeMethodD
-> Double
-> Int
-> Double
-> Double
-> (Vector Double -> Double)
-> (Vector Double -> Vector Double)
-> Vector Double
-> (Vector Double, Matrix Double)
minimizeVD MinimizeMethodD
method Double
eps Int
maxit Double
istep Double
tol Vector Double -> Double
f Vector Double -> Vector Double
df Vector Double
xiv = IO (Vector Double, Matrix Double) -> (Vector Double, Matrix Double)
forall a. IO a -> a
unsafePerformIO (IO (Vector Double, Matrix Double)
-> (Vector Double, Matrix Double))
-> IO (Vector Double, Matrix Double)
-> (Vector Double, Matrix Double)
forall a b. (a -> b) -> a -> b
$ do
let n :: IndexOf Vector
n = Vector Double -> IndexOf Vector
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
size Vector Double
xiv
f' :: Vector Double -> Double
f' = Vector Double -> Double
f
df' :: Vector Double -> Vector Double
df' = (IndexOf Vector -> Vector Double -> Vector Double
forall {c :: * -> *} {t}.
(Eq (IndexOf c), Container c t, Show (IndexOf c)) =>
IndexOf c -> c t -> c t
checkdim1 Int
IndexOf Vector
n (Vector Double -> Vector Double)
-> (Vector Double -> Vector Double)
-> Vector Double
-> Vector Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector Double -> Vector Double
df)
FunPtr (CInt -> Ptr Double -> Double)
fp <- (CInt -> Ptr Double -> Double)
-> IO (FunPtr (CInt -> Ptr Double -> Double))
mkVecfun ((Vector Double -> Double) -> CInt -> Ptr Double -> Double
iv Vector Double -> Double
f')
FunPtr TVV
dfp <- TVV -> IO (FunPtr TVV)
mkVecVecfun ((Vector Double -> Vector Double) -> TVV
aux_vTov Vector Double -> Vector Double
df')
Matrix Double
rawpath <- Vector Double
-> ((TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt)
-> IO (Matrix Double))
-> IO (Matrix Double)
forall {a} {t} {b}.
Storable a =>
Vector a -> (((CInt -> Ptr a -> t) -> t) -> IO b) -> IO b
vec Vector Double
xiv (((TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt)
-> IO (Matrix Double))
-> IO (Matrix Double))
-> ((TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt)
-> IO (Matrix Double))
-> IO (Matrix Double)
forall a b. (a -> b) -> a -> b
$ \TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt
xiv' ->
Int
-> Int
-> (CInt -> CInt -> Ptr Double -> IO CInt)
-> String
-> IO (Matrix Double)
forall {a}.
Storable a =>
Int
-> Int
-> (CInt -> CInt -> Ptr a -> IO CInt)
-> String
-> IO (Matrix a)
createMIO Int
maxit (Int
nInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
2)
(CInt
-> FunPtr (CInt -> Ptr Double -> Double)
-> FunPtr TVV
-> Double
-> Double
-> Double
-> CInt
-> TV (CInt -> CInt -> Ptr Double -> IO CInt)
c_minimizeD (Int -> CInt
fi (MinimizeMethodD -> Int
forall a. Enum a => a -> Int
fromEnum MinimizeMethodD
method)) FunPtr (CInt -> Ptr Double -> Double)
fp FunPtr TVV
dfp Double
istep Double
tol Double
eps (Int -> CInt
fi Int
maxit) TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> (TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt
-> CInt
-> Ptr Double
-> IO CInt
forall x y. x -> (x -> y) -> y
// TV (CInt -> CInt -> Ptr Double -> IO CInt)
-> CInt -> CInt -> Ptr Double -> IO CInt
xiv')
String
"minimizeD"
let it :: Int
it = Double -> Int
forall a b. (RealFrac a, Integral b) => a -> b
round (Matrix Double
rawpath Matrix Double -> IndexOf Matrix -> Double
forall (c :: * -> *) e. Container c e => c e -> IndexOf c -> e
`atIndex` (Int
maxitInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1,Int
0))
path :: Matrix Double
path = Int -> Matrix Double -> Matrix Double
forall t. Element t => Int -> Matrix t -> Matrix t
takeRows Int
it Matrix Double
rawpath
sol :: Vector Double
sol = Matrix Double -> Vector Double
forall t. Element t => Matrix t -> Vector t
flatten (Matrix Double -> Vector Double) -> Matrix Double -> Vector Double
forall a b. (a -> b) -> a -> b
$ Int -> Matrix Double -> Matrix Double
forall t. Element t => Int -> Matrix t -> Matrix t
dropColumns Int
2 (Matrix Double -> Matrix Double) -> Matrix Double -> Matrix Double
forall a b. (a -> b) -> a -> b
$ Int -> Matrix Double -> Matrix Double
forall t. Element t => Int -> Matrix t -> Matrix t
dropRows (Int
itInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) Matrix Double
path
FunPtr (CInt -> Ptr Double -> Double) -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr (CInt -> Ptr Double -> Double)
fp
FunPtr TVV -> IO ()
forall a. FunPtr a -> IO ()
freeHaskellFunPtr FunPtr TVV
dfp
(Vector Double, Matrix Double) -> IO (Vector Double, Matrix Double)
forall (m :: * -> *) a. Monad m => a -> m a
return (Vector Double
sol,Matrix Double
path)
foreign import ccall safe "gsl-aux.h minimizeD"
c_minimizeD :: CInt
-> FunPtr (CInt -> Ptr Double -> Double)
-> FunPtr (TV (TV Res))
-> Double -> Double -> Double -> CInt
-> TV (TM Res)
checkdim1 :: IndexOf c -> c t -> c t
checkdim1 IndexOf c
n c t
v
| c t -> IndexOf c
forall (c :: * -> *) t. Container c t => c t -> IndexOf c
size c t
v IndexOf c -> IndexOf c -> Bool
forall a. Eq a => a -> a -> Bool
== IndexOf c
n = c t
v
| Bool
otherwise = String -> c t
forall a. HasCallStack => String -> a
error (String -> c t) -> String -> c t
forall a b. (a -> b) -> a -> b
$ String
"Error: "String -> ShowS
forall a. [a] -> [a] -> [a]
++ IndexOf c -> String
forall a. Show a => a -> String
show IndexOf c
n
String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
" components expected in the result of the gradient supplied to minimizeD"