module Data.CRF.Chain1.Constrained.DAG.Feature.Present
( presentFeats
, presentOFeats
, presentTFeats
, presentSFeats
) where
import Data.DAG (DAG)
import qualified Data.DAG as DAG
import Data.CRF.Chain1.Constrained.Core (X, Y, Lb, Feature)
import qualified Data.CRF.Chain1.Constrained.Core as C
presentOFeats :: [DAG a (X, Y)] -> [Feature]
presentOFeats =
concatMap sentOFeats
where
sentOFeats dag =
[ C.OFeature o x
| edgeID <- DAG.dagEdges dag
, let edgeLabel = DAG.edgeLabel edgeID dag
, o <- C.unX (fst edgeLabel)
, x <- lbs (snd edgeLabel) ]
presentTFeats :: [DAG a Y] -> [Feature]
presentTFeats =
concatMap sentTFeats
where
sentTFeats dag =
[ C.TFeature x y
| edgeID <- DAG.dagEdges dag
, x <- lbs (DAG.edgeLabel edgeID dag)
, prevEdgeID <- DAG.prevEdges edgeID dag
, y <- lbs (DAG.edgeLabel prevEdgeID dag) ]
presentSFeats :: [DAG a Y] -> [Feature]
presentSFeats =
concatMap sentSFeats
where
sentSFeats dag =
[ C.SFeature x
| edgeID <- DAG.dagEdges dag
, DAG.isInitialEdge edgeID dag
, x <- lbs (DAG.edgeLabel edgeID dag) ]
presentFeats :: [DAG a (X, Y)] -> [Feature]
presentFeats ds
= presentOFeats ds
++ presentTFeats (map (fmap snd) ds)
++ presentSFeats (map (fmap snd) ds)
lbs :: Y -> [Lb]
lbs = map fst . C.unY