Skip to content

Optimize radial reduction: iterative queue-based peeling replaces recursive DFS#290

Merged
jd-lara merged 4 commits intomainfrom
copilot/improve-radial-reduction-performance
Apr 15, 2026
Merged

Optimize radial reduction: iterative queue-based peeling replaces recursive DFS#290
jd-lara merged 4 commits intomainfrom
copilot/improve-radial-reduction-performance

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 14, 2026

calculate_radial_arcs had three performance bottlenecks:

  1. O(nnz) sparse row access per call: A[row_ix, :].nzind on a CSC matrix scans all columns to find nonzeros in a row. Called repeatedly during chain walking.
  2. Recursive DFS: _new_parent recursively calls itself up each chain, compounding the sparse access cost.
  3. Fake parallelism: Threads.@threads with a ReentrantLock around the entire loop body serializes all work while adding threading overhead.

Changes

  • Pre-computed row→column mapping via _build_row_to_cols: single O(nnz) pass over CSC structure, then O(1) endpoint lookups per branch
  • Adjacency lists built upfront: each bus stores (neighbor_col, row_index) pairs for O(degree) neighbor traversal
  • Iterative queue-based chain peeling replaces _reverse_search_new_parent recursion: seed queue with degree-1 buses, peel leaves, enqueue parents that become chain nodes (original degree 2)
  • Removed Threads.@threads + ReentrantLock: eliminates threading overhead on what was effectively serial execution

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/repos/FluxML/MacroTools.jl/tarball/1e0228a030642014fe5cfe68c2c0a818f9e3f522
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/Blosc_jll.jl/tarball/535c80f1c0847a4c967ea945fca21becc9de1522
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/HDF5_jll.jl/tarball/45337643a2d97262d5fe72ce1f13e8a662d13d62
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/Hwloc_jll.jl/tarball/baaaebd42ed9ee1bd9173cfd56910e55a8622ee1
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/IntelOpenMP_jll.jl/tarball/ec1debd61c300961f98064cfb21287613ad7f303
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.test(test_args=["test_radial_branches"]) --warn-overwrite=yes --color=auto - (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/Libiconv_jll.jl/tarball/be484f5c92fad0bd8acfef35fe017900b0b73809
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/Lz4_jll.jl/tarball/191686b1ac1ea9c89fc52e996ad15d1d241d1e33
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/MKL_jll.jl/tarball/282cadc186e7b2ae0eeadbd7a4dffed4196ae2aa
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.test(test_args=["test_radial_branches"]) --warn-overwrite=yes --color=auto - (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/MPIABI_jll.jl/tarball/fdc0f7ca9e7e645d1114b93c9eee98f352b59a0c
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/MPICH_jll.jl/tarball/07dbec8aab01696edc0151a401a6cdfe95b9b885
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/MPItrampoline_jll.jl/tarball/36c2d142e7d45fb98b5f83925213feb3292ca348
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/MicrosoftMPI_jll.jl/tarball/bc95bf4149bf535c09602e3acdf950d9b4376227
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/OpenMPI_jll.jl/tarball/2f3d05e419b6125ffe06e55784102e99325bdbe2
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/SQLite_jll.jl/tarball/0b5f220f90642566b65ba86549d1ee4118ab2579
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/XML2_jll.jl/tarball/80d3930c6347cfce7ccf96bd3bafdf079d9c0390
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/Xorg_libpciaccess_jll.jl/tarball/4909eb8f1cbf6bd4b1c30dd18b2ead9019ef2fad
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/Zstd_jll.jl/tarball/446b23e73536f84e8037f5dce465e92275f6a308
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/aws_c_auth_jll.jl/tarball/8cab83c96af80a1be968251ce1a0548a7545484d
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/aws_c_cal_jll.jl/tarball/22c0f42f4a1f0dc5dcfa8fd267c4ac407c455e7a
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/aws_c_common_jll.jl/tarball/a759cb9bf456ad792cc7898a81ae333cce9ef02a
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/aws_c_compression_jll.jl/tarball/7910c72f45f44afd297c39fe43b99c56d5ed22ec
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/aws_c_http_jll.jl/tarball/e358d5a001ef7afbd4f8c5225322512819cda2f2
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/aws_c_io_jll.jl/tarball/7e481d474b2087ee8bbf55b81bf9119f21e396d9
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/aws_c_s3_jll.jl/tarball/3e9917ab25114feba657e71be41cad068b9f6595
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/aws_c_sdkutils_jll.jl/tarball/c43dfba2c1ab9ea9f02f2c80e86fa16f6460244e
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/aws_checksums_jll.jl/tarball/2570c8e23f4771a087b12a47edcaaa670ac05a01
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/dlfcn_win32_jll.jl/tarball/e141d67ffe550eadfb5af1bdbdaf138031e4805f
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/libaec_jll.jl/tarball/1411bc34c180946d3cef591de1384012afa6edee
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/mpif_jll.jl/tarball/653ea50df05f4df3913bc3c51f895127ae391b03
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/oneTBB_jll.jl/tarball/1350188a69a6e46f799d3945beef36435ed7262f
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.test(test_args=["test_radial_branches"]) --warn-overwrite=yes --color=auto - (http block)
  • https://api.github.com/repos/JuliaBinaryWrappers/s2n_tls_jll.jl/tarball/6b99e06a3863de281da6ff0e193a5b3706349054
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaCollections/AbstractTrees.jl/tarball/2d9c9a55f9c93e8887ad391fbae72f8ef55e1177
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaCollections/DataStructures.jl/tarball/e86f4a2805f7f19bec5129bc9150c38208e5dc23
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaCollections/LeftChildRightSiblingTrees.jl/tarball/95ba48564903b43b2462318aa243ee79d81135ff
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaCollections/OrderedCollections.jl/tarball/05868e21324cede2207c6f0f466b4bfef6d5e7ee
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaCollections/SortingAlgorithms.jl/tarball/64d974c2e6fdf07f8155b5b2ca2ffa9069b608d9
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/CSV.jl/tarball/8d8e0b0f350b8e1c91420b5e64e5de774c2f0f4d
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/DataAPI.jl/tarball/abe83f3a2f1b857aac70ef8b269080af17764bbe
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/DataFrames.jl/tarball/5fab31e2e01e70ad66e3e24c968c264d1cf166d6
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/DataFramesMeta.jl/tarball/b0652fb7f3c094cf453bf22e699712a0bed9fc83
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/DelimitedFiles.jl/tarball/9e2f36d3c96a820c678f2f1f1782582fcf685bae
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/InvertedIndices.jl/tarball/6da3c4316095de0f5ee2ebd875df8721e7e0bdbe
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/Missings.jl/tarball/ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/Parsers.jl/tarball/7d2f8f21da5db6a806faf7b9b292296da42b2810
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/PooledArrays.jl/tarball/36d8b4b899628fb92c2749eb488d884a926614d3
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/SentinelArrays.jl/tarball/ebe7e59b37c400f694f52b58c93d26201387da70
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/StructTypes.jl/tarball/159331b30e94d7b11379037feeb9b690950cace8
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/TableMetadataTools.jl/tarball/c0405d3f8189bb9a9755e429c6ea2138fca7e31f
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/Tables.jl/tarball/f2c1efbc8f3a609aadf318094f8fc5204bdaf344
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/WeakRefStrings.jl/tarball/b1be2855ed9ed8eac54e5caff2afcdb442d52c23
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaData/YAML.jl/tarball/a1c0c7585346251353cddede21f180b96388c403
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaDatabases/DBInterface.jl/tarball/a444404b3f94deaa43ca2a58e18153a82695282b
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaDatabases/SQLite.jl/tarball/87b47a05946c50f44531b447b1f24968345316a4
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaDocs/DocStringExtensions.jl/tarball/7442a5dfe1ebb773c29cc2962a8980f47221d76c
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaIO/Blosc.jl/tarball/310b77648d38c223d947ff3f50f511d08690b8d5
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaIO/CodecZlib.jl/tarball/962834c22b66e32aa10f7611c08c8ca4e20749a9
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaIO/HDF5.jl/tarball/491ea627ac824619f34168e29a0427a9e00e3e40
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaIO/HDF5.jl/tarball/d778420e524bcf56066e8c63c7aa315ae7269da2
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaIO/TranscodingStreams.jl/tarball/0c45878dcfdcfa8480052b6ab162cdd138781742
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaLang/Compat.jl/tarball/9d8a54ce4b17aa5bdce0ea5c34bc5e7c340d16ad
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaLang/PrecompileTools.jl/tarball/07a921781cab75691315adc645096ed5e370cb77
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaLogging/ProgressLogging.jl/tarball/f0803bc1171e455a04124affa9c21bba5ac4db32
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaLogging/TerminalLoggers.jl/tarball/f133fab380933d042f6796eda4e130272ba520ca
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaPackaging/JLLWrappers.jl/tarball/0533e564aae234aff59ab625543145446d8b6ec2
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaPackaging/Preferences.jl/tarball/8b770b60760d4451834fe79dd483e318eee709c4
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaPackaging/Requires.jl/tarball/62389eeff14780bfe55195b7204c0d8738436d64
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaParallel/MPI.jl/tarball/8e98d5d80b87403c311fd51e8455d4546ba7a5f8
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaPhysics/Unitful.jl/tarball/57e1b2c9de4bd6f40ecb9de4ac1797b81970d008
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaPlots/Plots.jl/tarball/5c3d09cc4f31f5fc6af001c250bf1278733100ff
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaServices/WorkerUtilities.jl/tarball/cd1659ba0d57b71a464a29e64dbc67cfe83d54e7
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaSparse/KLU.jl/tarball/07649c499349dad9f08dde4243a4c597064663e9
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaSparse/Pardiso.jl/tarball/eb95d6bbd64c54ebb506cdb09826f82d06bee92c
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.test(test_args=["test_radial_branches"]) --warn-overwrite=yes --color=auto - (http block)
  • https://api.github.com/repos/JuliaStats/Statistics.jl/tarball/ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaStats/TimeSeries.jl/tarball/e1235a1906d1e6d27c30c35daa91fcf6fc271f08
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaStrings/InlineStrings.jl/tarball/8f3d257792a522b4601c24a577954b0a8cd7334d
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaStrings/LaTeXStrings.jl/tarball/dda21b8cbd6a6c40d9d02a73230f9d70fed6918c
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaStrings/StringEncodings.jl/tarball/b765e46ba27ecf6b44faf70df40c57aa3a547dcb
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaTesting/Aqua.jl/tarball/d57fd255a8932b6509baf43284c416fc44d0b903
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.test(test_args=["test_radial_branches"]) --warn-overwrite=yes --color=auto - (http block)
  • https://api.github.com/repos/JuliaTesting/ExprTools.jl/tarball/27415f162e6028e81c72b82ef756bf321213b6ec
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/JuliaTesting/ReTest.jl/tarball/9a5136d157d1d6a2a56ff77bef1dc324e1313193
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.test(test_args=["test_radial_branches"]) --warn-overwrite=yes --color=auto - (http block)
  • https://api.github.com/repos/JuliaTesting/ReTest.jl/tarball/daf0743879904f0ad645ca6594e1479685f158a2
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.test(test_args=["test_radial_branches"]) --warn-overwrite=yes --color=auto - (http block)
  • https://api.github.com/repos/KristofferC/Crayons.jl/tarball/249fe38abf76d48563e2f4556bebd215aa317e15
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/KristofferC/TimerOutputs.jl/tarball/3748bd928e68c7c346b52125cf41fff0de6937d0
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/NREL-Sienna/InfrastructureSystems.jl/tarball/5c29a2a358755bceeb3233a7d8be778692a7e6c6
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/NREL-Sienna/PowerNetworkMatrices.jl/tarball/b390a2818c24452868b1edd4110e70553338c7e0
    • Triggering command: /usr/bin/julia julia --project=test -e using Pkg; Pkg.instantiate() -ljulia -ljulia-internal /local/share/julia", "/usr/local/julia1.12.5/share/julia"]) append!(empty!(Base.DL_LOAD_PATH), S-C ndor/bin/git (http block)
  • https://api.github.com/repos/NREL-Sienna/PowerSystemCaseBuilder.jl/tarball/ab9a5d728e749ec85ced41617ae2014fdda59765
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.test(test_args=["test_radial_branches"]) --warn-overwrite=yes --color=auto - (http block)
  • https://api.github.com/repos/NREL-Sienna/PowerSystems.jl/tarball/354c56b72404bfd2e4c1f364277512f9f549ce65
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/jkrumbiegel/Chain.jl/tarball/765487f32aeece2cf28aa7038e29c31060cb5a69
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/joshday/StringTemplates.jl/tarball/d78012ad7c6c22aba229a6363ec83ebc9ce5c135
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/jverzani/Mustache.jl/tarball/3cbd5dda543bc59f2e482607ccf84b633724fc32
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/nickrobinson251/PowerFlowData.jl/tarball/54d48d25e7d7511bbc8eb0ecff9e32f38c6f267c
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/queryverse/DataValueInterfaces.jl/tarball/bfc1187b79289637fa0ef6d4436ebdfe6905cbd6
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/queryverse/IteratorInterfaceExtensions.jl/tarball/a3f24677c21f5bbe9d2a714f95dcd58337fb2856
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/queryverse/TableTraits.jl/tarball/c06b2f539df1c6efa794486abfb6ed2022561a39
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/quinnj/JSON3.jl/tarball/411eccfe8aba0814ffa0fdf4860913ed09c34975
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/rofinn/FilePathsBase.jl/tarball/3bab2c5aa25e7840a4b065805c0cdfc01f3068d2
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/ronisbr/PrettyTables.jl/tarball/624de6279ab7d94fc9f672f0068107eb6619732c
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/ronisbr/StringManipulation.jl/tarball/d05693d339e37d6ab134c5ab53c29fce5ee5d7d5
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • https://api.github.com/repos/simonster/Reexport.jl/tarball/45e428421666073eab6f2da5c9d310d99bb12f9b
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (http block)
  • pkg.julialang.org
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.instantiate() (dns block)
    • Triggering command: /usr/bin/julia julia --project -e using Pkg; Pkg.test(test_args=["test_radial_branches"]) --warn-overwrite=yes --color=auto - (dns block)
    • Triggering command: /usr/local/julia1.12.5/bin/julia /usr/local/julia1.12.5/bin/julia -C native -J/usr/local/julia1.12.5/lib/julia/sys.so -g1 --code-coverage=none --color=auto --check-bounds=yes --warn-overwrite=yes --depwarn=yes --inline=yes --startup-file=no --track-allocation=none --check-bounds=yes --output-o /home/REDACTED/.julia/compiled/v1.12/MKL_jll/jl_iAtF8H --output-ji /home/REDACTED/.julia/compiled/v1.12/MKL_jll/jl_TS43s3 --output-incremental=yes --startup-file=no (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI linked an issue Apr 14, 2026 that may be closed by this pull request
…-based approach

Performance improvements:
1. Pre-compute row-to-column mapping for O(1) branch endpoint lookup
   instead of O(nnz) sparse row access via A[row,:].nzind on CSC matrix
2. Build adjacency lists upfront for efficient neighbor traversal
3. Replace recursive _new_parent/_reverse_search DFS with iterative
   queue-based chain peeling algorithm
4. Remove fake threading (Threads.@threads with ReentrantLock serialized
   all work, adding overhead without parallelism)

Agent-Logs-Url: https://github.com/NREL-Sienna/PowerNetworkMatrices.jl/sessions/22fe7baf-bf90-4039-b7d3-fd6ae12cc5f0

Co-authored-by: jd-lara <16385323+jd-lara@users.noreply.github.com>
Copilot AI changed the title [WIP] Improve performance of radial reduction Optimize radial reduction: iterative queue-based peeling replaces recursive DFS Apr 14, 2026
Copilot AI requested a review from jd-lara April 14, 2026 19:58
@jd-lara jd-lara requested a review from m-bossart April 14, 2026 20:12
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 14, 2026

Performance Results

Precompile Time

Main This Branch Delta
2.049 s 2.058 s +0.4%

Execution Time

Test Main This Branch Delta
matpower_ACTIVSg2000_sys-Build PTDF First 2.001 s 1.794 s -10.3%
matpower_ACTIVSg2000_sys-Build PTDF Second 75.1 ms 436.8 ms +481.5%
matpower_ACTIVSg2000_sys-Build Ybus First 13.7 ms 13.1 ms -4.9%
matpower_ACTIVSg2000_sys-Build Ybus Second 12.3 ms 12.0 ms -2.0%
matpower_ACTIVSg2000_sys-Build LODF First 176.0 ms 150.8 ms -14.3%
matpower_ACTIVSg2000_sys-Build LODF Second 222.7 ms 511.6 ms +129.7%
matpower_ACTIVSg2000_sys-Build VirtualMODF First 3.888 s 4.439 s +14.2%
matpower_ACTIVSg2000_sys-Build VirtualMODF Second 209.0 ms 791.7 ms +278.8%
matpower_ACTIVSg2000_sys-VirtualMODF Query 10 rows 469.8 ms 463.7 ms -1.3%
matpower_ACTIVSg2000_sys-Radial network reduction First 559.9 ms 435.9 ms -22.2%
matpower_ACTIVSg2000_sys-Radial network reduction Second 6.9 ms 0.6 ms -91.4%
matpower_ACTIVSg2000_sys-Degree two network reduction First 1.943 s 1.633 s -16.0%
matpower_ACTIVSg2000_sys-Degree two network reduction Second 1.0 ms 0.9 ms -12.7%
Base_Eastern_Interconnect_515GW-Build Ybus First 3.508 s 3.569 s +1.7%
Base_Eastern_Interconnect_515GW-Build Ybus Second 3.695 s 3.445 s -6.8%
Base_Eastern_Interconnect_515GW-Radial network reduction First 8.634 s 36.0 ms -99.6%
Base_Eastern_Interconnect_515GW-Radial network reduction Second 8.633 s 37.3 ms -99.6%
Base_Eastern_Interconnect_515GW-Degree two network reduction First 336.6 ms 320.6 ms -4.8%
Base_Eastern_Interconnect_515GW-Degree two network reduction Second 43.7 ms 30.8 ms -29.4%

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 14, 2026

Codecov Report

❌ Patch coverage is 91.95402% with 7 lines in your changes missing coverage. Please review.
✅ Project coverage is 79.54%. Comparing base (abede1d) to head (34ae594).
⚠️ Report is 7 commits behind head on main.

Files with missing lines Patch % Lines
src/radial_reduction.jl 93.44% 4 Missing ⚠️
src/degree_two_reduction.jl 88.46% 3 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##            main     #290       +/-   ##
==========================================
+ Coverage   0.07%   79.54%   +79.46%     
==========================================
  Files         38       38               
  Lines       3778     3783        +5     
==========================================
+ Hits           3     3009     +3006     
+ Misses      3775      774     -3001     
Flag Coverage Δ
unittests 79.54% <91.95%> (+79.46%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
src/degree_two_reduction.jl 89.72% <88.46%> (+89.72%) ⬆️
src/radial_reduction.jl 95.34% <93.44%> (+95.34%) ⬆️

... and 34 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@jd-lara jd-lara marked this pull request as ready for review April 14, 2026 20:39
Copy link
Copy Markdown
Member

@jd-lara jd-lara left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a great improvement, I added a similar piece of work for the 2-degree. Waiting for @m-bossart approval

@jd-lara jd-lara enabled auto-merge April 14, 2026 23:20
@jd-lara jd-lara merged commit 2e7df69 into main Apr 15, 2026
10 checks passed
@jd-lara jd-lara deleted the copilot/improve-radial-reduction-performance branch April 15, 2026 18:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Improve performance of radial reduction

3 participants