ash/benchmarks/sat_solver.exs
Zach Daniel ce5c080492 improvement: don't start processes for single items in list
chore: add some benchmarks/flame files
2024-08-15 09:14:43 -04:00

58 lines
1.5 KiB
Elixir

list = Enum.to_list(1..10_000)
map_fun = fn i -> [i, i * i] end
mixed = fn count ->
Enum.reduce(1..count, 0, fn var, expr ->
cond do
rem(var, 4) == 0 ->
{:or, var, expr}
rem(var, 3) == 0 ->
{:and, expr, var}
rem(var, 2) == 0 ->
{:and, -var, expr}
true ->
{:or, -var, expr}
end
end)
|> Ash.Policy.SatSolver.solve()
end
Benchee.run(
%{
solve: fn input ->
Ash.Policy.SatSolver.solve(input)
end
},
inputs: %{
"3 conjunctive" =>
Enum.to_list(1..3)
|> Enum.reduce(0, fn var, expr -> {:and, var, expr} end)
|> Ash.Policy.SatSolver.solve(),
"3 disjunctive" =>
Enum.to_list(1..3)
|> Enum.reduce(0, fn var, expr -> {:or, var, expr} end)
|> Ash.Policy.SatSolver.solve(),
"3 mixed" => mixed.(3),
"5 conjunctive" =>
Enum.to_list(1..5)
|> Enum.reduce(0, fn var, expr -> {:and, var, expr} end)
|> Ash.Policy.SatSolver.solve(),
"5 disjunctive" =>
Enum.to_list(1..5)
|> Enum.reduce(0, fn var, expr -> {:or, var, expr} end)
|> Ash.Policy.SatSolver.solve(),
"5 mixed" => mixed.(5),
"7 conjunctive" =>
Enum.to_list(1..7)
|> Enum.reduce(0, fn var, expr -> {:and, var, expr} end)
|> Ash.Policy.SatSolver.solve(),
"7 disjunctive" =>
Enum.to_list(1..7)
|> Enum.reduce(0, fn var, expr -> {:or, var, expr} end)
|> Ash.Policy.SatSolver.solve(),
"7 mixed" => mixed.(7)
}
)