ash/lib/sat_solver/implementation.ex
2024-04-05 15:11:09 -04:00

51 lines
1.8 KiB
Elixir

cond do
Application.compile_env(:ash, :sat_testing) ->
defmodule Ash.SatSolver.Implementation do
@moduledoc false
def solve_expression(cnf) do
Module.concat([System.get_env("SAT_SOLVER") || "Picosat"]).solve(cnf)
end
end
Code.ensure_loaded?(Picosat) ->
defmodule Ash.SatSolver.Implementation do
@moduledoc false
def solve_expression(cnf) do
Picosat.solve(cnf)
end
end
Code.ensure_loaded?(SimpleSat) ->
defmodule Ash.SatSolver.Implementation do
@moduledoc false
def solve_expression(cnf) do
SimpleSat.solve(cnf)
end
end
true ->
defmodule Ash.SatSolver.Implementation do
@moduledoc false
def solve_expression(_cnf) do
if Code.ensure_loaded?(Picosat) || Code.ensure_loaded?(SimpleSat) do
raise """
No SAT solver available, although one was loaded. This typically means you need to run `mix deps.compile ash --force`
If that doesn't work, please ensure that one of the following dependencies is present in your application to use sat solver features:
* `:picosat_elixir` (recommended) - A NIF wrapper around the PicoSAT SAT solver. Fast, production ready, battle tested.
* `:simple_sat` - A pure Elixir SAT solver. Slower than PicoSAT, but no NIF dependency.
"""
else
raise """
No SAT solver available.
Please add one of the following dependencies to your application to use sat solver features:
* `:picosat_elixir` (recommended) - A NIF wrapper around the PicoSAT SAT solver. Fast, production ready, battle tested.
* `:simple_sat` - A pure Elixir SAT solver. Slower than PicoSAT, but no NIF dependency.
"""
end
end
end
end