Safe Haskell | Safe-Infered |
---|
Pure combinators along the lines of original ADP. We simply re-export the monadic interface without the monadic function application combinator.
- module ADP.Fusion.Monadic
- class Monad m => StreamGen m t r | t -> r where
- class Monad m => PreStreamGen m s q | s -> q where
- preStreamGen :: s -> DIM2 -> Stream m q
- singlePreStreamGen :: (Monad m, Num head, Ord head) => :. (:. Z head) head -> Stream m (:. (:. Z head) head, Z, Z)
- class Monad m => ExtractValue m cnt where
- type Asor cnt :: *
- type Elem cnt :: *
- extractValue :: cnt -> DIM2 -> Asor cnt -> m (Elem cnt)
- extractStream :: cnt -> Stream m (Idx3 z, astack, vstack) -> Stream m (Idx3 z, astack :. Asor cnt, vstack :. Elem cnt)
- extractStreamLast :: cnt -> Stream m (Idx2 z, astack, vstack) -> Stream m (Idx2 z, astack :. Asor cnt, vstack :. Elem cnt)
- class Apply x where
- data Box mk step xs ys = Box mk step xs ys
- type Idx3 z = ((z :. Int) :. Int) :. Int
- type Idx2 z = (z :. Int) :. Int
- newtype Scalar a = Scalar {
- unScalar :: a
- newtype ScalarM a = ScalarM {
- unScalarM :: a
- newtype Vect a = Vect {
- unVect :: a
- newtype VectM a = VectM {
- unVectM :: a
Documentation
module ADP.Fusion.Monadic
StreamGen
class Monad m => StreamGen m t r | t -> r whereSource
Generate stream from either one (DIM2 -> m cnt) or some combination of terminals derived from uses of nextTo.
(Monad m, ExtractValue m (Arr0 sh (Vector elm)), ~ * (Asor (Arr0 sh (Vector elm))) k, ~ * (Elem (Arr0 sh (Vector elm))) elm) => StreamGen m (Arr0 sh (Vector elm)) (DIM2, :. Z k, :. Z elm) | |
(Monad m, ExtractValue m (Arr0 sh elm), ~ * (Asor (Arr0 sh elm)) k, ~ * (Elem (Arr0 sh elm)) elm) => StreamGen m (Arr0 sh elm) (DIM2, :. Z k, :. Z elm) | |
(Monad m, ExtractValue m (DIM2 -> VectM elm), ~ * (Asor (DIM2 -> VectM elm)) k, ~ * (Elem (DIM2 -> VectM elm)) elm) => StreamGen m (DIM2 -> VectM elm) (DIM2, :. Z k, :. Z elm) | |
(Monad m, ExtractValue m (DIM2 -> Vect elm), ~ * (Asor (DIM2 -> Vect elm)) k, ~ * (Elem (DIM2 -> Vect elm)) elm) => StreamGen m (DIM2 -> Vect elm) (DIM2, :. Z k, :. Z elm) | |
(Monad m, ExtractValue m (DIM2 -> ScalarM elm), ~ * (Asor (DIM2 -> ScalarM elm)) k, ~ * (Elem (DIM2 -> ScalarM elm)) elm) => StreamGen m (DIM2 -> ScalarM elm) (DIM2, :. Z k, :. Z elm) | |
(Monad m, ExtractValue m (DIM2 -> Scalar elm), ~ * (Asor (DIM2 -> Scalar elm)) k, ~ * (Elem (DIM2 -> Scalar elm)) elm) => StreamGen m (DIM2 -> Scalar elm) (DIM2, :. Z k, :. Z elm) | |
(Monad m, ExtractValue m (MArr0 s sh (Vector elm)), ~ * (Asor (MArr0 s sh (Vector elm))) k, ~ * (Elem (MArr0 s sh (Vector elm))) elm) => StreamGen m (MArr0 s sh (Vector elm)) (DIM2, :. Z k, :. Z elm) | |
(Monad m, ExtractValue m (MArr0 s sh elm), ~ * (Asor (MArr0 s sh elm)) k, ~ * (Elem (MArr0 s sh elm)) elm) => StreamGen m (MArr0 s sh elm) (DIM2, :. Z k, :. Z elm) | |
(Monad m, ExtractValue m ys, ~ * (Asor ys) cY, ~ * (Elem ys) eY, PreStreamGen m (Box mk step xs ys) (:. idx Int, :. adx cX, :. arg eX), ~ * (Idx2 _idx) idx) => StreamGen m (Box mk step xs ys) (:. idx Int, :. (:. adx cX) cY, :. (:. arg eX) eY) | two or more elements combined by NextTo (~~~), xs as anything, ys is monadic. |
PreStreamGen
class Monad m => PreStreamGen m s q | s -> q whereSource
Required by most StreamGen
instances just before extractStreamLast
is
called.
Monad m => PreStreamGen m (Arr0 sh (Vector elm)) (DIM2, Z, Z) | |
Monad m => PreStreamGen m (Arr0 sh elm) (DIM2, Z, Z) | |
Monad m => PreStreamGen m (DIM2 -> VectM elm) (DIM2, Z, Z) | |
Monad m => PreStreamGen m (DIM2 -> Vect elm) (DIM2, Z, Z) | |
Monad m => PreStreamGen m (DIM2 -> ScalarM elm) (DIM2, Z, Z) | |
Monad m => PreStreamGen m (DIM2 -> Scalar elm) (DIM2, Z, Z) | |
Monad m => PreStreamGen m (MArr0 s sh (Vector elm)) (DIM2, Z, Z) | |
Monad m => PreStreamGen m (MArr0 s sh elm) (DIM2, Z, Z) | |
(Monad m, ExtractValue m xs, ~ * (Asor xs) cX, ~ * (Elem xs) eX, PreStreamGen m (Box box2 box3 box1 xs) xsStack, ~ * (idxX, adxX, argX) xsStack, ~ * (:. (:. z0 Int) Int) idxX, ~ * ((idxX, adxX, argX) -> m (:. idxX Int, adxX, argX)) mk, ~ * ((:. idxX Int, adxX, argX) -> m (Step (:. idxX Int, adxX, argX) (:. idxX Int, adxX, argX))) step) => PreStreamGen m (Box mk step (Box box2 box3 box1 xs) ys) (:. idxX Int, :. adxX cX, :. argX eX) | Pre-stream generation for deeply nested boxes. |
(Monad m, ExtractValue m xs, ~ * (Asor xs) cX, ~ * (Elem xs) eX, PreStreamGen m xs xsStack, ~ * (idxX, adxX, argX) xsStack, ~ * (:. (:. z0 Int) Int) idxX, ~ * ((idxX, adxX, argX) -> m (:. idxX Int, adxX, argX)) mk, ~ * ((:. idxX Int, adxX, argX) -> m (Step (:. idxX Int, adxX, argX) (:. idxX Int, adxX, argX))) step) => PreStreamGen m (Box mk step xs ys) (:. idxX Int, :. adxX cX, :. argX eX) | the first two arguments from nextTo, monadic xs. |
singlePreStreamGen :: (Monad m, Num head, Ord head) => :. (:. Z head) head -> Stream m (:. (:. Z head) head, Z, Z)Source
Creates the single step on the left which does nothing more then set the outermost indices to (i,j). This does not use the alpha/omega's
ExtractValue: extract values from data structures.
class Monad m => ExtractValue m cnt whereSource
extractValue :: cnt -> DIM2 -> Asor cnt -> m (Elem cnt)Source
extractStream :: cnt -> Stream m (Idx3 z, astack, vstack) -> Stream m (Idx3 z, astack :. Asor cnt, vstack :. Elem cnt)Source
extractStreamLast :: cnt -> Stream m (Idx2 z, astack, vstack) -> Stream m (Idx2 z, astack :. Asor cnt, vstack :. Elem cnt)Source
(Monad m, Prim elm, Unbox elm, ~ * DIM2 sh) => ExtractValue m (Arr0 sh (Vector elm)) | vector-based cells |
Monad m => ExtractValue m (DIM2 -> Stream m elm) | This instance is a bit crazy, since the accessor is the current stream itself. No idea how efficient this is (need to squint at CORE), but I plan to use it for backtracking only. TODO Using this instance tends to break to optimizer ;-) -- don't use it yet! |
Monad m => ExtractValue m (DIM2 -> ScalarM (m elm)) | Function with monadic |
Monad m => ExtractValue m (DIM2 -> Scalar elm) | Function with |
(Monad m, Prim elm, ~ * DIM2 sh) => ExtractValue m (Arr0 sh elm) | Immutable arrays. |
(PrimMonad m, Prim elm, Unbox elm, ~ * (PrimState m) s, ~ * DIM2 sh) => ExtractValue m (MArr0 s sh (Vector elm)) | Instance of boxed array with vector-valued cells. We assume that we want
to store multiple results for each cell. If the intent is to store one
scalar result, use the |
(PrimMonad m, Prim elm, ~ * (PrimState m) s, ~ * DIM2 sh) => ExtractValue m (MArr0 s sh elm) | Mutable arrays. |
Apply function f
with arguments on a stack x
.
Apply (:. Z a -> res) | |
Apply (:. (:. Z a) b -> res) | |
Apply (:. (:. (:. Z a) b) c -> res) | |
Apply (:. (:. (:. (:. Z a) b) c) d -> res) | |
Apply (:. (:. (:. (:. (:. Z a) b) c) d) e -> res) | |
Apply (:. (:. (:. (:. (:. (:. Z a) b) c) d) e) f -> res) | |
Apply (:. (:. (:. (:. (:. (:. (:. Z a) b) c) d) e) f) g -> res) | |
Apply (:. (:. (:. (:. (:. (:. (:. (:. Z a) b) c) d) e) f) g) h -> res) | |
Apply (:. (:. (:. (:. (:. (:. (:. (:. (:. Z a) b) c) d) e) f) g) h) i -> res) | |
Apply (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. Z a) b) c) d) e) f) g) h) i) j -> res) | |
Apply (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. Z a) b) c) d) e) f) g) h) i) j) k -> res) | |
Apply (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. Z a) b) c) d) e) f) g) h) i) j) k) l -> res) | |
Apply (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. Z a) b) c) d) e) f) g) h) i) j) k) l) m -> res) | |
Apply (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. Z a) b) c) d) e) f) g) h) i) j) k) l) m) n -> res) | |
Apply (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. (:. Z a) b) c) d) e) f) g) h) i) j) k) l) m) n) o -> res) |
helper stuff
Box mk step xs ys |
(Monad m, ExtractValue m xs, ~ * (Asor xs) cX, ~ * (Elem xs) eX, PreStreamGen m (Box box2 box3 box1 xs) xsStack, ~ * (idxX, adxX, argX) xsStack, ~ * (:. (:. z0 Int) Int) idxX, ~ * ((idxX, adxX, argX) -> m (:. idxX Int, adxX, argX)) mk, ~ * ((:. idxX Int, adxX, argX) -> m (Step (:. idxX Int, adxX, argX) (:. idxX Int, adxX, argX))) step) => PreStreamGen m (Box mk step (Box box2 box3 box1 xs) ys) (:. idxX Int, :. adxX cX, :. argX eX) | Pre-stream generation for deeply nested boxes. |
(Monad m, ExtractValue m xs, ~ * (Asor xs) cX, ~ * (Elem xs) eX, PreStreamGen m xs xsStack, ~ * (idxX, adxX, argX) xsStack, ~ * (:. (:. z0 Int) Int) idxX, ~ * ((idxX, adxX, argX) -> m (:. idxX Int, adxX, argX)) mk, ~ * ((:. idxX Int, adxX, argX) -> m (Step (:. idxX Int, adxX, argX) (:. idxX Int, adxX, argX))) step) => PreStreamGen m (Box mk step xs ys) (:. idxX Int, :. adxX cX, :. argX eX) | the first two arguments from nextTo, monadic xs. |
(Monad m, ExtractValue m ys, ~ * (Asor ys) cY, ~ * (Elem ys) eY, PreStreamGen m (Box mk step xs ys) (:. idx Int, :. adx cX, :. arg eX), ~ * (Idx2 _idx) idx) => StreamGen m (Box mk step xs ys) (:. idx Int, :. (:. adx cX) cY, :. (:. arg eX) eY) | two or more elements combined by NextTo (~~~), xs as anything, ys is monadic. |
wrappers for functions instead of arrays as arguments. It can be much
Monad m => ExtractValue m (DIM2 -> Scalar elm) | Function with |
Monad m => PreStreamGen m (DIM2 -> Scalar elm) (DIM2, Z, Z) | |
(Monad m, ExtractValue m (DIM2 -> Scalar elm), ~ * (Asor (DIM2 -> Scalar elm)) k, ~ * (Elem (DIM2 -> Scalar elm)) elm) => StreamGen m (DIM2 -> Scalar elm) (DIM2, :. Z k, :. Z elm) |
Monad m => ExtractValue m (DIM2 -> ScalarM (m elm)) | Function with monadic |
Monad m => PreStreamGen m (DIM2 -> ScalarM elm) (DIM2, Z, Z) | |
(Monad m, ExtractValue m (DIM2 -> ScalarM elm), ~ * (Asor (DIM2 -> ScalarM elm)) k, ~ * (Elem (DIM2 -> ScalarM elm)) elm) => StreamGen m (DIM2 -> ScalarM elm) (DIM2, :. Z k, :. Z elm) |