Как отсортировать массив массива по внутреннему измерению? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть Array r Ix2 a такой, что (Manifest r Ix2 a, Ord a).Я хотел бы отсортировать этот массив по его внутреннему измерению, то есть отсортировать каждую строку внутри, но не по строкам.Согласно this , в массиве вообще не реализована сортировка.Должен ли я бросить свой собственный или я могу повторно использовать то, что уже существует для Vector с (например, vector-algorithms)?

1 Ответ

0 голосов
/ 03 декабря 2018

Конечно, было бы лучше развернуть собственную сортировку и отправить PR в библиотеку massiv;) Но есть способ вернуться к пакету vector-algorithms.Мне было любопытно, как я могу сделать это эффективно, и вот оно, наряду с автоматическим распараллеливанием сортировки каждой строки:

{-# LANGUAGE FlexibleContexts    #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies        #-}
module Examples.SortRows where

import           Data.Massiv.Array                 as A
import           Data.Massiv.Array.Manifest.Vector as A
import           Data.Massiv.Core.Scheduler
import           Data.Typeable
import           Data.Vector.Algorithms.Merge
import           Data.Vector.Generic               as VG
import           Data.Vector.Generic.Mutable       as VGM
import           System.IO.Unsafe

sortRows ::
     forall r e v.
     (Ord e, Typeable v, A.Mutable r Ix2 e, VG.Vector v e, ARepr v ~ r, VRepr r ~ v)
  => Array r Ix2 e
  -> Array r Ix2 e
sortRows arr = unsafePerformIO $ do
  mv :: VG.Mutable v RealWorld e <- VG.thaw (A.toVector arr :: v e)
  let comp = getComp arr
      sz@(m :. n) = size arr
  case comp of
    Seq -> do
      loopM_ 0 (< m) (+ 1) $ \i -> sort $ VGM.slice (toLinearIndex sz (i :. 0)) n mv
    ParOn wIds ->
      withScheduler_ wIds $ \scheduler -> do
        loopM_ 0 (< m) (+ 1) $ \i ->
          scheduleWork scheduler $ sort $ VGM.slice (toLinearIndex sz (i :. 0)) n mv
  v :: v e <- VG.unsafeFreeze mv
  return $ A.fromVector comp sz v

Я добавил это к примерам в массиве в этом коммите вместе с простым тестом свойств.

...