Current section

Files

Jump to
fixpoint lib solver search variable_value most_constrained.ex
Raw

lib/solver/search/variable_value/most_constrained.ex

defmodule CPSolver.Search.VariableSelector.MostConstrained do
alias CPSolver.Variable.Interface
alias CPSolver.Propagator.ConstraintGraph
alias CPSolver.Search.VariableSelector.FirstFail
def select_variable(variables, space_data, break_even_fun \\ &FirstFail.select_variable/1) do
## Pick out all variables with maximal degrees
List.foldr(variables, {[], -1}, fn var, {vars, current_max} = acc ->
graph = space_data[:constraint_graph]
var_id = Interface.id(var)
variable_vertex = ConstraintGraph.variable_vertex(var_id)
deg = Graph.in_degree(graph, variable_vertex)
cond do
deg < current_max -> acc
deg > current_max -> {[var], deg}
deg == current_max -> {[var | vars], deg}
end
end)
|> elem(0)
|> break_even_fun.()
end
end