Thank you. I'm still curious why other (named) expressions don't show up. I'm running the profiler again now and they DO. Odd...
God this is embarrassing... it's horrible code, I don't know monads yet and EM makes more sense in an imperative paradigm, but I felt like pushing the envelope and failed miserably lol. Anyways:
e_step ttable (fsentence, esentence) (counts, totals) =
let
ewords = {-# SCC "ewords" -#} T.words esentence
fwords = {-# SCC "fwords" -#} T.words fsentence
-- calculate s-total(e) map
sTotal = {-# SCC "sTotal" -#} foldr (update_sTotal fwords) M.empty ewords
update_sTotal fwords e sTotal = {-# SCC "update_sTotal" -#}
foldr (\f sTotal ->
M.insertWith (+) e (getProb f e ttable) sTotal)
sTotal fwords
-- helpers for updating counts
update_counts counts e f sTotal = {-# SCC "update_counts" -#}
let !adding = (getProb f e ttable) / (sTotal M.! e)
in M.insertWith (M.unionWith (+)) f (M.singleton e adding) counts
update_totals totals e f sTotal = {-# SCC "update_totals" -#}
let !adding = (getProb f e ttable) / (sTotal M.! e)
in M.insertWith' (+) f adding totals
in {-# SCC "folds" -#}
-- update counts by iterating over words
foldr (\f (!counts, !totals) ->
foldr (\e (!counts, !totals) ->
let !newCounts = update_counts counts e f sTotal
!newTotals = update_totals totals e f sTotal
in (newCounts, newTotals))
(counts, totals) ewords)
(counts, totals) fwords