{-# 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 7 "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 _ = (12)
{-# LINE 26 "Data/SVM/Raw.hsc" #-}
    alignment _ = 4
{-# LINE 27 "Data/SVM/Raw.hsc" #-}
    peek ptr = do index <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 28 "Data/SVM/Raw.hsc" #-}
                  value <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ptr
{-# LINE 29 "Data/SVM/Raw.hsc" #-}
                  return $ CSvmNode index value
    poke ptr (CSvmNode i v) = do ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr i
{-# LINE 31 "Data/SVM/Raw.hsc" #-}
                                 ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) ptr v
{-# LINE 32 "Data/SVM/Raw.hsc" #-}

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

instance Storable CSvmProblem where
    sizeOf _ = (12)
{-# LINE 41 "Data/SVM/Raw.hsc" #-}
    alignment _ = 4
{-# LINE 42 "Data/SVM/Raw.hsc" #-}
    peek ptr = do l <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 43 "Data/SVM/Raw.hsc" #-}
                  y <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ptr
{-# LINE 44 "Data/SVM/Raw.hsc" #-}
                  x <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 45 "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 47 "Data/SVM/Raw.hsc" #-}
                                      ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) ptr y
{-# LINE 48 "Data/SVM/Raw.hsc" #-}
                                      ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr x
{-# LINE 49 "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 55 "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 59 "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 _ = (88)
{-# LINE 83 "Data/SVM/Raw.hsc" #-}
    alignment _ = 4
{-# LINE 84 "Data/SVM/Raw.hsc" #-}
    peek ptr = do svm_type     <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
{-# LINE 85 "Data/SVM/Raw.hsc" #-}
                  kernel_type  <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) ptr
{-# LINE 86 "Data/SVM/Raw.hsc" #-}
                  degree       <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 87 "Data/SVM/Raw.hsc" #-}
                  gamma        <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) ptr
{-# LINE 88 "Data/SVM/Raw.hsc" #-}
                  coef0        <- ((\hsc_ptr -> peekByteOff hsc_ptr 20)) ptr
{-# LINE 89 "Data/SVM/Raw.hsc" #-}
                  cache_size   <- ((\hsc_ptr -> peekByteOff hsc_ptr 28)) ptr
{-# LINE 90 "Data/SVM/Raw.hsc" #-}
                  eps          <- ((\hsc_ptr -> peekByteOff hsc_ptr 36)) ptr
{-# LINE 91 "Data/SVM/Raw.hsc" #-}
                  c            <- ((\hsc_ptr -> peekByteOff hsc_ptr 44)) ptr
{-# LINE 92 "Data/SVM/Raw.hsc" #-}
                  nr_weight    <- ((\hsc_ptr -> peekByteOff hsc_ptr 52)) ptr
{-# LINE 93 "Data/SVM/Raw.hsc" #-}
                  weight_label <- ((\hsc_ptr -> peekByteOff hsc_ptr 56)) ptr
{-# LINE 94 "Data/SVM/Raw.hsc" #-}
                  weight       <- ((\hsc_ptr -> peekByteOff hsc_ptr 60)) ptr
{-# LINE 95 "Data/SVM/Raw.hsc" #-}
                  nu           <- ((\hsc_ptr -> peekByteOff hsc_ptr 64)) ptr
{-# LINE 96 "Data/SVM/Raw.hsc" #-}
                  p            <- ((\hsc_ptr -> peekByteOff hsc_ptr 72)) ptr
{-# LINE 97 "Data/SVM/Raw.hsc" #-}
                  shrinking    <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
{-# LINE 98 "Data/SVM/Raw.hsc" #-}
                  probability  <- ((\hsc_ptr -> peekByteOff hsc_ptr 84)) ptr
{-# LINE 99 "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 106 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) ptr kernel_type
{-# LINE 107 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr degree
{-# LINE 108 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 12)) ptr gamma
{-# LINE 109 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 20)) ptr coef0
{-# LINE 110 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 28)) ptr cache_size
{-# LINE 111 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 36)) ptr eps
{-# LINE 112 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 44)) ptr c
{-# LINE 113 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 52)) ptr nr_weight
{-# LINE 114 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 56)) ptr weight_label
{-# LINE 115 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 60)) ptr weight
{-# LINE 116 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 64)) ptr nu
{-# LINE 117 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 72)) ptr p
{-# LINE 118 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 80)) ptr shrinking
{-# LINE 119 "Data/SVM/Raw.hsc" #-}
              ((\hsc_ptr -> pokeByteOff hsc_ptr 84)) ptr probability
{-# LINE 120 "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 ()