Packages
fixpoint
0.9.2
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/constraints/all_different/all_different_dc_test.exs
defmodule CPSolverTest.Constraint.AllDifferent.DC do
use ExUnit.Case, async: false
describe "AllDifferent" do
alias CPSolver.Constraint.AllDifferent.DC, as: AllDifferent
alias CPSolver.IntVariable
alias CPSolver.Constraint
alias CPSolver.Model
import CPSolver.Variable.View.Factory
test "all fixed" do
variables = Enum.map(1..5, fn i -> IntVariable.new(i) end)
model = Model.new(variables, [Constraint.new(AllDifferent, variables)])
{:ok, result} = CPSolver.solve(model)
assert hd(result.solutions) == [1, 2, 3, 4, 5]
assert result.statistics.solution_count == 1
end
test "reduction" do
minizinc_solutions = [[1, 2, 4, 5], [1, 2, 3, 4], [1, 2, 3, 5]]
variables = Enum.map([1, 1..2, 1..4, [1, 2, 4, 5]], fn d -> IntVariable.new(d) end)
model = Model.new(variables, [Constraint.new(AllDifferent, variables)])
{:ok, result} = CPSolver.solve(model)
assert Enum.sort(result.solutions) == Enum.sort(minizinc_solutions)
end
test "produces all possible permutations" do
domain = 1..3
variables = Enum.map(1..3, fn _ -> IntVariable.new(domain) end)
model = Model.new(variables, [Constraint.new(AllDifferent, variables)])
{:ok, result} = CPSolver.solve(model, timeout: 100)
assert result.statistics.solution_count == 6
assert result.solutions |> Enum.sort() == [
[1, 2, 3],
[1, 3, 2],
[2, 1, 3],
[2, 3, 1],
[3, 1, 2],
[3, 2, 1]
]
end
test "unsatisfiable (duplicates)" do
variables = Enum.map(1..3, fn _ -> IntVariable.new(1) end)
model = Model.new(variables, [Constraint.new(AllDifferent, variables)])
{:ok, result} = CPSolver.solve(model, timeout: 1000)
assert result.status == :unsatisfiable
end
test "unsatisfiable(pigeonhole)" do
variables = Enum.map(1..4, fn _ -> IntVariable.new(1..3) end)
model = Model.new(variables, [Constraint.new(AllDifferent, variables)])
{:ok, result} = CPSolver.solve(model)
assert result.status == :unsatisfiable
end
test "views in variable list" do
n = 3
variables = Enum.map(1..n, fn i -> IntVariable.new(1..n, name: "row#{i}") end)
diagonal_down =
Enum.map(Enum.with_index(variables, 1), fn {var, idx} -> linear(var, 1, -idx) end)
diagonal_up =
Enum.map(Enum.with_index(variables, 1), fn {var, idx} -> linear(var, 1, idx) end)
model =
Model.new(
variables,
[
Constraint.new(AllDifferent, diagonal_down),
Constraint.new(AllDifferent, diagonal_up),
Constraint.new(AllDifferent, variables)
]
)
{:ok, res} = CPSolver.solve(model)
assert res.status == :unsatisfiable
end
end
end