{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
-- |
-- Module      : Data.Massiv.Array.Delayed.Interleaved
-- Copyright   : (c) Alexey Kuleshevich 2018-2021
-- License     : BSD3
-- Maintainer  : Alexey Kuleshevich <lehins@yandex.ru>
-- Stability   : experimental
-- Portability : non-portable
--
module Data.Massiv.Array.Delayed.Interleaved
  ( DI(..)
  , toInterleaved
  , fromInterleaved
  ) where

import Data.Massiv.Array.Delayed.Pull
import Data.Massiv.Core.Common
import Data.Massiv.Core.List (L, showArrayList, showsArrayPrec)


-- | Delayed array that will be loaded in an interleaved fashion during parallel
-- computation.
data DI = DI

newtype instance Array DI ix e = DIArray
  { Array DI ix e -> Array D ix e
diArray :: Array D ix e
  } deriving (Array DI ix e -> Array DI ix e -> Bool
(Array DI ix e -> Array DI ix e -> Bool)
-> (Array DI ix e -> Array DI ix e -> Bool) -> Eq (Array DI ix e)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall ix e.
(Index ix, Eq e) =>
Array DI ix e -> Array DI ix e -> Bool
/= :: Array DI ix e -> Array DI ix e -> Bool
$c/= :: forall ix e.
(Index ix, Eq e) =>
Array DI ix e -> Array DI ix e -> Bool
== :: Array DI ix e -> Array DI ix e -> Bool
$c== :: forall ix e.
(Index ix, Eq e) =>
Array DI ix e -> Array DI ix e -> Bool
Eq, Eq (Array DI ix e)
Eq (Array DI ix e)
-> (Array DI ix e -> Array DI ix e -> Ordering)
-> (Array DI ix e -> Array DI ix e -> Bool)
-> (Array DI ix e -> Array DI ix e -> Bool)
-> (Array DI ix e -> Array DI ix e -> Bool)
-> (Array DI ix e -> Array DI ix e -> Bool)
-> (Array DI ix e -> Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e -> Array DI ix e)
-> Ord (Array DI ix e)
Array DI ix e -> Array DI ix e -> Bool
Array DI ix e -> Array DI ix e -> Ordering
Array DI ix e -> Array DI ix e -> Array DI ix e
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall ix e. (Index ix, Ord e) => Eq (Array DI ix e)
forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Bool
forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Ordering
forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
min :: Array DI ix e -> Array DI ix e -> Array DI ix e
$cmin :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
max :: Array DI ix e -> Array DI ix e -> Array DI ix e
$cmax :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
>= :: Array DI ix e -> Array DI ix e -> Bool
$c>= :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Bool
> :: Array DI ix e -> Array DI ix e -> Bool
$c> :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Bool
<= :: Array DI ix e -> Array DI ix e -> Bool
$c<= :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Bool
< :: Array DI ix e -> Array DI ix e -> Bool
$c< :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Bool
compare :: Array DI ix e -> Array DI ix e -> Ordering
$ccompare :: forall ix e.
(Index ix, Ord e) =>
Array DI ix e -> Array DI ix e -> Ordering
$cp1Ord :: forall ix e. (Index ix, Ord e) => Eq (Array DI ix e)
Ord, a -> Array DI ix b -> Array DI ix a
(a -> b) -> Array DI ix a -> Array DI ix b
(forall a b. (a -> b) -> Array DI ix a -> Array DI ix b)
-> (forall a b. a -> Array DI ix b -> Array DI ix a)
-> Functor (Array DI ix)
forall a b. a -> Array DI ix b -> Array DI ix a
forall a b. (a -> b) -> Array DI ix a -> Array DI ix b
forall ix a b. a -> Array DI ix b -> Array DI ix a
forall ix a b. (a -> b) -> Array DI ix a -> Array DI ix b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Array DI ix b -> Array DI ix a
$c<$ :: forall ix a b. a -> Array DI ix b -> Array DI ix a
fmap :: (a -> b) -> Array DI ix a -> Array DI ix b
$cfmap :: forall ix a b. (a -> b) -> Array DI ix a -> Array DI ix b
Functor, Functor (Array DI ix)
a -> Array DI ix a
Functor (Array DI ix)
-> (forall a. a -> Array DI ix a)
-> (forall a b.
    Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b)
-> (forall a b c.
    (a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c)
-> (forall a b. Array DI ix a -> Array DI ix b -> Array DI ix b)
-> (forall a b. Array DI ix a -> Array DI ix b -> Array DI ix a)
-> Applicative (Array DI ix)
Array DI ix a -> Array DI ix b -> Array DI ix b
Array DI ix a -> Array DI ix b -> Array DI ix a
Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b
(a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c
forall a. a -> Array DI ix a
forall ix. Index ix => Functor (Array DI ix)
forall ix a. Index ix => a -> Array DI ix a
forall ix a b.
Index ix =>
Array DI ix a -> Array DI ix b -> Array DI ix a
forall ix a b.
Index ix =>
Array DI ix a -> Array DI ix b -> Array DI ix b
forall ix a b.
Index ix =>
Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b
forall ix a b c.
Index ix =>
(a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c
forall a b. Array DI ix a -> Array DI ix b -> Array DI ix a
forall a b. Array DI ix a -> Array DI ix b -> Array DI ix b
forall a b. Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b
forall a b c.
(a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: Array DI ix a -> Array DI ix b -> Array DI ix a
$c<* :: forall ix a b.
Index ix =>
Array DI ix a -> Array DI ix b -> Array DI ix a
*> :: Array DI ix a -> Array DI ix b -> Array DI ix b
$c*> :: forall ix a b.
Index ix =>
Array DI ix a -> Array DI ix b -> Array DI ix b
liftA2 :: (a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c
$cliftA2 :: forall ix a b c.
Index ix =>
(a -> b -> c) -> Array DI ix a -> Array DI ix b -> Array DI ix c
<*> :: Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b
$c<*> :: forall ix a b.
Index ix =>
Array DI ix (a -> b) -> Array DI ix a -> Array DI ix b
pure :: a -> Array DI ix a
$cpure :: forall ix a. Index ix => a -> Array DI ix a
$cp1Applicative :: forall ix. Index ix => Functor (Array DI ix)
Applicative, a -> Array DI ix a -> Bool
Array DI ix m -> m
Array DI ix a -> [a]
Array DI ix a -> Bool
Array DI ix a -> Int
Array DI ix a -> a
Array DI ix a -> a
Array DI ix a -> a
Array DI ix a -> a
(a -> m) -> Array DI ix a -> m
(a -> m) -> Array DI ix a -> m
(a -> b -> b) -> b -> Array DI ix a -> b
(a -> b -> b) -> b -> Array DI ix a -> b
(b -> a -> b) -> b -> Array DI ix a -> b
(b -> a -> b) -> b -> Array DI ix a -> b
(a -> a -> a) -> Array DI ix a -> a
(a -> a -> a) -> Array DI ix a -> a
(forall m. Monoid m => Array DI ix m -> m)
-> (forall m a. Monoid m => (a -> m) -> Array DI ix a -> m)
-> (forall m a. Monoid m => (a -> m) -> Array DI ix a -> m)
-> (forall a b. (a -> b -> b) -> b -> Array DI ix a -> b)
-> (forall a b. (a -> b -> b) -> b -> Array DI ix a -> b)
-> (forall b a. (b -> a -> b) -> b -> Array DI ix a -> b)
-> (forall b a. (b -> a -> b) -> b -> Array DI ix a -> b)
-> (forall a. (a -> a -> a) -> Array DI ix a -> a)
-> (forall a. (a -> a -> a) -> Array DI ix a -> a)
-> (forall a. Array DI ix a -> [a])
-> (forall a. Array DI ix a -> Bool)
-> (forall a. Array DI ix a -> Int)
-> (forall a. Eq a => a -> Array DI ix a -> Bool)
-> (forall a. Ord a => Array DI ix a -> a)
-> (forall a. Ord a => Array DI ix a -> a)
-> (forall a. Num a => Array DI ix a -> a)
-> (forall a. Num a => Array DI ix a -> a)
-> Foldable (Array DI ix)
forall a. Eq a => a -> Array DI ix a -> Bool
forall a. Num a => Array DI ix a -> a
forall a. Ord a => Array DI ix a -> a
forall m. Monoid m => Array DI ix m -> m
forall ix a. (Index ix, Eq a) => a -> Array DI ix a -> Bool
forall ix a. (Index ix, Num a) => Array DI ix a -> a
forall ix a. (Index ix, Ord a) => Array DI ix a -> a
forall ix m. (Index ix, Monoid m) => Array DI ix m -> m
forall ix a. Index ix => Array DI ix a -> Bool
forall ix a. Index ix => Array DI ix a -> Int
forall ix a. Index ix => Array DI ix a -> [a]
forall ix a. Index ix => (a -> a -> a) -> Array DI ix a -> a
forall ix m a.
(Index ix, Monoid m) =>
(a -> m) -> Array DI ix a -> m
forall ix b a. Index ix => (b -> a -> b) -> b -> Array DI ix a -> b
forall ix a b. Index ix => (a -> b -> b) -> b -> Array DI ix a -> b
forall a. Array DI ix a -> Bool
forall a. Array DI ix a -> Int
forall a. Array DI ix a -> [a]
forall a. (a -> a -> a) -> Array DI ix a -> a
forall m a. Monoid m => (a -> m) -> Array DI ix a -> m
forall b a. (b -> a -> b) -> b -> Array DI ix a -> b
forall a b. (a -> b -> b) -> b -> Array DI ix a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: Array DI ix a -> a
$cproduct :: forall ix a. (Index ix, Num a) => Array DI ix a -> a
sum :: Array DI ix a -> a
$csum :: forall ix a. (Index ix, Num a) => Array DI ix a -> a
minimum :: Array DI ix a -> a
$cminimum :: forall ix a. (Index ix, Ord a) => Array DI ix a -> a
maximum :: Array DI ix a -> a
$cmaximum :: forall ix a. (Index ix, Ord a) => Array DI ix a -> a
elem :: a -> Array DI ix a -> Bool
$celem :: forall ix a. (Index ix, Eq a) => a -> Array DI ix a -> Bool
length :: Array DI ix a -> Int
$clength :: forall ix a. Index ix => Array DI ix a -> Int
null :: Array DI ix a -> Bool
$cnull :: forall ix a. Index ix => Array DI ix a -> Bool
toList :: Array DI ix a -> [a]
$ctoList :: forall ix a. Index ix => Array DI ix a -> [a]
foldl1 :: (a -> a -> a) -> Array DI ix a -> a
$cfoldl1 :: forall ix a. Index ix => (a -> a -> a) -> Array DI ix a -> a
foldr1 :: (a -> a -> a) -> Array DI ix a -> a
$cfoldr1 :: forall ix a. Index ix => (a -> a -> a) -> Array DI ix a -> a
foldl' :: (b -> a -> b) -> b -> Array DI ix a -> b
$cfoldl' :: forall ix b a. Index ix => (b -> a -> b) -> b -> Array DI ix a -> b
foldl :: (b -> a -> b) -> b -> Array DI ix a -> b
$cfoldl :: forall ix b a. Index ix => (b -> a -> b) -> b -> Array DI ix a -> b
foldr' :: (a -> b -> b) -> b -> Array DI ix a -> b
$cfoldr' :: forall ix a b. Index ix => (a -> b -> b) -> b -> Array DI ix a -> b
foldr :: (a -> b -> b) -> b -> Array DI ix a -> b
$cfoldr :: forall ix a b. Index ix => (a -> b -> b) -> b -> Array DI ix a -> b
foldMap' :: (a -> m) -> Array DI ix a -> m
$cfoldMap' :: forall ix m a.
(Index ix, Monoid m) =>
(a -> m) -> Array DI ix a -> m
foldMap :: (a -> m) -> Array DI ix a -> m
$cfoldMap :: forall ix m a.
(Index ix, Monoid m) =>
(a -> m) -> Array DI ix a -> m
fold :: Array DI ix m -> m
$cfold :: forall ix m. (Index ix, Monoid m) => Array DI ix m -> m
Foldable, Integer -> Array DI ix e
Array DI ix e -> Array DI ix e
Array DI ix e -> Array DI ix e -> Array DI ix e
(Array DI ix e -> Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Integer -> Array DI ix e)
-> Num (Array DI ix e)
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
forall ix e. (Index ix, Num e) => Integer -> Array DI ix e
forall ix e. (Index ix, Num e) => Array DI ix e -> Array DI ix e
forall ix e.
(Index ix, Num e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
fromInteger :: Integer -> Array DI ix e
$cfromInteger :: forall ix e. (Index ix, Num e) => Integer -> Array DI ix e
signum :: Array DI ix e -> Array DI ix e
$csignum :: forall ix e. (Index ix, Num e) => Array DI ix e -> Array DI ix e
abs :: Array DI ix e -> Array DI ix e
$cabs :: forall ix e. (Index ix, Num e) => Array DI ix e -> Array DI ix e
negate :: Array DI ix e -> Array DI ix e
$cnegate :: forall ix e. (Index ix, Num e) => Array DI ix e -> Array DI ix e
* :: Array DI ix e -> Array DI ix e -> Array DI ix e
$c* :: forall ix e.
(Index ix, Num e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
- :: Array DI ix e -> Array DI ix e -> Array DI ix e
$c- :: forall ix e.
(Index ix, Num e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
+ :: Array DI ix e -> Array DI ix e -> Array DI ix e
$c+ :: forall ix e.
(Index ix, Num e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
Num, Fractional (Array DI ix e)
Array DI ix e
Fractional (Array DI ix e)
-> Array DI ix e
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> Floating (Array DI ix e)
Array DI ix e -> Array DI ix e
Array DI ix e -> Array DI ix e -> Array DI ix e
forall a.
Fractional a
-> a
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> Floating a
forall ix e. (Index ix, Floating e) => Fractional (Array DI ix e)
forall ix e. (Index ix, Floating e) => Array DI ix e
forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
log1mexp :: Array DI ix e -> Array DI ix e
$clog1mexp :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
log1pexp :: Array DI ix e -> Array DI ix e
$clog1pexp :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
expm1 :: Array DI ix e -> Array DI ix e
$cexpm1 :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
log1p :: Array DI ix e -> Array DI ix e
$clog1p :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
atanh :: Array DI ix e -> Array DI ix e
$catanh :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
acosh :: Array DI ix e -> Array DI ix e
$cacosh :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
asinh :: Array DI ix e -> Array DI ix e
$casinh :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
tanh :: Array DI ix e -> Array DI ix e
$ctanh :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
cosh :: Array DI ix e -> Array DI ix e
$ccosh :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
sinh :: Array DI ix e -> Array DI ix e
$csinh :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
atan :: Array DI ix e -> Array DI ix e
$catan :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
acos :: Array DI ix e -> Array DI ix e
$cacos :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
asin :: Array DI ix e -> Array DI ix e
$casin :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
tan :: Array DI ix e -> Array DI ix e
$ctan :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
cos :: Array DI ix e -> Array DI ix e
$ccos :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
sin :: Array DI ix e -> Array DI ix e
$csin :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
logBase :: Array DI ix e -> Array DI ix e -> Array DI ix e
$clogBase :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
** :: Array DI ix e -> Array DI ix e -> Array DI ix e
$c** :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
sqrt :: Array DI ix e -> Array DI ix e
$csqrt :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
log :: Array DI ix e -> Array DI ix e
$clog :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
exp :: Array DI ix e -> Array DI ix e
$cexp :: forall ix e.
(Index ix, Floating e) =>
Array DI ix e -> Array DI ix e
pi :: Array DI ix e
$cpi :: forall ix e. (Index ix, Floating e) => Array DI ix e
$cp1Floating :: forall ix e. (Index ix, Floating e) => Fractional (Array DI ix e)
Floating, Num (Array DI ix e)
Num (Array DI ix e)
-> (Array DI ix e -> Array DI ix e -> Array DI ix e)
-> (Array DI ix e -> Array DI ix e)
-> (Rational -> Array DI ix e)
-> Fractional (Array DI ix e)
Rational -> Array DI ix e
Array DI ix e -> Array DI ix e
Array DI ix e -> Array DI ix e -> Array DI ix e
forall a.
Num a
-> (a -> a -> a) -> (a -> a) -> (Rational -> a) -> Fractional a
forall ix e. (Index ix, Fractional e) => Num (Array DI ix e)
forall ix e. (Index ix, Fractional e) => Rational -> Array DI ix e
forall ix e.
(Index ix, Fractional e) =>
Array DI ix e -> Array DI ix e
forall ix e.
(Index ix, Fractional e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
fromRational :: Rational -> Array DI ix e
$cfromRational :: forall ix e. (Index ix, Fractional e) => Rational -> Array DI ix e
recip :: Array DI ix e -> Array DI ix e
$crecip :: forall ix e.
(Index ix, Fractional e) =>
Array DI ix e -> Array DI ix e
/ :: Array DI ix e -> Array DI ix e -> Array DI ix e
$c/ :: forall ix e.
(Index ix, Fractional e) =>
Array DI ix e -> Array DI ix e -> Array DI ix e
$cp1Fractional :: forall ix e. (Index ix, Fractional e) => Num (Array DI ix e)
Fractional)

instance (Ragged L ix e, Show e) => Show (Array DI ix e) where
  showsPrec :: Int -> Array DI ix e -> ShowS
showsPrec = (Array DI ix e -> Array D ix e) -> Int -> Array DI ix e -> ShowS
forall r r' ix ix' e.
(Ragged L ix' e, Load r ix e, Source r' ix' e, Show e) =>
(Array r ix e -> Array r' ix' e) -> Int -> Array r ix e -> ShowS
showsArrayPrec Array DI ix e -> Array D ix e
forall ix e. Array DI ix e -> Array D ix e
diArray
  showList :: [Array DI ix e] -> ShowS
showList = [Array DI ix e] -> ShowS
forall arr. Show arr => [arr] -> ShowS
showArrayList

instance Index ix => Construct DI ix e where
  setComp :: Comp -> Array DI ix e -> Array DI ix e
setComp Comp
c Array DI ix e
arr = Array DI ix e
R:ArrayDIixe ix e
arr { diArray :: Array D ix e
diArray = (Array DI ix e -> Array D ix e
forall ix e. Array DI ix e -> Array D ix e
diArray Array DI ix e
arr) { dComp :: Comp
dComp = Comp
c } }
  {-# INLINE setComp #-}

  makeArray :: Comp -> Sz ix -> (ix -> e) -> Array DI ix e
makeArray Comp
c Sz ix
sz = Array D ix e -> Array DI ix e
forall ix e. Array D ix e -> Array DI ix e
DIArray (Array D ix e -> Array DI ix e)
-> ((ix -> e) -> Array D ix e) -> (ix -> e) -> Array DI ix e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Comp -> Sz ix -> (ix -> e) -> Array D ix e
forall r ix e.
Construct r ix e =>
Comp -> Sz ix -> (ix -> e) -> Array r ix e
makeArray Comp
c Sz ix
sz
  {-# INLINE makeArray #-}

instance Index ix => Resize DI ix where
  unsafeResize :: Sz ix' -> Array DI ix e -> Array DI ix' e
unsafeResize Sz ix'
sz = Array D ix' e -> Array DI ix' e
forall ix e. Array D ix e -> Array DI ix e
DIArray (Array D ix' e -> Array DI ix' e)
-> (Array DI ix e -> Array D ix' e)
-> Array DI ix e
-> Array DI ix' e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sz ix' -> Array D ix e -> Array D ix' e
forall r ix ix' e.
(Resize r ix, Index ix') =>
Sz ix' -> Array r ix e -> Array r ix' e
unsafeResize Sz ix'
sz (Array D ix e -> Array D ix' e)
-> (Array DI ix e -> Array D ix e)
-> Array DI ix e
-> Array D ix' e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array DI ix e -> Array D ix e
forall ix e. Array DI ix e -> Array D ix e
diArray
  {-# INLINE unsafeResize #-}

instance Index ix => Extract DI ix e where
  unsafeExtract :: ix -> Sz ix -> Array DI ix e -> Array (R DI) ix e
unsafeExtract ix
sIx Sz ix
newSz = Array D ix e -> Array DI ix e
forall ix e. Array D ix e -> Array DI ix e
DIArray (Array D ix e -> Array DI ix e)
-> (Array DI ix e -> Array D ix e)
-> Array DI ix e
-> Array DI ix e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ix -> Sz ix -> Array D ix e -> Array (R D) ix e
forall r ix e.
Extract r ix e =>
ix -> Sz ix -> Array r ix e -> Array (R r) ix e
unsafeExtract ix
sIx Sz ix
newSz (Array D ix e -> Array D ix e)
-> (Array DI ix e -> Array D ix e) -> Array DI ix e -> Array D ix e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array DI ix e -> Array D ix e
forall ix e. Array DI ix e -> Array D ix e
diArray
  {-# INLINE unsafeExtract #-}


instance Index ix => Load DI ix e where
  size :: Array DI ix e -> Sz ix
size (DIArray arr) = Array D ix e -> Sz ix
forall r ix e. Load r ix e => Array r ix e -> Sz ix
size Array D ix e
arr
  {-# INLINE size #-}
  getComp :: Array DI ix e -> Comp
getComp = Array D ix e -> Comp
forall ix e. Array D ix e -> Comp
dComp (Array D ix e -> Comp)
-> (Array DI ix e -> Array D ix e) -> Array DI ix e -> Comp
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array DI ix e -> Array D ix e
forall ix e. Array DI ix e -> Array D ix e
diArray
  {-# INLINE getComp #-}
  loadArrayM :: Scheduler m () -> Array DI ix e -> (Int -> e -> m ()) -> m ()
loadArrayM Scheduler m ()
scheduler (DIArray (DArray _ sz f)) Int -> e -> m ()
uWrite =
    Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Scheduler m () -> Int
forall (m :: * -> *) a. Scheduler m a -> Int
numWorkers Scheduler m ()
scheduler) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ((Int -> m ()) -> m ()) -> (Int -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \ !Int
start ->
      Scheduler m () -> m () -> m ()
forall (m :: * -> *) a. Scheduler m a -> m a -> m ()
scheduleWork Scheduler m ()
scheduler (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$
      Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> (Int -> ix -> m ())
-> m ()
forall ix (m :: * -> *).
(Index ix, Monad m) =>
Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> (Int -> ix -> m ())
-> m ()
iterLinearM_ Sz ix
sz Int
start (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
sz) (Scheduler m () -> Int
forall (m :: * -> *) a. Scheduler m a -> Int
numWorkers Scheduler m ()
scheduler) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
(<) ((Int -> ix -> m ()) -> m ()) -> (Int -> ix -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \ !Int
k -> Int -> e -> m ()
uWrite Int
k (e -> m ()) -> (ix -> e) -> ix -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ix -> e
f
  {-# INLINE loadArrayM #-}

instance Index ix => StrideLoad DI ix e where
  loadArrayWithStrideM :: Scheduler m ()
-> Stride ix
-> Sz ix
-> Array DI ix e
-> (Int -> e -> m ())
-> m ()
loadArrayWithStrideM Scheduler m ()
scheduler Stride ix
stride Sz ix
resultSize Array DI ix e
arr Int -> e -> m ()
uWrite =
    let strideIx :: ix
strideIx = Stride ix -> ix
forall ix. Stride ix -> ix
unStride Stride ix
stride
        DIArray (DArray _ _ f) = Array DI ix e
arr
    in Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m ()) -> m ()
forall (m :: * -> *) a.
Monad m =>
Int -> (Int -> Bool) -> (Int -> Int) -> (Int -> m a) -> m ()
loopM_ Int
0 (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Scheduler m () -> Int
forall (m :: * -> *) a. Scheduler m a -> Int
numWorkers Scheduler m ()
scheduler) (Int -> Int -> Int
forall a. Num a => a -> a -> a
+ Int
1) ((Int -> m ()) -> m ()) -> (Int -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$ \ !Int
start ->
          Scheduler m () -> m () -> m ()
forall (m :: * -> *) a. Scheduler m a -> m a -> m ()
scheduleWork Scheduler m ()
scheduler (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$
          Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> (Int -> ix -> m ())
-> m ()
forall ix (m :: * -> *).
(Index ix, Monad m) =>
Sz ix
-> Int
-> Int
-> Int
-> (Int -> Int -> Bool)
-> (Int -> ix -> m ())
-> m ()
iterLinearM_ Sz ix
resultSize Int
start (Sz ix -> Int
forall ix. Index ix => Sz ix -> Int
totalElem Sz ix
resultSize) (Scheduler m () -> Int
forall (m :: * -> *) a. Scheduler m a -> Int
numWorkers Scheduler m ()
scheduler) Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
(<) ((Int -> ix -> m ()) -> m ()) -> (Int -> ix -> m ()) -> m ()
forall a b. (a -> b) -> a -> b
$
            \ !Int
i ix
ix -> Int -> e -> m ()
uWrite Int
i (ix -> e
f ((Int -> Int -> Int) -> ix -> ix -> ix
forall ix. Index ix => (Int -> Int -> Int) -> ix -> ix -> ix
liftIndex2 Int -> Int -> Int
forall a. Num a => a -> a -> a
(*) ix
strideIx ix
ix))
  {-# INLINE loadArrayWithStrideM #-}

-- | Convert a source array into an array that, when computed, will have its elemets evaluated out
-- of order (interleaved amongst cores), hence making unbalanced computation better parallelizable.
toInterleaved :: Source r ix e => Array r ix e -> Array DI ix e
toInterleaved :: Array r ix e -> Array DI ix e
toInterleaved = Array D ix e -> Array DI ix e
forall ix e. Array D ix e -> Array DI ix e
DIArray (Array D ix e -> Array DI ix e)
-> (Array r ix e -> Array D ix e) -> Array r ix e -> Array DI ix e
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Array r ix e -> Array D ix e
forall r ix e. Source r ix e => Array r ix e -> Array D ix e
delay
{-# INLINE toInterleaved #-}

-- | /O(1)/ - Unwrap the interleved array.
--
-- @since 0.2.1
fromInterleaved :: Array DI ix e -> Array D ix e
fromInterleaved :: Array DI ix e -> Array D ix e
fromInterleaved = Array DI ix e -> Array D ix e
forall ix e. Array DI ix e -> Array D ix e
diArray
{-# INLINE fromInterleaved #-}