numerical-0.0.0.0: src/Numerical/Array.hs
{-# 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
-}