tangle 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/tangle.rb +11 -2
- data/lib/tangle/edge.rb +14 -5
- data/lib/tangle/errors.rb +28 -0
- data/lib/tangle/graph.rb +6 -4
- data/lib/tangle/simple/edge.rb +18 -0
- data/lib/tangle/simple/graph.rb +17 -0
- data/lib/tangle/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1fe724ce08f713fbe503fde9eb9705f8e2aa39df7d44a2cb1463f5404dcb8380
|
4
|
+
data.tar.gz: 64ac53373a7747cb68f2023bb1cf6c5a9656449c0916ae1a2f6ee856f5c67593
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8121539f09661bf3ff0bac14211d0cda52768d2b0a9f4ffb76fb92ea1049afacebca54aa85fce60f47cbffe194ca1f2832758d3f6f1c28acb8bb80f09ee33cec
|
7
|
+
data.tar.gz: 604724b372a499f6237240a9dfa3298e91f1889c7f674a733956d56a616b633af154e4a97aa9250d724b8ba7306dad7f69615e4af295e1d7705c5ccbe672b06c
|
data/lib/tangle.rb
CHANGED
@@ -1,8 +1,17 @@
|
|
1
1
|
require 'tangle/version'
|
2
|
+
require 'tangle/errors'
|
2
3
|
require 'tangle/graph'
|
4
|
+
require 'tangle/simple/graph'
|
3
5
|
|
4
|
-
# Tangle manages
|
6
|
+
# Tangle manages various types of graphs
|
7
|
+
#
|
8
|
+
# Tangle::MultiGraph.new
|
9
|
+
# => Undirected graph without edge constraints
|
10
|
+
#
|
11
|
+
# Tangle::SimpleGraph.new
|
12
|
+
# => Undirected graph with single edges between vertices, and no loops
|
5
13
|
#
|
6
14
|
module Tangle
|
7
|
-
|
15
|
+
MultiGraph = Tangle::Graph
|
16
|
+
SimpleGraph = Tangle::Simple::Graph
|
8
17
|
end
|
data/lib/tangle/edge.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'tangle/errors'
|
2
|
+
|
1
3
|
module Tangle
|
2
4
|
#
|
3
5
|
# An edge in a graph, connecting two vertices
|
@@ -16,7 +18,7 @@ module Tangle
|
|
16
18
|
@vertices = Set[vertex1, vertex2]
|
17
19
|
@graph = graph
|
18
20
|
|
19
|
-
|
21
|
+
validate_edge
|
20
22
|
end
|
21
23
|
|
22
24
|
# Follow the edge from a vertex to the other end
|
@@ -43,7 +45,7 @@ module Tangle
|
|
43
45
|
vertices = @vertices.map do |vertex|
|
44
46
|
graph.get_vertex(vertex.vertex_id)
|
45
47
|
end
|
46
|
-
|
48
|
+
self.class.new(*vertices, graph: graph)
|
47
49
|
rescue KeyError
|
48
50
|
nil
|
49
51
|
end
|
@@ -52,16 +54,23 @@ module Tangle
|
|
52
54
|
"#<#{self.class}: #{@vertices}>"
|
53
55
|
end
|
54
56
|
|
57
|
+
def eql?(other)
|
58
|
+
@graph == other.graph && @vertices == other.vertices
|
59
|
+
end
|
60
|
+
alias == eql?
|
61
|
+
alias === eql?
|
62
|
+
alias equal? eql?
|
63
|
+
|
55
64
|
attr_reader :name
|
56
65
|
attr_reader :graph
|
57
66
|
attr_reader :vertices
|
58
67
|
|
59
|
-
def_delegators :@vertices, :include
|
68
|
+
def_delegators :@vertices, :include?, :hash
|
60
69
|
|
61
70
|
private
|
62
71
|
|
63
|
-
def
|
64
|
-
@vertices.all? { |vertex| vertex.graph == @graph }
|
72
|
+
def validate_edge
|
73
|
+
raise GraphError unless @vertices.all? { |vertex| vertex.graph == @graph }
|
65
74
|
end
|
66
75
|
end
|
67
76
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Tangle
|
2
|
+
#
|
3
|
+
# LoopError is raised when a looped edge is disallowed.
|
4
|
+
#
|
5
|
+
class LoopError < RuntimeError
|
6
|
+
def initialize(reason = 'loops not allowed', *)
|
7
|
+
super
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
# MultiEdgeError is raised when multiple edges between a single pair of
|
12
|
+
# vertices is disallowed.
|
13
|
+
#
|
14
|
+
class MultiEdgeError < RuntimeError
|
15
|
+
def initialize(reason = 'multiedges not allowed', *)
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# GraphError is raised when graph elements in an operation belong to
|
21
|
+
# different graphs.
|
22
|
+
#
|
23
|
+
class GraphError < RuntimeError
|
24
|
+
def initialize(reason = 'not in the same graph', *)
|
25
|
+
super
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
data/lib/tangle/graph.rb
CHANGED
@@ -6,6 +6,8 @@ module Tangle
|
|
6
6
|
# Base class for all kinds of graphs
|
7
7
|
#
|
8
8
|
class Graph
|
9
|
+
Edge = Tangle::Edge
|
10
|
+
|
9
11
|
# Initialize a new graph, optionally preloading it with vertices and edges
|
10
12
|
#
|
11
13
|
# Graph.new() => Graph
|
@@ -28,7 +30,7 @@ module Tangle
|
|
28
30
|
def initialize(vertices: nil, edges: nil)
|
29
31
|
@vertices_by_id = {}
|
30
32
|
@vertices_by_name = {}
|
31
|
-
@edges
|
33
|
+
@edges ||= []
|
32
34
|
|
33
35
|
initialize_vertices(vertices)
|
34
36
|
initialize_edges(edges)
|
@@ -42,7 +44,7 @@ module Tangle
|
|
42
44
|
if block_given?
|
43
45
|
@edges.select(&selector)
|
44
46
|
else
|
45
|
-
@edges
|
47
|
+
@edges.to_a
|
46
48
|
end
|
47
49
|
end
|
48
50
|
|
@@ -52,7 +54,7 @@ module Tangle
|
|
52
54
|
#
|
53
55
|
def add_edge(*vertices, **kvargs)
|
54
56
|
vertices = vertices.map { |v| get_vertex(v) }
|
55
|
-
insert_edge(Edge.new(*vertices, graph: self, **kvargs))
|
57
|
+
insert_edge(self.class::Edge.new(*vertices, graph: self, **kvargs))
|
56
58
|
end
|
57
59
|
|
58
60
|
# Get all vertices.
|
@@ -97,7 +99,7 @@ module Tangle
|
|
97
99
|
# Unless a selector is provided, the subgraph contains the entire graph.
|
98
100
|
#
|
99
101
|
def subgraph(&selector)
|
100
|
-
graph =
|
102
|
+
graph = self.class.new
|
101
103
|
|
102
104
|
dup_vertices_into(graph, &selector)
|
103
105
|
dup_edges_into(graph)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'tangle/edge'
|
2
|
+
|
3
|
+
module Tangle
|
4
|
+
module Simple
|
5
|
+
#
|
6
|
+
# An edge in a simple graph, with no loops or multiedges
|
7
|
+
#
|
8
|
+
class Edge < Tangle::Edge
|
9
|
+
private
|
10
|
+
|
11
|
+
def validate_edge
|
12
|
+
super
|
13
|
+
raise LoopError unless @vertices.count == 2
|
14
|
+
raise MultiEdgeError if @graph.edges.include? self
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'tangle/graph'
|
2
|
+
require 'tangle/simple/edge'
|
3
|
+
|
4
|
+
module Tangle
|
5
|
+
module Simple
|
6
|
+
#
|
7
|
+
# A simple graph, without loops and multiple edges
|
8
|
+
class Graph < Tangle::Graph
|
9
|
+
Edge = Tangle::Simple::Edge
|
10
|
+
|
11
|
+
def initialize(**kvargs)
|
12
|
+
@edges ||= Set[]
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/tangle/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tangle
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Calle Englund
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-02-
|
11
|
+
date: 2018-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -86,7 +86,10 @@ files:
|
|
86
86
|
- bin/setup
|
87
87
|
- lib/tangle.rb
|
88
88
|
- lib/tangle/edge.rb
|
89
|
+
- lib/tangle/errors.rb
|
89
90
|
- lib/tangle/graph.rb
|
91
|
+
- lib/tangle/simple/edge.rb
|
92
|
+
- lib/tangle/simple/graph.rb
|
90
93
|
- lib/tangle/version.rb
|
91
94
|
- lib/tangle/vertex.rb
|
92
95
|
- tangle.gemspec
|