Packages
fixpoint
0.14.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/or_test.exs
defmodule CPSolverTest.Constraint.Or do
use ExUnit.Case, async: false
alias CPSolver.BooleanVariable
alias CPSolver.Model
alias CPSolver.Constraint.Or
import CPSolver.Variable.View.Factory
describe "Or constraint" do
test "`or` functionality" do
bool_vars = Enum.map(1..4, fn i -> BooleanVariable.new(name: "b#{i}") end)
or_constraint = Or.new(bool_vars)
model = Model.new(bool_vars, [or_constraint])
{:ok, result} = CPSolver.solve(model)
assert result.statistics.solution_count == 15
assert_or(result.solutions, length(bool_vars))
end
test "inconsistency (all-false)" do
bool_vars = List.duplicate(0, 4)
or_constraint = Or.new(bool_vars)
assert catch_throw({:fail, _} = Model.new(bool_vars, [or_constraint]))
end
test "with negation vars" do
x = BooleanVariable.new(name: "x")
not_y = negation(BooleanVariable.new(name: "y"))
vars = [x, not_y]
or_constraint = Or.new(vars)
model = Model.new(vars, [or_constraint])
{:ok, result} = CPSolver.solve(model)
assert [0, 0] in result.solutions
end
test "peformance" do
n = 1000
bool_vars = Enum.map(1..n, fn i -> BooleanVariable.new(name: "b#{i}") end)
or_constraint = Or.new(bool_vars)
model = Model.new(bool_vars, [or_constraint])
{:ok, res} =
CPSolver.solve(model,
stop_on: {:max_solutions, 1},
search: {:first_fail, :indomain_max},
space_threads: 1
)
assert res.statistics.solution_count >= 1
## Arbitrary elapsed time, the main point it shouldn't be too big
assert res.statistics.elapsed_time < 250_000
end
defp assert_or(solutions, array_len) do
assert Enum.all?(solutions, fn solution ->
arr = Enum.take(solution, array_len)
Enum.sum(arr) > 0
end)
end
end
end