Strategic profile of soda

Strategic profile of soda

Click on the above gif to reveal the original PostScript of the profile.

Note that in the above profile the main thread has been adjusted to finish at the same time as the longest running non-root thread. This was done in order to remove output time from the profile.

------------------------------------------------------------------
-- Searching in a grid of words for hidden words oriented in any of
-- the 8 possible directions.
-- Colin Runciman, May 1984 (Haskell version June 1993)
-- Version 6 -- search parallel lines in parallel
------------------------------------------------------------------
 
module Main(main) where
 
import Strategies
import List (transpose)
import Char (ord) 
 
main :: IO ()
main = print prog_result


prog_result = sum_it ((concat (map find hidden
				`using` markStrat "find" (parList rnf)))
		`using` markStrat "d_||_dl_||_ul" strategy)
    where
    sum_it xs = xs -- rnf xs `seq` () -- foldr (\c n -> n+(ord c)-64) 0 xs
    strategy result = rnf d `par` rnf dl `par` rnf ul `par` rnf result
    find word = word ++ " " ++ concat dirs ++ "\n"
        where
        dirs = map snd lists
	lists = forw ++ back `using` markStrat "(++)" strat2
        strat2 r = rnf back `par` rnf forw `par` rnf r
        forw = filter (\(as,b) -> or (map (contains word) as
					`using` markStrat "forw" (parList rnf)))
               [(r,"right "), (d,"down "), (dl,"downleft "), (ul,"upleft ")]
        back = filter (\(as,b) -> or (map (contains drow) as
					`using` markStrat "back" (parList rnf)))
               [(r,"left "), (d,"up "), (dl,"upright "), (ul,"downright ")]
        drow = reverse word
    r  = grid
    d  = transpose grid
    dl = diagonals grid
    ul = diagonals (reverse grid)


-------------------------------------------------------------------------------- 
 
diagonals [r] = map (:[]) r
diagonals (r:rs) = zipinit r ([]:diagonals rs)
 
zipinit [] ys = ys
zipinit (x:xs) (y:ys) = (x : y) : zipinit xs ys
 
contains xs ys = any (prefix xs) (suffixes ys)
 
suffixes [] = []
suffixes xs = xs : suffixes (tail xs) 
 
prefix [] ys = True
prefix xs [] = False
prefix (x:xs) (y:ys) = x == y && prefix xs ys
 
grid =
   [['Y', 'I', 'O', 'M', 'R', 'E', 'S', 'K', 'S', 'T'],
    ['A', 'E', 'H', 'Y', 'G', 'E', 'H', 'E', 'D', 'W'],
    ['Z', 'F', 'I', 'A', 'C', 'N', 'I', 'T', 'I', 'A'],
    ['N', 'T', 'O', 'C', 'O', 'M', 'V', 'O', 'O', 'R'],
    ['E', 'R', 'D', 'L', 'O', 'C', 'E', 'N', 'S', 'M'],
    ['Z', 'O', 'U', 'R', 'P', 'S', 'R', 'N', 'D', 'A'],
    ['O', 'Y', 'A', 'S', 'M', 'O', 'Y', 'E', 'D', 'L'],
    ['R', 'N', 'D', 'E', 'N', 'L', 'O', 'A', 'I', 'T'],
    ['F', 'I', 'W', 'I', 'N', 'T', 'E', 'R', 'R', 'C'],
    ['F', 'E', 'Z', 'E', 'E', 'R', 'F', 'T', 'F', 'I'],
    ['I', 'I', 'D', 'T', 'P', 'H', 'U', 'B', 'R', 'L'],
    ['C', 'N', 'O', 'H', 'S', 'G', 'E', 'I', 'O', 'N'],
    ['E', 'G', 'M', 'O', 'P', 'S', 'T', 'A', 'S', 'O'],
    ['T', 'G', 'F', 'F', 'C', 'I', 'S', 'H', 'T', 'H'],
    ['O', 'T', 'B', 'C', 'S', 'S', 'N', 'O', 'W', 'I']]
 
hidden =
  ["COSY", "SOFT", "WINTER", "SHIVER", "FROZEN", "SNOW",
   "WARM", "HEAT", "COLD",   "FREEZE", "FROST",  "ICE" ]


David J. King
d.j.king@open.ac.uk