Packages
fixpoint
0.8.36
0.22.2
0.22.1
0.21.5
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.6
0.20.5
0.20.4
0.20.3
0.20.2
0.20.1
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.18.2
0.18.1
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.16.5
0.16.4
0.16.3
0.16.2
0.16.1
0.16.0
0.15.6
0.15.5
0.15.4
0.15.3
0.15.2
0.15.1
0.15.0
0.14.9
0.14.8
0.14.7
0.14.6
0.14.5
0.14.4
0.14.3
0.14.2
0.14.1
0.13.5
0.13.4
0.13.2
0.13.1
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.2
0.12.1
0.11.8
0.11.7
0.11.6
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.46
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.28
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.12
0.5.11
0.5.10
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.6
0.3.5
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.3
0.2.2
0.2.1
0.1.3
0.1.2
0.1.1
0.1.0
Constraint Programming Solver
Current section
Files
Jump to
Current section
Files
lib/solver/constraints/constraint_factory.ex
defmodule CPSolver.Constraint.Factory do
alias CPSolver.Constraint.{Sum, Element, Element2D, Modulo, Absolute, LessOrEqual, Equal, Reified}
alias CPSolver.Propagator.Modulo, as: ModuloPropagator
alias CPSolver.IntVariable, as: Variable
alias CPSolver.BooleanVariable
alias CPSolver.Variable.Interface
alias CPSolver.DefaultDomain, as: Domain
import CPSolver.Variable.View.Factory
def element(array, x, opts \\ []) do
domain = array
y = Variable.new(domain, name: Keyword.get(opts, :name, make_ref()))
result(y, Element.new(array, x, y))
end
def element2d(array2d, x, y, opts \\ []) do
domain = array2d |> List.flatten()
z = Variable.new(domain, name: Keyword.get(opts, :name, make_ref()))
result(z, Element2D.new([array2d, x, y, z]))
end
def sum(vars, opts \\ []) do
domain =
case opts[:domain] do
nil ->
{domain_min, domain_max} =
Enum.reduce(vars, {0, 0}, fn var, {min_acc, max_acc} ->
domain = Interface.domain(var) |> Domain.to_list()
{min_acc + Enum.min(domain), max_acc + Enum.max(domain)}
end)
domain_min..domain_max
d ->
d
end
sum_var = Variable.new(domain, name: Keyword.get(opts, :name, make_ref()))
result(sum_var, Sum.new(sum_var, vars))
end
def add(var1, var2, opts \\ []) do
sum([var1, var2], opts)
end
def subtract(var1, var2, opts \\ []) do
add(var1, linear(var2, -1, 0), opts)
end
def mod(x, y, opts \\ []) do
domain =
Keyword.get(opts, :domain) ||
(
{lb, ub} = ModuloPropagator.mod_bounds(x, y)
lb..ub
)
mod_var = Variable.new(domain, name: Keyword.get(opts, :name, make_ref()))
result(mod_var, Modulo.new(mod_var, x, y))
end
def absolute(x, opts \\ []) do
domain =
Keyword.get(opts, :domain) ||
(
abs_min = abs(Interface.min(x))
abs_max = abs(Interface.max(x))
0..max(abs_min, abs_max)
)
abs_var = Variable.new(domain, name: Keyword.get(opts, :name, make_ref()))
result(abs_var, Absolute.new(x, abs_var))
end
defp compose(constraint1, constraint2, relation) do
b1 = BooleanVariable.new()
b2 = BooleanVariable.new()
reif_c1 = Reified.new([constraint1, b1])
reif_c2 = Reified.new([constraint2, b2])
[reif_c1, reif_c2, relation.new([b1, b2])]
end
## Implication, equivalence, inverse implication.
## These function produce the list of constraints:
## - 2 reified constraints for constraint1 and constraint2
## - relational constraint (LessOrEqual for implications, Equal for equivalence)
## over control variables induced by reified constraints.
##
def impl(constraint1, constraint2) do
compose(constraint1, constraint2, LessOrEqual)
end
def equiv(constraint1, constraint2) do
compose(constraint1, constraint2, Equal)
end
def inverse_impl(constraint1, constraint2) do
impl(constraint2, constraint1)
end
defp result(derived_variable, constraint) do
{derived_variable, constraint}
end
end