svm-simple 0.2.1 → 0.2.2
raw patch · 4 files changed
+129/−36 lines, 4 files
Files
- AI/SVM/Base.hs +81/−17
- AI/SVM/Common.hs +25/−0
- AI/SVM/Simple.hs +15/−18
- svm-simple.cabal +8/−1
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