Packages
fixpoint
0.21.4
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
lib/solver/constraints/propagators/channel.ex
defmodule CPSolver.Propagator.Channel do
use CPSolver.Propagator
def new(x, bools) do
b_vars_num = length(bools)
removeBelow(x, 1)
removeAbove(x, b_vars_num)
Enum.each(bools, fn b_var ->
removeAbove(b_var, 1)
removeBelow(b_var, 0)
end)
new([x | bools])
end
@impl true
def variables([x | b_vars]) do
[
set_propagate_on(x, :domain_change)
| Enum.map(b_vars, fn b_var -> set_propagate_on(b_var, :fixed) end)
]
end
@impl true
def arguments(args) do
Vector.new(args)
end
@impl true
def filter(vars, state, changes) do
state = state || initial_state(vars)
reduce(vars, state, changes)
|> finalize()
end
defp initial_state(vars) do
bool_var_indices = MapSet.new(1..(Vector.size(vars) - 1))
%{
unfixed_vars: bool_var_indices
}
end
defp reduce(vars, %{unfixed_vars: unfixed_b_var_indices} = _state, changes) do
x_var = vars[0]
## Apply changes
stage1_results =
Enum.reduce_while(changes, unfixed_b_var_indices, fn
{0, :fixed}, acc ->
## x is fixed, we're done
{:halt, {:entailed, min(x_var), acc}}
{0, _other_x_change}, acc ->
{:cont,
Enum.reduce(domain_values(x_var), acc, fn idx, acc2 ->
if idx in acc2 do
acc2
else
fix(vars[idx], 0)
MapSet.delete(acc2, idx)
end
end)}
{b_var_idx, :fixed}, acc ->
acc = MapSet.delete(acc, b_var_idx)
## one of booleans is fixed
b_min = min(vars[b_var_idx])
if b_min == 1 do
fix(x_var, b_var_idx)
{:halt, {:entailed, b_var_idx, acc}}
else
case remove(x_var, b_var_idx) do
:fixed ->
{:halt, {:entailed, min(x_var), acc}}
_ ->
{:cont, acc}
end
end
end)
## Stage 2 : iterate through the rest of unfixed indices
case stage1_results do
{:entailed, x_value, unfixed_bool_indices} ->
fix_booleans(x_value, vars, unfixed_bool_indices)
:entailed
unfixed_bool_indices ->
if fixed?(x_var) do
fix_booleans(min(x_var), vars, unfixed_bool_indices)
:entailed
else
reduce_stage2(x_var, vars, unfixed_bool_indices)
end
end
end
defp fix_booleans(fixed_index, vars, unfixed_b_var_indices) do
Enum.each(
unfixed_b_var_indices,
fn b_index ->
fix_to = (b_index == fixed_index && 1) || 0
fix(vars[b_index], fix_to)
end
)
end
defp reduce_stage2(x_var, vars, unfixed_bool_indices) do
Enum.reduce_while(unfixed_bool_indices, unfixed_bool_indices, fn b_var_idx, acc ->
b_var = vars[b_var_idx]
if fixed?(b_var) do
if min(b_var) == 1 do
fix(x_var, b_var_idx)
fix_booleans(b_var_idx, vars, acc)
{:halt, :entailed}
else
case remove(x_var, b_var_idx) do
:fixed ->
{:halt, :entailed}
_ ->
{:cont, acc}
end
end
else
if contains?(x_var, b_var_idx) do
{:cont, acc}
else
fix(b_var, 0)
{:cont, MapSet.delete(acc, b_var_idx)}
end
end
end)
end
defp finalize(:entailed) do
:passive
end
defp finalize(unfixed_b_var_indices) do
if Enum.empty?(unfixed_b_var_indices) do
:passive
else
{:state, %{unfixed_vars: unfixed_b_var_indices}}
end
end
end