module Activity (activityGraph,Activity(..)) where
import GRIP
import StdLib
import PSlib
import Graph
import Parse
activityGraph ordering selectpes statFile =
--show (pes,ticks) ++
--show "DEBUG " ++ show (aggs) ++
initGraph "Processor Activity Graph"
(pes,selectpes) (ticks*100,100) ("Time (ms)","% Activity")
(map f ordering)
++ scale (my_fromInt dimX/my_fromInt 100)
(my_fromInt dimY/my_fromInt (maxticks))
++ concat (map2 plotCurve (map colour order)
(outlinesTrace traces))
where
f a = (colour a,display a,aggr a aggs)
active = if selectpes==[] then length pes-1 else length selectpes
maxticks = active*ticks
(pes,ticks,orderedStats) = getParameters stats
(traces,aggs) = (akkumulate (processAct (map extractor order)) nullstate.
gatherAct (Act 0 0 0 0 0 0).
map (scaleAct ticks).
getAct selectpes) orderedStats
order = reverse ordering
stats = parseFile statFile
processAct :: [Activities->Int] -> State -> Activities -> (Trace,State)
processAct extractors (i,r,g,f,t) a@(Act n i' r' g' f' t')
= (trace, (i'+i,r'+r,g'+g,f'+f,t+t'))
where
trace@(T _ (m:_)) = makeTrace extractors n a
makeTrace fs n s = T n (f fs)
where
f [] = []
f ex@(e:es) = sum (pam ex s):f es
type State = (Int,Int,Int,Int,Int)
nullstate = (0,0,0,0,0)
data Trace = T Int [Int]
outlinesTrace :: [Trace] -> [[Point]]
outlinesTrace [T n a] = map (\x->[Pt n x]) a
outlinesTrace (T n a:more) = map2 (:) (map (\x->Pt n x) a) (outlinesTrace more)
aggr IDLE (i,_,_,_,t) = printFloat (percentage i t) ++ "%"
aggr REDN (_,r,_,_,t) = printFloat (percentage r t) ++ "%"
aggr GC (_,_,g,_,t) = printFloat (percentage g t) ++ "%"
aggr FLUSH (_,_,_,f,t) = printFloat (percentage f t) ++ "%"
percentage x y = my_fromInt x * 100 / my_fromInt y
gatherAct :: Activities -> [Activities] -> [Activities]
gatherAct t [] = [t,(Act (numberAct t+1) 0 0 0 0 0)]
gatherAct t l@(a:as) | numberAct t==numberAct a = gatherAct (addAct t a) as
| otherwise = t:gatherAct (Act (n+1) 0 0 0 0 0) l
where n=numberAct t
pam [] _ = []
pam (f:fs) a = f a:pam fs a
data Activity = REDN | IDLE | FLUSH | GC deriving (Eq)
extractor REDN = reduction
extractor IDLE = idle
extractor GC = gc
extractor FLUSH = flush
colour REDN = 0
colour IDLE = 8
colour FLUSH = 5
colour GC = 2
instance Parse Activity where
parseType ('R':string) = (REDN,string)
parseType ('G':string) = (GC,string)
parseType ('F':string) = (FLUSH,string)
parseType ('I':string) = (IDLE,string)
parseType (string) = error ("No such Activity : "++show string++"\n")
display REDN = "Reduction"
display GC = "Garbage Collection"
display FLUSH = "Flush Read/Write"
display IDLE = "Idle"
addAct (Act _ a b c d t1) (Act n e f g h t2) = Act n (a+e) (b+f) (c+g) (d+h) (t1+t2)
|