ADPfusion-0.0.1.1: Efficient, high-level dynamic programming.

Safe HaskellSafe-Infered

ADP.Fusion

Contents

Description

Pure combinators along the lines of original ADP. We simply re-export the monadic interface without the monadic function application combinator.

Synopsis

Documentation

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.

Methods

streamGen :: t -> DIM2 -> Stream m rSource

Instances

(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 cntY, ~ * (Asor cntY) cY, ~ * (Elem cntY) eY, ~ * cntY ys, 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.

Methods

preStreamGenSource

Arguments

:: s

the composite type of the arguments

-> DIM2

the original index (Z:.i:.j)

-> Stream m q

the stream we get out of it

Instances

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 cntX, ~ * (Asor cntX) cX, ~ * (Elem cntX) eX, ~ * cntX xs, 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 cntX, ~ * (Asor cntX) cX, ~ * (Elem cntX) eX, ~ * cntX xs, 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

Associated Types

type Asor cnt :: *Source

type Elem cnt :: *Source

Methods

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

Instances

(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 Scalar return value.

Monad m => ExtractValue m (DIM2 -> Scalar elm)

Function with Scalar return value.

(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 Scalar wrapper.

(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.

class Apply x whereSource

Associated Types

type Fun x :: *Source

Methods

apply :: Fun x -> xSource

Instances

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

data Box mk step xs ys Source

Constructors

Box mk step xs ys 

Instances

(Monad m, ExtractValue m cntX, ~ * (Asor cntX) cX, ~ * (Elem cntX) eX, ~ * cntX xs, 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 cntX, ~ * (Asor cntX) cX, ~ * (Elem cntX) eX, ~ * cntX xs, 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 cntY, ~ * (Asor cntY) cY, ~ * (Elem cntY) eY, ~ * cntY ys, 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.

type Idx3 z = ((z :. Int) :. Int) :. IntSource

type Idx2 z = (z :. Int) :. IntSource

wrappers for functions instead of arrays as arguments. It can be much

newtype Scalar a Source

Constructors

Scalar 

Fields

unScalar :: a
 

Instances

Monad m => ExtractValue m (DIM2 -> Scalar elm)

Function with Scalar return value.

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) 

newtype ScalarM a Source

Constructors

ScalarM 

Fields

unScalarM :: a
 

Instances

Monad m => ExtractValue m (DIM2 -> ScalarM (m elm))

Function with monadic Scalar return value.

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) 

newtype Vect a Source

Constructors

Vect 

Fields

unVect :: a
 

Instances

Monad m => PreStreamGen m (DIM2 -> Vect elm) (DIM2, Z, Z) 
(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) 

newtype VectM a Source

Constructors

VectM 

Fields

unVectM :: a
 

Instances

Monad m => PreStreamGen m (DIM2 -> VectM elm) (DIM2, Z, Z) 
(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)