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