{-# LANGUAGE PolyKinds #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeFamilies #-} module Numerical.Array where --import Numerical.Array.Shape --data MArray world rep lay (view:: Locality) sh elem {- lets do just IO and not ST for now? or bite the primstate bullet now? -} --data family Array world rep lay (view:: Locality) sh elm {- only Row and Column Major have dense formats that are unique across ALL possible ranks, not so simple for others. Make different data instances per formats -} --class Array where ----------- -- | for now locality is a closed type, may change going forward -- also should it be in a different module like shape or layout? {- theres several points in the design space of array apis that are nice, but none quite right Vector is probably the closest pros: which has nice pure vs mutable apis simple interface cons: its really designed for Int indexing assumes every pure Vector is internally derived from an imperative one (this is reflected in where the thaw/freeze) so there needs to be an Array class, an MArray class, and the Thawing / Freezing needs to be in a seperate PhasedArray class! why? Because we can't assume that pure/mutable arrays are the fundamental data type! -} {- maybe do data Locality = Contiguous | Strided For now lets assume that the concrete (rather than delayed) arrays have a regular structure when strided. (rather than nonuniform gaps) -} {- rep = storable, unboxed, boxed, delay, etc lay = row major, column major, morton z, morton w (flipped n), --- this ignores symmetry and hermitian being properties as well as packed layouts --- also need to have a good sparse story --- as currently done, most don't really make sense for != rank-2 arrays, -- rowMajor is a foldR, columnMajor is a foldL over the shape ices -- Repa and accelerate use a Snoc List so that Row major fuses well for row major sh= rank / shape, ie matrix or vector, or some higher tensor thingy lets borrow from repa/ accelea mode= need to have a notion of runnable worlds, based on "backend" chosen, eg CBlasish, DPH, Repa, LLVM, Free (get the shallow/ deep ast) view = Origin, Slice, and Diced, I might make this a fixed universe for now Lets not distinguish whether a contiguous array is the original or derived for now doesn't seem to be a meaningful difference and would make type inference crap / not bijective Note that this does mean that accidental space leaks may happen that suggests (but not for now) having a notion of origin / derived that would allow elimiting space leaks. But lets not do that for now -} {- uncheckedReshape :: Array wld rep lay -}