{-# LINE 1 "src/Bindings/SVM.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LINE 2 "src/Bindings/SVM.hsc" #-}

-------------------------------------------------------------------------------
-- |
-- Module     : Bindings.SVM
-- Copyright  : (c) 2009-2011 Paulo Tanimoto, Ville Tirronen
-- License    : BSD3
--
-- Maintainer : Paulo Tanimoto <ptanimoto@gmail.com>
--              Ville Tirronen <aleator@gmail.com>
--
-------------------------------------------------------------------------------
-- For a high-level description of the C API, refer to the README file 
-- included in the libsvm archive, available for download at 
-- <http://www.csie.ntu.edu.tw/~cjlin/libsvm/>.



{-# LINE 19 "src/Bindings/SVM.hsc" #-}

{-# LINE 20 "src/Bindings/SVM.hsc" #-}

module Bindings.SVM where
import Foreign.Ptr (Ptr,FunPtr,plusPtr)
import Foreign.Ptr (wordPtrToPtr,castPtrToFunPtr)
import Foreign.Storable
import Foreign.C.Types
import Foreign.C.String (CString,CStringLen,CWString,CWStringLen)
import Foreign.Marshal.Alloc (alloca)
import Foreign.Marshal.Array (peekArray,pokeArray)
import Data.Int
import Data.Word

{-# LINE 23 "src/Bindings/SVM.hsc" #-}

-- libsvm_version
foreign import ccall "&libsvm_version" p'libsvm_version
  :: Ptr (CInt)

{-# LINE 26 "src/Bindings/SVM.hsc" #-}

-- svm_node

{-# LINE 29 "src/Bindings/SVM.hsc" #-}

{-# LINE 30 "src/Bindings/SVM.hsc" #-}

{-# LINE 31 "src/Bindings/SVM.hsc" #-}
data C'svm_node = C'svm_node{
  c'svm_node'index :: CInt,
  c'svm_node'value :: CDouble
} deriving (Eq,Show)
p'svm_node'index p = plusPtr p 0
p'svm_node'index :: Ptr (C'svm_node) -> Ptr (CInt)
p'svm_node'value p = plusPtr p 4
p'svm_node'value :: Ptr (C'svm_node) -> Ptr (CDouble)
instance Storable C'svm_node where
  sizeOf _ = 12
  alignment = sizeOf
  peek p = do
    v0 <- peekByteOff p 0
    v1 <- peekByteOff p 4
    return $ C'svm_node v0 v1
  poke p (C'svm_node v0 v1) = do
    pokeByteOff p 0 v0
    pokeByteOff p 4 v1
    return ()

{-# LINE 32 "src/Bindings/SVM.hsc" #-}

-- svm_problem

{-# LINE 35 "src/Bindings/SVM.hsc" #-}

{-# LINE 36 "src/Bindings/SVM.hsc" #-}

{-# LINE 37 "src/Bindings/SVM.hsc" #-}

{-# LINE 38 "src/Bindings/SVM.hsc" #-}
data C'svm_problem = C'svm_problem{
  c'svm_problem'l :: CInt,
  c'svm_problem'y :: Ptr CDouble,
  c'svm_problem'x :: Ptr (Ptr C'svm_node)
} deriving (Eq,Show)
p'svm_problem'l p = plusPtr p 0
p'svm_problem'l :: Ptr (C'svm_problem) -> Ptr (CInt)
p'svm_problem'y p = plusPtr p 4
p'svm_problem'y :: Ptr (C'svm_problem) -> Ptr (Ptr CDouble)
p'svm_problem'x p = plusPtr p 8
p'svm_problem'x :: Ptr (C'svm_problem) -> Ptr (Ptr (Ptr C'svm_node))
instance Storable C'svm_problem where
  sizeOf _ = 12
  alignment = sizeOf
  peek p = do
    v0 <- peekByteOff p 0
    v1 <- peekByteOff p 4
    v2 <- peekByteOff p 8
    return $ C'svm_problem v0 v1 v2
  poke p (C'svm_problem v0 v1 v2) = do
    pokeByteOff p 0 v0
    pokeByteOff p 4 v1
    pokeByteOff p 8 v2
    return ()

{-# LINE 39 "src/Bindings/SVM.hsc" #-}

-- svm_type
c'C_SVC = 0
c'C_SVC :: (Num a) => a

{-# LINE 42 "src/Bindings/SVM.hsc" #-}
c'NU_SVC = 1
c'NU_SVC :: (Num a) => a

{-# LINE 43 "src/Bindings/SVM.hsc" #-}
c'ONE_CLASS = 2
c'ONE_CLASS :: (Num a) => a

{-# LINE 44 "src/Bindings/SVM.hsc" #-}
c'EPSILON_SVR = 3
c'EPSILON_SVR :: (Num a) => a

{-# LINE 45 "src/Bindings/SVM.hsc" #-}
c'NU_SVR = 4
c'NU_SVR :: (Num a) => a

{-# LINE 46 "src/Bindings/SVM.hsc" #-}

-- kernel_type
c'LINEAR = 0
c'LINEAR :: (Num a) => a

{-# LINE 49 "src/Bindings/SVM.hsc" #-}
c'POLY = 1
c'POLY :: (Num a) => a

{-# LINE 50 "src/Bindings/SVM.hsc" #-}
c'RBF = 2
c'RBF :: (Num a) => a

{-# LINE 51 "src/Bindings/SVM.hsc" #-}
c'SIGMOID = 3
c'SIGMOID :: (Num a) => a

{-# LINE 52 "src/Bindings/SVM.hsc" #-}
c'PRECOMPUTED = 4
c'PRECOMPUTED :: (Num a) => a

{-# LINE 53 "src/Bindings/SVM.hsc" #-}

-- svm_parameter

{-# LINE 56 "src/Bindings/SVM.hsc" #-}

{-# LINE 57 "src/Bindings/SVM.hsc" #-}

{-# LINE 58 "src/Bindings/SVM.hsc" #-}

{-# LINE 59 "src/Bindings/SVM.hsc" #-}

{-# LINE 60 "src/Bindings/SVM.hsc" #-}

{-# LINE 61 "src/Bindings/SVM.hsc" #-}


{-# LINE 63 "src/Bindings/SVM.hsc" #-}

{-# LINE 64 "src/Bindings/SVM.hsc" #-}

{-# LINE 65 "src/Bindings/SVM.hsc" #-}


{-# LINE 67 "src/Bindings/SVM.hsc" #-}

{-# LINE 68 "src/Bindings/SVM.hsc" #-}

{-# LINE 69 "src/Bindings/SVM.hsc" #-}

{-# LINE 70 "src/Bindings/SVM.hsc" #-}


{-# LINE 72 "src/Bindings/SVM.hsc" #-}

{-# LINE 73 "src/Bindings/SVM.hsc" #-}

{-# LINE 74 "src/Bindings/SVM.hsc" #-}
data C'svm_parameter = C'svm_parameter{
  c'svm_parameter'svm_type :: CInt,
  c'svm_parameter'kernel_type :: CInt,
  c'svm_parameter'degree :: CInt,
  c'svm_parameter'gamma :: CDouble,
  c'svm_parameter'coef0 :: CDouble,
  c'svm_parameter'cache_size :: CDouble,
  c'svm_parameter'eps :: CDouble,
  c'svm_parameter'C :: CDouble,
  c'svm_parameter'nr_weight :: CInt,
  c'svm_parameter'weight_label :: Ptr CInt,
  c'svm_parameter'weight :: Ptr CDouble,
  c'svm_parameter'nu :: CDouble,
  c'svm_parameter'p :: CDouble,
  c'svm_parameter'shrinking :: CInt,
  c'svm_parameter'probability :: CInt
} deriving (Eq,Show)
p'svm_parameter'svm_type p = plusPtr p 0
p'svm_parameter'svm_type :: Ptr (C'svm_parameter) -> Ptr (CInt)
p'svm_parameter'kernel_type p = plusPtr p 4
p'svm_parameter'kernel_type :: Ptr (C'svm_parameter) -> Ptr (CInt)
p'svm_parameter'degree p = plusPtr p 8
p'svm_parameter'degree :: Ptr (C'svm_parameter) -> Ptr (CInt)
p'svm_parameter'gamma p = plusPtr p 12
p'svm_parameter'gamma :: Ptr (C'svm_parameter) -> Ptr (CDouble)
p'svm_parameter'coef0 p = plusPtr p 20
p'svm_parameter'coef0 :: Ptr (C'svm_parameter) -> Ptr (CDouble)
p'svm_parameter'cache_size p = plusPtr p 28
p'svm_parameter'cache_size :: Ptr (C'svm_parameter) -> Ptr (CDouble)
p'svm_parameter'eps p = plusPtr p 36
p'svm_parameter'eps :: Ptr (C'svm_parameter) -> Ptr (CDouble)
p'svm_parameter'C p = plusPtr p 44
p'svm_parameter'C :: Ptr (C'svm_parameter) -> Ptr (CDouble)
p'svm_parameter'nr_weight p = plusPtr p 52
p'svm_parameter'nr_weight :: Ptr (C'svm_parameter) -> Ptr (CInt)
p'svm_parameter'weight_label p = plusPtr p 56
p'svm_parameter'weight_label :: Ptr (C'svm_parameter) -> Ptr (Ptr CInt)
p'svm_parameter'weight p = plusPtr p 60
p'svm_parameter'weight :: Ptr (C'svm_parameter) -> Ptr (Ptr CDouble)
p'svm_parameter'nu p = plusPtr p 64
p'svm_parameter'nu :: Ptr (C'svm_parameter) -> Ptr (CDouble)
p'svm_parameter'p p = plusPtr p 72
p'svm_parameter'p :: Ptr (C'svm_parameter) -> Ptr (CDouble)
p'svm_parameter'shrinking p = plusPtr p 80
p'svm_parameter'shrinking :: Ptr (C'svm_parameter) -> Ptr (CInt)
p'svm_parameter'probability p = plusPtr p 84
p'svm_parameter'probability :: Ptr (C'svm_parameter) -> Ptr (CInt)
instance Storable C'svm_parameter where
  sizeOf _ = 88
  alignment = sizeOf
  peek p = do
    v0 <- peekByteOff p 0
    v1 <- peekByteOff p 4
    v2 <- peekByteOff p 8
    v3 <- peekByteOff p 12
    v4 <- peekByteOff p 20
    v5 <- peekByteOff p 28
    v6 <- peekByteOff p 36
    v7 <- peekByteOff p 44
    v8 <- peekByteOff p 52
    v9 <- peekByteOff p 56
    v10 <- peekByteOff p 60
    v11 <- peekByteOff p 64
    v12 <- peekByteOff p 72
    v13 <- peekByteOff p 80
    v14 <- peekByteOff p 84
    return $ C'svm_parameter v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14
  poke p (C'svm_parameter v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14) = do
    pokeByteOff p 0 v0
    pokeByteOff p 4 v1
    pokeByteOff p 8 v2
    pokeByteOff p 12 v3
    pokeByteOff p 20 v4
    pokeByteOff p 28 v5
    pokeByteOff p 36 v6
    pokeByteOff p 44 v7
    pokeByteOff p 52 v8
    pokeByteOff p 56 v9
    pokeByteOff p 60 v10
    pokeByteOff p 64 v11
    pokeByteOff p 72 v12
    pokeByteOff p 80 v13
    pokeByteOff p 84 v14
    return ()

{-# LINE 75 "src/Bindings/SVM.hsc" #-}

-- svm_model

{-# LINE 78 "src/Bindings/SVM.hsc" #-}
-- parameter

{-# LINE 80 "src/Bindings/SVM.hsc" #-}
-- number of classes, = 2 in regression/one class svm #

{-# LINE 82 "src/Bindings/SVM.hsc" #-}
-- total #SV

{-# LINE 84 "src/Bindings/SVM.hsc" #-}
-- SVs (SV[l]) 

{-# LINE 86 "src/Bindings/SVM.hsc" #-}
-- coefficients for SVs in decision functions (sv_coef[k-1][l])

{-# LINE 88 "src/Bindings/SVM.hsc" #-}
-- constants in decision functions (rho[k*(k-1)/2]) 

{-# LINE 90 "src/Bindings/SVM.hsc" #-}
-- pariwise probability information 

{-# LINE 92 "src/Bindings/SVM.hsc" #-}

{-# LINE 93 "src/Bindings/SVM.hsc" #-}
 
-- for classification only 

-- label of each class (label[k]) 

{-# LINE 98 "src/Bindings/SVM.hsc" #-}
--  number of SVs for each class (nSV[k]) 
--  nSV[0] + nSV[1] + ... + nSV[k-1] = l 

{-# LINE 101 "src/Bindings/SVM.hsc" #-}
-- if svm_model is created by svm_load_model
-- 0 if svm_model is created by svm_train

{-# LINE 104 "src/Bindings/SVM.hsc" #-}
data C'svm_model = C'svm_model{
  c'svm_model'param :: C'svm_parameter,
  c'svm_model'nr_class :: CInt,
  c'svm_model'l :: CInt,
  c'svm_model'SV :: Ptr (Ptr C'svm_node),
  c'svm_model'sv_coef :: Ptr (Ptr CDouble),
  c'svm_model'rho :: Ptr CDouble,
  c'svm_model'probA :: Ptr CDouble,
  c'svm_model'probB :: Ptr CDouble,
  c'svm_model'label :: Ptr CInt,
  c'svm_model'nSV :: Ptr CInt,
  c'svm_model'free_sv :: CInt
} deriving (Eq,Show)
p'svm_model'param p = plusPtr p 0
p'svm_model'param :: Ptr (C'svm_model) -> Ptr (C'svm_parameter)
p'svm_model'nr_class p = plusPtr p 88
p'svm_model'nr_class :: Ptr (C'svm_model) -> Ptr (CInt)
p'svm_model'l p = plusPtr p 92
p'svm_model'l :: Ptr (C'svm_model) -> Ptr (CInt)
p'svm_model'SV p = plusPtr p 96
p'svm_model'SV :: Ptr (C'svm_model) -> Ptr (Ptr (Ptr C'svm_node))
p'svm_model'sv_coef p = plusPtr p 100
p'svm_model'sv_coef :: Ptr (C'svm_model) -> Ptr (Ptr (Ptr CDouble))
p'svm_model'rho p = plusPtr p 104
p'svm_model'rho :: Ptr (C'svm_model) -> Ptr (Ptr CDouble)
p'svm_model'probA p = plusPtr p 108
p'svm_model'probA :: Ptr (C'svm_model) -> Ptr (Ptr CDouble)
p'svm_model'probB p = plusPtr p 112
p'svm_model'probB :: Ptr (C'svm_model) -> Ptr (Ptr CDouble)
p'svm_model'label p = plusPtr p 116
p'svm_model'label :: Ptr (C'svm_model) -> Ptr (Ptr CInt)
p'svm_model'nSV p = plusPtr p 120
p'svm_model'nSV :: Ptr (C'svm_model) -> Ptr (Ptr CInt)
p'svm_model'free_sv p = plusPtr p 124
p'svm_model'free_sv :: Ptr (C'svm_model) -> Ptr (CInt)
instance Storable C'svm_model where
  sizeOf _ = 128
  alignment = sizeOf
  peek p = do
    v0 <- peekByteOff p 0
    v1 <- peekByteOff p 88
    v2 <- peekByteOff p 92
    v3 <- peekByteOff p 96
    v4 <- peekByteOff p 100
    v5 <- peekByteOff p 104
    v6 <- peekByteOff p 108
    v7 <- peekByteOff p 112
    v8 <- peekByteOff p 116
    v9 <- peekByteOff p 120
    v10 <- peekByteOff p 124
    return $ C'svm_model v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10
  poke p (C'svm_model v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10) = do
    pokeByteOff p 0 v0
    pokeByteOff p 88 v1
    pokeByteOff p 92 v2
    pokeByteOff p 96 v3
    pokeByteOff p 100 v4
    pokeByteOff p 104 v5
    pokeByteOff p 108 v6
    pokeByteOff p 112 v7
    pokeByteOff p 116 v8
    pokeByteOff p 120 v9
    pokeByteOff p 124 v10
    return ()

{-# LINE 105 "src/Bindings/SVM.hsc" #-}

-- training
foreign import ccall "svm_train" c'svm_train
  :: Ptr C'svm_problem -> Ptr C'svm_parameter -> IO (Ptr C'svm_model)
foreign import ccall "&svm_train" p'svm_train
  :: FunPtr (Ptr C'svm_problem -> Ptr C'svm_parameter -> IO (Ptr C'svm_model))

{-# LINE 108 "src/Bindings/SVM.hsc" #-}

-- cross validation
foreign import ccall "svm_cross_validation" c'svm_cross_validation
  :: Ptr C'svm_problem -> Ptr C'svm_parameter -> CInt -> Ptr CDouble -> IO ()
foreign import ccall "&svm_cross_validation" p'svm_cross_validation
  :: FunPtr (Ptr C'svm_problem -> Ptr C'svm_parameter -> CInt -> Ptr CDouble -> IO ())

{-# LINE 111 "src/Bindings/SVM.hsc" #-}

-- saving models
foreign import ccall "svm_save_model" c'svm_save_model
  :: CString -> Ptr C'svm_model -> IO ()
foreign import ccall "&svm_save_model" p'svm_save_model
  :: FunPtr (CString -> Ptr C'svm_model -> IO ())

{-# LINE 114 "src/Bindings/SVM.hsc" #-}

-- loading models
foreign import ccall "svm_load_model" c'svm_load_model
  :: CString -> IO (Ptr C'svm_model)
foreign import ccall "&svm_load_model" p'svm_load_model
  :: FunPtr (CString -> IO (Ptr C'svm_model))

{-# LINE 117 "src/Bindings/SVM.hsc" #-}

-- getting properties
foreign import ccall "svm_get_svm_type" c'svm_get_svm_type
  :: Ptr C'svm_model -> IO CInt
foreign import ccall "&svm_get_svm_type" p'svm_get_svm_type
  :: FunPtr (Ptr C'svm_model -> IO CInt)

{-# LINE 120 "src/Bindings/SVM.hsc" #-}
foreign import ccall "svm_get_nr_class" c'svm_get_nr_class
  :: Ptr C'svm_model -> IO CInt
foreign import ccall "&svm_get_nr_class" p'svm_get_nr_class
  :: FunPtr (Ptr C'svm_model -> IO CInt)

{-# LINE 121 "src/Bindings/SVM.hsc" #-}
foreign import ccall "svm_get_labels" c'svm_get_labels
  :: Ptr C'svm_model -> Ptr CInt -> IO ()
foreign import ccall "&svm_get_labels" p'svm_get_labels
  :: FunPtr (Ptr C'svm_model -> Ptr CInt -> IO ())

{-# LINE 122 "src/Bindings/SVM.hsc" #-}
foreign import ccall "svm_get_svr_probability" c'svm_get_svr_probability
  :: Ptr C'svm_model -> IO CDouble
foreign import ccall "&svm_get_svr_probability" p'svm_get_svr_probability
  :: FunPtr (Ptr C'svm_model -> IO CDouble)

{-# LINE 123 "src/Bindings/SVM.hsc" #-}

-- predictions
foreign import ccall "svm_predict_values" c'svm_predict_values
  :: Ptr C'svm_model -> Ptr C'svm_node -> Ptr CDouble -> IO ()
foreign import ccall "&svm_predict_values" p'svm_predict_values
  :: FunPtr (Ptr C'svm_model -> Ptr C'svm_node -> Ptr CDouble -> IO ())

{-# LINE 126 "src/Bindings/SVM.hsc" #-}
foreign import ccall "svm_predict" c'svm_predict
  :: Ptr C'svm_model -> Ptr C'svm_node -> IO CDouble
foreign import ccall "&svm_predict" p'svm_predict
  :: FunPtr (Ptr C'svm_model -> Ptr C'svm_node -> IO CDouble)

{-# LINE 127 "src/Bindings/SVM.hsc" #-}
foreign import ccall "svm_predict_probability" c'svm_predict_probability
  :: Ptr C'svm_model -> Ptr C'svm_node -> Ptr CDouble -> IO CDouble
foreign import ccall "&svm_predict_probability" p'svm_predict_probability
  :: FunPtr (Ptr C'svm_model -> Ptr C'svm_node -> Ptr CDouble -> IO CDouble)

{-# LINE 128 "src/Bindings/SVM.hsc" #-}

-- destroying
foreign import ccall "svm_free_model_content" c'svm_free_model_content
  :: Ptr C'svm_model -> IO ()
foreign import ccall "&svm_free_model_content" p'svm_free_model_content
  :: FunPtr (Ptr C'svm_model -> IO ())

{-# LINE 131 "src/Bindings/SVM.hsc" #-}
foreign import ccall "svm_free_and_destroy_model" c'svm_free_and_destroy_model
  :: Ptr (Ptr C'svm_model) -> IO ()
foreign import ccall "&svm_free_and_destroy_model" p'svm_free_and_destroy_model
  :: FunPtr (Ptr (Ptr C'svm_model) -> IO ())

{-# LINE 132 "src/Bindings/SVM.hsc" #-}
foreign import ccall "svm_destroy_param" c'svm_destroy_param
  :: Ptr C'svm_parameter -> IO ()
foreign import ccall "&svm_destroy_param" p'svm_destroy_param
  :: FunPtr (Ptr C'svm_parameter -> IO ())

{-# LINE 133 "src/Bindings/SVM.hsc" #-}

-- checking
foreign import ccall "svm_check_parameter" c'svm_check_parameter
  :: Ptr C'svm_problem -> Ptr C'svm_parameter -> IO CString
foreign import ccall "&svm_check_parameter" p'svm_check_parameter
  :: FunPtr (Ptr C'svm_problem -> Ptr C'svm_parameter -> IO CString)

{-# LINE 136 "src/Bindings/SVM.hsc" #-}
foreign import ccall "svm_check_probability_model" c'svm_check_probability_model
  :: Ptr C'svm_model -> IO CInt
foreign import ccall "&svm_check_probability_model" p'svm_check_probability_model
  :: FunPtr (Ptr C'svm_model -> IO CInt)

{-# LINE 137 "src/Bindings/SVM.hsc" #-}

-- printing
foreign import ccall "svm_set_print_string_function" c'svm_set_print_string_function
  :: FunPtr (CString -> IO ()) -> IO ()
foreign import ccall "&svm_set_print_string_function" p'svm_set_print_string_function
  :: FunPtr (FunPtr (CString -> IO ()) -> IO ())

{-# LINE 140 "src/Bindings/SVM.hsc" #-}