From fdf88072fd7630f9e7721682dc475272a2418a48 Mon Sep 17 00:00:00 2001 From: Seth Bromberger Date: Fri, 19 Dec 2014 09:58:26 -0800 Subject: [PATCH 1/3] fixed indexing issue when vertices are <:Integer --- src/graph.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graph.jl b/src/graph.jl index 47fa6449..e0a62869 100644 --- a/src/graph.jl +++ b/src/graph.jl @@ -55,7 +55,7 @@ vertices(g::GenericGraph) = g.vertices num_edges(g::GenericGraph) = length(g.edges) edges(g::GenericGraph) = g.edges -vertex_index{V<:ProvidedVertexType}(v::V, g::GenericGraph{V}) = vertex_index(v) +vertex_index{V<:ProvidedVertexType}(v::V, g::GenericGraph{V}) = vertex_index(v,vertices(g)) edge_index{V,E}(e::E, g::GenericGraph{V,E}) = edge_index(e) out_edges{V}(v::V, g::GenericGraph{V}) = g.finclist[vertex_index(v, g)] From fe2b228b587820b344d246e52a7078bbfdeefbe8 Mon Sep 17 00:00:00 2001 From: Seth Bromberger Date: Fri, 19 Dec 2014 23:09:22 -0800 Subject: [PATCH 2/3] SimpleGraph now is O(1) vertex indexing, and does not take vertices for add_vertex\!() deprecated add_vertex\!(g::SimpleGraph, v) --- src/graph.jl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/graph.jl b/src/graph.jl index e0a62869..cd58991b 100644 --- a/src/graph.jl +++ b/src/graph.jl @@ -55,6 +55,7 @@ vertices(g::GenericGraph) = g.vertices num_edges(g::GenericGraph) = length(g.edges) edges(g::GenericGraph) = g.edges +vertex_index(v::Integer, g::SimpleGraph) = (v <= g.vertices[end]? v: 0) vertex_index{V<:ProvidedVertexType}(v::V, g::GenericGraph{V}) = vertex_index(v,vertices(g)) edge_index{V,E}(e::E, g::GenericGraph{V,E}) = edge_index(e) @@ -69,6 +70,16 @@ in_neighbors{V}(v::V, g::GenericGraph{V}) = SourceIterator(g, in_edges(v, g)) # mutation +function add_vertex!(g::SimpleGraph) + v = g.vertices[end] + 1 + g.vertices = 1:v + push!(g.finclist, Int[]) + push!(g.binclist, Int[]) + v +end + +@deprecate add_vertex!(g::SimpleGraph,v) add_vertex!(g::SimpleGraph) + function add_vertex!{V}(g::GenericGraph{V}, v::V) push!(g.vertices, v) push!(g.finclist, Int[]) From ceb7b4c8ff348aee05330bd57c3a2ee977c51257 Mon Sep 17 00:00:00 2001 From: Seth Bromberger Date: Sun, 21 Dec 2014 08:55:27 -0800 Subject: [PATCH 3/3] added @mlubin's suggestions for indexing to preserve KeyIndex and others O(1) --- src/common.jl | 2 -- src/graph.jl | 11 ++++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/common.jl b/src/common.jl index ebf1a840..7e35cae8 100644 --- a/src/common.jl +++ b/src/common.jl @@ -8,8 +8,6 @@ typealias AttributeDict Dict{UTF8String, Any} # ################################################ -vertex_index(v::Integer) = v - immutable KeyVertex{K} index::Int key::K diff --git a/src/graph.jl b/src/graph.jl index cd58991b..1492aeaf 100644 --- a/src/graph.jl +++ b/src/graph.jl @@ -56,7 +56,15 @@ num_edges(g::GenericGraph) = length(g.edges) edges(g::GenericGraph) = g.edges vertex_index(v::Integer, g::SimpleGraph) = (v <= g.vertices[end]? v: 0) -vertex_index{V<:ProvidedVertexType}(v::V, g::GenericGraph{V}) = vertex_index(v,vertices(g)) + +function vertex_index{V<:ProvidedVertexType}(v::V, g::GenericGraph{V}) + if applicable(vertex_index, v) # use O(1) if possible + return vertex_index(v) + else # use O(n) + return vertex_index(v,vertices(g)) + end +end + edge_index{V,E}(e::E, g::GenericGraph{V,E}) = edge_index(e) out_edges{V}(v::V, g::GenericGraph{V}) = g.finclist[vertex_index(v, g)] @@ -71,6 +79,7 @@ in_neighbors{V}(v::V, g::GenericGraph{V}) = SourceIterator(g, in_edges(v, g)) # mutation function add_vertex!(g::SimpleGraph) + # ensure SimpleGraph indices are consecutive, allowing O(1) indexing v = g.vertices[end] + 1 g.vertices = 1:v push!(g.finclist, Int[])