Skip to content

Commit c0b67cc

Browse files
committed
Delete nodes if applicable.
1 parent 9362c24 commit c0b67cc

1 file changed

Lines changed: 57 additions & 21 deletions

File tree

src/main/apply_geography.jl

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
"""
3-
apply_geography(graph, geography; kwargs...) -> updated_graph
3+
apply_geography(graph, geography; kwargs...) -> Dict
44
55
Update the network building costs of a graph based on geographical features and remove edges impeded by geographical barriers.
66
Aversion to altitude changes rescales building infrastructure costs `delta_i` by (see also user manual to MATLAB toolbox):\n
@@ -90,6 +90,7 @@ function apply_geography(graph, geography; kwargs...)
9090
end
9191

9292
# Remove edges where geographical barriers are (rivers)
93+
remove_edge = false
9394
if obstacles !== nothing
9495

9596
# Store initial delta matrics (avoid double counting)
@@ -101,6 +102,9 @@ function apply_geography(graph, geography; kwargs...)
101102
across_obstacle = falses(graph.J, graph.J)
102103
along_obstacle = falses(graph.J, graph.J)
103104
remove_edge = isinf(op.across_obstacle_delta_i) || isinf(op.across_obstacle_delta_tau) # remove the edge
105+
if remove_edge
106+
rm_nodes = falses(graph.J)
107+
end
104108

105109
for i in 1:graph.J
106110
neighbors = graph.nodes[i]
@@ -131,16 +135,16 @@ function apply_geography(graph, geography; kwargs...)
131135
rmi = findfirst(==(i), nodes_new[j])
132136
if rmi !== nothing
133137
deleteat!(nodes_new[j], rmi)
134-
# if isempty(nodes_new[j])
135-
# deleteat!(nodes_new, j)
136-
# end
138+
if isempty(nodes_new[j])
139+
rm_nodes[j] = true # deleteat!(nodes_new, j)
140+
end
137141
end
138142
rmj = findfirst(==(j), nodes_new[i])
139143
if rmj !== nothing
140144
deleteat!(nodes_new[i], rmj)
141-
# if isempty(nodes_new[i])
142-
# deleteat!(nodes_new, i)
143-
# end
145+
if isempty(nodes_new[i])
146+
rm_nodes[i] = true # deleteat!(nodes_new, i)
147+
end
144148
end
145149

146150
adjacency_new[i, j] = false
@@ -165,20 +169,21 @@ function apply_geography(graph, geography; kwargs...)
165169
# This is for edges along obstable: allowing different delta (e.g., water transport on river)
166170
if isinf(op.along_obstacle_delta_i) || isinf(op.along_obstacle_delta_tau)
167171
# if infinite, remove edge
172+
remove_edge = true
168173
for (io, jo) in zip(obstacles[:, 1], obstacles[:, 2])
169174
rmio = findfirst(==(io), nodes_new[jo])
170175
if rmio !== nothing
171176
deleteat!(nodes_new[jo], rmio)
172-
# if isempty(nodes_new[jo])
173-
# deleteat!(nodes_new, jo)
174-
# end
177+
if isempty(nodes_new[jo])
178+
rm_nodes[jo] = true # deleteat!(nodes_new, jo)
179+
end
175180
end
176181
rmjo = findfirst(==(jo), nodes_new[io])
177182
if rmjo !== nothing
178183
deleteat!(nodes_new[io], rmjo)
179-
# if isempty(nodes_new[io])
180-
# deleteat!(nodes_new, io)
181-
# end
184+
if isempty(nodes_new[io])
185+
rm_nodes[io] = true # deleteat!(nodes_new, io)
186+
end
182187
end
183188
adjacency_new[io, jo] = false
184189
adjacency_new[jo, io] = false
@@ -200,16 +205,47 @@ function apply_geography(graph, geography; kwargs...)
200205

201206
# Creating new object
202207
graph_new = namedtuple_to_dict(graph)
203-
graph_new[:delta_i] = delta_i_new
204-
graph_new[:delta_tau] = delta_tau_new
205208

206-
if obstacles !== nothing
207-
graph_new[:nodes] = nodes_new
208-
graph_new[:adjacency] = adjacency_new
209+
if remove_edge && any(rm_nodes)
210+
keep = findall(.!rm_nodes)
211+
graph_new[:delta_i] = delta_i_new[keep, keep]
212+
graph_new[:delta_tau] = delta_tau_new[keep, keep]
213+
graph_new[:nodes] = nodes_new[keep]
214+
graph_new[:adjacency] = adjacency_new[keep, keep]
209215
# make sure that the degrees of freedom of the updated graph match the # of links
210-
graph_new[:ndeg] = sum(tril(adjacency_new))
211-
graph_new[:across_obstacle] = across_obstacle
212-
graph_new[:along_obstacle] = along_obstacle
216+
graph_new[:ndeg] = sum(tril(graph_new[:adjacency]))
217+
graph_new[:across_obstacle] = across_obstacle[keep, keep]
218+
graph_new[:along_obstacle] = along_obstacle[keep, keep]
219+
220+
if haskey(graph, :Lj)
221+
graph_new[:Lj] = graph[:Lj][keep]
222+
end
223+
if haskey(graph, :Hj)
224+
graph_new[:Hj] = graph[:Hj][keep]
225+
end
226+
if haskey(graph, :hj)
227+
graph_new[:hj] = graph_new[:Hj] ./ graph_new[:Lj]
228+
end
229+
if haskey(graph, :omegaj)
230+
graph_new[:omegaj] = graph[:omegaj][keep]
231+
end
232+
if haskey(graph, :Zjn)
233+
graph_new[:Zjn] = graph[:Zjn][keep, :]
234+
end
235+
if haskey(graph, :region)
236+
graph_new[:region] = graph[:region][keep]
237+
end
238+
else
239+
graph_new[:delta_i] = delta_i_new
240+
graph_new[:delta_tau] = delta_tau_new
241+
if obstacles !== nothing
242+
graph_new[:nodes] = nodes_new
243+
graph_new[:adjacency] = adjacency_new
244+
# make sure that the degrees of freedom of the updated graph match the # of links
245+
graph_new[:ndeg] = sum(tril(adjacency_new))
246+
graph_new[:across_obstacle] = across_obstacle
247+
graph_new[:along_obstacle] = along_obstacle
248+
end
213249
end
214250

215251
return graph_new

0 commit comments

Comments
 (0)