Packages
fixpoint
0.19.5
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/examples/hakank/cp_utils.ex
#
#
#
defmodule Hakank.CPUtils do
# alias CPSolver.IntVariable
alias CPSolver.Constraint.Sum
# alias CPSolver.Constraint.Equal
alias CPSolver.Constraint.LessOrEqual
alias CPSolver.Constraint.AllDifferent.DC.Fast, as: AllDifferent
# alias CPSolver.Model
import CPSolver.Variable.View.Factory
#
# "System" / General functions.
#
@doc """
timeit(fun)
A simple timing function, returns the time in seconds (as a string).
##Examples##
> Util.timeit(&Test1.main/0)
> Util.timeit(fn () -> Test1.run() end)
"""
def timeit(fun) do
{time0, res} = :timer.tc(fun, [])
IO.inspect(res)
(time0 / 1_000_000) |> :erlang.float_to_binary([:compact, decimals: 5])
end
@doc """
mat_at(m,i,j)
Returns the value (`i`,`j`) of the 2d matrix `mat`.
##Examples##
iex> [[1,2,3],[4,5,6],[7,8,9]] |> mat_at(1,2)
6
"""
def mat_at(m,i,j) do
m |> Enum.at(i) |> Enum.at(j)
end
@doc """
transpose(m)
Returns a transposed version of `m`.
##Example##
iex> [[1,2,3],[4,5,6],[7,8,9]] |> transpose
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
"""
def transpose(m) do
Enum.zip_with(m, &Function.identity/1)
end
@doc """
print_matrix(x,rows,cols, format \\ "~2w")
Pretty print `x` as a matrix.
Note: `x` is assumed to be a list of rows*cols elements.
`format` is the spacing of the values, defaults to "~2w".
"""
def print_matrix(x,rows,cols, format \\ "~2w") do
for i <- 0..rows-1 do
for j <- 0..cols-1 do
:io.format(format,[Enum.at(x,i*cols+j)])
end
IO.puts("")
end
IO.puts("\n")
end
#
# Decomposition of constraints
#
@doc """
latin_square(x)
Ensures that an n x n matrix `x` is a Latin Square.
##Examples##
> latin_square(x)
"""
def latin_square(x) do
row_constraints = Enum.map(x,fn row -> AllDifferent.new(row) end)
col_constraints = Enum.map(x |> transpose, fn row -> AllDifferent.new(row) end)
row_constraints ++ col_constraints
end
@doc """
scalar_product(xs,ys,total)
Ensures that `xs` * `ys` = `total`.
It is assumed that `xs` and `ys` are of the same length.
`total` can be either a decision variable or a constraint.
"""
def scalar_product(xs,ys,total) do
[Sum.new(total, for {xi,yi} <- Enum.zip(xs,ys) do mul(xi,yi) end )]
end
@doc """
increasing(x)
Decomposition of the global constraint `increasing` which ensures that
`x` is in increasing order.
"""
def increasing(x) do
len = length(x)
for i <- 1..len-1 do LessOrEqual.new(Enum.at(x,i-1),Enum.at(x,i)) end
end
@doc """
decreasing(x)
Decomposition of the global constraint `increasing` which ensures that
`x` is in increasing order.
"""
def decreasing(x) do
len = length(x)
for i <- 1..len-1 do LessOrEqual.new(Enum.at(x,i),Enum.at(x,i-1)) end
end
@doc """
get_solution_value(res,sol,var_name)
Return the solution of variable named `var_name` (e.g. `"x[3]"`) for
a specific solution `sol`.
Note: `var_name` handles only the single named variables found in
`res.variables`.
"""
#
# For some reason I cannot add these examples in the @doc section since
# it gives an error that get_solution_values/3 does not exist.
#
# Examples:
# x1_val = xxxget_solution_values(res,sol,"x[1]")
# x_val = for i <- 0..n-1, do: get_solution_values(res,sol,"x[#{i}]")
#
def get_solution_value(res,sol,var_name) do
var_idx = Enum.find_index(res.variables, fn v -> v == var_name end)
var_idx && Enum.at(sol, var_idx)
end
end