class Rbgraph::Graph
Attributes
edges[RW]
nodes[RW]
Public Class Methods
new(nodes = {}, edges = {})
click to toggle source
# File lib/rbgraph/graph.rb, line 8 def initialize(nodes = {}, edges = {}) self.nodes = nodes self.edges = edges end
Public Instance Methods
add_edge!(node1, node2, weight = 1, kind = nil, edge_data = {}) { |self, edges, new_edge| ... }
click to toggle source
# File lib/rbgraph/graph.rb, line 30 def add_edge!(node1, node2, weight = 1, kind = nil, edge_data = {}, &block) node1 = add_node!(node1[:id], node1[:data]) node2 = add_node!(node2[:id], node2[:data]) new_edge = Edge.new(self, node1, node2, weight, kind, edge_data) if edges[new_edge.id].nil? edges[new_edge.id] = new_edge else if block_given? yield(self, edges[new_edge.id], new_edge) else edges[new_edge.id].weight += weight end end connect_nodes(node1, node2, edges[new_edge.id]) edges[new_edge.id] end
add_node!(node_id, node_data) { |self, nodes, node_data| ... }
click to toggle source
# File lib/rbgraph/graph.rb, line 21 def add_node!(node_id, node_data, &block) if nodes[node_id].nil? nodes[node_id] = Node.new(self, node_id, node_data) else yield(self, nodes[node_id], node_data) if block_given? end nodes[node_id] end
as_json(options = {})
click to toggle source
# File lib/rbgraph/graph.rb, line 98 def as_json(options = {}) {nodes: nodes, edges: edges} end
connect_nodes(node1, node2, edge)
click to toggle source
# File lib/rbgraph/graph.rb, line 89 def connect_nodes(node1, node2, edge) raise NotImplementedError("Cannot connect nodes on a general graph! Use either Directed or Undirected subclasses") end
directed?()
click to toggle source
# File lib/rbgraph/graph.rb, line 17 def directed? raise NotImplementedError end
inspect()
click to toggle source
# File lib/rbgraph/graph.rb, line 93 def inspect edges.values.map(&:inspect) end
merge_nodes!(node_ids, new_node_id = nil, new_node_data = {}, merge_options = {}, &block)
click to toggle source
# File lib/rbgraph/graph.rb, line 64 def merge_nodes!(node_ids, new_node_id = nil, new_node_data = {}, merge_options = {}, &block) node_ids = nodes.values_at(*node_ids).compact.map(&:id) return nil if node_ids.empty? if new_node_id.nil? # If new_node_id is nil then select the first from the list as the surviving node. new_node = nodes[node_ids.shift] new_node.data.merge!(new_node_data) else # Otherwise either check if a node with the given id exists, or create a new one. if nodes[new_node_id].nil? new_node = add_node!(new_node_id, new_node_data) else new_node = nodes[new_node_id] random_not_existent_id = nodes.keys.sort_by { |k| -k.to_s.length } .first.to_s + "_" new_node.merge!(Node.new(self, 0, new_node_data), keep_other_data: true) node_ids.delete(new_node_id) end end node_ids.each do |node_id| node = nodes[node_id] new_node.merge!(node, merge_options, &block) end new_node end
remove_edge!(edge)
click to toggle source
# File lib/rbgraph/graph.rb, line 55 def remove_edge!(edge) edge = edge.is_a?(Edge) ? edge : edges[edge] edge.node1.neighbors.delete(edge.node2.id) edge.node2.neighbors.delete(edge.node1.id) edge.node1.edges.delete(edge.id) edge.node2.edges.delete(edge.id) edges.delete(edge.id) end
remove_node!(node)
click to toggle source
# File lib/rbgraph/graph.rb, line 47 def remove_node!(node) node = node.is_a?(Node) ? node : nodes[node] if node node.edges.values.each { |edge| remove_edge!(edge) } nodes.delete(node.id) end end
size()
click to toggle source
# File lib/rbgraph/graph.rb, line 13 def size nodes.values.length end
to_json(options = {})
click to toggle source
# File lib/rbgraph/graph.rb, line 102 def to_json(options = {}) JSON.generate({nodes: nodes, edges: edges}) end