defmodule CPSolver.Constraint.Reified do
@moduledoc """
Reified (equivalence) constraint.
Extends constraint C to constraint R(C, b),
where 'b' is a boolean variable, and
C holds iff b is fixed to true
"""
use CPSolver.Constraint
alias CPSolver.Propagator.Reified, as: ReifPropagator
def new(constraint, b) do
new([constraint, b])
end
@impl true
def propagators([constraint, b]) do
[reified_propagator(constraint, b, :full)]
end
def reified_propagator(constraint, b, mode) when mode in [:full, :half, :inverse_half] do
ReifPropagator.new(Constraint.constraint_to_propagators(constraint), b, mode)
end
end
defmodule CPSolver.Constraint.HalfReified do
@moduledoc """
Half-reified (implication) constraint.
Extends constraint C to constraint R(C, b),
where 'b' is a boolean variable, and
b is fixed to true if C holds
"""
use CPSolver.Constraint
alias CPSolver.Constraint.Reified
def new(constraint, b) do
new([constraint, b])
end
@impl true
def propagators([constraint, b]) do
[Reified.reified_propagator(constraint, b, :half)]
end
end
defmodule CPSolver.Constraint.InverseHalfReified do
@moduledoc """
Inverse half-reified (inverse implication) constraint.
Extends constraint C to constraint R(C, b),
where 'b' is a boolean variable, and
C holds if b is fixed to true.
"""
use CPSolver.Constraint
alias CPSolver.Constraint.Reified
def new(constraint, b) do
new([constraint, b])
end
@impl true
def propagators([constraint, b]) do
[Reified.reified_propagator(constraint, b, :inverse_half)]
end
end