lib/utils/bitgraph.ex

defmodule CPSolver.Utils.BitGraph do
    def new(opts \\ []) do
      BitGraph.new(opts)
    end


    def add_edge(bg, v1, v2) do
      BitGraph.add_edge(bg, v1, v2)
    end

    def add_edge(bg, v1, v2, label) do
      BitGraph.add_edge(bg, v1, v2, label)
    end

    def add_vertex(bg, v) do
      BitGraph.add_vertex(bg, v)
    end

    def add_vertex(bg, v, label) do
      BitGraph.add_vertex(bg, v, label)
    end

    def delete_edge(bg, v1, v2) do
      BitGraph.delete_edge(bg, v1, v2)
    end

    def delete_edges(bg, edges) do
      Enum.reduce(edges, bg, fn {from, to} -> delete_edge(bg, from, to) end)
    end

    def delete_vertex(bg, v) do
      BitGraph.delete_vertex(bg, v)
    end

    def delete_vertices(bg, vertices) do
      Enum.reduce(vertices, bg, fn vertex -> delete_vertex(bg, vertex) end)
    end

    def edge(bg, v1, v2) do
      BitGraph.get_edge(bg, v1, v2)
    end

    def edges(bg) do
      BitGraph.edges(bg)
      |> expand_edges(bg)
    end

    def edges(bg, v) do
      BitGraph.edges(bg, v)
      |> expand_edges(bg)
    end

    def in_degree(bg, v) do
      BitGraph.in_degree(bg, v)
    end

    def in_edges(bg, v) do
      BitGraph.in_edges(bg, v)
      |> expand_edges(bg)
    end

    def in_neighbours(bg, v) do
      BitGraph.in_neighbors(bg, v)
    end

    def num_edges(bg) do
      BitGraph.num_edges(bg)
    end

    def num_vertices(bg) do
      BitGraph.num_vertices(bg)
    end

    def out_degree(bg, v) do
      BitGraph.out_degree(bg, v)
    end

    def out_edges(bg, v) do
      BitGraph.out_edges(bg, v)
      |> expand_edges(bg)
    end

    def out_neighbours(bg, v) do
      BitGraph.out_neighbors(bg, v)
    end

    def vertex(bg, v) do
      BitGraph.get_vertex(bg, v)
    end

    def vertices(bg) do
      BitGraph.vertices(bg)
    end

    def copy(graph) do
      BitGraph.copy(graph)
    end

    defp expand_edges(edges, graph) do
      Enum.map(edges, fn {v1, v2} ->
        {_edge_id, v1, v2, labels} = edge(graph, v1, v2)
        %Graph.Edge{v1: v1, v2: v2, label: labels, weight: 1}
      end)
    end

end