packages feed

semiring-0.3: Data/Semiring/ViterbiNBestDerivation.hs

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, TypeSynonymInstances, FlexibleInstances #-}
module Data.Semiring.ViterbiNBestDerivation where
import Data.Semiring
import Data.List 
import Data.Semiring.Viterbi
import Data.Semiring.ViterbiNBest
import Data.Semiring.Prob
import Data.Semiring.Derivation

-- | The 'ViterbiNBestDerivation' is an example of a more complicated semiring
--   built up from smaller components. It keeps track of the top N scoring paths 
--   along with their derivations.
-- 
-- > type ViterbiNBestDerivation n m = ViterbiNBest n (Weighted Prob (Derivation m))
type ViterbiNBestDerivation n m = ViterbiNBest n (Weighted Prob (Derivation m))


-- | The 'ViterbiDerivation' is a simpler semiring. It just keeps track of the best 
--   scoring path and it's derivation.
--  
-- > type ViterbiDerivation m  = Viterbi (Weighted Prob (Derivation m))
type ViterbiDerivation p m  = Viterbi (Weighted p (Derivation m))

class BestScorer d s a | a -> d, a -> s where 
    getBestDerivation :: a -> d 
    getBestScore :: a -> s

instance (Monoid m, WeightedSemiring p) => BestScorer m p (ViterbiDerivation p m) where
    getBestDerivation = fromDerivation . getInfo . fromViterbi
    getBestScore = getWeight . fromViterbi
--getBestDerivation :: (Monoid m, WeightedSemiring p) => ViterbiDerivation p m -> m


--getBestScore :: (Monoid m, WeightedSemiring p) => ViterbiDerivation p m -> p