On Wed, Feb 15, 2012 at 9:51 PM, Thomas Schilling <nominolo@googlemail.com> wrote:
On 15 February 2012 16:17, Dan Maftei <ninestraycats@gmail.com> wrote:
>
> 1 When profiling my code with -auto-all, my .prof file names some sub-expressions with a backslash. Cf. below. What are these?
>
>      e_step
>       e_step.ewords
>       e_step.\
>        e_step.\.\
>         e_step.update_counts
>       e_step.fwords
>

Yup, those are anonymous functions.

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...
 

>
> 2. A related question: I tried using the SCC pragma instead of auto-all. I added it to all seven expressions inside the let, and to the nested folds. However, only two showed up in the .prof file! How come?

It would be helpful if you pasted the code.  I think SCC pragmas
around lambdas get ignored and you should put them inside.  (It may be
the other way around, though.)

 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