Packages
fixpoint
0.3.1
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_agent.ex
defmodule CPSolver.Variable.Agent do
alias CPSolver.DefaultDomain, as: Domain
require Logger
@behaviour GenServer
def create(variable) do
{:ok, _pid} = GenServer.start_link(__MODULE__, variable)
end
@impl true
@spec init(atom | %{:domain => any, optional(any) => any}) :: {:ok, :gb_sets.set(any)}
def init(variable) do
{:ok, Domain.new(variable.domain)}
end
def operation(var, operation, args \\ [])
def operation(var, operation, args) when is_pid(var) do
do_operation(var, operation, args)
end
defp do_operation(variable_handle, operation, args) do
GenServer.call(variable_handle, {operation, args})
end
@impl true
def handle_call({_op, _args}, _from, :fail) do
{:reply, :fail, :fail}
end
## Read ops
def handle_call({:domain, _args}, _from, domain) do
{:reply, domain, domain}
end
def handle_call({op, args}, _from, domain)
when op in [:size, :fixed?, :min, :max, :contains?] do
{:reply, apply(Domain, op, [domain | args]), domain}
end
## Write ops
def handle_call({op, args}, _from, domain)
when op in [:remove, :removeAbove, :removeBelow, :fix] do
{result, updated_domain} =
case apply(Domain, op, [domain | args]) do
:fail ->
{:fail, :fail}
:no_change ->
{:no_change, domain}
{domain_change, new_domain} ->
{domain_change, new_domain}
end
{:reply, result, updated_domain}
end
@impl true
def handle_cast(:dispose, state) do
{:stop, :normal, state}
end
end