Packages
fixpoint
0.9.9
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/modulo_test.exs
defmodule CPSolverTest.Propagator.Modulo do
use ExUnit.Case
import CPSolver.Test.Helpers
describe "Propagator filtering" do
alias CPSolver.IntVariable, as: Variable
alias CPSolver.DefaultDomain, as: Domain
alias CPSolver.Variable.Interface
alias CPSolver.Propagator
alias CPSolver.Propagator.Modulo
test "filtering, initial call" do
## Both vars are unfixed
x = 1..10
y = -5..5
m = -10..10
variables = Enum.map([m, x, y], fn d -> Variable.new(d) end)
{:ok, [m_var, _x_var, y_var] = bound_vars, _store} = create_store(variables)
# before filtering
assert Interface.contains?(y_var, 0)
assert Interface.min(m_var) == -10
p = Modulo.new(bound_vars)
_res = Propagator.filter(p)
## y has 0 removed
refute Interface.contains?(y_var, 0)
## Nothing is fixed
refute Enum.any?(bound_vars, fn var -> Interface.fixed?(var) end)
end
test "filtering, dividend and divisor fixed" do
x = -7
y = 3
m = -10..10
variables = Enum.map([m, x, y], fn d -> Variable.new(d) end)
{:ok, [m_var, _x_var, _y_var] = bound_vars, _store} = create_store(variables)
p = Modulo.new(bound_vars)
res = Propagator.filter(p)
assert res.changes == %{m_var.id => :fixed}
## Modulo is fixed to x % y
## Dividend and modulo have the same sign
assert Interface.fixed?(m_var) && Interface.min(m_var) == rem(x, y)
end
test "filtering, modulo and dividend fixed" do
x = -10
y = -100..100
m = -2
variables = Enum.map([m, x, y], fn d -> Variable.new(d) end)
{:ok, [_m_var, _x_var, y_var] = bound_vars, _store} = create_store(variables)
p = Modulo.new(bound_vars)
res = Propagator.filter(p)
refute res == :fail
## All values in domain of y satisfy x % y = m
assert Enum.all?(Domain.to_list(y_var.domain), fn y_val ->
rem(x, y_val) == m
end)
end
test "filtering, modulo and divider fixed" do
x = -100..100
y = -10
m = -2
variables = Enum.map([m, x, y], fn d -> Variable.new(d) end)
{:ok, [_m_var, x_var, _y_var] = bound_vars, _store} = create_store(variables)
p = Modulo.new(bound_vars)
res = Propagator.filter(p)
refute res == :fail
## All values in domain of x satisfy x % y = m
assert Enum.all?(Domain.to_list(x_var.domain), fn x_val -> rem(x_val, y) == m end)
end
test "inconsistency, if modulo and dividend are fixed to values of different sign" do
x = 10
y = -100..100
m = -2
variables = Enum.map([m, x, y], fn d -> Variable.new(d) end)
{:ok, bound_vars, _store} = create_store(variables)
p = Modulo.new(bound_vars)
assert :fail = Propagator.filter(p)
end
test "inconsistency, if every modulo value has a different sign with every divident value" do
m = 1..10
y = -100..100
x = -10..-1
variables = Enum.map([m, x, y], fn d -> Variable.new(d) end)
{:ok, bound_vars, _store} = create_store(variables)
p = Modulo.new(bound_vars)
assert :fail = Propagator.filter(p)
end
end
end