Packages
fixpoint
0.8.49
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/circuit_test.exs
defmodule CPSolverTest.Propagator.Circuit do
use ExUnit.Case
alias CPSolver.ConstraintStore
alias CPSolver.IntVariable, as: Variable
alias CPSolver.Variable.Interface
alias CPSolver.DefaultDomain, as: Domain
alias CPSolver.Propagator
alias CPSolver.Propagator.Circuit
describe "Propagator filtering" do
test "fixed variables: valid circuit" do
valid_circuit = [2, 3, 4, 0, 5, 1]
result = filter(valid_circuit)
refute result.active?
end
test "fails on invalid circuit" do
invalid_circuits =
[
[1, 2, 3, 4, 5, 2],
[1, 2, 0, 4, 5, 3]
]
Enum.all?(invalid_circuits, fn circuit ->
:fail ==
try do
filter(circuit)
catch
x -> x
end
end)
end
test "domains are cut accordingly on initialization" do
n = 10
domains = Enum.map(0..(n - 1), fn _idx -> -n..n end)
propagator = make_propagator(domains)
Propagator.filter(propagator)
## args of a propagator are bounded variables
assert_initial_reduction(propagator)
end
test "filtering" do
domains = [0..2, 0..2, 0..2]
propagator = make_propagator(domains)
[x0, x1, x2] = Arrays.to_list(propagator.args)
res1 = Propagator.filter(propagator)
assert_initial_reduction(propagator)
## Make x1 to be successor of x0
Interface.fix(x0, 1)
propagator1 = propagator |> Map.put(:state, res1.state)
_res2 = Propagator.filter(propagator1)
## x0 is now a successor of x2
assert Interface.fixed?(x2)
assert Interface.min(x2) == 0
## x1 is also fixed
assert Interface.fixed?(x1)
end
end
defp filter(domains) do
domains
|> make_propagator()
|> Propagator.filter()
end
defp make_propagator(domains) do
variables =
Enum.map(Enum.with_index(domains), fn {d, idx} -> Variable.new(d, name: "x#{idx}") end)
{:ok, x_vars, _store} = ConstraintStore.create_store(variables)
Circuit.new(x_vars)
end
defp assert_initial_reduction(propagator) do
n = Arrays.size(propagator.args)
assert Enum.all?(
Enum.with_index(propagator.args),
fn {var, idx} ->
domain = Interface.domain(var) |> Domain.to_list()
MapSet.new(domain) == MapSet.new(0..(n - 1)) |> MapSet.delete(idx)
end
)
end
end