Sha256: d549dddb193437f694965e8dc05182cc8683754f9f199d4f59fbcba7158212c4

Contents?: true

Size: 1.14 KB

Versions: 1

Compression:

Stored size: 1.14 KB

Contents

require 'csv'
require_relative '../../lib/rgraph/link'
require_relative '../../lib/rgraph/node'


class Graph
  attr_accessor :nodes, :links

  def initialize(csv)
    @nodes = []
    @links = []
    raise Exception.new("the file must be a .csv") unless File.extname(csv) == ".csv"

    CSV.foreach(csv, headers: true) do |row|
      #last because CSV#delete returns [column,value]
      source_id = row.delete('source').last
      target_id = row.delete('target').last

      unless source = get_node_by_id(source_id)
        source = Node.new(id: source_id)
        @nodes << source
      end
      unless target = get_node_by_id(target_id)
        target = Node.new(id: target_id)
        @nodes << target
      end

      @links << Link.new(source: source, target: target, weight: row['weight'], year: row['year'])
    end
  end

  def each_node(&block)
    @nodes.each(&block)
  end

  def each_link(&block)
    @links.each(&block)
  end

  def degrees
    @nodes.map{|node| node.degree}
  end

  def average_degree
    degrees.inject(:+) / @nodes.size.to_f
  end

  private

  def get_node_by_id(node_id)
    @nodes.select{|n| n.id == node_id}.first
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rgraph-0.0.5 lib/rgraph/graph.rb