{-# LINE 1 "Data/SVM/Raw.hsc" #-}
{-|This is a module with raw bindings to libsvm
-}

{-# LANGUAGE ForeignFunctionInterface, GeneralizedNewtypeDeriving, 
             EmptyDataDecls #-}





{-# LINE 13 "Data/SVM/Raw.hsc" #-}

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, FunPtr)
import Foreign.ForeignPtr (FinalizerPtr)

data CSvmNode = CSvmNode {
    index:: CInt,
    value:: CDouble
}

instance Storable CSvmNode where
    sizeOf _ = (16)
{-# LINE 29 "Data/SVM/Raw.hsc" #-}
    alignment _ = 8
{-# LINE 30 "Data/SVM/Raw.hsc" #-}
    peek ptr = do idx <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 31 "Data/SVM/Raw.hsc" #-}
                  val <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 32 "Data/SVM/Raw.hsc" #-}
                  return $ CSvmNode idx val
    poke ptr (CSvmNode i v) = do ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr i
{-# LINE 34 "Data/SVM/Raw.hsc" #-}
                                 ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr v
{-# LINE 35 "Data/SVM/Raw.hsc" #-}

data CSvmProblem = CSvmProblem {
    l:: CInt,
    y:: Ptr CDouble,
    x:: Ptr (Ptr CSvmNode)
}

instance Storable CSvmProblem where
    sizeOf _ = (24)
{-# LINE 44 "Data/SVM/Raw.hsc" #-}
    alignment _ = 8
{-# LINE 45 "Data/SVM/Raw.hsc" #-}
    peek ptr = do lp <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 46 "Data/SVM/Raw.hsc" #-}
                  yp <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 47 "Data/SVM/Raw.hsc" #-}
                  xp <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr
{-# LINE 48 "Data/SVM/Raw.hsc" #-}
                  return $ CSvmProblem lp yp xp
    poke ptr (CSvmProblem lp yp xp) = do ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr lp
{-# LINE 50 "Data/SVM/Raw.hsc" #-}
                                         ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr yp
{-# LINE 51 "Data/SVM/Raw.hsc" #-}
                                         ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) ptr xp
{-# LINE 52 "Data/SVM/Raw.hsc" #-}


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

{-# LINE 57 "Data/SVM/Raw.hsc" #-}

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

{-# LINE 61 "Data/SVM/Raw.hsc" #-}

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
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 _ = (104)
{-# LINE 86 "Data/SVM/Raw.hsc" #-}
    alignment _ = 8
{-# LINE 87 "Data/SVM/Raw.hsc" #-}
    peek ptr = do svm_type_p     <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 88 "Data/SVM/Raw.hsc" #-}
                  kernel_type_p  <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ptr
{-# LINE 89 "Data/SVM/Raw.hsc" #-}
                  degree_p       <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 90 "Data/SVM/Raw.hsc" #-}
                  gamma_p        <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr
{-# LINE 91 "Data/SVM/Raw.hsc" #-}
                  coef0_p        <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) ptr
{-# LINE 92 "Data/SVM/Raw.hsc" #-}
                  cache_size_p   <- ((\hsc_ptr -> peekByteOff hsc_ptr 32)) ptr
{-# LINE 93 "Data/SVM/Raw.hsc" #-}
                  eps_p          <- ((\hsc_ptr -> peekByteOff hsc_ptr 40)) ptr
{-# LINE 94 "Data/SVM/Raw.hsc" #-}
                  c_p            <- ((\hsc_ptr -> peekByteOff hsc_ptr 48)) ptr
{-# LINE 95 "Data/SVM/Raw.hsc" #-}
                  nr_weight_p    <- ((\hsc_ptr -> peekByteOff hsc_ptr 56)) ptr
{-# LINE 96 "Data/SVM/Raw.hsc" #-}
                  weight_label_p <- ((\hsc_ptr -> peekByteOff hsc_ptr 64)) ptr
{-# LINE 97 "Data/SVM/Raw.hsc" #-}
                  weight_p       <- ((\hsc_ptr -> peekByteOff hsc_ptr 72)) ptr
{-# LINE 98 "Data/SVM/Raw.hsc" #-}
                  nu_p           <- ((\hsc_ptr -> peekByteOff hsc_ptr 80)) ptr
{-# LINE 99 "Data/SVM/Raw.hsc" #-}
                  p_p            <- ((\hsc_ptr -> peekByteOff hsc_ptr 88)) ptr
{-# LINE 100 "Data/SVM/Raw.hsc" #-}
                  shrinking_p    <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 101 "Data/SVM/Raw.hsc" #-}
                  probability_p  <- ((\hsc_ptr -> peekByteOff hsc_ptr 100)) ptr
{-# LINE 102 "Data/SVM/Raw.hsc" #-}
                  return $ CSvmParameter svm_type_p kernel_type_p degree_p
                                gamma_p coef0_p cache_size_p eps_p c_p nr_weight_p
                                weight_label_p weight_p nu_p p_p shrinking_p probability_p
    poke ptr (CSvmParameter svm_type_p kernel_type_p degree_p
                           gamma_p coef0_p cache_size_p eps_p c_p nr_weight_p
                           weight_label_p weight_p nu_p p_p shrinking_p probability_p) =
           do ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr svm_type_p
{-# LINE 109 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) ptr kernel_type_p
{-# LINE 110 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr degree_p
{-# LINE 111 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) ptr gamma_p
{-# LINE 112 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 24)) ptr coef0_p
{-# LINE 113 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 32)) ptr cache_size_p
{-# LINE 114 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 40)) ptr eps_p
{-# LINE 115 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 48)) ptr c_p
{-# LINE 116 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 56)) ptr nr_weight_p
{-# LINE 117 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 64)) ptr weight_label_p
{-# LINE 118 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 72)) ptr weight_p
{-# LINE 119 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 80)) ptr nu_p
{-# LINE 120 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 88)) ptr p_p
{-# LINE 121 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 96)) ptr shrinking_p
{-# LINE 122 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 100)) ptr probability_p
{-# LINE 123 "Data/SVM/Raw.hsc" #-}

-- |Managed type for struct svm_model.
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 -> IO 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 CInt

type CSvmPrintFn = CString -> IO ()

foreign import ccall unsafe "svm.h svm_set_print_string_function" c_svm_set_print_string_function :: FunPtr CSvmPrintFn -> IO ()
foreign import ccall unsafe "wrapper" createSvmPrintFnPtr :: CSvmPrintFn -> IO (FunPtr CSvmPrintFn)