{-# LINE 1 "Data/SVM/Raw.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface, GeneralizedNewtypeDeriving,
{-# LINE 2 "Data/SVM/Raw.hsc" #-}
             EmptyDataDecls #-}


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

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


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

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 _ = (16)
{-# LINE 29 "Data/SVM/Raw.hsc" #-}
    alignment _ = (8)
{-# LINE 30 "Data/SVM/Raw.hsc" #-}
    peek ptr = do index <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 31 "Data/SVM/Raw.hsc" #-}
                  value <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 32 "Data/SVM/Raw.hsc" #-}
                  return $ CSvmNode index value
    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 l <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 46 "Data/SVM/Raw.hsc" #-}
                  y <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 47 "Data/SVM/Raw.hsc" #-}
                  x <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr
{-# LINE 48 "Data/SVM/Raw.hsc" #-}
                  return $ CSvmProblem l y x
    poke ptr (CSvmProblem l y x) = do ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr l
{-# LINE 50 "Data/SVM/Raw.hsc" #-}
                                      ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr y
{-# LINE 51 "Data/SVM/Raw.hsc" #-}
                                      ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) ptr x
{-# LINE 52 "Data/SVM/Raw.hsc" #-}


-- TODO esportare solo il tipo e non il costruttore?
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 58 "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 62 "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 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     <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 88 "Data/SVM/Raw.hsc" #-}
                  kernel_type  <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ptr
{-# LINE 89 "Data/SVM/Raw.hsc" #-}
                  degree       <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 90 "Data/SVM/Raw.hsc" #-}
                  gamma        <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) ptr
{-# LINE 91 "Data/SVM/Raw.hsc" #-}
                  coef0        <- ((\hsc_ptr -> peekByteOff hsc_ptr 24)) ptr
{-# LINE 92 "Data/SVM/Raw.hsc" #-}
                  cache_size   <- ((\hsc_ptr -> peekByteOff hsc_ptr 32)) ptr
{-# LINE 93 "Data/SVM/Raw.hsc" #-}
                  eps          <- ((\hsc_ptr -> peekByteOff hsc_ptr 40)) ptr
{-# LINE 94 "Data/SVM/Raw.hsc" #-}
                  c            <- ((\hsc_ptr -> peekByteOff hsc_ptr 48)) ptr
{-# LINE 95 "Data/SVM/Raw.hsc" #-}
                  nr_weight    <- ((\hsc_ptr -> peekByteOff hsc_ptr 56)) ptr
{-# LINE 96 "Data/SVM/Raw.hsc" #-}
                  weight_label <- ((\hsc_ptr -> peekByteOff hsc_ptr 64)) ptr
{-# LINE 97 "Data/SVM/Raw.hsc" #-}
                  weight       <- ((\hsc_ptr -> peekByteOff hsc_ptr 72)) ptr
{-# LINE 98 "Data/SVM/Raw.hsc" #-}
                  nu           <- ((\hsc_ptr -> peekByteOff hsc_ptr 80)) ptr
{-# LINE 99 "Data/SVM/Raw.hsc" #-}
                  p            <- ((\hsc_ptr -> peekByteOff hsc_ptr 88)) ptr
{-# LINE 100 "Data/SVM/Raw.hsc" #-}
                  shrinking    <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 101 "Data/SVM/Raw.hsc" #-}
                  probability  <- ((\hsc_ptr -> peekByteOff hsc_ptr 100)) ptr
{-# LINE 102 "Data/SVM/Raw.hsc" #-}
                  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
{-# LINE 109 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) ptr kernel_type
{-# LINE 110 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr degree
{-# LINE 111 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 16)) ptr gamma
{-# LINE 112 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 24)) ptr coef0
{-# LINE 113 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 32)) ptr cache_size
{-# LINE 114 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 40)) ptr eps
{-# LINE 115 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 48)) ptr c
{-# LINE 116 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 56)) ptr nr_weight
{-# LINE 117 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 64)) ptr weight_label
{-# LINE 118 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 72)) ptr weight
{-# LINE 119 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 80)) ptr nu
{-# LINE 120 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 88)) ptr p
{-# LINE 121 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 96)) ptr shrinking
{-# LINE 122 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 100)) ptr probability
{-# LINE 123 "Data/SVM/Raw.hsc" #-}

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 ()