Packages
fixpoint
0.4.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/propagators/propagator_variable.ex
defmodule CPSolver.Propagator.Variable do
alias CPSolver.Variable
alias CPSolver.Propagator
@propagator_events Propagator.propagator_events()
@domain_events CPSolver.Common.domain_events()
@propagator_id_key :propagator_id_key
@variable_op_results_key :variable_op_results
defdelegate domain(var), to: Variable
defdelegate size(var), to: Variable
defdelegate min(var), to: Variable
defdelegate max(var), to: Variable
defdelegate fixed?(var), to: Variable
defdelegate contains?(var, val), to: Variable
def remove(var, val) do
wrap(:remove, var, val)
end
def removeAbove(var, val) do
wrap(:removeAbove, var, val)
end
def removeBelow(var, val) do
wrap(:removeBelow, var, val)
end
def fix(var, val) do
wrap(:fix, var, val)
end
def set_propagate_on(var, nil) do
set_propagate_on(var, :fixed)
end
def set_propagate_on(%Variable{} = var, propagator_event)
when propagator_event in @propagator_events do
Map.put(var, :propagate_on, Propagator.to_domain_events(propagator_event))
end
defp wrap(op, var, val) do
case apply(Variable, op, [
Map.put(var, :propagator_id, get_propagator_id()),
val
]) do
:fail ->
throw({:fail, var.id})
res ->
save_op(var, res)
res
end
end
defp save_op(_var, :no_change) do
:ok
end
defp save_op(var, domain_change) when domain_change in @domain_events do
current_changes = ((changes = get_variable_ops()) && changes) || Map.new()
Process.put(@variable_op_results_key, Map.put(current_changes, var.id, domain_change))
end
def get_variable_ops() do
Process.get(@variable_op_results_key)
end
def reset_variable_ops() do
Process.delete(@variable_op_results_key)
end
def set_propagator_id(id) do
Process.put(@propagator_id_key, id)
end
def get_propagator_id() do
Process.get(@propagator_id_key)
end
def plus(:fail, _) do
:fail
end
def plus(_, :fail) do
:fail
end
def plus(a, b) do
a + b
end
end