11
22"""
3- apply_geography(graph, geography; kwargs...) -> updated_graph
3+ apply_geography(graph, geography; kwargs...) -> Dict
44
55Update the network building costs of a graph based on geographical features and remove edges impeded by geographical barriers.
66Aversion 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