Guest User

Untitled

a guest
Oct 17th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.06 KB | None | 0 0
  1. test = gather (segmentedIndices info) vec
  2.  
  3. segs :: Segments Int
  4. segs = fromList (Z:.4) [1,7,0,2]
  5.  
  6. starts :: Vector Int
  7. starts = fromList (Z:.4) [0,10,5,5]
  8.  
  9. info :: Acc (Vector (Int,Int))
  10. info = A.zip (use starts) (use segs)
  11.  
  12. vec :: Acc (Vector Float)
  13. vec = use $ fromList (Z:.20) [0..]
  14.  
  15. --
  16.  
  17. segmentedIndices
  18. :: Acc (Vector (Int,Int))
  19. -> Acc (Vector Int)
  20. segmentedIndices info
  21. = A.map A.snd
  22. $ A.scanl1 (segmented (+)) (A.zip idx ones)
  23. where
  24. idx = mkHeadIndices info
  25. ones = fill (shape idx) 1
  26.  
  27. mkHeadIndices
  28. :: Acc (Vector (Int,Int))
  29. -> Acc (Vector Int)
  30. mkHeadIndices info
  31. = A.init
  32. $ A.permute const zeros (\ix -> seg!ix A.== 0 ? ( ignore, index1 (offset ! ix) )) start
  33. where
  34. (start, seg) = A.unzip info
  35. (offset, len) = unlift (scanl' (+) 0 seg)
  36. zeros = fill (index1 $ the len + 1) 0
  37.  
  38. segmented
  39. :: (Exp Int -> Exp Int -> Exp Int)
  40. -> Exp (Int, Int)
  41. -> Exp (Int, Int)
  42. -> Exp (Int, Int)
  43. segmented f a b =
  44. let (aF, aV) = unlift a
  45. (bF, bV) = unlift b
  46. in
  47. lift ( aF A..|. bF
  48. , bF A./= 0 ? (bF, f aV bV))
Add Comment
Please, Sign In to add comment