@@ -22,6 +22,9 @@ import LightGraphs.SimpleGraphs:
22
22
SimpleEdge, fadj, badj
23
23
24
24
export
25
+ AbstractMetaGraph,
26
+ MetaGraph,
27
+ MetaDiGraph,
25
28
meta_graph,
26
29
weight_type,
27
30
default_weight,
@@ -32,74 +35,66 @@ export
32
35
DOTFormat,
33
36
reverse
34
37
35
- maybe_order_edge (graph, edge) =
36
- if is_directed (graph)
37
- edge
38
- else
39
- if is_ordered (edge)
40
- edge
41
- else
42
- reverse (edge)
43
- end
44
- end
45
38
46
- include ( " metagraph.jl " )
39
+ abstract type AbstractMetaGraph{Vertex, InnerGraph, AtVertex, AtEdge, GraphMeta, WeightFunction, Weight} <: AbstractGraph{Vertex} end
47
40
48
- function show (io:: IO , meta:: MetaGraph {<: Any, <: Any, AtVertex, AtEdge, GraphMeta, <: Any, Weight} ) where {AtVertex, AtEdge, GraphMeta, Weight}
41
+ function show (io:: IO , meta:: AbstractMetaGraph {<: Any, <: Any, AtVertex, AtEdge, GraphMeta, <: Any, Weight} ) where {AtVertex, AtEdge, GraphMeta, Weight}
49
42
print (io, " Meta graph based on a $(meta. inner_graph) with $AtVertex (s) at vertices, $AtEdge (s) at edges, $GraphMeta metadata, $Weight weights, and default weight $(meta. default_weight) " )
50
43
end
51
44
52
- @inline fadj (meta:: MetaGraph , arguments... ) =
45
+ @inline fadj (meta:: AbstractMetaGraph , arguments... ) =
53
46
fadj (meta. inner_graph, arguments... )
54
- @inline badj (meta:: MetaGraph , arguments... ) =
47
+ @inline badj (meta:: AbstractMetaGraph , arguments... ) =
55
48
badj (meta. inner_graph, arguments... )
56
49
57
- eltype (meta:: MetaGraph ) = eltype (meta. inner_graph)
58
- edgetype (meta:: MetaGraph ) = edgetype (meta. inner_graph)
59
- nv (meta:: MetaGraph ) = nv (meta. inner_graph)
60
- vertices (meta:: MetaGraph ) = vertices (meta. inner_graph)
50
+ eltype (meta:: AbstractMetaGraph ) = eltype (meta. inner_graph)
51
+ edgetype (meta:: AbstractMetaGraph ) = edgetype (meta. inner_graph)
52
+ nv (meta:: AbstractMetaGraph ) = nv (meta. inner_graph)
53
+ vertices (meta:: AbstractMetaGraph ) = vertices (meta. inner_graph)
61
54
62
- ne (meta:: MetaGraph ) = ne (meta. inner_graph)
63
- edges (meta:: MetaGraph ) = edges (meta. inner_graph)
55
+ ne (meta:: AbstractMetaGraph ) = ne (meta. inner_graph)
56
+ edges (meta:: AbstractMetaGraph ) = edges (meta. inner_graph)
64
57
65
- has_vertex (meta:: MetaGraph , arguments... ) =
58
+ has_vertex (meta:: AbstractMetaGraph , arguments... ) =
66
59
has_vertex (meta. inner_graph, arguments... )
67
- @inline has_edge (meta:: MetaGraph , arguments... ) =
60
+ @inline has_edge (meta:: AbstractMetaGraph , arguments... ) =
68
61
has_edge (meta. inner_graph, arguments... )
69
62
70
- inneighbors (meta:: MetaGraph , vertex:: Integer ) =
63
+ inneighbors (meta:: AbstractMetaGraph , vertex:: Integer ) =
71
64
inneighbors (meta. inner_graph, vertex)
72
- outneighbors (meta:: MetaGraph , vertex:: Integer ) = fadj (meta. inner_graph, vertex)
65
+ outneighbors (meta:: AbstractMetaGraph , vertex:: Integer ) = fadj (meta. inner_graph, vertex)
73
66
74
- issubset (meta:: MetaGraph , meta2:: MetaGraph ) =
67
+ issubset (meta:: AbstractMetaGraph , meta2:: AbstractMetaGraph ) =
75
68
issubset (meta. inner_graph, meta2. inner_graph)
76
69
77
- # TODO : not order edges more than once
78
-
79
- @inline add_edge! (meta:: MetaGraph , arguments... ) =
70
+ @inline add_edge! (meta:: AbstractMetaGraph , arguments... ) =
80
71
add_edge! (meta. inner_graph, arguments... )
81
72
82
- @inline function delete! (meta:: MetaGraph , edge:: Edge )
73
+ function setindex! (meta:: AbstractMetaGraph , value, edge:: AbstractEdge )
74
+ meta. edge_meta[maybe_order_edge (meta, edge)] = value
75
+ add_edge! (meta, edge)
76
+ end
77
+
78
+ @inline function delete! (meta:: AbstractMetaGraph , edge:: Edge )
83
79
delete! (meta. edge_meta, maybe_order_edge (meta, edge))
84
80
rem_edge! (meta. inner_graph, edge)
85
81
end
86
- @inline rem_edge! (meta:: MetaGraph , edge:: Edge ) = delete! (meta, edge)
82
+ @inline rem_edge! (meta:: AbstractMetaGraph , edge:: Edge ) = delete! (meta, edge)
87
83
88
- add_vertex! (meta:: MetaGraph ) = add_vertex! (meta. inner_graph)
89
- function push! (meta:: MetaGraph , value)
84
+ add_vertex! (meta:: AbstractMetaGraph ) = add_vertex! (meta. inner_graph)
85
+ function push! (meta:: AbstractMetaGraph , value)
90
86
add_vertex! (meta) || return false
91
87
last_vertex = nv (meta)
92
88
meta[last_vertex] = value
93
89
return last_vertex
94
90
end
95
91
96
92
function move_meta! (meta, old_edge:: AbstractEdge , new_edge:: AbstractEdge )
97
- meta[maybe_order_edge (meta, new_edge)] =
98
- pop! (meta. edge_meta, maybe_order_edge (meta, old_edge))
93
+ meta[new_edge] = pop! (meta. edge_meta, maybe_order_edge (meta, old_edge))
99
94
return nothing
100
95
end
101
96
102
- function delete! (meta:: MetaGraph , deleted_vertex:: Integer )
97
+ function delete! (meta:: AbstractMetaGraph , deleted_vertex:: Integer )
103
98
moved_vertex = nv (meta)
104
99
# delete meta data for the old vertex
105
100
delete! (meta. vertex_meta, deleted_vertex)
@@ -136,22 +131,22 @@ function delete!(meta::MetaGraph, deleted_vertex::Integer)
136
131
return result
137
132
end
138
133
139
- rem_vertex! (meta:: MetaGraph , vertex) = delete! (meta, vertex)
134
+ rem_vertex! (meta:: AbstractMetaGraph , vertex) = delete! (meta, vertex)
140
135
141
- struct MetaWeights{Weight <: Real , InnerMetaGraph } <: AbstractMatrix{Weight}
142
- inner_meta_graph:: InnerMetaGraph
136
+ struct MetaWeights{Weight <: Real , InnerAbstractMetaGraph } <: AbstractMatrix{Weight}
137
+ inner_meta_graph:: InnerAbstractMetaGraph
143
138
end
144
139
145
140
show (io:: IO , weights:: MetaWeights ) = print (io, " metaweights" )
146
141
show (io:: IO , :: MIME"text/plain" , weights:: MetaWeights ) = show (io, weights)
147
142
148
- MetaWeights (meta:: MetaGraph ) = MetaWeights {weight_type(meta), typeof(meta)} (meta)
143
+ MetaWeights (meta:: AbstractMetaGraph ) = MetaWeights {weight_type(meta), typeof(meta)} (meta)
149
144
150
145
is_directed (:: Type{<: MetaWeights{<: Any, InnerMetaGraph}} ) where {InnerMetaGraph} =
151
146
is_directed (InnerMetaGraph)
152
147
153
148
function getindex (weights:: MetaWeights{Weight} , in_vertex:: Integer , out_vertex:: Integer ):: Weight where {Weight}
154
- edge = maybe_order_edge (weights, Edge (in_vertex, out_vertex) )
149
+ edge = Edge (in_vertex, out_vertex)
155
150
inner_meta_graph = weights. inner_meta_graph
156
151
if haskey (inner_meta_graph, edge)
157
152
Weight (inner_meta_graph. weight_function (inner_meta_graph[edge]))
@@ -165,15 +160,18 @@ function size(weights::MetaWeights)
165
160
(vertices, vertices)
166
161
end
167
162
168
- weights (meta:: MetaGraph ) = MetaWeights (meta)
163
+ weights (meta:: AbstractMetaGraph ) = MetaWeights (meta)
164
+
165
+ weight_type (meta:: AbstractMetaGraph{<: Any, <: Any, <: Any, <: Any, <: Any, <: Any, Weight} ) where {Weight} =
166
+ Weight
169
167
170
- getindex (meta:: MetaGraph , vertex:: Integer ) = meta. vertex_meta[vertex]
171
- getindex (meta:: MetaGraph , edge:: AbstractEdge ) = meta. edge_meta[edge]
168
+ getindex (meta:: AbstractMetaGraph , vertex:: Integer ) = meta. vertex_meta[vertex]
169
+ getindex (meta:: AbstractMetaGraph , edge:: AbstractEdge ) = meta. edge_meta[edge]
172
170
173
- haskey (meta:: MetaGraph , vertex:: Integer ) = haskey (meta. vertex_meta, vertex)
174
- haskey (meta:: MetaGraph , edge:: AbstractEdge ) = haskey (meta. edge_meta, edge)
171
+ haskey (meta:: AbstractMetaGraph , vertex:: Integer ) = haskey (meta. vertex_meta, vertex)
172
+ haskey (meta:: AbstractMetaGraph , edge:: AbstractEdge ) = haskey (meta. edge_meta, edge)
175
173
176
- function setindex! (meta:: MetaGraph , value, vertex:: Integer )
174
+ function setindex! (meta:: AbstractMetaGraph , value, vertex:: Integer )
177
175
meta. vertex_meta[vertex] = value
178
176
return nothing
179
177
end
@@ -192,7 +190,7 @@ julia> weight_function(meta_graph(Graph(), weight_function = identity))(0)
192
190
0
193
191
```
194
192
"""
195
- weight_function (meta:: MetaGraph ) = meta. weight_function
193
+ weight_function (meta:: AbstractMetaGraph ) = meta. weight_function
196
194
197
195
"""
198
196
default_weight(meta)
@@ -208,7 +206,7 @@ julia> default_weight(meta_graph(Graph(), default_weight = 2.0))
208
206
2.0
209
207
```
210
208
"""
211
- default_weight (meta:: MetaGraph ) = meta. default_weight
209
+ default_weight (meta:: AbstractMetaGraph ) = meta. default_weight
212
210
213
211
"""
214
212
filter_edges(meta, a_function)
@@ -231,7 +229,7 @@ julia> filter_edges(test, isequal(:a))
231
229
Edge 1 => 2
232
230
```
233
231
"""
234
- filter_edges (meta:: MetaGraph , a_function:: Function ) =
232
+ filter_edges (meta:: AbstractMetaGraph , a_function:: Function ) =
235
233
findall (a_function, meta. edge_meta)
236
234
237
235
"""
@@ -254,7 +252,7 @@ julia> filter_vertices(test, isequal(:a))
254
252
1
255
253
```
256
254
"""
257
- filter_vertices (meta:: MetaGraph , a_function:: Function ) =
255
+ filter_vertices (meta:: AbstractMetaGraph , a_function:: Function ) =
258
256
findall (a_function, meta. vertex_meta)
259
257
260
258
function copy_meta! (old_meta, new_meta, vertex_map)
@@ -265,21 +263,19 @@ function copy_meta!(old_meta, new_meta, vertex_map)
265
263
end
266
264
for new_edge in edges (new_meta)
267
265
in_vertex, out_vertex = Tuple (new_edge)
268
- old_edge = maybe_order_edge (old_meta,
269
- Edge (vertex_map[in_vertex], vertex_map[out_vertex])
270
- )
266
+ old_edge = Edge (vertex_map[in_vertex], vertex_map[out_vertex])
271
267
if haskey (old_meta, old_edge)
272
268
new_meta[new_edge] = old_meta[old_edge]
273
269
end
274
270
end
275
271
return nothing
276
272
end
277
273
278
- function induced_subgraph (meta:: MetaGraph {Vertex} , vertices:: AbstractVector{Vertex} ) where {Vertex <: Integer }
274
+ function induced_subgraph (meta:: AbstractMetaGraph {Vertex} , vertices:: AbstractVector{Vertex} ) where {Vertex <: Integer }
279
275
induced_graph, vertex_map =
280
276
induced_subgraph (meta. inner_graph, vertices)
281
277
induced_meta =
282
- MetaGraph (induced_graph,
278
+ typeof (meta) (induced_graph,
283
279
empty (meta. vertex_meta),
284
280
empty (meta. edge_meta),
285
281
meta. graph_meta,
@@ -294,11 +290,21 @@ end
294
290
# how this might work, but if the property is a vector, a generic way to append to
295
291
# it would be a good thing.
296
292
297
- == (meta:: MetaGraph , meta2:: MetaGraph ) =
298
- meta. inner_graph == meta2. inner_graph
293
+ == (meta:: AbstractMetaGraph , meta2:: AbstractMetaGraph ) = meta. inner_graph == meta2. inner_graph
294
+
295
+ copy (meta:: AbstractMetaGraph ) = deepcopy (meta)
299
296
300
- copy (meta:: MetaGraph ) = deepcopy (meta)
297
+ zero (meta:: AbstractMetaGraph{<:Any, InnerGraph, AtVertex, AtEdge, GraphMeta} ) where {InnerGraph, AtVertex, AtEdge, GraphMeta} =
298
+ meta_graph (InnerGraph ();
299
+ AtVertex = AtVertex,
300
+ AtEdge = AtEdge,
301
+ graph_meta = GraphMeta (),
302
+ weight_function = meta. weight_function,
303
+ default_weight = meta. default_weight
304
+ )
301
305
306
+ include (" metadigraph.jl" )
307
+ include (" metagraph.jl" )
302
308
include (" overrides.jl" )
303
309
include (" persistence.jl" )
304
310
0 commit comments