Packages
fixpoint
0.9.0
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/element2d_test.exs
defmodule CPSolverTest.Propagator.Element2D do
use ExUnit.Case
describe "Propagator filtering" do
alias CPSolver.IntVariable, as: Variable
alias CPSolver.Variable.Interface
alias CPSolver.Propagator
alias CPSolver.Propagator.Element2D
import CPSolver.Test.Helpers
test "filtering" do
x = -2..40
y = -3..10
z = 2..40
t = [
[9, 8, 7, 5, 6],
[9, 1, 5, 2, 8],
[8, 3, 1, 4, 9],
[9, 1, 2, 8, 6]
]
variables = Enum.map([x, y, z], fn d -> Variable.new(d) end)
{:ok, bound_vars, _store} = create_store(variables)
[x_var, y_var, z_var] = bound_vars
propagator = Element2D.new(t, x_var, y_var, z_var)
%{state: state1} = Propagator.filter(propagator)
assert Interface.min(x_var) == 0
assert Interface.max(x_var) == 3
assert Interface.min(y_var) == 0
assert Interface.max(y_var) == 4
assert Interface.min(z_var) == 2
assert Interface.max(z_var) == 9
Interface.removeAbove(z_var, 7)
%{state: state2} = Propagator.filter(Map.put(propagator, :state, state1))
assert Interface.min(y_var) == 1
Interface.remove(x_var, 0)
%{state: state3} = Propagator.filter(Map.put(propagator, :state, state2))
assert 6 == Interface.max(z_var)
assert 3 == Interface.max(x_var)
Interface.remove(y_var, 4)
%{state: state4} = Propagator.filter(Map.put(propagator, :state, state3))
assert 5 == Interface.max(z_var)
assert 2 == Interface.min(z_var)
%{state: state5} = Propagator.filter(Map.put(propagator, :state, state4))
Interface.remove(y_var, 2)
%{state: _state6} = Propagator.filter(Map.put(propagator, :state, state5))
assert 4 == Interface.max(z_var)
assert 2 == Interface.min(z_var)
end
test "inconsistency" do
x = 1..2
y = -10..1
z = -2..6
t = [
[3, 5],
[7, 8]
]
variables = Enum.map([x, y, z], fn d -> Variable.new(d) end)
{:ok, bound_vars, _store} = create_store(variables)
[x_var, y_var, z_var] = bound_vars
## The propagator will fail.
## D(x) = 1..2 implies filtering to {1} (because T is 2x2, and it's a 0-based index)
## This leaves only the second row for the values of z, which is inconsistent with D(z).
propagator = Element2D.new(t, x_var, y_var, z_var)
assert :fail == Propagator.filter(propagator)
end
test "2 of 3 fixed" do
x = 3..3
y = 3..3
z = 2..40
t = [
[9, 8, 7, 5, 6],
[9, 1, 5, 2, 8],
[8, 3, 1, 4, 9],
[9, 1, 2, 8, 6]
]
variables = Enum.map([x, y, z], fn d -> Variable.new(d) end)
{:ok, bound_vars, _store} = create_store(variables)
[x_var, y_var, z_var] = bound_vars
propagator = Element2D.new(t, x_var, y_var, z_var)
%{state: nil, active?: false} = Propagator.filter(propagator)
assert Interface.min(z_var) ==
Enum.at(t, Interface.min(x_var)) |> Enum.at(Interface.min(y_var))
assert Interface.fixed?(z_var)
end
end
end