@@ -12,17 +12,52 @@ import Dagger
12
12
import Dagger: DTask, Chunk, Processor
13
13
import Dagger. TimespanLogging: Timespan
14
14
15
- function logs_to_df (logs:: Dict )
16
- df = DataFrame (proc= Processor[], proc_name= String[], tid= Int[], t_start= UInt64[], t_end= UInt64[])
15
+ _name_to_color (name:: AbstractString , colors) =
16
+ colors[mod1 (hash (name), length (colors))]
17
+ _name_to_color (name:: AbstractString , :: Nothing ) = " black"
18
+ _default_colors = [" red" , " orange" , " green" , " blue" , " purple" , " pink" , " silver" ]
19
+
20
+ function logs_to_df (logs:: Dict ; colors= _default_colors, name_to_color= _name_to_color, color_by= :fn )
21
+ if color_by == :fn
22
+ # Generate function names
23
+ fn_names = Dict {Int, String} ()
24
+ for w in keys (logs)
25
+ for idx in 1 : length (logs[w][:core ])
26
+ category = logs[w][:core ][idx]. category:: Symbol
27
+ kind = logs[w][:core ][idx]. kind:: Symbol
28
+ if category == :add_thunk && kind == :start
29
+ tid = logs[w][:id ][idx]. thunk_id:: Int
30
+ if haskey (logs[w], :tasknames )
31
+ fn_names[tid] = first (split (logs[w][:tasknames ][idx]:: String , ' ' ))
32
+ else
33
+ @warn " Task names missing from logs"
34
+ fn_names[tid] = " "
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+
41
+ # FIXME : Color eltype
42
+ df = DataFrame (proc= Processor[], proc_name= String[], tid= Int[], t_start= UInt64[], t_end= UInt64[], color= Any[])
17
43
Dagger. logs_event_pairs (logs) do w, start_idx, finish_idx
18
44
category = logs[w][:core ][start_idx]. category
19
45
if category == :compute
20
- proc = logs[w][:id ][start_idx]. processor
46
+ proc = logs[w][:id ][start_idx]. processor:: Processor
21
47
proc_name = Dagger. short_name (proc)
22
- tid = logs[w][:id ][start_idx]. thunk_id
23
- t_start = logs[w][:core ][start_idx]. timestamp
24
- t_end = logs[w][:core ][finish_idx]. timestamp
25
- push! (df, (;proc, proc_name, tid, t_start, t_end))
48
+ tid = logs[w][:id ][start_idx]. thunk_id:: Int
49
+ fn_name = get (fn_names, tid, " unknown" )
50
+ t_start = logs[w][:core ][start_idx]. timestamp:: UInt64
51
+ t_end = logs[w][:core ][finish_idx]. timestamp:: UInt64
52
+ if color_by == :fn
53
+ fn_name = fn_names[tid]
54
+ color = name_to_color (fn_name, colors)
55
+ elseif color_by == :proc
56
+ color = name_to_color (proc_name, colors)
57
+ else
58
+ throw (ArgumentError (" Invalid color_by value: $(repr (color_by)) " ))
59
+ end
60
+ push! (df, (;proc, proc_name, tid, t_start, t_end, color))
26
61
end
27
62
end
28
63
return df
72
107
73
108
Render a Gantt chart of task execution in `logs` using Plots. `kwargs` are passed to `plot` directly.
74
109
"""
75
- function Dagger. render_logs (logs:: Dict , :: Val{:plots_gantt} ; kwargs... )
76
- df = logs_to_df (logs)
110
+ function Dagger. render_logs (logs:: Dict , :: Val{:plots_gantt} ;
111
+ colors= _default_colors, name_to_color= _name_to_color,
112
+ color_by= :fn , kwargs... )
113
+ df = logs_to_df (logs; colors, name_to_color, color_by)
77
114
78
115
rect (w, h, x, y) = Shape (x .+ [0 ,w,w,0 ], y .+ [0 ,0 ,h,h])
79
116
@@ -85,8 +122,7 @@ function Dagger.render_logs(logs::Dict, ::Val{:plots_gantt}; kwargs...)
85
122
dy = Dict (u .=> 1 : length (u))
86
123
r = [rect (t1, 1 , t2, dy[t3]) for (t1,t2,t3) in zip (duration, t_start, df. proc_name)]
87
124
88
- # FIXME : Colors
89
- return plot (r; #= c=permutedims(df.color),=# yticks= (1.5 : (nrow (df) + 0.5 ), u), xlabel= " Time (seconds)" , ylabel= " Processor" , labels= false , kwargs... )
125
+ return plot (r; color= permutedims (df. color), yticks= (1.5 : (nrow (df) + 0.5 ), u), xlabel= " Time (seconds)" , ylabel= " Processor" , labels= false , kwargs... )
90
126
end
91
127
92
128
end # module PlotsExt
0 commit comments