Skip to main content

lib/solver/search/strategy/variable/local/most_constrained.ex

defmodule CPSolver.Search.VariableSelector.MostConstrained do
  use CPSolver.Search.VariableSelector
  alias CPSolver.Variable.Interface
  alias CPSolver.Search.Utils, as: SearchUtils
  alias CPSolver.Propagator.ConstraintGraph

  @impl true
  def select(space_data, _opts) do
    get_maximals(space_data)
  end

  defp get_maximals(space_data) do
    max_by_fun = fn var ->
      ConstraintGraph.variable_degree(space_data[:constraint_graph], Interface.id(var))
    end

    SearchUtils.maximals(space_data, max_by_fun)
  end
end