Current section

Files

Jump to
fixpoint test constraints minimum_test.exs
Raw

test/constraints/minimum_test.exs

defmodule CPSolverTest.Constraint.Minimum do
use ExUnit.Case, async: false
alias CPSolver.IntVariable, as: Variable
alias CPSolver.Model
alias CPSolver.Constraint.Minimum
alias CPSolver.Constraint.Factory, as: ConstraintFactory
import CPSolver.Variable.View.Factory
describe "Minimum constraint" do
test "`minimum` functionality" do
x_arr = Enum.map(1..4, fn idx -> Variable.new(0..4, name: "x#{idx}") end)
y = Variable.new(-5..20, name: "y")
model = Model.new([y | x_arr], [Minimum.new(y, x_arr)])
{:ok, result} = CPSolver.solve(model)
assert_minimum(result.solutions)
assert result.statistics.solution_count == 625
end
test "Factory" do
x_arr = Enum.map(1..4, fn idx -> Variable.new(0..4, name: "x#{idx}") end)
{max_var, maximum_constraint} = ConstraintFactory.minimum(x_arr)
assert Variable.min(max_var) == 0
assert Variable.max(max_var) == 4
model = Model.new([], [maximum_constraint])
{:ok, result} = CPSolver.solve(model)
assert_minimum(result.solutions)
assert result.statistics.solution_count == 625
end
test "Consistent with Maximum" do
x_arr = Enum.map(1..4, fn idx -> minus(Variable.new(0..4, name: "x#{idx}")) end)
{negative_max_var, negative_maximum_constraint} = ConstraintFactory.minimum(x_arr)
assert Variable.min(negative_max_var) == -4
assert Variable.max(negative_max_var) == 0
model = Model.new([], [negative_maximum_constraint])
{:ok, result} = CPSolver.solve(model)
assert_maximum(result.solutions, fn y -> -y end)
assert result.statistics.solution_count == 625
end
## Constraint check: y = min(x_array)
##
defp assert_minimum(solutions) do
assert Enum.all?(solutions, fn [y | xs] ->
y == Enum.min(xs)
end)
end
defp assert_maximum(solutions, transform_fun) do
assert Enum.all?(solutions, fn [y | xs] ->
transform_fun.(y) == Enum.max(xs)
end)
end
end
end