diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b21a36d..d6eab1fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ PowerModels.jl Change Log ========================= ### Staged -- nothing +- Improve performance of `calc_basic_incidence_matrix` (#946) ### v0.21.3 - Fix no-buses bug in `calc_connected_components` (#933) diff --git a/src/core/data_basic.jl b/src/core/data_basic.jl index 58f10e39..78767a8a 100644 --- a/src/core/data_basic.jl +++ b/src/core/data_basic.jl @@ -242,18 +242,18 @@ function calc_basic_incidence_matrix(data::Dict{String,<:Any}) Memento.warn(_LOGGER, "calc_basic_incidence_matrix requires basic network data and given data may be incompatible. make_basic_network can be used to transform data into the appropriate form.") end - I = Int[] - J = Int[] - V = Int[] - - b = [branch for (i,branch) in data["branch"] if branch["br_status"] != 0] - branch_ordered = sort(b, by=(x) -> x["index"]) - for (i,branch) in enumerate(branch_ordered) - push!(I, i); push!(J, branch["f_bus"]); push!(V, 1) - push!(I, i); push!(J, branch["t_bus"]); push!(V, -1) - end - - return sparse(I,J,V) + E, N = length(data["branch"])::Int, length(data["bus"])::Int + # I = [..., e, e, ...] + I = repeat(1:E; inner=2) + J = zeros(Int, 2 * E) + for e in 1:E + branch = data["branch"]["$e"] + J[2*e-1] = branch["f_bus"]::Int + J[2*e] = branch["t_bus"]::Int + end + # V = [..., 1, -1, ...] + V = repeat([1, -1]; outer=E) + return sparse(I, J, V, E, N) end """