Packages
fixpoint
0.10.7
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
test/propagators/less_or_equal_test.exs
defmodule CPSolverTest.Propagator.LessOrEqual do
use ExUnit.Case
describe "Propagator filtering" do
alias CPSolver.IntVariable, as: Variable
alias CPSolver.Propagator
alias CPSolver.Propagator.{Less, LessOrEqual}
test "filtering" do
## Both vars are unfixed
x = 0..10
y = -5..5
vars = Enum.map([x, y], fn d -> Variable.new(d) end)
[x_var, y_var] = vars
%{changes: changes} = Propagator.filter(LessOrEqual.new(vars))
assert Map.get(changes, x_var.id) == :max_change
assert Map.get(changes, y_var.id) == :min_change
assert 0 == Variable.min(x_var)
assert 5 == Variable.max(x_var)
## Both domains are cut to 0..5
assert Variable.min(x_var) == Variable.min(y_var)
assert Variable.max(x_var) == Variable.max(y_var)
end
test "inconsistency" do
x = 1..10
y = -10..0
## Inconsistency: no solution to x <= y
variables = Enum.map([x, y], fn d -> Variable.new(d) end)
## The propagator will fail on one of the variables
assert Propagator.filter(LessOrEqual.new(variables)) == :fail
end
test "offset" do
x = 0..10
y = -10..0
variables = Enum.map([x, y], fn d -> Variable.new(d) end)
[x_var, y_var] = variables
# (x <= y + 5)
offset = 5
Propagator.filter(LessOrEqual.new([x_var, y_var, offset]))
## The domain of (y+5) variable is -5..5
assert 0 == Variable.min(x_var)
assert 5 == Variable.max(x_var)
assert Variable.min(x_var) == Variable.min(y_var) + offset
assert Variable.max(x_var) == Variable.max(y_var) + offset
end
test "Filtering reports :passive if the domains intersect in no more than one point" do
x = 1..4
y = 2..4
variables = Enum.map([x, y], fn d -> Variable.new(d) end)
[x_var, y_var] = variables
refute %{active: false} == Propagator.filter(LessOrEqual.new([x_var, y_var]))
## Cut domain of x so it intersects with domain of y in exactly one point
Variable.removeAbove(x_var, 2)
result = Propagator.filter(LessOrEqual.new([x_var, y_var]))
refute result.active?
## Cut domain of x so it does not intersect with domain of y
Variable.remove(x_var, 2)
assert %{active?: false} = Propagator.filter(LessOrEqual.new([x_var, y_var]))
end
test "Less" do
x = 1
y = 1
[x_var, y_var] = Enum.map([x, y], fn d -> Variable.new(d) end)
less_propagator = Propagator.new(Less, [x_var, y_var])
assert Propagator.filter(less_propagator) == :fail
end
end
end