diff --git a/Project.toml b/Project.toml index 35b9dca..e75d326 100644 --- a/Project.toml +++ b/Project.toml @@ -6,7 +6,7 @@ version = "0.2.0" [deps] CoverageTools = "c36e975a-824b-4404-a568-ef97ca766997" CpuId = "adafc99b-e345-5852-983c-f28acb93d879" -Distributed = "8ba89e20-285c-5b6f-9357-94700520ee1b" +Malt = "36869731-bdee-424d-aa32-cab38c994e3b" Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" Profile = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" @@ -14,17 +14,24 @@ TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" [weakdeps] BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" Chairmarks = "0ca39b1e-fe0b-4e98-acfc-b1656634c4de" +Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" [extensions] BenchmarkToolsExt = "BenchmarkTools" +CSVExt = "CSV" ChairmarksExt = "Chairmarks" +MakieExt = "Makie" [compat] BenchmarkTools = "1.5" -Chairmarks = "1.2" -CoverageTools = "1" +CSV = "0.10" +Chairmarks = "1" +CoverageTools = "1.3.1" CpuId = "0.3.1" +Makie = "0.21" +Malt = "1.1.1" TypedTables = "1" julia = "1.9" diff --git a/ext/BenchmarkToolsExt/benchmark.jl b/ext/BenchmarkToolsExt/benchmark.jl index ea95daa..bc1571f 100644 --- a/ext/BenchmarkToolsExt/benchmark.jl +++ b/ext/BenchmarkToolsExt/benchmark.jl @@ -13,10 +13,13 @@ function PerfChecker.default_options(::Val{:benchmark}) ) end +PerfChecker.initpkgs(::Val{:benchmark}) = quote + using BenchmarkTools +end + function PerfChecker.check(d::Dict, block::Expr, ::Val{:benchmark}) quote d = $d - using BenchmarkTools return @benchmark $block samples=d[:samples] seconds=d[:seconds] evals=d[:evals] overhead=d[:overhead] gctrial=d[:gctrial] gcsample=d[:gcsample] time_tolerance=d[:time_tolerance] memory_tolerance=d[:memory_tolerance] end end diff --git a/ext/CSVExt/CSVExt.jl b/ext/CSVExt/CSVExt.jl new file mode 100644 index 0000000..b77bf99 --- /dev/null +++ b/ext/CSVExt/CSVExt.jl @@ -0,0 +1,10 @@ +module CSVExt + +using CSV +import TypedTables: Table + +table_to_csv(t::Table, path::String) = CSV.write(path, t) + +csv_to_table(path::String) = CSV.read(path, Table) + +end diff --git a/ext/ChairmarksExt/b.jl b/ext/ChairmarksExt/b.jl index d6770f6..292e9a9 100644 --- a/ext/ChairmarksExt/b.jl +++ b/ext/ChairmarksExt/b.jl @@ -9,10 +9,13 @@ function PerfChecker.default_options(::Val{:chairmark}) ) end +PerfChecker.initpkgs(::Val{:chairmark}) = quote + using Chairmarks +end + function PerfChecker.check(d::Dict, block::Expr, ::Val{:chairmark}) quote d = $d - using Chairmarks return @be $block evals=d[:evals] seconds=d[:seconds] samples=d[:samples] gc=d[:gc] end end diff --git a/ext/MakieExt/MakieExt.jl b/ext/MakieExt/MakieExt.jl new file mode 100644 index 0000000..1b8f704 --- /dev/null +++ b/ext/MakieExt/MakieExt.jl @@ -0,0 +1,11 @@ +module MakieExt + +using Makie +using TypedTables +using PerfChecker + +include("plotutils.jl") +include("allocs.jl") +include("bench.jl") + +end diff --git a/ext/MakieExt/allocs.jl b/ext/MakieExt/allocs.jl new file mode 100644 index 0000000..2436a12 --- /dev/null +++ b/ext/MakieExt/allocs.jl @@ -0,0 +1,65 @@ +function PerfChecker.table_to_pie(x::Table, ::Val{:alloc}; pkg_name = "") + data = x.bytes + paths = smart_paths(x.filenames)[2] .* " — line " .* string.(x.linenumbers) + percentage = data .* 100 ./ sum(data) + colors = make_colors(length(percentage)) + str = isempty(pkg_name) ? "" : " for $pkg_name" + f, ax, _ = pie( + data; + axis = (autolimitaspect = 1,), + color = colors, + inner_radius = 2, + radius = 4, + strokecolor = :white, + strokewidth = 5 + ) + ax.title = "Mallocs$str" + hidedecorations!(ax) + hidespines!(ax) + Legend(f[1, 2], [PolyElement(color = c) for c in colors], paths) + return f +end + +function PerfChecker.checkres_to_pie(x::PerfChecker.CheckerResult, ::Val{:alloc}) +end + +function PerfChecker.checkres_to_scatterlines( + x::PerfChecker.CheckerResult, ::Val{:alloc}; title = "") + di = Dict() + for i in eachindex(x.tables) + j = x.tables[i] + p = x.pkgs[i] + u = unique(j.filenames) + paths = smart_paths(u)[2] + for k in eachindex(u) + if haskey(di, paths[k]) + push!(di[paths[k]], (sum(j.bytes[j.filenames .== u[k]]), p.version)) + else + di[paths[k]] = [(sum(j.bytes[j.filenames .== u[k]]), p.version)] + end + end + end + + versions = Dict() + for i in eachindex(x.pkgs) + versions[x.pkgs[i].version] = i + end + + versionnums = [x.pkgs[i].version for i in eachindex(x.pkgs)] + f = Figure() + ax = Axis(f[1, 1]) + ax.xticks = (eachindex(versionnums), string.(versionnums)) + ax.xlabel = "versions" + ax.ylabel = "bytes" + colors = make_colors(length(keys(di))) + i = 1 + for (keys, values) in di + xs = [values[i][1] for i in eachindex(values)] + ys = [versions[values[i][2]] for i in eachindex(values)] + scatterlines!(f[1, 1], ys, xs, label = keys, color = (colors[i], 0.6)) + i += 1 + end + ax.title = x.pkgs[1].name + Legend(f[1, 2], ax) + return f +end diff --git a/ext/MakieExt/bench.jl b/ext/MakieExt/bench.jl new file mode 100644 index 0000000..8d5505d --- /dev/null +++ b/ext/MakieExt/bench.jl @@ -0,0 +1,44 @@ +function PerfChecker.checkres_to_scatterlines( + x::PerfChecker.CheckerResult, ::Val{:benchmark}) + println("Hello!") + @warn "Here!" +end + +function PerfChecker.checkres_to_boxplots( + x::PerfChecker.CheckerResult, ::Val{:benchmark}; kwarg = :times) + di = Dict() + data = [] + #for i in eachindex(x.tables) + #j = x.tables[i] + #p = x.pkgs[i] + #g = getproperties(j[i], (kwargs,)) + #g = [g[k][1] for k in eachindex(g)] + #push!((fill(i, length(g)), g)) + #end + + #= + w = getproperties(j[1], (:allocs,)) + versions = Dict() + for i in eachindex(x.pkgs) + versions[x.pkgs[i].version] = i + end + + versionnums = [x.pkgs[i].version for i in eachindex(x.pkgs)] + f = Figure() + ax = Axis(f[1, 1]) + ax.xticks = (eachindex(versionnums), string.(versionnums)) + ax.xlabel = "versions" + ax.ylabel = "bytes" + colors = make_colors(length(keys(di))) + i = 1 + for (keys, values) in di + xs = [values[i][1] for i in eachindex(values)] + ys = [versions[values[i][2]] for i in eachindex(values)] + scatterlines!(f[1,1], ys, xs, label = keys, color = (colors[i], 0.6)); i += 1 + end + ax.title = x.pkgs[1].name + Legend(f[1,2], ax) + return f + =# + return data +end diff --git a/ext/MakieExt/plotutils.jl b/ext/MakieExt/plotutils.jl new file mode 100644 index 0000000..a28a4f3 --- /dev/null +++ b/ext/MakieExt/plotutils.jl @@ -0,0 +1,24 @@ +function make_colors(l) + Makie.distinguishable_colors( + l, [Makie.RGB(1, 1, 1), Makie.RGB(0, 0, 0)], dropseed = true) +end + +function smart_paths(paths) + split_paths = map(splitpath ∘ normpath, paths) + + common = paths |> first |> dirname |> splitpath + for path in split_paths + to_pop = length(common) + for name in Iterators.zip(common, path) + name[1] == name[2] || break + to_pop -= 1 + end + foreach(_ -> pop!(common), 1:to_pop) + end + + for path in split_paths + foreach(_ -> popfirst!(path), 1:length(common)) + end + + return joinpath(common...), map(joinpath, split_paths) +end diff --git a/images/benchmark-memory.png b/images/benchmark-memory.png deleted file mode 100644 index 8062d6f..0000000 Binary files a/images/benchmark-memory.png and /dev/null differ diff --git a/perf/GLM/benchmarks/benchmark-memory.tikz b/perf/GLM/benchmarks/benchmark-memory.tikz deleted file mode 100644 index 53f448e..0000000 --- a/perf/GLM/benchmarks/benchmark-memory.tikz +++ /dev/null @@ -1,856 +0,0 @@ -% Recommended preamble: -% \usetikzlibrary{arrows.meta} -% \usetikzlibrary{backgrounds} -% \usepgfplotslibrary{patchplots} -% \usepgfplotslibrary{fillbetween} -% \pgfplotsset{% -% layers/standard/.define layer set={% -% background,axis background,axis grid,axis ticks,axis lines,axis tick labels,pre main,main,axis descriptions,axis foreground% -% }{ -% grid style={/pgfplots/on layer=axis grid},% -% tick style={/pgfplots/on layer=axis ticks},% -% axis line style={/pgfplots/on layer=axis lines},% -% label style={/pgfplots/on layer=axis descriptions},% -% legend style={/pgfplots/on layer=axis descriptions},% -% title style={/pgfplots/on layer=axis descriptions},% -% colorbar style={/pgfplots/on layer=axis descriptions},% -% ticklabel style={/pgfplots/on layer=axis tick labels},% -% axis background@ style={/pgfplots/on layer=axis background},% -% 3d box foreground style={/pgfplots/on layer=axis foreground},% -% }, -% } - -\begin{tikzpicture}[/tikz/background rectangle/.style={fill={rgb,1:red,1.0;green,1.0;blue,1.0}, draw opacity={1.0}}, show background rectangle] -\begin{axis}[point meta max={nan}, point meta min={nan}, legend cell align={left}, legend columns={1}, title={Benchmarks (memory) evolution in -GLM.jl}, title style={at={{(0.5,1)}}, anchor={south}, font={{\fontsize{14 pt}{18.2 pt}\selectfont}}, color={rgb,1:red,0.0;green,0.0;blue,0.0}, draw opacity={1.0}, rotate={0.0}, align={center}}, legend style={color={rgb,1:red,0.0;green,0.0;blue,0.0}, draw opacity={1.0}, line width={1}, solid, fill={rgb,1:red,1.0;green,1.0;blue,1.0}, fill opacity={1.0}, text opacity={1.0}, font={{\fontsize{8 pt}{10.4 pt}\selectfont}}, text={rgb,1:red,0.0;green,0.0;blue,0.0}, cells={anchor={center}}, at={(1.02, 1)}, anchor={north west}}, axis background/.style={fill={rgb,1:red,1.0;green,1.0;blue,1.0}, opacity={1.0}}, anchor={north west}, xshift={1.0mm}, yshift={-1.0mm}, width={145.4mm}, height={99.6mm}, scaled x ticks={false}, xlabel={version}, x tick style={color={rgb,1:red,0.0;green,0.0;blue,0.0}, opacity={1.0}}, x tick label style={color={rgb,1:red,0.0;green,0.0;blue,0.0}, opacity={1.0}, rotate={0}}, xlabel style={at={(ticklabel cs:0.5)}, anchor=near ticklabel, at={{(ticklabel cs:0.5)}}, anchor={near ticklabel}, font={{\fontsize{11 pt}{14.3 pt}\selectfont}}, color={rgb,1:red,0.0;green,0.0;blue,0.0}, draw opacity={1.0}, rotate={0.0}}, xmajorgrids={true}, xmin={-0.1640000000000006}, xmax={9.164000000000001}, xticklabels={{1.3.10,1.3.11,1.3.9,1.4.0,1.5.0,1.6.0,1.7.0,1.8.0,1.8.2}}, xtick={{0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5}}, xtick align={inside}, xticklabel style={font={{\fontsize{8 pt}{10.4 pt}\selectfont}}, color={rgb,1:red,0.0;green,0.0;blue,0.0}, draw opacity={1.0}, rotate={0.0}}, x grid style={color={rgb,1:red,0.0;green,0.0;blue,0.0}, draw opacity={0.1}, line width={0.5}, solid}, axis x line*={left}, x axis line style={color={rgb,1:red,0.0;green,0.0;blue,0.0}, draw opacity={1.0}, line width={1}, solid}, scaled y ticks={false}, ylabel={size (bytes)}, y tick style={color={rgb,1:red,0.0;green,0.0;blue,0.0}, opacity={1.0}}, y tick label style={color={rgb,1:red,0.0;green,0.0;blue,0.0}, opacity={1.0}, rotate={0}}, ylabel style={at={(ticklabel cs:0.5)}, anchor=near ticklabel, at={{(ticklabel cs:0.5)}}, anchor={near ticklabel}, font={{\fontsize{11 pt}{14.3 pt}\selectfont}}, color={rgb,1:red,0.0;green,0.0;blue,0.0}, draw opacity={1.0}, rotate={0.0}}, ymajorgrids={true}, ymin={4.53656223976e9}, ymax={4.66376224824e9}, yticklabels={{$4.5500\times10^{9}$,$4.5750\times10^{9}$,$4.6000\times10^{9}$,$4.6250\times10^{9}$,$4.6500\times10^{9}$}}, ytick={{4.55e9,4.575e9,4.6e9,4.625e9,4.65e9}}, ytick align={inside}, yticklabel style={font={{\fontsize{8 pt}{10.4 pt}\selectfont}}, color={rgb,1:red,0.0;green,0.0;blue,0.0}, draw opacity={1.0}, rotate={0.0}}, y grid style={color={rgb,1:red,0.0;green,0.0;blue,0.0}, draw opacity={0.1}, line width={0.5}, solid}, axis y line*={left}, y axis line style={color={rgb,1:red,0.0;green,0.0;blue,0.0}, draw opacity={1.0}, line width={1}, solid}, colorbar={false}] - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid] - table[row sep={\\}] - { - \\ - 0.5 4.54016224e9 \\ - 0.3 4.54016224e9 \\ - 0.7 4.54016224e9 \\ - 0.5 4.54016224e9 \\ - 0.5 4.54016224e9 \\ - } - ; - \addlegendentry {memory} - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 0.9 4.54016224e9 \\ - 0.9 4.54016224e9 \\ - 0.09999999999999998 4.54016224e9 \\ - 0.09999999999999998 4.54016224e9 \\ - 0.9 4.54016224e9 \\ - 0.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 0.9 4.54016224e9 \\ - 0.09999999999999998 4.54016224e9 \\ - 0.09999999999999998 4.54016224e9 \\ - 0.9 4.54016224e9 \\ - 0.9 4.54016224e9 \\ - 0.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 0.5 4.54016224e9 \\ - 0.3 4.54016224e9 \\ - 0.7 4.54016224e9 \\ - 0.5 4.54016224e9 \\ - 0.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 1.5 4.54016224e9 \\ - 1.3 4.54016224e9 \\ - 1.7 4.54016224e9 \\ - 1.5 4.54016224e9 \\ - 1.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 1.9 4.54016224e9 \\ - 1.9 4.54016224e9 \\ - 1.1 4.54016224e9 \\ - 1.1 4.54016224e9 \\ - 1.9 4.54016224e9 \\ - 1.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 1.9 4.54016224e9 \\ - 1.1 4.54016224e9 \\ - 1.1 4.54016224e9 \\ - 1.9 4.54016224e9 \\ - 1.9 4.54016224e9 \\ - 1.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 1.5 4.54016224e9 \\ - 1.3 4.54016224e9 \\ - 1.7 4.54016224e9 \\ - 1.5 4.54016224e9 \\ - 1.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 2.5 4.660162248e9 \\ - 2.3 4.660162248e9 \\ - 2.7 4.660162248e9 \\ - 2.5 4.660162248e9 \\ - 2.5 4.660162248e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 2.9 4.660162248e9 \\ - 2.9 4.660162248e9 \\ - 2.1 4.660162248e9 \\ - 2.1 4.660162248e9 \\ - 2.9 4.660162248e9 \\ - 2.9 4.660162248e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 2.9 4.660162248e9 \\ - 2.1 4.660162248e9 \\ - 2.1 4.660162248e9 \\ - 2.9 4.660162248e9 \\ - 2.9 4.660162248e9 \\ - 2.5 4.660162248e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 2.5 4.660162248e9 \\ - 2.3 4.660162248e9 \\ - 2.7 4.660162248e9 \\ - 2.5 4.660162248e9 \\ - 2.5 4.660162248e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 3.5 4.54016224e9 \\ - 3.3 4.54016224e9 \\ - 3.7 4.54016224e9 \\ - 3.5 4.54016224e9 \\ - 3.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 3.9 4.54016224e9 \\ - 3.9 4.54016224e9 \\ - 3.1 4.54016224e9 \\ - 3.1 4.54016224e9 \\ - 3.9 4.54016224e9 \\ - 3.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 3.9 4.54016224e9 \\ - 3.1 4.54016224e9 \\ - 3.1 4.54016224e9 \\ - 3.9 4.54016224e9 \\ - 3.9 4.54016224e9 \\ - 3.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 3.5 4.54016224e9 \\ - 3.3 4.54016224e9 \\ - 3.7 4.54016224e9 \\ - 3.5 4.54016224e9 \\ - 3.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 4.5 4.54016224e9 \\ - 4.3 4.54016224e9 \\ - 4.7 4.54016224e9 \\ - 4.5 4.54016224e9 \\ - 4.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 4.9 4.54016224e9 \\ - 4.9 4.54016224e9 \\ - 4.1 4.54016224e9 \\ - 4.1 4.54016224e9 \\ - 4.9 4.54016224e9 \\ - 4.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 4.9 4.54016224e9 \\ - 4.1 4.54016224e9 \\ - 4.1 4.54016224e9 \\ - 4.9 4.54016224e9 \\ - 4.9 4.54016224e9 \\ - 4.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 4.5 4.54016224e9 \\ - 4.3 4.54016224e9 \\ - 4.7 4.54016224e9 \\ - 4.5 4.54016224e9 \\ - 4.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 5.5 4.54016224e9 \\ - 5.3 4.54016224e9 \\ - 5.7 4.54016224e9 \\ - 5.5 4.54016224e9 \\ - 5.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 5.9 4.54016224e9 \\ - 5.9 4.54016224e9 \\ - 5.1 4.54016224e9 \\ - 5.1 4.54016224e9 \\ - 5.9 4.54016224e9 \\ - 5.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 5.9 4.54016224e9 \\ - 5.1 4.54016224e9 \\ - 5.1 4.54016224e9 \\ - 5.9 4.54016224e9 \\ - 5.9 4.54016224e9 \\ - 5.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 5.5 4.54016224e9 \\ - 5.3 4.54016224e9 \\ - 5.7 4.54016224e9 \\ - 5.5 4.54016224e9 \\ - 5.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 6.5 4.54016224e9 \\ - 6.3 4.54016224e9 \\ - 6.7 4.54016224e9 \\ - 6.5 4.54016224e9 \\ - 6.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 6.9 4.54016224e9 \\ - 6.9 4.54016224e9 \\ - 6.1 4.54016224e9 \\ - 6.1 4.54016224e9 \\ - 6.9 4.54016224e9 \\ - 6.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 6.9 4.54016224e9 \\ - 6.1 4.54016224e9 \\ - 6.1 4.54016224e9 \\ - 6.9 4.54016224e9 \\ - 6.9 4.54016224e9 \\ - 6.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 6.5 4.54016224e9 \\ - 6.3 4.54016224e9 \\ - 6.7 4.54016224e9 \\ - 6.5 4.54016224e9 \\ - 6.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 7.5 4.54016224e9 \\ - 7.3 4.54016224e9 \\ - 7.7 4.54016224e9 \\ - 7.5 4.54016224e9 \\ - 7.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 7.9 4.54016224e9 \\ - 7.9 4.54016224e9 \\ - 7.1 4.54016224e9 \\ - 7.1 4.54016224e9 \\ - 7.9 4.54016224e9 \\ - 7.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 7.9 4.54016224e9 \\ - 7.1 4.54016224e9 \\ - 7.1 4.54016224e9 \\ - 7.9 4.54016224e9 \\ - 7.9 4.54016224e9 \\ - 7.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 7.5 4.54016224e9 \\ - 7.3 4.54016224e9 \\ - 7.7 4.54016224e9 \\ - 7.5 4.54016224e9 \\ - 7.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 8.5 4.540279184e9 \\ - 8.3 4.540279184e9 \\ - 8.7 4.540279184e9 \\ - 8.5 4.540279184e9 \\ - 8.5 4.540279184e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 8.9 4.540279184e9 \\ - 8.9 4.540279184e9 \\ - 8.1 4.540279184e9 \\ - 8.1 4.540279184e9 \\ - 8.9 4.540279184e9 \\ - 8.9 4.540279184e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 8.9 4.540279184e9 \\ - 8.1 4.540279184e9 \\ - 8.1 4.540279184e9 \\ - 8.9 4.540279184e9 \\ - 8.9 4.540279184e9 \\ - 8.5 4.540279184e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.0;blue,0.0}, name path={c1d08dc6-c509-4ca3-8cb0-a701464342c3}, area legend, fill={rgb,1:red,0.0;green,0.6056;blue,0.9787}, fill opacity={1.0}, draw opacity={0.5}, line width={2}, solid, forget plot] - table[row sep={\\}] - { - \\ - 8.5 4.540279184e9 \\ - 8.3 4.540279184e9 \\ - 8.7 4.540279184e9 \\ - 8.5 4.540279184e9 \\ - 8.5 4.540279184e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 0.5 4.54016224e9 \\ - 0.3 4.54016224e9 \\ - 0.7 4.54016224e9 \\ - 0.5 4.54016224e9 \\ - 0.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 0.9 4.54016224e9 \\ - 0.9 4.54016224e9 \\ - 0.09999999999999998 4.54016224e9 \\ - 0.09999999999999998 4.54016224e9 \\ - 0.9 4.54016224e9 \\ - 0.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 0.9 4.54016224e9 \\ - 0.09999999999999998 4.54016224e9 \\ - 0.09999999999999998 4.54016224e9 \\ - 0.9 4.54016224e9 \\ - 0.9 4.54016224e9 \\ - 0.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 0.5 4.54016224e9 \\ - 0.3 4.54016224e9 \\ - 0.7 4.54016224e9 \\ - 0.5 4.54016224e9 \\ - 0.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 1.5 4.54016224e9 \\ - 1.3 4.54016224e9 \\ - 1.7 4.54016224e9 \\ - 1.5 4.54016224e9 \\ - 1.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 1.9 4.54016224e9 \\ - 1.9 4.54016224e9 \\ - 1.1 4.54016224e9 \\ - 1.1 4.54016224e9 \\ - 1.9 4.54016224e9 \\ - 1.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 1.9 4.54016224e9 \\ - 1.1 4.54016224e9 \\ - 1.1 4.54016224e9 \\ - 1.9 4.54016224e9 \\ - 1.9 4.54016224e9 \\ - 1.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 1.5 4.54016224e9 \\ - 1.3 4.54016224e9 \\ - 1.7 4.54016224e9 \\ - 1.5 4.54016224e9 \\ - 1.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 2.5 4.660162248e9 \\ - 2.3 4.660162248e9 \\ - 2.7 4.660162248e9 \\ - 2.5 4.660162248e9 \\ - 2.5 4.660162248e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 2.9 4.660162248e9 \\ - 2.9 4.660162248e9 \\ - 2.1 4.660162248e9 \\ - 2.1 4.660162248e9 \\ - 2.9 4.660162248e9 \\ - 2.9 4.660162248e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 2.9 4.660162248e9 \\ - 2.1 4.660162248e9 \\ - 2.1 4.660162248e9 \\ - 2.9 4.660162248e9 \\ - 2.9 4.660162248e9 \\ - 2.5 4.660162248e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 2.5 4.660162248e9 \\ - 2.3 4.660162248e9 \\ - 2.7 4.660162248e9 \\ - 2.5 4.660162248e9 \\ - 2.5 4.660162248e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 3.5 4.54016224e9 \\ - 3.3 4.54016224e9 \\ - 3.7 4.54016224e9 \\ - 3.5 4.54016224e9 \\ - 3.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 3.9 4.54016224e9 \\ - 3.9 4.54016224e9 \\ - 3.1 4.54016224e9 \\ - 3.1 4.54016224e9 \\ - 3.9 4.54016224e9 \\ - 3.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 3.9 4.54016224e9 \\ - 3.1 4.54016224e9 \\ - 3.1 4.54016224e9 \\ - 3.9 4.54016224e9 \\ - 3.9 4.54016224e9 \\ - 3.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 3.5 4.54016224e9 \\ - 3.3 4.54016224e9 \\ - 3.7 4.54016224e9 \\ - 3.5 4.54016224e9 \\ - 3.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 4.5 4.54016224e9 \\ - 4.3 4.54016224e9 \\ - 4.7 4.54016224e9 \\ - 4.5 4.54016224e9 \\ - 4.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 4.9 4.54016224e9 \\ - 4.9 4.54016224e9 \\ - 4.1 4.54016224e9 \\ - 4.1 4.54016224e9 \\ - 4.9 4.54016224e9 \\ - 4.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 4.9 4.54016224e9 \\ - 4.1 4.54016224e9 \\ - 4.1 4.54016224e9 \\ - 4.9 4.54016224e9 \\ - 4.9 4.54016224e9 \\ - 4.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 4.5 4.54016224e9 \\ - 4.3 4.54016224e9 \\ - 4.7 4.54016224e9 \\ - 4.5 4.54016224e9 \\ - 4.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 5.5 4.54016224e9 \\ - 5.3 4.54016224e9 \\ - 5.7 4.54016224e9 \\ - 5.5 4.54016224e9 \\ - 5.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 5.9 4.54016224e9 \\ - 5.9 4.54016224e9 \\ - 5.1 4.54016224e9 \\ - 5.1 4.54016224e9 \\ - 5.9 4.54016224e9 \\ - 5.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 5.9 4.54016224e9 \\ - 5.1 4.54016224e9 \\ - 5.1 4.54016224e9 \\ - 5.9 4.54016224e9 \\ - 5.9 4.54016224e9 \\ - 5.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 5.5 4.54016224e9 \\ - 5.3 4.54016224e9 \\ - 5.7 4.54016224e9 \\ - 5.5 4.54016224e9 \\ - 5.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 6.5 4.54016224e9 \\ - 6.3 4.54016224e9 \\ - 6.7 4.54016224e9 \\ - 6.5 4.54016224e9 \\ - 6.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 6.9 4.54016224e9 \\ - 6.9 4.54016224e9 \\ - 6.1 4.54016224e9 \\ - 6.1 4.54016224e9 \\ - 6.9 4.54016224e9 \\ - 6.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 6.9 4.54016224e9 \\ - 6.1 4.54016224e9 \\ - 6.1 4.54016224e9 \\ - 6.9 4.54016224e9 \\ - 6.9 4.54016224e9 \\ - 6.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 6.5 4.54016224e9 \\ - 6.3 4.54016224e9 \\ - 6.7 4.54016224e9 \\ - 6.5 4.54016224e9 \\ - 6.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 7.5 4.54016224e9 \\ - 7.3 4.54016224e9 \\ - 7.7 4.54016224e9 \\ - 7.5 4.54016224e9 \\ - 7.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 7.9 4.54016224e9 \\ - 7.9 4.54016224e9 \\ - 7.1 4.54016224e9 \\ - 7.1 4.54016224e9 \\ - 7.9 4.54016224e9 \\ - 7.9 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 7.9 4.54016224e9 \\ - 7.1 4.54016224e9 \\ - 7.1 4.54016224e9 \\ - 7.9 4.54016224e9 \\ - 7.9 4.54016224e9 \\ - 7.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 7.5 4.54016224e9 \\ - 7.3 4.54016224e9 \\ - 7.7 4.54016224e9 \\ - 7.5 4.54016224e9 \\ - 7.5 4.54016224e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 8.5 4.540279184e9 \\ - 8.3 4.540279184e9 \\ - 8.7 4.540279184e9 \\ - 8.5 4.540279184e9 \\ - 8.5 4.540279184e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 8.9 4.540279184e9 \\ - 8.9 4.540279184e9 \\ - 8.1 4.540279184e9 \\ - 8.1 4.540279184e9 \\ - 8.9 4.540279184e9 \\ - 8.9 4.540279184e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 8.9 4.540279184e9 \\ - 8.1 4.540279184e9 \\ - 8.1 4.540279184e9 \\ - 8.9 4.540279184e9 \\ - 8.9 4.540279184e9 \\ - 8.5 4.540279184e9 \\ - } - ; - \addplot[color={rgb,1:red,0.0;green,0.6056;blue,0.9787}, name path={0d1a0447-2625-4f7b-a190-112324f94bb5}, draw opacity={0.5}, line width={0}, solid, forget plot] - table[row sep={\\}] - { - \\ - 8.5 4.540279184e9 \\ - 8.3 4.540279184e9 \\ - 8.7 4.540279184e9 \\ - 8.5 4.540279184e9 \\ - 8.5 4.540279184e9 \\ - } - ; -\end{axis} -\end{tikzpicture} diff --git a/perf/PatternFolds/Project.toml b/perf/PatternFolds/Project.toml index 7bfa3c7..5077243 100644 --- a/perf/PatternFolds/Project.toml +++ b/perf/PatternFolds/Project.toml @@ -1,5 +1,8 @@ [deps] BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" +CSV = "336ed68f-0bac-5ca0-87d4-7b16caf5d00b" +CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" Chairmarks = "0ca39b1e-fe0b-4e98-acfc-b1656634c4de" PatternFolds = "c18a7f1d-76ad-4ce4-950d-5419b888513b" PerfChecker = "6309bf6b-a531-4b08-891e-8ee981e5c424" +TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" diff --git a/perf/PatternFolds/allocs.jl b/perf/PatternFolds/allocs.jl index abf6d4d..662eebf 100644 --- a/perf/PatternFolds/allocs.jl +++ b/perf/PatternFolds/allocs.jl @@ -1,4 +1,4 @@ -using PerfChecker +using PerfChecker, CairoMakie d = Dict(:targets => ["PatternFolds"], :path => @__DIR__, :tags => [:patterns, :intervals], :pkgs => ("PatternFolds", :custom, [v"0.2.3", v"0.2.2"], true)) @@ -27,3 +27,15 @@ end begin end @info x + +for (i, t) in enumerate(x.tables) + p = d[:pkgs] + @info "debug" p[1] p[2] p[3] p[4] + mkpath("perf/PatternFolds/output") + display(table_to_pie(t, Val(:alloc); pkg_name = "PatternFolds.jl")) + path = joinpath( + d[:path], "perf", "PatternFolds", "output", string(p[1], "_v$(p[3][i])", ".png")) + @info path +end + +# checkres_to_scatterlines(x, Val(:alloc)) diff --git a/perf/PatternFolds/bench.jl b/perf/PatternFolds/bench.jl index c26eea8..abe211b 100644 --- a/perf/PatternFolds/bench.jl +++ b/perf/PatternFolds/bench.jl @@ -1,6 +1,10 @@ -using PerfChecker, BenchmarkTools +using PerfChecker, BenchmarkTools, CairoMakie -t = @check :benchmark Dict(:path => @__DIR__, :evals => 1, :samples => 100, :seconds => 100) begin +d = Dict(:path => @__DIR__, :evals => 1, :samples => 100, + :seconds => 100, :tags => [:patterns, :intervals], + :pkgs => ("PatternFolds", :custom, [v"0.2.2", v"0.2.3"], true)) + +t = @check :benchmark d begin using PatternFolds end begin # Intervals @@ -27,3 +31,5 @@ end begin end @info t + +#@info checkres_to_boxplots(t, Val(:benchmark)) diff --git a/perf/PatternFolds/chair.jl b/perf/PatternFolds/chair.jl index a35b359..a1a1934 100644 --- a/perf/PatternFolds/chair.jl +++ b/perf/PatternFolds/chair.jl @@ -1,8 +1,9 @@ using PerfChecker, Chairmarks -import Pkg -Pkg.status(; extensions = true) -t = @check :chairmark Dict(:path => @__DIR__, :evals => 1) begin +d = Dict(:path => @__DIR__, :evals => 1, :tags => [:patterns, :intervals], + :pkgs => ("PatternFolds", :custom, [v"0.2.2", v"0.2.3"], true)) + +t = @check :chairmark d begin using PatternFolds end begin # Intervals diff --git a/src/PerfChecker.jl b/src/PerfChecker.jl index b8d7be0..d30acaa 100644 --- a/src/PerfChecker.jl +++ b/src/PerfChecker.jl @@ -6,7 +6,7 @@ using Pkg.Types import TOML: parse using Profile import TypedTables: Table -import Distributed: remotecall_fetch, addprocs, rmprocs, remotecall_eval +import Malt: remote_eval_wait, Worker, remote_eval_fetch, stop, fetch import CoverageTools: analyze_malloc_files, find_malloc_files, MallocInfo import Base.Sys: CPUinfo, CPU_NAME, cpu_info, WORD_SIZE import CpuId: simdbytes, cpucores, cputhreads, cputhreads_per_core @@ -50,11 +50,26 @@ function find_by_tags(tags::Vector{Symbol}, results::CheckerResult; exact_match findall(x -> exact_match ? (tags == x.tags) : (!isempty(x.tags ∩ tags)), results) end +function csv_to_table(path) + @warn "CSV module not loaded. Please load it before using this function." +end + +function table_to_csv(t::Table, path::String) + @warn "CSV module not loaded. Please load it before using this function." +end + # SECTION - Exports export @check export to_table export find_by_tags export get_versions +export table_to_pie +export checkres_to_pie +export checkres_to_scatterlines +export saveplot +export csv_to_table +export table_to_csv +export checkres_to_boxplots # SECTION - Includes include("versions.jl") diff --git a/src/alloc.jl b/src/alloc.jl index a9b103c..fdb3238 100644 --- a/src/alloc.jl +++ b/src/alloc.jl @@ -29,7 +29,7 @@ function post(d::Dict, ::Val{:alloc}) result = d[:check_result] files = find_malloc_files(result[1]) delete_files = find_malloc_files(result[2]) - myallocs = analyze_malloc_files(files) + myallocs = analyze_malloc_files(files; skip_zeros = true) if !isempty(myallocs) rm.(delete_files) else diff --git a/src/check.jl b/src/check.jl index 29720bf..3677b47 100644 --- a/src/check.jl +++ b/src/check.jl @@ -1,3 +1,6 @@ +initpkgs(x) = quote + nothing +end prep(d, b, v) = quote nothing end @@ -7,6 +10,7 @@ end post(d, v) = nothing default_options(v) = Dict() +initpkgs(x::Symbol) = initpkgs(Val(x)) prep(d::Dict, b::Expr, v::Symbol) = prep(d, b, Val(v)) check(d::Dict, b::Expr, v::Symbol) = check(d, b, Val(v)) post(d::Dict, v::Symbol) = post(d, Val(v)) @@ -16,98 +20,103 @@ function default_options(d::Dict, v::Symbol) return merge(di, d) end +function check_function(x::Symbol, d::Dict, block1, block2) + di = default_options(d, x) + g = prep(di, block1, x) + h = check(di, block2, x) + initpkg = initpkgs(x) + + results = CheckerResult( + Table[], + HwInfo( + cpu_info(), + CPU_NAME, + WORD_SIZE, + simdbytes(), + (cpucores(), cputhreads(), cputhreads_per_core()) + ), + haskey(di, :tags) ? di[:tags] : Symbol[:none], + PackageSpec[] + ) + + pkgs = if haskey(di, :pkgs) + [PackageSpec(name = di[:pkgs][1], version = i) for i in get_versions(di[:pkgs])[2]] + else + PackageSpec[PackageSpec()] + end + + devop = haskey(di, :devops) + + len = length(pkgs) + devop + + t = [tempname() for _ in 1:len] + cp.(Ref(di[:path]), t) + + procs = @sync begin + fetch.([@async(Worker(; + exeflags = ["--track-allocation=$(di[:track])", + "-t $(di[:threads])", "--project=$(t[i])"])) for i in 1:len]) + end + + for i in 1:len + remote_eval_wait(Main, procs[i], quote + import Pkg + let + i = $i + @info "Worker No.: $i" + end + Pkg.instantiate(; io = stderr) + end) + + remote_eval_wait(Main, procs[i], initpkg) + + remote_eval_wait(Main, procs[i], + quote + d = $di + pkgs = $pkgs + if !($i == $len && $devop) + pkgs != [Pkg.PackageSpec()] && Pkg.add(getindex(pkgs, $i)) + else + pkg = d[:devops] + pkg isa Tuple ? Pkg.develop(pkg[1]; pkg[2]...) : Pkg.develop(pkg) + end + haskey(d, :extra_pkgs) && Pkg.add(d[:extra_pkgs]) + end) + + di[:prep_result] = remote_eval_fetch(Main, procs[i], g) + di[:check_result] = remote_eval_fetch(Main, procs[i], h) + + stop(procs[i]) + + res = post(di, x) + push!(results.tables, res |> to_table) + if !(devop && i == len) + push!(results.pkgs, pkgs[i]) + end + end + + return results +end + macro check(x, d, block1, block2) block1, block2 = Expr(:quote, block1), Expr(:quote, block2) quote + x = $(esc(x)) d = $(esc(d)) - di = default_options(d, $x) - g = prep(di, $block1, $x) - h = check(di, $block2, $x) - results = CheckerResult( - Table[], - HwInfo( - cpu_info(), - CPU_NAME, - WORD_SIZE, - simdbytes(), - (cpucores(), cputhreads(), cputhreads_per_core()) - ), - haskey(di, :tags) ? di[:tags] : Symbol[:none], - PackageSpec[] - ) - - pkgs = if haskey(di, :pkgs) - [PackageSpec(name = di[:pkgs][1], version = i) - for i in get_versions(di[:pkgs])[2]] - else - PackageSpec[PackageSpec()] - end - - devop = haskey(di, :devops) - - len = length(pkgs) + devop - - for i in 1:len - p = remotecall_fetch(Core.eval, - 1, - Main, - Expr(:toplevel, - quote - import Distributed - d = $di - t = tempname() - cp(d[:path], t) - Distributed.addprocs(1; - exeflags = ["--track-allocation=$(d[:track])", - "--project=$t", "-t $(d[:threads])"]) - end).args...) |> first - - remotecall_fetch(Core.eval, p, Main, - Expr(:toplevel, - quote - import Pkg - Pkg.instantiate() - import PerfChecker - d = $di - - pkgs = if haskey(d, :pkgs) - [Pkg.PackageSpec(name = d[:pkgs][1], version = i) - for i in PerfChecker.get_versions(d[:pkgs])[2]] - else - Pkg.PackageSpec[Pkg.PackageSpec()] - end - - if !($i == $len && $devop) - pkgs != [Pkg.PackageSpec()] && Pkg.add(getindex(pkgs, $i)) - else - pkg = d[:devops] - pkg isa Tuple ? Pkg.develop(pkg[1]; pkg[2]...) : - Pkg.develop(pkg) - end - haskey(d, :extra_pkgs) && Pkg.add(d[:extra_pkgs]) - end).args...) - - di[:prep_result] = remotecall_fetch(Core.eval, p, Main, - Expr(:toplevel, g.args...)) - - di[:check_result] = remotecall_fetch(Core.eval, p, Main, - Expr(:toplevel, h.args...)) - - remotecall_fetch(Core.eval, 1, Main, - Expr(:toplevel, quote - import Distributed - Distributed.rmprocs($p) - end).args...) - res = $post(di, $x) - push!(results.tables, res |> to_table) - if !(devop && i == len) - push!(results.pkgs, pkgs[i]) - end - end - results + check_function(x, d, $block1, $block2) end end function perf_table end function perf_plot end + +function table_to_pie end + +function checkres_to_scatterlines end + +function checkres_to_pie end + +function saveplot end + +function checkres_to_boxplots end diff --git a/src/versions.jl b/src/versions.jl index 21cfe0c..7d08b48 100644 --- a/src/versions.jl +++ b/src/versions.jl @@ -54,7 +54,7 @@ function arrange_minor(a::VersionNumber, v::Vector{VersionNumber}, maxo::Bool) end """ -Outputs the last breaking or next breaking version. +Outputs the last breaking or next breaking version. """ function arrange_breaking(a::VersionNumber, v::Vector{VersionNumber}, maxo::Bool) if a.major == 0 @@ -76,8 +76,13 @@ function arrange_major(a::VersionNumber, v::Vector{VersionNumber}, maxo::Bool) return maxo ? [maximum(p)] : [minimum(p)] end -function arrange_custom(a::VersionNumber, ::Vector{VersionNumber}, ::Bool) - return [a] +function arrange_custom(a::VersionNumber, v::Vector{VersionNumber}, ::Bool) + return if a in v + [a] + else + @warn "Version $a not found" + return Vector{VersionNumber}() + end end function get_versions(pkgconf::VerConfig, regname::Union{Nothing, Vector{String}} = nothing) diff --git a/test/runtests.jl b/test/runtests.jl index 695e41c..d2c33cb 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -5,7 +5,6 @@ using Test @testset "Other Packages" begin using BenchmarkTools - using Distributed using PerfChecker # include("compositional_networks.jl")