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)) && "<===>" || "~~~"
acc <> "#{r}[(Node#{r+1}\n)] #{connector} #{c}[(Node #{c+1}\n)];\n" #|| acc
end
Kino.Mermaid.new("""
graph TD;
#{cluster}
""")
Checker.run(instance, solution)