Packages
fixpoint
0.11.2
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/digraph.ex
defmodule CPSolver.Utils.Digraph do
def new(opts \\ []) do
:digraph.new(opts)
end
def add_edge(dg, v1, v2) do
:digraph.add_edge(dg, v1, v2)
dg
end
def add_edge(dg, v1, v2, label) do
:digraph.add_edge(dg, v1, v2, label)
dg
end
def add_edge(dg, e, v1, v2, label) do
:digraph.add_edge(dg, e, v1, v2, label)
dg
end
def add_vertex(dg, v) do
:digraph.add_vertex(dg, v)
dg
end
def add_vertex(dg, v, label) do
:digraph.add_vertex(dg, v, label)
dg
end
def delete_edge(dg, e) do
:digraph.del_edge(dg, e)
dg
end
def delete_edges(dg, edges) do
:digraph.del_edges(dg, edges)
dg
end
def delete_path(dg, v1, v2) do
:digraph.del_path(dg, v1, v2)
dg
end
def delete_vertex(dg, v) do
:digraph.del_vertex(dg, v)
dg
end
def delete_vertices(dg, vertices) do
:digraph.del_vertices(dg, vertices)
dg
end
def delete(dg) do
:digraph.delete(dg)
end
def edge(dg, e) do
:digraph.edge(dg, e)
end
def edges(dg) do
:digraph.edges(dg)
|> expand_edges(dg)
end
def edges(dg, v) do
:digraph.edges(dg, v)
|> expand_edges(dg)
end
def get_cycle(dg, v) do
:digraph.get_cycle(dg, v)
end
def get_path(dg, v1, v2) do
:digraph.get_path(dg, v1, v2)
end
def get_short_cycle(dg, v) do
:digraph.get_short_cycle(dg, v)
end
def get_short_path(dg, v1, v2) do
:digraph.get_short_path(dg, v1, v2)
end
def in_degree(dg, v) do
:digraph.in_degree(dg, v)
end
def in_edges(dg, v) do
:digraph.in_edges(dg, v)
|> expand_edges(dg)
end
def in_neighbours(dg, v) do
:digraph.in_neighbours(dg, v)
end
def no_edges(dg) do
:digraph.no_edges(dg)
end
def no_vertices(dg) do
:digraph.no_vertices(dg)
end
def out_degree(dg, v) do
:digraph.out_degree(dg, v)
end
def out_edges(dg, v) do
:digraph.out_edges(dg, v)
|> expand_edges(dg)
end
def out_neighbours(dg, v) do
:digraph.out_neighbours(dg, v)
end
def vertex(dg, v) do
:digraph.vertex(dg, v)
end
def vertices(dg) do
:digraph.vertices(dg)
end
def copy(graph) do
dg = :digraph.new()
Enum.each(:digraph.vertices(graph), fn vertex_id ->
{_vertex_id, label} = vertex(graph, vertex_id)
:digraph.add_vertex(dg, vertex_id, label)
end)
Enum.each(:digraph.edges(graph), fn edge ->
{_e, v1, v2, label} = :digraph.edge(graph, edge)
:digraph.add_edge(dg, v1, v2, label)
end)
dg
end
def from_libgraph(%Graph{} = graph) do
dg = new()
Enum.each(Graph.vertices(graph), fn vertex ->
add_vertex(dg, vertex, Graph.vertex_labels(graph, vertex))
end)
edges = Graph.edges(graph)
Enum.each(edges, fn %Graph.Edge{v1: v1, v2: v2, label: label} ->
add_edge(dg, v1, v2, label)
end)
dg
end
def to_libgraph(digraph) do
g_vertices = Enum.reduce(vertices(digraph), Graph.new(),
fn vertex, graph_acc ->
{vertex_id, label} = vertex(digraph, vertex)
Graph.add_vertex(graph_acc, vertex_id, label)
end)
Enum.reduce(edges(digraph), g_vertices, fn digraph_edge, graph_acc ->
%Graph.Edge{v1: v1, v2: v2, label: label} = digraph_edge
Graph.add_edge(graph_acc, v1, v2, label: label)
end)
end
defp expand_edges(edges, digraph) do
Enum.map(edges, fn e ->
{_edge_id, v1, v2, labels} = edge(digraph, e)
%Graph.Edge{v1: v1, v2: v2, label: labels, weight: 1}
end)
end
end