module Data.SVM.Raw where
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 _ = (12)
alignment _ = 4
peek ptr = do index <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
value <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ptr
return $ CSvmNode index value
poke ptr (CSvmNode i v) = do ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr i
((\hsc_ptr -> pokeByteOff hsc_ptr 4)) ptr v
data CSvmProblem = CSvmProblem {
l:: CInt,
y:: Ptr CDouble,
x:: Ptr (Ptr CSvmNode)
}
instance Storable CSvmProblem where
sizeOf _ = (12)
alignment _ = 4
peek ptr = do l <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
y <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ptr
x <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
return $ CSvmProblem l y x
poke ptr (CSvmProblem l y x) = do ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr l
((\hsc_ptr -> pokeByteOff hsc_ptr 4)) ptr y
((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr x
newtype CSvmType = CSvmType {unCSvmType :: CInt}
deriving (Storable, Show)
cSvc :: CSvmType
cSvc = CSvmType 0
nuSvc :: CSvmType
nuSvc = CSvmType 1
oneClass :: CSvmType
oneClass = CSvmType 2
epsilonSvr :: CSvmType
epsilonSvr = CSvmType 3
nuSvr :: CSvmType
nuSvr = CSvmType 4
newtype CKernelType = CKernelType {unCKernelType :: CInt}
deriving (Storable, Show)
linear :: CKernelType
linear = CKernelType 0
poly :: CKernelType
poly = CKernelType 1
rbf :: CKernelType
rbf = CKernelType 2
sigmoid :: CKernelType
sigmoid = CKernelType 3
precomputed :: CKernelType
precomputed = CKernelType 4
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 _ = (88)
alignment _ = 4
peek ptr = do svm_type <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
kernel_type <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ptr
degree <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
gamma <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) ptr
coef0 <- ((\hsc_ptr -> peekByteOff hsc_ptr 20)) ptr
cache_size <- ((\hsc_ptr -> peekByteOff hsc_ptr 28)) ptr
eps <- ((\hsc_ptr -> peekByteOff hsc_ptr 36)) ptr
c <- ((\hsc_ptr -> peekByteOff hsc_ptr 44)) ptr
nr_weight <- ((\hsc_ptr -> peekByteOff hsc_ptr 52)) ptr
weight_label <- ((\hsc_ptr -> peekByteOff hsc_ptr 56)) ptr
weight <- ((\hsc_ptr -> peekByteOff hsc_ptr 60)) ptr
nu <- ((\hsc_ptr -> peekByteOff hsc_ptr 64)) ptr
p <- ((\hsc_ptr -> peekByteOff hsc_ptr 72)) ptr
shrinking <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
probability <- ((\hsc_ptr -> peekByteOff hsc_ptr 84)) 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 ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr svm_type
((\hsc_ptr -> pokeByteOff hsc_ptr 4)) ptr kernel_type
((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr degree
((\hsc_ptr -> pokeByteOff hsc_ptr 12)) ptr gamma
((\hsc_ptr -> pokeByteOff hsc_ptr 20)) ptr coef0
((\hsc_ptr -> pokeByteOff hsc_ptr 28)) ptr cache_size
((\hsc_ptr -> pokeByteOff hsc_ptr 36)) ptr eps
((\hsc_ptr -> pokeByteOff hsc_ptr 44)) ptr c
((\hsc_ptr -> pokeByteOff hsc_ptr 52)) ptr nr_weight
((\hsc_ptr -> pokeByteOff hsc_ptr 56)) ptr weight_label
((\hsc_ptr -> pokeByteOff hsc_ptr 60)) ptr weight
((\hsc_ptr -> pokeByteOff hsc_ptr 64)) ptr nu
((\hsc_ptr -> pokeByteOff hsc_ptr 72)) ptr p
((\hsc_ptr -> pokeByteOff hsc_ptr 80)) ptr shrinking
((\hsc_ptr -> pokeByteOff hsc_ptr 84)) ptr probability
data CSvmModel
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 ()