{-# 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
data C'svm_node = C'svm_node{
{-# LINE 29 "src/Bindings/SVM.hsc" #-}

  c'svm_node'index :: CInt
{-# LINE 30 "src/Bindings/SVM.hsc" #-}
,
  c'svm_node'value :: CDouble
{-# LINE 31 "src/Bindings/SVM.hsc" #-}

 } deriving (Eq,Show)
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
data C'svm_problem = C'svm_problem{
{-# LINE 35 "src/Bindings/SVM.hsc" #-}

  c'svm_problem'l :: CInt
{-# LINE 36 "src/Bindings/SVM.hsc" #-}
,
  c'svm_problem'y :: Ptr CDouble
{-# LINE 37 "src/Bindings/SVM.hsc" #-}
,
  c'svm_problem'x :: Ptr (Ptr C'svm_node)
{-# LINE 38 "src/Bindings/SVM.hsc" #-}

 } deriving (Eq,Show)
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
data C'svm_parameter = C'svm_parameter{
{-# LINE 56 "src/Bindings/SVM.hsc" #-}

  c'svm_parameter'svm_type :: CInt
{-# LINE 57 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'kernel_type :: CInt
{-# LINE 58 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'degree :: CInt
{-# LINE 59 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'gamma :: CDouble
{-# LINE 60 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'coef0 :: CDouble
{-# LINE 61 "src/Bindings/SVM.hsc" #-}

,
  c'svm_parameter'cache_size :: CDouble
{-# LINE 63 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'eps :: CDouble
{-# LINE 64 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'C :: CDouble
{-# LINE 65 "src/Bindings/SVM.hsc" #-}

,
  c'svm_parameter'nr_weight :: CInt
{-# LINE 67 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'weight_label :: Ptr CInt
{-# LINE 68 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'weight :: Ptr CDouble
{-# LINE 69 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'nu :: CDouble
{-# LINE 70 "src/Bindings/SVM.hsc" #-}

,
  c'svm_parameter'p :: CDouble
{-# LINE 72 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'shrinking :: CInt
{-# LINE 73 "src/Bindings/SVM.hsc" #-}
,
  c'svm_parameter'probability :: CInt
{-# LINE 74 "src/Bindings/SVM.hsc" #-}

 } deriving (Eq,Show)
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
data C'svm_model = C'svm_model

{-# LINE 78 "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 81 "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 84 "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 87 "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 90 "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 93 "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 94 "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 95 "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 96 "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 99 "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 100 "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 101 "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 104 "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 105 "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 106 "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 109 "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 110 "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 113 "src/Bindings/SVM.hsc" #-}