packages feed

svm-simple 0.2.1 → 0.2.2

raw patch · 4 files changed

+129/−36 lines, 4 files

Files

AI/SVM/Base.hs view
@@ -33,31 +33,34 @@                  ,predict                  )  where -import qualified Data.Vector.Storable as V-import qualified Data.Vector as GV-import Data.Vector.Storable ((!)) import Bindings.SVM-import Foreign.C.Types+import Control.Applicative+import Control.Arrow (first, second, (***), (&&&))+import Control.Exception +import Control.Monad+import Data.Binary+import Data.IORef+import Data.List+import Data.Map (Map)+import Data.Tuple+import Data.Vector.Storable ((!)) import Foreign.C.String-import Foreign.Ptr+import Foreign.C.Types import Foreign.ForeignPtr-import qualified Foreign.Concurrent as C-import Foreign.Marshal.Utils-import Foreign.Marshal.Array import Foreign.Marshal.Alloc-import Control.Applicative-import System.IO.Unsafe+import Foreign.Marshal.Array+import Foreign.Marshal.Utils+import Foreign.Ptr import Foreign.Storable-import Control.Monad-import Control.Arrow (first, second, (***), (&&&)) import System.Directory-import Data.IORef-import Control.Exception  import System.IO.Error-import Data.Tuple-import Data.Map (Map)+import System.IO.Unsafe+import qualified Data.ByteString.Lazy as B import qualified Data.Map as Map-import Data.List+import qualified Data.Vector as GV+import qualified Data.Vector.Storable as V+import qualified Foreign.Concurrent as C+import AI.SVM.Common  class SVMVector a where     convert :: a -> V.Vector Double@@ -85,6 +88,7 @@   + {-# SPECIALIZE convertDense :: V.Vector Double -> V.Vector C'svm_node #-} {-# SPECIALIZE convertDense :: V.Vector Float -> V.Vector C'svm_node #-} convertDense :: (V.Storable a, Real a) => V.Vector a -> V.Vector C'svm_node@@ -121,6 +125,20 @@  getModelPtr (SVM fp) = fp +-- | Somewhat unsafe binary instance. This goes through the disk.+instance Binary SVM where+    put s = put $ idiotToStr s+    get   = get >>= return . idiotFromStr++idiotToStr svm = unsafePerformIO $ withTmp $ \tmp -> do+                    saveSVM tmp svm+                    B.readFile tmp+idiotFromStr svm = unsafePerformIO $ withTmp $ \tmp -> do+                    B.writeFile tmp svm+                    loadSVM tmp+                ++ modelFinalizer :: Ptr C'svm_model -> IO () modelFinalizer modelPtr = with modelPtr c'svm_free_and_destroy_model @@ -176,6 +194,52 @@     , c'svm_parameter'shrinking = 1     , c'svm_parameter'probability = 0     }++instance Binary CInt where+    put cint = put (fromIntegral cint :: Int)+    get = fromIntegral <$> (get :: Get Int) ++instance Binary CDouble where+    put cint = put (realToFrac cint :: Double)+    get = realToFrac <$> (get :: Get Double) ++encodeParams C'svm_parameter{..} = do+    put c'svm_parameter'svm_type +    put c'svm_parameter'kernel_type +    put c'svm_parameter'degree +    put c'svm_parameter'gamma  +    put c'svm_parameter'coef0  +    put c'svm_parameter'cache_size +    put c'svm_parameter'eps +    put c'svm_parameter'C   +    put c'svm_parameter'nr_weight +    --put c'svm_parameter'weight_label = nullPtr+    --put c'svm_parameter'weight       = nullPtr+    put c'svm_parameter'nu +    put c'svm_parameter'p  +    put c'svm_parameter'shrinking+    put c'svm_parameter'probability ++decodeParams b = do     +    c'svm_parameter'svm_type <- get+    c'svm_parameter'kernel_type <- get+    c'svm_parameter'degree      <- get   +    c'svm_parameter'gamma       <- get +    c'svm_parameter'coef0       <- get+    c'svm_parameter'cache_size  <- get +    c'svm_parameter'eps         <- get+    c'svm_parameter'C           <- get+    c'svm_parameter'nr_weight   <- get+    c'svm_parameter'nu          <- get+    c'svm_parameter'p           <- get+    c'svm_parameter'shrinking   <- get+    c'svm_parameter'probability <- get+    let c'svm_parameter'weight_label = nullPtr+        c'svm_parameter'weight = nullPtr+    return C'svm_parameter{..}++                   +       -- | SVM variants data SVMType = 
+ AI/SVM/Common.hs view
@@ -0,0 +1,25 @@+module AI.SVM.Common where++import Data.Char+import System.Random.MWC+import Control.Applicative+import Control.Monad+import System.Directory+import Control.Exception++-- * Utilities+randomName = withSystemRandom $ \gen -> map chr <$> replicateM 16 (uniformR (97,122::Int) gen)+                                          :: IO String ++-- | Get a name for a temporary file, run operation with the filename and erase the file if the +--   operation creates it.+withTmp op = do+        fp <- getTemporaryDirectory+        out <- randomName+        bracket (return ())+                (\() -> do+                         e <- doesFileExist out +                         when e (removeFile out))+                (\() -> op (fp++"/"++out))+        +
AI/SVM/Simple.hs view
@@ -36,6 +36,8 @@ module AI.SVM.Simple ( 		 -- * Basic types                   RegressorType(..), ClassifierType(..)+                 ,Kernel(..)+                 ,SVMOneClass(), SVMClassifier(), SVMRegressor() 		 -- * Classifier machines                  ,trainClassifier, classify    		 -- * One class machines@@ -49,18 +51,16 @@ import AI.SVM.Base import Control.Applicative import Control.Arrow (second, (***), (&&&))-import Control.Exception import Control.Monad import Data.Binary-import Data.Char import Data.List import Data.Map (Map) import Data.Tuple import System.Directory import System.IO.Unsafe-import System.Random.MWC import qualified Data.ByteString.Lazy as B import qualified Data.Map as Map+import AI.SVM.Common   -- | Supported SVM classifiers@@ -77,6 +77,18 @@ newtype SVMRegressor  = SVMRegressor SVM  newtype SVMOneClass   = SVMOneClass SVM  +instance (Ord a, Binary a) => Binary (SVMClassifier a) where+    put (SVMClassifier svm a b) = put svm >> put a >> put b+    get = SVMClassifier <$> get <*> get <*> get ++instance Binary SVMRegressor where+    put (SVMRegressor r) = put r+    get = SVMRegressor <$> get++instance Binary SVMOneClass where+    put (SVMOneClass r) = put r+    get = SVMOneClass <$> get+ generalizeClassifier C{..} = C_SVC{cost_=cost} generalizeClassifier NU{..} = NU_SVC{cost_=cost, nu_=nu} @@ -107,21 +119,6 @@ instance Persisting SVMOneClass where     save fp (SVMOneClass a) = saveSVM fp a     load fp = SVMOneClass <$> loadSVM fp------ * Utilities-randomName = withSystemRandom $ \gen -> map chr <$> replicateM 16 (uniformR (97,122::Int) gen)-                                          :: IO String ---- | Get a name for a temporary file, run operation with the filename and erase the file if the ---   operation creates it.-withTmp op = do-        fp <- getTemporaryDirectory-        out <- randomName-        bracket (return ())-                (\() -> do-                         e <- doesFileExist out -                         when e (removeFile out))-                (\() -> op (fp++"/"++out))  -- | Train an SVM classifier of given type.  trainClassifier
svm-simple.cabal view
@@ -1,5 +1,5 @@ name:                svm-simple-version:             0.2.1+version:             0.2.2 synopsis:            Medium level, simplified, bindings to libsvm description:   This is a set of simplified bindings to libsvm <http://www.csie.ntu.edu.tw/~cjlin/libsvm/> suite@@ -7,6 +7,11 @@   and support vector regression.    .   .+  Changes in version 0.2.2+  .+  * Rather ugly binary instances+  * Exporting SVM types+  .   Changes in version 0.2.1   .   * Added operations for saving and loading SVMs to the 'Simple'-interface.@@ -37,6 +42,8 @@     Examples/PlotOneClass.hs  library+  other-modules:+    AI.SVM.Common   Exposed-modules:     AI.SVM.Simple     AI.SVM.Base