Packages
fixpoint
0.8.49
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_fwc_test.exs
defmodule CPSolverTest.Constraint.AllDifferent.FWC do
use ExUnit.Case, async: false
describe "AllDifferentFWC" do
alias CPSolver.Constraint.AllDifferent.FWC, as: AllDifferentFWC
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(AllDifferentFWC, variables)])
{:ok, result} = CPSolver.solve_sync(model)
assert hd(result.solutions) == [1, 2, 3, 4, 5]
assert result.statistics.solution_count == 1
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(AllDifferentFWC, variables)])
{:ok, result} = CPSolver.solve_sync(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(AllDifferentFWC, variables)])
{:ok, result} = CPSolver.solve_sync(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(AllDifferentFWC, variables)])
{:ok, result} = CPSolver.solve_sync(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(AllDifferentFWC, diagonal_down),
Constraint.new(AllDifferentFWC, diagonal_up),
Constraint.new(AllDifferentFWC, variables)
]
)
{:ok, res} = CPSolver.solve_sync(model)
assert res.status == :unsatisfiable
end
end
end