defmodule CPSolver.Common do alias CPSolver.Variable alias CPSolver.Variable.View @type domain_change :: :fixed | :domain_change | :min_change | :max_change @type domain_get_operation :: :size | :fixed? | :min | :max | :contains? @type domain_update_operation :: :remove | :removeAbove | :removeBelow | :fix @type variable_or_view :: Variable.t() | View.t() def domain_events() do [:fixed, :domain_change, :min_change, :max_change] end ## Value for unfixed variables. ## def unfixed() do :atomics.new(1, signed: true) |> :atomics.info() |> Map.get(:max) end ## Choose a "stronger" domain change ## from two. ## "Stronger" domain change implies the weaker one. ## For instance, ## - :bound_change implies :domain_change; ## - :fixed implies all domain changes. ## - :domain_change implies no other domain changes. def stronger_domain_change(nil, new_change) do new_change end def stronger_domain_change(new_change, nil) do new_change end def stronger_domain_change(:fixed, _new_change) do :fixed end def stronger_domain_change(_current_change, :fixed) do :fixed end def stronger_domain_change(:domain_change, new_change) do new_change end def stronger_domain_change(current_change, :domain_change) do current_change end def stronger_domain_change(:bound_change, bound_change) when bound_change in [:min_change, :max_change] do bound_change end def stronger_domain_change(bound_change, :bound_change) when bound_change in [:min_change, :max_change] do bound_change end def stronger_domain_change(:min_change, :max_change) do :bound_change end def stronger_domain_change(:max_change, :min_change) do :bound_change end def stronger_domain_change(current_change, new_change) when current_change == new_change do current_change end end