module Spark(sparkGraph,Spark(..)) where
import StdLib
import GRIP
import PSlib
import Graph
import Parse
sparkGraph ordering selectpes statFile = initGraph "Spark Activity Graph" (pes,selectpes)
(100*ticks,height) ("Time (ms)", "Sparks")
(map f ordering)
++ scale (my_fromInt dimX/my_fromInt 100)
(my_fromInt dimY/my_fromInt height)
++ concat (map2 plotCurve (map colourSpark order)
(outlinesTrace traces))
where
f a = (colourSpark a,displaySpark a,aggr a aggs)
(pes,ticks,orderedStats) = getParameters stats
height = axisScale h
(traces,(aggs,h,w)) = akkumulate(processSparks (map extractor order)) nullstate
(gatherSp (Sp 0 0 0 0 0) (getSp selectpes orderedStats))
order = reverse ordering
stats = parseFile statFile
processSparks :: [Sparks->Int] -> State -> Sparks -> (Trace,State)
processSparks extractors ((c,u,r,l),graphmax,_) s@(Sp n c' u' r' l')
= (trace,
((c'+c,u'+u,r'+r,l'+l),max graphmax m,n))
where
trace@(T _ (m:_)) = makeTrace extractors n s
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,Int)
nullstate = ((0,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)
pam [] _ = []
pam (f:fs) a = f a:pam fs a
gatherSp t [] = [t,(Sp (numberSp t+1) 0 0 0 0)]
gatherSp t l@(a:as) | numberSp t==numberSp a = gatherSp (addSparks t a) as
| otherwise = t:gatherSp (Sp (n+1) 0 0 0 0) l
where n=numberSp t
addSparks (Sp n a b c d) (Sp _ e f g h) = Sp n (a+e) (b+f) (c+g) (d+h)
data Spark = USED | RESUMED | CREATED | LOST deriving (Eq)
aggr :: Spark -> (Int,Int,Int,Int) -> String
aggr CREATED (i,_,_,_) = show i
aggr USED (_,r,_,_) = show r
aggr RESUMED (_,_,g,_) = show g
aggr LOST (_,_,_,f) = show f
extractor LOST = lost
extractor CREATED = created
extractor RESUMED = resumed
extractor USED = used
colourSpark :: Spark -> Int
colourSpark LOST = 8
colourSpark CREATED = 5
colourSpark RESUMED = 2
colourSpark USED = 0
displaySpark :: Spark -> String
displaySpark LOST = "Sparks Lost"
displaySpark CREATED = "Sparks Created"
displaySpark RESUMED = "Resumed Sparks"
displaySpark USED = "Used Sparks"
instance Parse Spark where
parseType ('L':string) = (LOST,string)
parseType ('C':string) = (CREATED,string)
parseType ('R':string) = (RESUMED,string)
parseType ('U':string) = (USED,string)
parseType (string) = error ("No such Activity : "++show string++"\n")
|