Packages
fixpoint
0.19.3
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/variables/variable.ex
defmodule CPSolver.Variable do
defstruct [:id, :index, :name, :domain, :initial_size, :store, :propagate_on]
@type t :: %__MODULE__{
id: reference(),
index: integer(),
name: term(),
domain: Domain.t(),
initial_size: integer(),
propagate_on: Propagator.propagator_event()
}
alias CPSolver.Variable
alias CPSolver.Variable.View
alias CPSolver.DefaultDomain, as: Domain
require Logger
@callback new(values :: Enum.t(), opts :: Keyword.t()) :: Variable.t()
defmacro __using__(_) do
quote do
@behaviour CPSolver.Variable
def new(values, opts \\ []) do
id = make_ref()
domain = Domain.new(values)
%Variable{
id: id,
name: Keyword.get(opts, :name, id),
domain: domain,
initial_size: Domain.size(domain)
}
end
def copy(variable) do
Map.put(variable, :id, make_ref())
end
defp default_opts() do
[domain_impl: CPSolver.DefaultDomain]
end
defoverridable new: 2
end
end
def domain(variable) do
apply_op(:domain, variable)
end
def iterator(%{domain: domain} = _variable, _opts \\ []) do
Domain.iterator(domain)
end
def size(variable) do
apply_op(:size, variable)
end
def fixed?(variable) do
apply_op(:fixed?, variable)
end
def min(variable) do
apply_op(:min, variable)
end
def max(variable) do
apply_op(:max, variable)
end
def contains?(variable, value) do
apply_op(:contains?, variable, value)
end
def remove(variable, value) do
apply_op(:remove, variable, value)
end
def removeAbove(variable, value) do
apply_op(:removeAbove, variable, value)
end
def removeBelow(variable, value) do
apply_op(:removeBelow, variable, value)
end
def fix(variable, value) do
apply_op(:fix, variable, value)
end
defp apply_op(op, %{domain: domain} = _variable, value)
when op in [:remove, :removeAbove, :removeBelow, :fix] do
apply(Domain, op, [domain, value]) |> normalize_update_result()
end
defp apply_op(:contains?, %{domain: domain} = _variable, value) do
Domain.contains?(domain, value)
end
defp apply_op(op, %View{variable: variable}) do
apply_op(op, variable)
end
defp apply_op(op, %{domain: domain} = _variable)
when op in [:size, :fixed?, :min, :max] do
apply(Domain, op, [domain])
end
defp apply_op(:domain, %{domain: domain}) when not is_nil(domain) do
domain
end
defp normalize_update_result({change, _}), do: change
defp normalize_update_result(change), do: change
end