{-# LANGUAGE GeneralizedNewtypeDeriving #-}

module Discokitty.Examples.LesJustesViterbi where

import qualified Data.Map                       as Map
import           Discokitty
import           Discokitty.Models.Vectorspaces
import qualified Discokitty.Multiwords          as M


-- Viterbi semiring
newtype Viterbi = Viterbi Double deriving (Eq, Show, Num, Ord)
instance Semiring Viterbi where
  plus = max
  mult = (*)
  unit = 1
  zero = 0

-- Reals -> Viterbi translation
v :: M.Multiword (Vectorspace u Double) -> M.Multiword (Vectorspace u Viterbi)
v = M.fromList . fmap (\ (x , p) -> (v' x , p) ) . M.toList
  where
    v' :: Words (Vectorspace u Double) -> Words (Vectorspace u Viterbi)
    v' w = w { meaning = v'' (meaning w) }

    v'' :: Vectorspace u Double -> Vectorspace u Viterbi
    v'' = fromMap . Map.map Viterbi . toMap