HSvm-0.1.0.2.89: Data/SVM/Raw.hsc
{-# LANGUAGE ForeignFunctionInterface, GeneralizedNewtypeDeriving,
EmptyDataDecls #-}
#include "svm.h"
#include <stddef.h>
#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__)
module Data.SVM.Raw where
-- TODO limitare l'export
-- TODO verificare l'import
import Foreign.Storable (Storable(..), peekByteOff, pokeByteOff)
import Foreign.C.Types (CDouble, CInt)
import Foreign.C.String (CString)
import Foreign.Ptr(nullPtr, Ptr)
import Foreign.ForeignPtr (FinalizerPtr)
data CSvmNode = CSvmNode {
index:: CInt,
value:: CDouble
}
instance Storable CSvmNode where
sizeOf _ = #size struct svm_node
alignment _ = #alignment struct svm_node
peek ptr = do index <- (#peek struct svm_node, index) ptr
value <- (#peek struct svm_node, value) ptr
return $ CSvmNode index value
poke ptr (CSvmNode i v) = do (#poke struct svm_node, index) ptr i
(#poke struct svm_node, value) ptr v
data CSvmProblem = CSvmProblem {
l:: CInt,
y:: Ptr CDouble,
x:: Ptr (Ptr CSvmNode)
}
instance Storable CSvmProblem where
sizeOf _ = #size struct svm_problem
alignment _ = #alignment struct svm_problem
peek ptr = do l <- (#peek struct svm_problem, l) ptr
y <- (#peek struct svm_problem, y) ptr
x <- (#peek struct svm_problem, x) ptr
return $ CSvmProblem l y x
poke ptr (CSvmProblem l y x) = do (#poke struct svm_problem, l) ptr l
(#poke struct svm_problem, y) ptr y
(#poke struct svm_problem, x) ptr x
-- TODO esportare solo il tipo e non il costruttore?
newtype CSvmType = CSvmType {unCSvmType :: CInt}
deriving (Storable, Show)
#enum CSvmType, CSvmType, C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR
newtype CKernelType = CKernelType {unCKernelType :: CInt}
deriving (Storable, Show)
#enum CKernelType, CKernelType, LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED
data CSvmParameter = CSvmParameter {
svm_type :: CSvmType,
kernel_type :: CKernelType,
degree :: CInt,
gamma :: CDouble,
coef0 :: CDouble,
cache_size :: CDouble,
eps :: CDouble,
c :: CDouble,
nr_weight :: CInt,
weight_label :: Ptr CInt,
weight :: Ptr CDouble,
nu :: CDouble,
p :: CDouble,
shrinking :: CInt,
probability :: CInt
} deriving Show
defaultCParam = CSvmParameter cSvc rbf 3 0 0 100 1e-3 1
0 nullPtr nullPtr 0.5 0.1 1 0
instance Storable CSvmParameter where
sizeOf _ = #size struct svm_parameter
alignment _ = #alignment struct svm_parameter
peek ptr = do svm_type <- (#peek struct svm_parameter, svm_type) ptr
kernel_type <- (#peek struct svm_parameter, kernel_type) ptr
degree <- (#peek struct svm_parameter, degree) ptr
gamma <- (#peek struct svm_parameter, gamma) ptr
coef0 <- (#peek struct svm_parameter, coef0) ptr
cache_size <- (#peek struct svm_parameter, cache_size) ptr
eps <- (#peek struct svm_parameter, eps) ptr
c <- (#peek struct svm_parameter, C) ptr
nr_weight <- (#peek struct svm_parameter, nr_weight) ptr
weight_label <- (#peek struct svm_parameter, weight_label) ptr
weight <- (#peek struct svm_parameter, weight) ptr
nu <- (#peek struct svm_parameter, nu) ptr
p <- (#peek struct svm_parameter, p) ptr
shrinking <- (#peek struct svm_parameter, degree) ptr
probability <- (#peek struct svm_parameter, probability) ptr
return $ CSvmParameter svm_type kernel_type degree
gamma coef0 cache_size eps c nr_weight
weight_label weight nu p shrinking probability
poke ptr (CSvmParameter svm_type kernel_type degree
gamma coef0 cache_size eps c nr_weight
weight_label weight nu p shrinking probability) =
do (#poke struct svm_parameter, svm_type) ptr svm_type
(#poke struct svm_parameter, kernel_type) ptr kernel_type
(#poke struct svm_parameter, degree) ptr degree
(#poke struct svm_parameter, gamma) ptr gamma
(#poke struct svm_parameter, coef0) ptr coef0
(#poke struct svm_parameter, cache_size) ptr cache_size
(#poke struct svm_parameter, eps) ptr eps
(#poke struct svm_parameter, C) ptr c
(#poke struct svm_parameter, nr_weight) ptr nr_weight
(#poke struct svm_parameter, weight_label) ptr weight_label
(#poke struct svm_parameter, weight) ptr weight
(#poke struct svm_parameter, nu) ptr nu
(#poke struct svm_parameter, p) ptr p
(#poke struct svm_parameter, shrinking) ptr shrinking
(#poke struct svm_parameter, probability) ptr probability
data CSvmModel
-- TODO cambiare il return type da
foreign import ccall unsafe "svm.h svm_train" c_svm_train :: Ptr CSvmProblem -> Ptr CSvmParameter -> IO (Ptr CSvmModel)
foreign import ccall unsafe "svm.h svm_cross_validation" c_svm_cross_validation:: Ptr CSvmProblem -> Ptr CSvmParameter -> CInt -> Ptr CDouble -> IO ()
foreign import ccall unsafe "svm.h svm_predict" c_svm_predict :: Ptr CSvmModel -> Ptr CSvmNode -> CDouble
foreign import ccall unsafe "svm.h svm_save_model" c_svm_save_model :: CString -> Ptr CSvmModel -> IO CInt
foreign import ccall unsafe "svm.h svm_load_model" c_svm_load_model :: CString -> IO (Ptr CSvmModel)
foreign import ccall unsafe "svm.h svm_check_parameter" c_svm_check_parameter :: Ptr CSvmProblem -> Ptr CSvmParameter -> CString
foreign import ccall unsafe "svm.h &svm_destroy_model" c_svm_destroy_model :: FinalizerPtr CSvmModel
foreign import ccall unsafe "svm.h clone_model_support_vectors" c_clone_model_support_vectors :: Ptr CSvmModel -> IO ()