tangle 0.3.1 → 0.4.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/README.md +1 -1
- data/lib/tangle/directed/edge.rb +31 -0
- data/lib/tangle/directed/graph.rb +17 -0
- data/lib/tangle/edge.rb +11 -4
- data/lib/tangle/mixin/ancestry.rb +64 -0
- data/lib/tangle/mixin/connectedness.rb +8 -5
- data/lib/tangle/mixin.rb +1 -0
- data/lib/tangle/vertex.rb +2 -2
- data/lib/tangle.rb +2 -0
- 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: 46af55dc3f6a3cb2ffc754776a93209e02d647cac2aa824729b3816665b344a6
|
4
|
+
data.tar.gz: b128f9e8ffa5c608ffc2b9a12946c772886b4bdec661d51ac542c9e25346e890
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5cd121de93316e33175f8184a7092bce69e85c6865b75826da6fd741997b583004b53167679cf098e9e2cb9023809e725d7ab9528c61d32cfeef02e1a589d7a6
|
7
|
+
data.tar.gz: 685ce03d7f320333b527c22582a46aedddcf2ab7bd0eec1351aa49b5ec9c319130b2d3ccd4348558844ebda593ab5e8403765711f235e85730b9c4eca96fc424
|
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
[](https://badge.fury.io/rb/tangle)
|
1
|
+
[](https://badge.fury.io/rb/tangle) [](https://codeclimate.com/github/notCalle/ruby-tangle/maintainability)
|
2
2
|
|
3
3
|
# Tangle
|
4
4
|
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'tangle/edge'
|
2
|
+
|
3
|
+
module Tangle
|
4
|
+
module Directed
|
5
|
+
#
|
6
|
+
# An edge in a directed graph
|
7
|
+
#
|
8
|
+
class Edge < Tangle::Edge
|
9
|
+
def initialize(vertex1, vertex2 = vertex1, graph: nil)
|
10
|
+
@child, @parent = @vertices = [vertex1, vertex2]
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def parent?(vertex)
|
15
|
+
@parent == vertex
|
16
|
+
end
|
17
|
+
|
18
|
+
def parent(_vertex = nil)
|
19
|
+
@parent
|
20
|
+
end
|
21
|
+
|
22
|
+
def child?(vertex)
|
23
|
+
@child == vertex
|
24
|
+
end
|
25
|
+
|
26
|
+
def child(_vertex = nil)
|
27
|
+
@child
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'tangle/graph'
|
2
|
+
require 'tangle/directed/edge'
|
3
|
+
|
4
|
+
module Tangle
|
5
|
+
module Directed
|
6
|
+
#
|
7
|
+
# A directed graph
|
8
|
+
class Graph < Tangle::Graph
|
9
|
+
Edge = Tangle::Directed::Edge
|
10
|
+
DEFAULT_MIXINS = [Tangle::Mixin::Ancestry].freeze
|
11
|
+
|
12
|
+
def initialize(mixins: DEFAULT_MIXINS, **kvargs)
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/tangle/edge.rb
CHANGED
@@ -16,7 +16,7 @@ module Tangle
|
|
16
16
|
# End users should probably use Graph#add_edge instead.
|
17
17
|
#
|
18
18
|
def initialize(vertex1, vertex2 = vertex1, graph: nil)
|
19
|
-
@vertices
|
19
|
+
@vertices ||= Set[vertex1, vertex2]
|
20
20
|
@graph = graph
|
21
21
|
|
22
22
|
initialize_mixins
|
@@ -28,9 +28,16 @@ module Tangle
|
|
28
28
|
#
|
29
29
|
# walk(vertex) => Vertex
|
30
30
|
#
|
31
|
-
def walk(from_vertex)
|
32
|
-
|
33
|
-
|
31
|
+
def walk(from_vertex, selector: :other)
|
32
|
+
send(selector, from_vertex)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Return the other vertex for a vertex of this edge
|
36
|
+
#
|
37
|
+
def other(for_vertex)
|
38
|
+
raise RuntimeError unless @vertices.include?(for_vertex)
|
39
|
+
|
40
|
+
@vertices.find { |other| other != for_vertex } || for_vertex
|
34
41
|
end
|
35
42
|
|
36
43
|
# Duplicate an edge into another graph, replacing original vertices with
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'tangle/mixin/connectedness'
|
2
|
+
|
3
|
+
module Tangle
|
4
|
+
module Mixin
|
5
|
+
#
|
6
|
+
# Mixin for adding ancestry features
|
7
|
+
#
|
8
|
+
module Ancestry
|
9
|
+
#
|
10
|
+
# Mixins for adding ancestry relations to a digraph
|
11
|
+
#
|
12
|
+
module Graph
|
13
|
+
include Tangle::Mixin::Connectedness::Graph
|
14
|
+
|
15
|
+
def ancestor_subgraph(vertex)
|
16
|
+
subgraph { |other| vertex.ancestor?(other) }
|
17
|
+
end
|
18
|
+
|
19
|
+
def descendant_subgraph(vertex)
|
20
|
+
subgraph { |other| vertex.descendant?(other) }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Mixins for adding ancestry relations to vertices in a digraph
|
26
|
+
#
|
27
|
+
module Vertex
|
28
|
+
include Tangle::Mixin::Connectedness::Vertex
|
29
|
+
|
30
|
+
def parent_edges
|
31
|
+
@graph.edges { |edge| edge.child?(self) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def parents
|
35
|
+
neighbours(parent_edges)
|
36
|
+
end
|
37
|
+
|
38
|
+
def parent?(other)
|
39
|
+
@graph.edges.any? { |edge| edge.child?(self) && edge.parent?(other) }
|
40
|
+
end
|
41
|
+
|
42
|
+
def ancestor?(other)
|
43
|
+
connected?(other, test_method: :parent?)
|
44
|
+
end
|
45
|
+
|
46
|
+
def child_edges
|
47
|
+
@graph.edges { |edge| edge.parent?(self) }
|
48
|
+
end
|
49
|
+
|
50
|
+
def children
|
51
|
+
neighbours(child_edges)
|
52
|
+
end
|
53
|
+
|
54
|
+
def child?(other)
|
55
|
+
@graph.edges.any? { |edge| edge.parent?(self) && edge.child?(other) }
|
56
|
+
end
|
57
|
+
|
58
|
+
def descendant?(other)
|
59
|
+
connected?(other, test_method: :child?)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -1,5 +1,8 @@
|
|
1
1
|
module Tangle
|
2
2
|
module Mixin
|
3
|
+
#
|
4
|
+
# Mixins for adding connectedness features
|
5
|
+
#
|
3
6
|
module Connectedness
|
4
7
|
#
|
5
8
|
# Mixin for adding connectedness to a graph
|
@@ -50,20 +53,20 @@ module Tangle
|
|
50
53
|
# Two vertices are connected if there is a path between them,
|
51
54
|
# and a vertex is connected to itself.
|
52
55
|
#
|
53
|
-
def connected?(other)
|
56
|
+
def connected?(other, test_method: :adjacent?)
|
54
57
|
raise GraphError unless @graph == other.graph
|
55
58
|
return true if self == other
|
56
59
|
|
57
|
-
connected_excluding?(other, Set[self])
|
60
|
+
connected_excluding?(other, test_method, Set[self])
|
58
61
|
end
|
59
62
|
|
60
63
|
protected
|
61
64
|
|
62
|
-
def connected_excluding?(other, history)
|
63
|
-
return true if
|
65
|
+
def connected_excluding?(other, test_method, history)
|
66
|
+
return true if send(test_method, other)
|
64
67
|
|
65
68
|
(neighbours - history).any? do |vertex|
|
66
|
-
vertex.connected_excluding?(other, history << self)
|
69
|
+
vertex.connected_excluding?(other, test_method, history << self)
|
67
70
|
end
|
68
71
|
end
|
69
72
|
end
|
data/lib/tangle/mixin.rb
CHANGED
data/lib/tangle/vertex.rb
CHANGED
@@ -61,8 +61,8 @@ module Tangle
|
|
61
61
|
|
62
62
|
# Return the set of adjacent vertices
|
63
63
|
#
|
64
|
-
def neighbours
|
65
|
-
Set.new(
|
64
|
+
def neighbours(included = edges)
|
65
|
+
Set.new(included.map { |edge| edge.walk(self) })
|
66
66
|
end
|
67
67
|
|
68
68
|
# If two vertices have the same vertex_id, they have the same value
|
data/lib/tangle.rb
CHANGED
@@ -2,6 +2,7 @@ require 'tangle/version'
|
|
2
2
|
require 'tangle/errors'
|
3
3
|
require 'tangle/graph'
|
4
4
|
require 'tangle/simple/graph'
|
5
|
+
require 'tangle/directed/graph'
|
5
6
|
|
6
7
|
# Tangle manages various types of graphs
|
7
8
|
#
|
@@ -14,4 +15,5 @@ require 'tangle/simple/graph'
|
|
14
15
|
module Tangle
|
15
16
|
MultiGraph = Tangle::Graph
|
16
17
|
SimpleGraph = Tangle::Simple::Graph
|
18
|
+
DiGraph = Tangle::Directed::Graph
|
17
19
|
end
|
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.4.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-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: git-version-bump
|
@@ -99,10 +99,13 @@ files:
|
|
99
99
|
- bin/console
|
100
100
|
- bin/setup
|
101
101
|
- lib/tangle.rb
|
102
|
+
- lib/tangle/directed/edge.rb
|
103
|
+
- lib/tangle/directed/graph.rb
|
102
104
|
- lib/tangle/edge.rb
|
103
105
|
- lib/tangle/errors.rb
|
104
106
|
- lib/tangle/graph.rb
|
105
107
|
- lib/tangle/mixin.rb
|
108
|
+
- lib/tangle/mixin/ancestry.rb
|
106
109
|
- lib/tangle/mixin/connectedness.rb
|
107
110
|
- lib/tangle/simple/edge.rb
|
108
111
|
- lib/tangle/simple/graph.rb
|