defmodule CPSolver.Propagator.LessOrEqual do use CPSolver.Propagator def new(x, y, offset \\ 0) do new([x, y, offset]) end @impl true def variables([x, y | _]) do [set_propagate_on(x, :min_change), set_propagate_on(y, :max_change)] end @impl true def filter([x, y]) do filter([x, y, 0]) end def filter([x, y, offset]) do filter(x, y, offset) end def filter(x, y, offset \\ 0) do if max(x) <= plus(min(y), offset) do ## TODO: it doesn't make sense to filter at all after this happens. ## as it will be stable forever. ## Consider setting :active flag to exclude propagators from propagation process. :stable else removeAbove(x, plus(max(y), offset)) removeBelow(y, plus(min(x), -offset)) end end end