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:
Kiana Sheibani 2023-09-25 22:55:53 -04:00
parent a0068469c5
commit 983733f241
Signed by: toki
GPG key ID: 6CB106C25E86A9F7
2 changed files with 0 additions and 171 deletions

View file

@ -26,7 +26,6 @@ modules = Data.NP,
Data.NumIdr.Interfaces,
Data.NumIdr.Scalar,
Data.NumIdr.Vector,
Data.NumIdr.LArray,
Data.NumIdr.Transform,
Data.NumIdr.Transform.Affine,
Data.NumIdr.Transform.Isometry,

View file

@ -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