module Language.Paraiso.POM
(
POM(..), makePOM, mapGraph
) where
import qualified Algebra.Ring as Ring
import qualified Control.Monad as Monad
import Language.Paraiso.OM.Builder (Builder, makeKernel)
import Language.Paraiso.OM.Graph
import Language.Paraiso.Tensor
import NumericPrelude
data (Vector vector, Ring.C gauge) => POM vector gauge a =
POM {
pomName :: Name,
setup :: Setup vector gauge,
kernels :: [Kernel vector gauge a]
}
deriving (Show)
instance (Vector v, Ring.C g) => Nameable (POM v g a) where
name = pomName
instance (Vector v, Ring.C g) => Monad.Functor (POM v g) where
fmap = mapGraph . nmap
mapGraph :: (Vector v, Ring.C g) =>
(Graph v g a -> Graph v g b)
-> POM v g a
-> POM v g b
mapGraph f pom = pom
{ kernels = map
(\kern -> kern{dataflow = f $ dataflow kern}) $
kernels pom}
makePOM :: (Vector v, Ring.C g) =>
Name
-> (Setup v g)
-> [(Name, Builder v g ())]
-> POM v g ()
makePOM name0 setup0 kerns =
POM {
pomName = name0,
setup = setup0,
kernels = map (\(n,b) -> makeKernel setup0 n b) kerns
}