From 6827aa04b1c21b08875c58d38de5d90195aefb46 Mon Sep 17 00:00:00 2001 From: Alberto Ruiz Date: Tue, 26 May 2015 20:17:07 +0200 Subject: general sortVector, sortIndex --- packages/base/src/Data/Packed/Internal/Matrix.hs | 40 ++++++++++++++++++++++-- packages/base/src/Data/Packed/Numeric.hs | 12 +++++-- packages/base/src/Numeric/Vectorized.hs | 21 ++++++------- 3 files changed, 57 insertions(+), 16 deletions(-) diff --git a/packages/base/src/Data/Packed/Internal/Matrix.hs b/packages/base/src/Data/Packed/Internal/Matrix.hs index 76d2204..1679ea6 100644 --- a/packages/base/src/Data/Packed/Internal/Matrix.hs +++ b/packages/base/src/Data/Packed/Internal/Matrix.hs @@ -265,33 +265,44 @@ class (Storable a) => Element a where transdata = transdataP -- transdata' constantD :: a -> Int -> Vector a constantD = constantP -- constant' - extractR :: Matrix a -> CInt -> Idxs -> CInt -> Idxs -> Matrix a + extractR :: Matrix a -> CInt -> Vector CInt -> CInt -> Vector CInt -> Matrix a + sortI :: Ord a => Vector a -> Vector CInt + sortV :: Ord a => Vector a -> Vector a instance Element Float where transdata = transdataAux ctransF constantD = constantAux cconstantF extractR = extractAux c_extractF + sortI = sortIdxF + sortV = sortValF instance Element Double where transdata = transdataAux ctransR constantD = constantAux cconstantR extractR = extractAux c_extractD + sortI = sortIdxD + sortV = sortValD instance Element (Complex Float) where transdata = transdataAux ctransQ constantD = constantAux cconstantQ extractR = extractAux c_extractQ + sortI = undefined + sortV = undefined instance Element (Complex Double) where transdata = transdataAux ctransC constantD = constantAux cconstantC extractR = extractAux c_extractC + sortI = undefined + sortV = undefined instance Element (CInt) where transdata = transdataAux ctransI constantD = constantAux cconstantI extractR = extractAux c_extractI - + sortI = sortIdxI + sortV = sortValI ------------------------------------------------------------------- @@ -466,3 +477,28 @@ foreign import ccall unsafe "extractQ" c_extractQ foreign import ccall unsafe "extractI" c_extractI :: CInt -> CInt -> CInt -> CIdxs (CIdxs (CM CInt (CM CInt (IO CInt)))) +-------------------------------------------------------------------------------- + +sortG f v = unsafePerformIO $ do + r <- createVector (dim v) + app2 f vec v vec r "sortG" + return r + +sortIdxD = sortG c_sort_indexD +sortIdxF = sortG c_sort_indexF +sortIdxI = sortG c_sort_indexI + +sortValD = sortG c_sort_valD +sortValF = sortG c_sort_valF +sortValI = sortG c_sort_valI + +foreign import ccall unsafe "sort_indexD" c_sort_indexD :: CV Double (CV CInt (IO CInt)) +foreign import ccall unsafe "sort_indexF" c_sort_indexF :: CV Float (CV CInt (IO CInt)) +foreign import ccall unsafe "sort_indexI" c_sort_indexI :: CV CInt (CV CInt (IO CInt)) + +foreign import ccall unsafe "sort_valuesD" c_sort_valD :: CV Double (CV Double (IO CInt)) +foreign import ccall unsafe "sort_valuesF" c_sort_valF :: CV Float (CV Float (IO CInt)) +foreign import ccall unsafe "sort_valuesI" c_sort_valI :: CV CInt (CV CInt (IO CInt)) + +-------------------------------------------------------------------------------- + diff --git a/packages/base/src/Data/Packed/Numeric.hs b/packages/base/src/Data/Packed/Numeric.hs index 2821eae..cb449a9 100644 --- a/packages/base/src/Data/Packed/Numeric.hs +++ b/packages/base/src/Data/Packed/Numeric.hs @@ -52,7 +52,7 @@ module Data.Packed.Numeric ( uniformSample, meanCov, -- * sorting - sortVector, + sortVector, sortIndex, -- * Element conversion Convert(..), Complexable(), @@ -299,6 +299,14 @@ instance Numeric Double instance Numeric (Complex Double) instance Numeric Float instance Numeric (Complex Float) -instance Numeric CInt +instance Numeric I + +-------------------------------------------------------------------------------- + +sortVector :: (Ord t, Element t) => Vector t -> Vector t +sortVector = sortV + +sortIndex :: (Ord t, Element t) => Vector t -> Vector I +sortIndex = sortI diff --git a/packages/base/src/Numeric/Vectorized.hs b/packages/base/src/Numeric/Vectorized.hs index d0ff562..589cb49 100644 --- a/packages/base/src/Numeric/Vectorized.hs +++ b/packages/base/src/Numeric/Vectorized.hs @@ -19,8 +19,10 @@ module Numeric.Vectorized ( FunCodeVV(..), vectorZipR, vectorZipC, vectorZipF, vectorZipQ, vectorZipI, vectorScan, saveMatrix, Seed, RandDist(..), randomVector, - sortVector, roundVector, - range + roundVector, + range, +-- compareD, compareF, compareI, +-- chooseD, chooseF, chooseI ) where import Data.Packed.Internal.Common @@ -374,15 +376,6 @@ foreign import ccall unsafe "random_vector" c_random_vector :: CInt -> CInt -> T -------------------------------------------------------------------------------- -sortVector v = unsafePerformIO $ do - r <- createVector (dim v) - app2 c_sort_values vec v vec r "sortVector" - return r - -foreign import ccall unsafe "sort_values" c_sort_values :: TVV - --------------------------------------------------------------------------------- - roundVector v = unsafePerformIO $ do r <- createVector (dim v) app2 c_round_vector vec v vec r "roundVector" @@ -392,7 +385,11 @@ foreign import ccall unsafe "round_vector" c_round_vector :: TVV -------------------------------------------------------------------------------- -range :: Int -> Idxs +-- | +-- >>> range 5 +-- fromList [0,1,2,3,4] +-- +range :: Int -> Vector I range n = unsafePerformIO $ do r <- createVector n app1 c_range_vector vec r "range" -- cgit v1.2.3