Skip to content
This repository has been archived by the owner on May 4, 2024. It is now read-only.

Commit

Permalink
Merge edges with same destination
Browse files Browse the repository at this point in the history
  • Loading branch information
floriandejonckheere committed Apr 1, 2024
1 parent d86a377 commit d907f30
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 30 deletions.
4 changes: 2 additions & 2 deletions lib/mosaik/graph/vertex.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ class Vertex

def initialize(id, attributes = {})
@id = id
@edges = Hash.new { |h, k| h[k] = [] }
@edges = Hash.new { |h, k| h[k] = Edge.new }
@attributes = attributes
end

def add_edge(to, **attributes)
edges[to] << Edge.new(attributes)
edges[to].attributes.merge!(attributes)
end

def remove_edge(id)
Expand Down
67 changes: 47 additions & 20 deletions spec/mosaik/graph/graph_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -24,25 +24,38 @@
graph.add_directed_edge("vertex1", "vertex2")

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex2").edges).to be_empty
end

it "adds a directed edge with attributes" do
it "sets the attributes" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_directed_edge("vertex1", "vertex2", key: "value")

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex1").edges["vertex2"].first.attributes).to eq key: "value"
expect(graph.find_vertex("vertex1").edges["vertex2"].attributes).to eq key: "value"
end

it "adds a directed edge twice" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_directed_edge("vertex1", "vertex2")
graph.add_directed_edge("vertex1", "vertex2")
context "when the edge already exists" do
it "does not add a directed edge multiple times" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_directed_edge("vertex1", "vertex2")
graph.add_directed_edge("vertex1", "vertex2")
graph.add_directed_edge("vertex1", "vertex2")

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex1").edges["vertex2"].size).to eq 2
expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex2").edges.keys).to be_empty
end

it "merges the attributes" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_directed_edge("vertex1", "vertex2", key: "value")
graph.add_directed_edge("vertex1", "vertex2", value: "key")
graph.add_directed_edge("vertex1", "vertex2", key: "key")

expect(graph.find_vertex("vertex1").edges["vertex2"].attributes).to eq key: "key", value: "key"
end
end
end

Expand All @@ -53,25 +66,39 @@
graph.add_undirected_edge("vertex1", "vertex2")

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex2").edges.keys).to eq ["vertex1"]
end

it "adds an undirected edge with attributes" do
it "sets the attributes" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_undirected_edge("vertex1", "vertex2", key: "value")

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex1").edges["vertex2"].first.attributes).to eq key: "value"
expect(graph.find_vertex("vertex1").edges["vertex2"].attributes).to eq key: "value"
expect(graph.find_vertex("vertex2").edges["vertex1"].attributes).to eq key: "value"
end

it "adds an undirected edge twice" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_undirected_edge("vertex1", "vertex2")
graph.add_undirected_edge("vertex1", "vertex2")
context "when the edge already exists" do
it "adds an undirected edge multiple times" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_undirected_edge("vertex1", "vertex2")
graph.add_undirected_edge("vertex1", "vertex2")

expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex1").edges["vertex2"].size).to eq 2
expect(graph.find_vertex("vertex1").edges.keys).to eq ["vertex2"]
expect(graph.find_vertex("vertex2").edges.keys).to eq ["vertex1"]
end

it "merges the attributes" do
graph.add_vertex("vertex1")
graph.add_vertex("vertex2")
graph.add_undirected_edge("vertex1", "vertex2", key: "value")
graph.add_undirected_edge("vertex1", "vertex2", value: "key")
graph.add_undirected_edge("vertex1", "vertex2", key: "key")

expect(graph.find_vertex("vertex1").edges["vertex2"].attributes).to eq key: "key", value: "key"
expect(graph.find_vertex("vertex2").edges["vertex1"].attributes).to eq key: "key", value: "key"
end
end
end

Expand Down
25 changes: 17 additions & 8 deletions spec/mosaik/graph/vertex_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,28 @@
expect(vertex.edges.keys).to eq ["child"]
end

it "adds an edge with attributes" do
it "sets the attributes" do
vertex.add_edge("child", key: "value")

expect(vertex.edges.keys).to eq ["child"]
expect(vertex.edges["child"].first.attributes).to eq key: "value"
expect(vertex.edges["child"].attributes).to eq key: "value"
end

it "adds an edge twice" do
vertex.add_edge("child")
vertex.add_edge("child")
context "when the edge already exists" do
it "does not add an edge multiple times" do
vertex.add_edge("child")
vertex.add_edge("child")
vertex.add_edge("child")

expect(vertex.edges.keys).to eq ["child"]
expect(vertex.edges["child"].size).to eq 2
expect(vertex.edges.keys).to eq ["child"]
end

it "merges the attributes" do
vertex.add_edge("child", key: "value")
vertex.add_edge("child", value: "key")
vertex.add_edge("child", key: "key")

expect(vertex.edges["child"].attributes).to eq key: "key", value: "key"
end
end
end
end

0 comments on commit d907f30

Please sign in to comment.