{-# LANGUAGE ScopedTypeVariables #-}

module NLP.Probability.EM where 
import NLP.Probability.Observation
import NLP.Probability.ConditionalDistribution
import Control.Monad.Random
import Control.Monad (liftM)
import Data.Monoid

randomCounts :: (Bounded event, Enum event, Event event, MonadRandom mr) => 
                mr (Counts event)  
randomCounts = do
  rcounts <- mapM (\e -> do {r <- getRandomR (1, 10); return (e,r)}) [minBound..maxBound]
  return $ mconcat $ map (uncurry observations) rcounts  

randomCondCounts :: (Bounded event, Enum event , Event event ,
                     Bounded context, Enum context, Context context,
                    MonadRandom mr) => [context] -> mr (CondObserved event context)
randomCondCounts contexts =  do
  let r = randomCounts
  condcounts <- mapM (\context -> condObservationCounts context `liftM` r) contexts
  return $ mconcat condcounts