Packages
fixpoint
0.9.4
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/sum_test.exs
defmodule CPSolverTest.Propagator.Sum do
use ExUnit.Case
describe "Propagator filtering" do
alias CPSolver.IntVariable, as: Variable
alias CPSolver.Propagator
alias CPSolver.Propagator.Sum
import CPSolver.Variable.Interface
import CPSolver.Variable.View.Factory
import CPSolver.Test.Helpers
test "The domain bounds of 'sum' variable are reduced to the sum of bounds of the summands" do
y = Variable.new(-100..100, name: "y")
x =
Enum.map([{"x1", 0..5}, {"x2", 1..5}, {"x3", 0..5}], fn {name, d} ->
Variable.new(d, name: name)
end)
{:ok, bound_vars, _store} = create_store([y | x])
[y_var | x_vars] = bound_vars
Propagator.filter(Sum.new(y_var, x_vars))
assert 1 == min(y_var)
assert 15 == max(y_var)
end
test "Test 2" do
y = Variable.new(0..100, name: "y")
x =
Enum.map([{-5..5, "x1"}, {[1, 2], "x2"}, {[0, 1], "x3"}], fn {d, name} ->
Variable.new(d, name: name)
end)
{:ok, bound_vars, _store} = create_store([y | x])
[y_var | x_vars] = bound_vars
[x1_var, _x2_var, _x3_var] = x_vars
sum_propagator = Sum.new(y_var, x_vars)
Propagator.filter(sum_propagator)
assert -3 == min(x1_var)
assert 0 == min(y_var)
assert 8 == max(y_var)
end
test "when 'y' variable is fixed" do
y = Variable.new([5], name: "y")
x =
Enum.map([{1..5, "x1"}, {[1], "x2"}, {[0, 1], "x3"}], fn {d, name} ->
Variable.new(d, name: name)
end)
{:ok, bound_vars, _store} = create_store([y | x])
[y_var | x_vars] = bound_vars
[x1_var, _x2_var, x3_var] = x_vars
sum_propagator = Sum.new(y_var, x_vars)
Propagator.filter(sum_propagator)
assert 4 == max(x1_var)
assert 3 == min(x1_var)
assert 1 == max(x3_var)
assert 0 == min(x3_var)
end
test "fails on inconsistency" do
y = Variable.new(10, name: "y")
x1 = Variable.new(0..4, name: "x1")
x2 = Variable.new(0..5, name: "x2")
{:ok, bound_vars, _store} =
create_store([y, x1, x2])
[y_var, x1_var, x2_var] = bound_vars
assert :fail == Propagator.filter(Sum.new(y_var, [x1_var, x2_var]))
end
test "when summands are views" do
y = Variable.new(50, name: "y")
x1 = Variable.new(0..2, name: "x1")
x2 = Variable.new(1..2, name: "x2")
{:ok, bound_vars, store} =
create_store([y, x1, x2])
[y_var, x1_var, x2_var] = bound_vars
refute :fail ==
Propagator.filter(Sum.new(y_var, [mul(x1_var, 10), mul(x2_var, 20)]), store: store)
assert 1 == Variable.min(x1_var)
assert 1 == Variable.max(x1_var)
end
end
end