Packages
fixpoint
0.9.4
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/search/strategy/variable/action.ex
defmodule CPSolver.Search.VariableSelector.Action do
@moduledoc """
Action (activity-based) varaible selector
(https://www.gecode.org/doc-latest/MPG.pdf, p.8.5.3)
"""
alias CPSolver.Space
alias CPSolver.Shared
alias CPSolver.Variable.Interface
alias CPSolver.Utils
def select(variables, data, action_mode) when action_mode in [:action_min, :action_max, :action_size_min, :action_size_max] do
select_impl(variables, data, action_mode)
|> Enum.map(fn {var, _action} -> var end)
end
defp select_impl(variables, data, :action_min) do
Utils.minimals(
variable_actions(variables, Space.get_shared(data)),
fn {_var, action} -> action end
)
end
defp select_impl(variables, data, :action_max) do
Utils.maximals(
variable_actions(variables, Space.get_shared(data)),
fn {_var, action} -> action end
)
end
defp select_impl(variables, data, :action_size_min) do
Utils.minimals(
variable_actions(variables, Space.get_shared(data)),
fn {var, action} -> action / Interface.size(var) end
)
end
defp select_impl(variables, data, :action_size_max) do
Utils.maximals(
variable_actions(variables, Space.get_shared(data)),
fn {var, action} ->
action / Interface.size(var) end
)
end
@doc """
Initialize Action data
"""
def initialize(space_data, decay) do
shared = Space.get_shared(space_data)
Shared.get_auxillary(shared, :action) ||
(
action_table = Shared.create_shared_ets_table(shared)
Shared.put_auxillary(shared, :action, %{propagator_actions: action_table, decay: decay})
)
end
@doc """
Compute actions of variables in one pass
"""
def variable_actions(variables, shared) do
action_data = Shared.get_auxillary(shared, :action)
global_failure_count = Shared.get_failure_count(shared)
if action_data && global_failure_count do
%{variable_actions: action_table, decay: decay} = action_data
Enum.zip(variables,
:ets.select(action_table, for(var <- variables, do: {{Interface.id(var), :_}, [], [:"$_"]})))
else
Enum.map(variables, fn var -> {var, 1} end)
end
end
end