Remove LArray
LArrays were originally devised for efficiency reasons, but now that Delayed array representations exist there isn't any need for it.
This commit is contained in:
parent
a0068469c5
commit
983733f241
|
@ -26,7 +26,6 @@ modules = Data.NP,
|
||||||
Data.NumIdr.Interfaces,
|
Data.NumIdr.Interfaces,
|
||||||
Data.NumIdr.Scalar,
|
Data.NumIdr.Scalar,
|
||||||
Data.NumIdr.Vector,
|
Data.NumIdr.Vector,
|
||||||
Data.NumIdr.LArray,
|
|
||||||
Data.NumIdr.Transform,
|
Data.NumIdr.Transform,
|
||||||
Data.NumIdr.Transform.Affine,
|
Data.NumIdr.Transform.Affine,
|
||||||
Data.NumIdr.Transform.Isometry,
|
Data.NumIdr.Transform.Isometry,
|
||||||
|
|
|
@ -1,170 +0,0 @@
|
||||||
module Data.NumIdr.LArray
|
|
||||||
|
|
||||||
import Data.Vect
|
|
||||||
import Data.NumIdr.PrimArray
|
|
||||||
import Data.NumIdr.Array
|
|
||||||
|
|
||||||
%default total
|
|
||||||
|
|
||||||
|
|
||||||
||| An array type that is guaranteed to be unique through linear types.
|
|
||||||
|||
|
|
||||||
||| This type can be used to operate on an array value without it being copied
|
|
||||||
||| on every mutation.
|
|
||||||
export
|
|
||||||
data LArray : Vect rk Nat -> Type -> Type where
|
|
||||||
MkLArray : (ord : Order) -> (sts : Vect rk Nat) ->
|
|
||||||
(s : Vect rk Nat) -> PrimArray a -> LArray s a
|
|
||||||
|
|
||||||
||| A vector that is guaranteed to be unique through linear types.
|
|
||||||
export
|
|
||||||
LVector : Nat -> Type -> Type
|
|
||||||
LVector n = LArray [n]
|
|
||||||
|
|
||||||
||| A matrix that is guaranteed to be unique through linear types.
|
|
||||||
export
|
|
||||||
LMatrix : (m, n : Nat) -> Type -> Type
|
|
||||||
LMatrix m n = LArray [m,n]
|
|
||||||
|
|
||||||
||| A matrix that is guaranteed to be unique through linear types.
|
|
||||||
export
|
|
||||||
LMatrix' : Nat -> Type -> Type
|
|
||||||
LMatrix' n = LArray [n,n]
|
|
||||||
|
|
||||||
|
|
||||||
thaw : Array s a -> LArray s a
|
|
||||||
thaw {s} arr with (viewShape arr)
|
|
||||||
_ | Shape s = MkLArray (getOrder arr) (strides arr) s (getPrim arr)
|
|
||||||
|
|
||||||
||| Freeze a linear array into an immutable array.
|
|
||||||
export
|
|
||||||
freeze : (1 _ : LArray s a) -> Array s a
|
|
||||||
freeze (MkLArray ord sts s arr) = unsafeMkArray ord sts s arr
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
-- Constructors
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
export
|
|
||||||
repeatL : (s : Vect rk Nat) -> a -> ((1 _ : LArray s a) -> LArray s' b) -> Array s' b
|
|
||||||
repeatL s x f = freeze $ f (thaw $ repeat s x)
|
|
||||||
|
|
||||||
|
|
||||||
export
|
|
||||||
zerosL : Num a => (s : Vect rk Nat) -> ((1 _ : LArray s a) -> LArray s' b) -> Array s' b
|
|
||||||
zerosL s f = freeze $ f (thaw $ zeros s)
|
|
||||||
|
|
||||||
export
|
|
||||||
onesL : Num a => (s : Vect rk Nat) -> ((1 _ : LArray s a) -> LArray s' b) -> Array s' b
|
|
||||||
onesL s f = freeze $ f (thaw $ ones s)
|
|
||||||
|
|
||||||
|
|
||||||
export
|
|
||||||
fromVectL : (s : Vect rk Nat) -> Vect (product s) a -> ((1 _ : LArray s a) -> LArray s' b) -> Array s' b
|
|
||||||
fromVectL s v f = freeze $ f (thaw $ fromVect s v)
|
|
||||||
|
|
||||||
export
|
|
||||||
fromStreamL : (s : Vect rk Nat) -> Stream a -> ((1 _ : LArray s a) -> LArray s' b) -> Array s' b
|
|
||||||
fromStreamL s xs f = freeze $ f (thaw $ fromStream s xs)
|
|
||||||
|
|
||||||
export
|
|
||||||
copyToL : Array s a -> ((1 _ : LArray s a) -> LArray s' b) -> Array s' b
|
|
||||||
copyToL {s} arr f with (viewShape arr)
|
|
||||||
_ | Shape s =
|
|
||||||
let ord = getOrder arr
|
|
||||||
sts = strides arr
|
|
||||||
prim = copy $ getPrim arr
|
|
||||||
in freeze $ f (thaw $ unsafeMkArray ord sts s prim)
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
-- Indexing
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
infixl 10 !!
|
|
||||||
infixl 10 !?
|
|
||||||
infixl 10 !#
|
|
||||||
infixl 11 !!..
|
|
||||||
infixl 11 !?..
|
|
||||||
infixl 11 !#..
|
|
||||||
|
|
||||||
|
|
||||||
||| Index the array using the given coordinates.
|
|
||||||
export
|
|
||||||
index : Coords s -> (1 _ : LArray s a) -> Res a (const $ LArray s a)
|
|
||||||
index is (MkLArray ord sts s arr) =
|
|
||||||
index (getLocation sts is) arr
|
|
||||||
# MkLArray ord sts s arr
|
|
||||||
|
|
||||||
||| Index the array using the given coordinates.
|
|
||||||
|||
|
|
||||||
||| This is the operator form of `index`.
|
|
||||||
export %inline
|
|
||||||
(!!) : (1 _ : LArray s a) -> Coords s -> Res a (const $ LArray s a)
|
|
||||||
arr !! is = index is arr
|
|
||||||
|
|
||||||
||| Update the entry at the given coordinates using the function.
|
|
||||||
export
|
|
||||||
indexUpdate : Coords s -> (a -> a) -> (1 _ : LArray s a) -> LArray s a
|
|
||||||
indexUpdate is f (MkLArray ord sts s arr) =
|
|
||||||
MkLArray ord sts s (unsafeUpdateInPlace (getLocation sts is) f arr)
|
|
||||||
|
|
||||||
||| Set the entry at the given coordinates to the given value.
|
|
||||||
export
|
|
||||||
indexSet : Coords s -> a -> (1 _ : LArray s a) -> LArray s a
|
|
||||||
indexSet is = indexUpdate is . const
|
|
||||||
|
|
||||||
|
|
||||||
||| Index the array using the given coordinates, returning `Nothing` if the
|
|
||||||
||| coordinates are out of bounds.
|
|
||||||
export
|
|
||||||
indexNB : Vect rk Nat -> (1 _ : LArray {rk} s a) -> Res (Maybe a) (const $ LArray s a)
|
|
||||||
indexNB is (MkLArray ord sts s arr) =
|
|
||||||
(if all id $ zipWith (<) is s
|
|
||||||
then Just $ index (getLocation' sts is) arr
|
|
||||||
else Nothing)
|
|
||||||
# MkLArray ord sts s arr
|
|
||||||
|
|
||||||
||| Index the array using the given coordinates, returning `Nothing` if the
|
|
||||||
||| coordinates are out of bounds.
|
|
||||||
|||
|
|
||||||
||| This is the operator form of `indexNB`.
|
|
||||||
export %inline
|
|
||||||
(!?) : (1 _ : LArray {rk} s a) -> Vect rk Nat -> Res (Maybe a) (const $ LArray s a)
|
|
||||||
arr !? is = indexNB is arr
|
|
||||||
|
|
||||||
||| Update the entry at the given coordinates using the function. `Nothing` is
|
|
||||||
||| returned if the coordinates are out of bounds.
|
|
||||||
export
|
|
||||||
indexUpdateNB : Vect rk Nat -> (a -> a) -> LArray {rk} s a -> Maybe (LArray s a)
|
|
||||||
indexUpdateNB is f (MkLArray ord sts s arr) =
|
|
||||||
if all id $ zipWith (<) is s
|
|
||||||
then Just $ MkLArray ord sts s (unsafeUpdateInPlace (getLocation' sts is) f arr)
|
|
||||||
else Nothing
|
|
||||||
|
|
||||||
||| Set the entry at the given coordinates using the function. `Nothing` is
|
|
||||||
||| returned if the coordinates are out of bounds.
|
|
||||||
export
|
|
||||||
indexSetNB : Vect rk Nat -> a -> LArray {rk} s a -> Maybe (LArray s a)
|
|
||||||
indexSetNB is = indexUpdateNB is . const
|
|
||||||
|
|
||||||
||| Index the array using the given coordinates.
|
|
||||||
||| WARNING: This function does not perform any bounds check on its inputs.
|
|
||||||
||| Misuse of this function can easily break memory safety.
|
|
||||||
export
|
|
||||||
indexUnsafe : Vect rk Nat -> (1 _ : LArray {rk} s a) -> Res a (const $ LArray s a)
|
|
||||||
indexUnsafe is (MkLArray ord sts s arr) =
|
|
||||||
index (getLocation' sts is) arr
|
|
||||||
# MkLArray ord sts s arr
|
|
||||||
|
|
||||||
||| Index the array using the given coordinates.
|
|
||||||
||| WARNING: This function does not perform any bounds check on its inputs.
|
|
||||||
||| Misuse of this function can easily break memory safety.
|
|
||||||
|||
|
|
||||||
||| This is the operator form of `indexUnsafe`.
|
|
||||||
export %inline
|
|
||||||
(!#) : (1 _ : LArray {rk} s a) -> Vect rk Nat -> Res a (const $ LArray s a)
|
|
||||||
arr !# is = indexUnsafe is arr
|
|
Loading…
Reference in a new issue