module Language.Paraiso.OM.Graph
(
Setup(..), Kernel(..), Graph, nmap, getA,
Annotation(..),
Node(..), Edge(..),
Inst(..),
module Language.Paraiso.Name
)where
import qualified Algebra.Ring as Ring
import Data.Dynamic
import qualified Data.Graph.Inductive as FGL
import Language.Paraiso.Name
import Language.Paraiso.OM.Arithmetic as A
import Language.Paraiso.OM.Reduce as R
import Language.Paraiso.OM.DynValue
import Language.Paraiso.Tensor
import NumericPrelude
data (Vector vector, Ring.C gauge) => Setup vector gauge =
Setup {
staticValues :: [Named DynValue]
} deriving (Eq, Show)
data (Vector vector, Ring.C gauge) => Kernel vector gauge a =
Kernel {
kernelName :: Name,
dataflow :: Graph vector gauge a
}
deriving (Show)
instance (Vector v, Ring.C g) => Nameable (Kernel v g a) where
name = kernelName
type Graph vector gauge a = FGL.Gr (Node vector gauge a) Edge
nmap :: (Vector v, Ring.C g) => (a -> b) -> Graph v g a -> Graph v g b
nmap f = let
nmap' f0 (NValue x a0) = (NValue x $ f0 a0)
nmap' f0 (NInst x a0) = (NInst x $ f0 a0)
in FGL.nmap (nmap' f)
data Node vector gauge a =
NValue DynValue a |
NInst (Inst vector gauge) a
deriving (Show)
data Edge =
EUnord |
EOrd Int deriving (Eq, Ord, Show)
getA :: Node v g a -> a
getA nd = case nd of
NValue _ x -> x
NInst _ x -> x
instance (Vector v, Ring.C g) => Functor (Node v g) where
fmap f (NValue x y) = (NValue x (f y))
fmap f (NInst x y) = (NInst x (f y))
data Inst vector gauge =
Imm Dynamic |
Load Name |
Store Name |
Reduce R.Operator |
Broadcast |
Shift (vector gauge) |
LoadIndex (Axis vector) |
Arith A.Operator
deriving (Show)
instance Arity (Inst vector gauge) where
arity a = case a of
Imm _ -> (0,1)
Load _ -> (0,1)
Store _ -> (1,0)
Reduce _ -> (1,1)
Broadcast -> (1,1)
Shift _ -> (1,1)
LoadIndex _ -> (0,1)
Arith op -> arity op
data Annotation = Comment String | Balloon
deriving (Eq, Ord, Read, Show)