Packages
fixpoint
0.8.28
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 CPUtils do
# alias CPSolver.IntVariable
# alias CPSolver.Constraint.Sum
# alias CPSolver.Constraint.Equal
alias CPSolver.Constraint.AllDifferent.FWC, as: AllDifferent
# alias CPSolver.Model
#
# "System" / General functions.
#
@doc """
timeit(fun)
From https://stackoverflow.com/questions/29668635/how-can-we-easily-time-function-calls-in-elixir
A more elaborate timing function. Prints
* Name of the function
* Result
* Time in seconds
##Examples##
> timeit(&test1/0)
"""
def timeit(fun) do
# Convert the function (e.g. &Euler1.euler1a/0 to a string
fun_s = Kernel.inspect(fun)
{time0, res} = :timer.tc(fun, [])
time = (time0 / 1_000_000) |> :erlang.float_to_binary([:compact, decimals: 5])
IO.puts("#{fun_s} res:#{res} time:#{time}s")
end
@doc """
timeit_simple(fun)
A simple timing function, returns the time in seconds (as a string).
##Examples##
> Util.timeit_simple(&Test1.main/0)
> Util.timeit_simple(fn () -> Test1.main() end)
"""
def timeit_simple(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
end