Sha256: 8ef58f4c9e753c3866bde84ac94a66f9814bbfacbba72cb3b0876231173d4dd8

Contents?: true

Size: 1.76 KB

Versions: 1

Compression:

Stored size: 1.76 KB

Contents

module Ogr
  # Graph implemented as Adjency List
  class GraphAsList
    def initialize(opts = {})
      @store = []
      @directed = opts[:directed].nil? ? true : false
    end

    def undirected?
      !@directed
    end

    # Adds new edges to graph.
    def add(x, y, weight)
      @store[x] ||= EdgeBag.new
      @store[x].add(y, weight)
      @store[y] ||= EdgeBag.new if undirected?
      @store[y].add(x, weight) if undirected?
    end

    # Removes conection between vertex x and y.
    def remove(x, y)
      @store[x].remove(y)
      @store[y].remove(x) if undirected?
    end

    # Checks if two elements are connected.
    def edge?(x, y)
      connected?(x, y)
    end

    # Returns Edge(x,y) if exist.
    def get_edge(x, y)
      edge = get(x, y)
      edge[:weight] if edge
    end

    # Returns all neighbors for given vertex.
    def neighbors(x)
      @store[x].map { |edge| edge[:v] }
    end

    # Returns vertex degree. Second parameter determines direction - :in incoming
    # edges, :out - outcoming edges, :all - incoming and outcoming edges.
    def degree(x, direction = :all)
      r = Hash.new(0)
      vc = (0..@store.size)
      vc.each do |i|
        r[:in] += 1 if  connected?(i, x)
        r[:out] += 1 if connected?(x, i)
      end
      r[:all] = r[:in] + r[:out]
      return r[direction] / 2 if undirected?
      r[direction]
    end

    def each_edge(vertexes)
      @store.each_with_index do |list, i|
        list.each do |vertex|
          j = vertex[:v]
          next if i > j && undirected?
          w = get_edge(i, j)
          yield Edge.new(vertexes[i], vertexes[j], w) if w
        end
      end
    end

    private

    def get(x, y)
      @store[x] && @store[x].get(y)
    end

    def connected?(x, y)
      !get(x, y).nil?
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
ogr-0.1.0 lib/ogr/graphs/graph_as_list.rb