Skip to content
This repository was archived by the owner on Oct 8, 2021. It is now read-only.

Commit 13974b0

Browse files
authored
Merge pull request #36 from JuliaGraphs/sbromberger/reverse
adds reverse() for MetaDiGraphs
2 parents d706aa9 + 9eb70ed commit 13974b0

File tree

3 files changed

+61
-7
lines changed

3 files changed

+61
-7
lines changed

src/MetaGraphs.jl

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ import LightGraphs:
1616
has_vertex, has_edge, inneighbors, outneighbors,
1717
weights, indegree, outdegree, degree,
1818
induced_subgraph,
19-
loadgraph, savegraph, AbstractGraphFormat
19+
loadgraph, savegraph, AbstractGraphFormat,
20+
reverse
2021

2122
import LightGraphs.SimpleGraphs:
2223
AbstractSimpleGraph, SimpleGraph, SimpleDiGraph,
@@ -41,7 +42,8 @@ export
4142
filter_edges,
4243
filter_vertices,
4344
MGFormat,
44-
set_indexing_prop!
45+
set_indexing_prop!,
46+
reverse
4547

4648
const PropDict = Dict{Symbol,Any}
4749
const MetaDict = Dict{Symbol,Dict{Any,Integer}}
@@ -318,7 +320,7 @@ rem_prop!(g::AbstractMetaGraph{T}, u::Integer, v::Integer, prop::Symbol) where T
318320
319321
Provides a default index value for a vertex if no value currently exists. The default is a string: "\$prop\$i" where `prop` is the property name and `i` is the vertex number. If some other vertex already has this name, a randomized string is generated (though the way it is generated is deterministic).
320322
"""
321-
function default_index_value(v::Integer, prop::Symbol, index_values::Set{Any}; exclude = nothing)
323+
function default_index_value(v::Integer, prop::Symbol, index_values::Set{Any}; exclude=nothing)
322324
val = string(prop) * string(v)
323325
if in(val, index_values) || val == exclude
324326
srand(v + hash(prop))
@@ -337,16 +339,16 @@ are already set, each vertex must have unique values. Optionally, set the index
337339
`val` for vertex `v`. Any vertices without values will be set to a default
338340
("(prop)(v)").
339341
"""
340-
function set_indexing_prop!(g::AbstractMetaGraph, prop::Symbol; exclude = nothing)
342+
function set_indexing_prop!(g::AbstractMetaGraph, prop::Symbol; exclude=nothing)
341343
in(prop, g.indices) && return g.indices
342344
index_values = [g.vprops[v][prop] for v in keys(g.vprops) if haskey(g.vprops[v], prop)]
343345
length(index_values) != length(union(index_values)) && error("Cannot make $prop an index, duplicate values detected")
344346
index_values = Set(index_values)
345347

346348
g.metaindex[prop] = Dict{Any,Integer}()
347-
for v in 1:size(g)[1]
349+
for v in vertices(g)
348350
if !haskey(g.vprops, v) || !haskey(g.vprops[v], prop)
349-
val = default_index_value(v, prop, index_values, exclude = exclude)
351+
val = default_index_value(v, prop, index_values, exclude=exclude)
350352
set_prop!(g, v, prop, val)
351353
end
352354
g.metaindex[prop][g.vprops[v][prop]] = v
@@ -356,7 +358,7 @@ function set_indexing_prop!(g::AbstractMetaGraph, prop::Symbol; exclude = nothin
356358
end
357359

358360
function set_indexing_prop!(g::AbstractMetaGraph, v::Integer, prop::Symbol, val::Any)
359-
!in(prop, g.indices) && set_indexing_prop!(g, prop, exclude = val)
361+
!in(prop, g.indices) && set_indexing_prop!(g, prop, exclude=val)
360362
(haskey(g.metaindex[prop], val) && g.vprops[v][prop] == val) && return g.indices
361363
haskey(g.metaindex[prop], val) && error("':$prop' index already contains $val")
362364

@@ -508,4 +510,5 @@ copy(g::T) where T <: AbstractMetaGraph = deepcopy(g)
508510
include("metagraph.jl")
509511
include("metadigraph.jl")
510512
include("persistence.jl")
513+
include("overrides.jl")
511514
end # module

src/overrides.jl

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
function reverse(mg::MetaDiGraph{T,U}) where T <: Integer where U <: Real
2+
rg = reverse(mg.graph)
3+
map = nv(mg):-1:1
4+
rvprops = Dict{T,PropDict}()
5+
reprops = Dict{SimpleEdge{T},PropDict}()
6+
rgprops = mg.gprops
7+
rweightfield = mg.weightfield
8+
rdefaultweight = mg.defaultweight
9+
rindices = mg.indices
10+
11+
for v in keys(mg.vprops)
12+
rvprops[map[v]] = mg.vprops[v]
13+
end
14+
15+
for e in keys(mg.eprops)
16+
reprops[reverse(e)] = mg.eprops[e]
17+
end
18+
19+
rmg = MetaDiGraph(rg,
20+
rvprops,
21+
reprops,
22+
rgprops,
23+
rweightfield,
24+
rdefaultweight,
25+
MetaDict(),
26+
Set{Symbol}())
27+
for p in mg.indices
28+
set_indexing_prop!(rmg, p)
29+
end
30+
31+
return rmg
32+
end

test/metagraphs.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,5 +401,24 @@ end
401401

402402
@test_throws ErrorException G[:not_a_key]
403403
@test_throws ErrorException dG[:not_a_key]
404+
end
404405

406+
@testset "Overrides" begin
407+
mga = MetaDiGraph(PathDiGraph(4), 8)
408+
set_prop!(mga, 1, 2, :name, "1, 2")
409+
set_prop!(mga, 2, 3, :name, "2, 3")
410+
set_prop!(mga, 3, 4, :name, "3, 4")
411+
set_indexing_prop!(mga, 1, :foo, "v1")
412+
set_indexing_prop!(mga, 2, :foo, "v2")
413+
set_indexing_prop!(mga, 3, :foo, "v3")
414+
set_indexing_prop!(mga, 4, :foo, "v4")
415+
416+
rmg = reverse(mga)
417+
@test props(rmg, 1)[:foo] == rmg[1, :foo] == mga[4, :foo] == "v4"
418+
@test props(rmg, 2, 1) == props(mga, 1, 2)
419+
@test props(rmg, 3, 2) == props(mga, 2, 3)
420+
@test weightfield(rmg) == weightfield(mga) == :weight
421+
@test defaultweight(rmg) == defaultweight(mga) == 8
405422
end
423+
424+

0 commit comments

Comments
 (0)