diff options
author | Aria Shrimpton <me@aria.rip> | 2024-03-27 17:10:21 +0000 |
---|---|---|
committer | Aria Shrimpton <me@aria.rip> | 2024-03-27 17:10:21 +0000 |
commit | 2f75ce401867feaddce578e09be542407c327f48 (patch) | |
tree | 9865e39aa815787a17fcaccd155bbe25d5e93f70 /analysis | |
parent | 98340e2ddf76a50b7341444a161362b1d01beb22 (diff) |
analysis & write up cost models
Diffstat (limited to 'analysis')
-rw-r--r-- | analysis/vis.livemd | 55 |
1 files changed, 42 insertions, 13 deletions
diff --git a/analysis/vis.livemd b/analysis/vis.livemd index 48b8e59..0aa2711 100644 --- a/analysis/vis.livemd +++ b/analysis/vis.livemd @@ -87,6 +87,16 @@ cost_model_points = |> DF.new() end) |> DF.concat_rows() +``` + +```elixir +# Discard points outside one standard deviation, as we do when fitting +cost_model_points = + cost_model_points + |> DF.group_by(["impl", "op", "n"]) + |> DF.mutate(avg: mean(t), dev: standard_deviation(t)) + |> DF.filter(abs(t - avg) < dev) + |> DF.discard(["avg", "dev"]) |> DF.mutate(t: cast(t, {:duration, :nanosecond})) ``` @@ -149,15 +159,17 @@ defmodule CostModel do |> Enum.map(fn %{"impl" => impl} -> points_for(cost_models, ns, impl, op) end) |> DF.concat_rows() |> DF.filter(impl in ^impls) + |> DF.sort_by(impl) |> Tucan.lineplot("n", "t", color_by: "impl", clip: true) ] ++ if(draw_points, do: [ - Tucan.scatter( - cost_model_points - |> DF.filter(op == ^op and impl in ^impls) - |> DF.group_by(["impl", "n"]) - |> DF.summarise(t: mean(cast(t, :f32))), + cost_model_points + |> DF.filter(op == ^op and impl in ^impls) + |> DF.group_by(["impl", "n"]) + |> DF.sort_by(impl) + |> DF.mutate(t: cast(t, :f32)) + |> Tucan.scatter( "n", "t", color_by: "impl", @@ -174,6 +186,7 @@ defmodule CostModel do |> Tucan.Axes.set_x_title("Size of container (n)") |> Tucan.set_size(500, 250) |> Tucan.Legend.set_title(:color, "Implementation") + |> Tucan.Scale.set_x_domain(ns.first, ns.last) case y_domain do [lo, hi] -> Tucan.Scale.set_y_domain(plot, lo, hi) @@ -186,6 +199,7 @@ defmodule CostModel do Enum.map(impl_splits, &plot(cost_models, cost_model_points, &1, op)) |> Tucan.vconcat() + |> VegaLite.resolve(:scale, color: :independent) end end ``` @@ -198,39 +212,54 @@ graph = cost_models, cost_model_points, [ + ["Vec", "LinkedList"], ["SortedVec", "SortedVecSet", "SortedVecMap", "VecSet", "VecMap"], - [ - "Vec", - "LinkedList" - ], ["BTreeSet", "BTreeMap", "HashSet", "HashMap"] ], "insert" ) - |> VegaLite.resolve(:scale, color: :independent) VegaLite.Export.save!(graph, "../thesis/assets/insert.json") graph ``` +<!-- livebook:{"reevaluate_automatically":true} --> + +```elixir +graph = + CostModel.plot( + cost_models, + cost_model_points, + ["VecSet", "SortedVecSet", "HashSet", "BTreeSet"], + "insert", + ns: 1..3000//10, + y_domain: [0, 200], + draw_points: false + ) + +VegaLite.Export.save!(graph, "../thesis/assets/insert_small_n.json") + +graph +``` + ```elixir graph = CostModel.split_plot( cost_models, cost_model_points, [ - ["SortedVec", "SortedVecSet", "SortedVecMap", "VecSet"], + ["SortedVec", "SortedVecSet", "SortedVecMap"], [ "Vec", "LinkedList", - "VecMap" + "VecMap", + "VecSet" ], ["BTreeSet", "BTreeMap", "HashSet", "HashMap"] ], "contains" ) - |> VegaLite.resolve(:scale, color: :independent) VegaLite.Export.save!(graph, "../thesis/assets/contains.json") |