Packages
fixpoint
0.14.7
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/utils/utils.ex
defmodule CPSolver.Utils do
alias CPSolver.Variable.Interface
alias CPSolver.IntVariable, as: Variable
alias CPSolver.DefaultDomain, as: Domain
alias Iter.Iterable
def on_primary_node?(arg) when is_reference(arg) or is_pid(arg) or is_port(arg) do
Node.self() == node(arg)
end
def array2d_min_max(arr) do
n_rows = length(arr)
n_cols = length(hd(arr))
first = Enum.at(arr, 0) |> Enum.at(0)
for i <- 0..(n_rows - 1), j <- 0..(n_cols - 1), reduce: {first, first} do
{acc_min, acc_max} ->
val = Enum.at(arr, i) |> Enum.at(j)
cond do
val < acc_min -> {val, acc_max}
val > acc_max -> {acc_min, val}
true -> {acc_min, acc_max}
end
end
end
## Cartesian product of list of lists
def cartesian([h]) do
for i <- h do
[i]
end
end
def cartesian([h | t] = _values, handler \\ nil) do
for i <- h, j <- cartesian(t) do
[i | j]
|> tap(fn res -> handler && handler.(res) end)
end
end
def lazy_cartesian(lists, callback \\ &Function.identity/1) do
lazy_cartesian(lists, callback, [])
end
def lazy_cartesian([head | rest] = _lists, callback, values) do
Enum.map(head, fn i ->
more_values = [i | values]
if !Enum.empty?(rest) do
lazy_cartesian(rest, callback, more_values)
else
callback && callback.(Enum.reverse(more_values))
end
end)
end
def domain_values(variable_or_view, access \\ :interface) do
cond do
access == :interface -> Interface.domain(variable_or_view)
access == :variable -> Variable.domain(variable_or_view)
true -> throw{:error, :unknown_access_type}
end
|> Domain.to_list()
end
## Pick all minimal elements according to given minimizing function
def minimals(enumerable, min_by_fun) do
List.foldr(enumerable, {[], nil}, fn el, {minimals_acc, current_min} = acc ->
val = min_by_fun.(el)
cond do
is_nil(current_min) || val < current_min -> {[el], val}
is_nil(val) || val > current_min -> acc
val == current_min -> {[el | minimals_acc], current_min}
end
end)
|> elem(0)
end
## Pick all maximal elements according to given maximizing function
def maximals(enumerable, max_by_fun) do
List.foldr(enumerable, {[], -1}, fn el, {maximals_acc, current_max} = acc ->
val = max_by_fun.(el)
cond do
is_nil(val) || val < current_max -> acc
val > current_max -> {[el], val}
val == current_max -> {[el | maximals_acc], val}
end
end)
|> elem(0)
end
def iterate(iterator, acc, fun) do
case Iterable.next(iterator) do
:done -> acc
{:ok, neighbor, rest} ->
case fun.(neighbor, acc) do
{:halt, acc_new} ->
acc_new
{:cont, acc_new} ->
iterate(rest, acc_new, fun)
end
end
end
end