Powered by AppSignal & Oban Pro

Packer

livebooks/packer.livemd

Packer

Mix.install(
     [
       {:packer, path: Path.join(System.get_env("HOME"), "projects/packer")},
       {:kino, "~> 0.17.0"}
     ]
)

Generate and run

alias Packer.{Checker, Instance, Solver}
instance = Instance.generate(7, 15, nodes_connected_probability: 0.5)
{:ok, solution} = Solver.run(instance, time_limit: 30_000)
%{num_nodes: num_nodes, topology: topology} = instance
cluster = for r <- 0..num_nodes-2, c <- r+1..num_nodes - 1, r != c,  reduce: "" do
  acc ->
    members_r = Enum.at(solution["processes_on_node"], r) |> Enum.map_join(" ", fn m -> "#{m}" end)
    members_c = Enum.at(solution["processes_on_node"], c) |> Enum.map_join("", fn m -> "#{m}" end)

    connector = 
      (topology |> Enum.at(r) |> Enum.at(c)) &amp;&amp; "<===>" || "~~~"
    
      acc <> "#{r}[(Node#{r+1}\n#{members_r}
)]
#{connector} #{c}[(Node #{c+1}\n#{members_c}
)];
\n" #|| acc end Kino.Mermaid.new(""" graph TD; #{cluster} """)
Checker.run(instance, solution)