module NLP.Semiring.ViterbiNBest where
import NLP.Semiring
import NLP.Semiring.Helpers
import Data.List
class N a where
mkN :: a
n :: a -> Int
data ViterbiNBest n semi = ViterbiNBest [semi]
deriving (Eq, Show)
instance (N n, Ord semi, WeightedSemiring semi) => Multiplicative (ViterbiNBest n semi) where
one = ViterbiNBest [one]
times (ViterbiNBest a) (ViterbiNBest b) =
ViterbiNBest $
take (n (mkN::n)) $
reverse $ sort $
map (uncurry times) $ cartesian a b
instance (N n, WeightedSemiring semi, Ord semi) => Monoid (ViterbiNBest n semi) where
mempty = ViterbiNBest []
mappend (ViterbiNBest a) (ViterbiNBest b) =
ViterbiNBest $ take (n (mkN::n)) $ reverse $ sort (a ++ b)
instance (N n, WeightedSemiring semi, Ord semi) => Semiring (ViterbiNBest n semi)
data Ten = Ten
instance N Ten where
mkN = Ten
n _ = 10
type Viterbi10Best semi = ViterbiNBest Ten semi