Skip to content

Support ThreeWindingTransformer outages in NetworkModification#289

Open
Copilot wants to merge 5 commits into
mainfrom
copilot/support-three-winding-transformer-outages
Open

Support ThreeWindingTransformer outages in NetworkModification#289
Copilot wants to merge 5 commits into
mainfrom
copilot/support-three-winding-transformer-outages

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 14, 2026

Passing a PSY.ThreeWindingTransformer directly as an outage component errored, requiring users to manually construct internal ThreeWindingTransformerWinding objects. This PR auto-decomposes 3WT components into their winding arcs.

Description

Core changes (src/network_modification.jl)

  • _classify_outage_component! for PSY.ThreeWindingTransformer: Replace error with automatic decomposition into available winding arcs (skips unavailable windings)
  • NetworkModification(mat, ::PSY.ThreeWindingTransformer): New constructor for full transformer outage
  • _classify_branch_modification for PSY.ThreeWindingTransformer: New method decomposing into per-winding classification
  • Separate :transformer3w from :direct in arc classification: Compute Ybus delta directly via ybus_branch_entries(tr) instead of routing through _compute_arc_ybus_delta, which fails due to BA-matrix susceptance vs raw winding susceptance mismatch
  • Use get_name instead of PSY.get_name in classification info messages and the ACTransmission constructor — ThreeWindingTransformerWinding lacks a name field so PSY.get_name errors; PNM.get_name dispatches correctly for both regular branches and windings

Usage

sys = build_system(PSITestSystems, "case10_radial_series_reductions")
trf = first(get_components(ThreeWindingTransformer, sys))
vptdf = VirtualPTDF(sys)

# Full 3WT outage — previously errored
mod = NetworkModification(vptdf, trf)  # 3 arc modifications

# Single winding trip (partial outage)
w1 = ThreeWindingTransformerWinding(trf, 1)
mod_w1 = NetworkModification(vptdf, w1)  # 1 arc modification

# Via Outage supplemental attribute
outage = GeometricDistributionForcedOutage(; ...)
add_supplemental_attribute!(sys, trf, outage)
mod = NetworkModification(vptdf, sys, outage)  # works

Tests (test/test_network_modification.jl)

Four new test sets: full 3WT outage, single winding outage, partial outage with disabled winding, and outage via PSY.Outage supplemental attribute.

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=test -e using Pkg; Pkg.develop(path="."); Pkg.instantiate() --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=test -e using Pkg; Pkg.develop(path="."); Pkg.instantiate() --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=test -e using Pkg; Pkg.develop(path="."); Pkg.instantiate() --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=test -e using Pkg; Pkg.develop(path="."); Pkg.instantiate() --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=test -e using Pkg; Pkg.develop(path="."); Pkg.instantiate() --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=test -e using Pkg; Pkg.develop(path="."); Pkg.instantiate() --warn-overwrite=yes --color=auto - (http block)
  • https://api.github.com/repos/JuliaTesting/ReTest.jl/tarball/daf0743879904f0ad645ca6594e1479685f158a2
    • Triggering command: /usr/bin/julia julia --project=test -e using Pkg; Pkg.develop(path="."); Pkg.instantiate() --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/PowerSystemCaseBuilder.jl/tarball/ab9a5d728e749ec85ced41617ae2014fdda59765
    • Triggering command: /usr/bin/julia julia --project=test -e using Pkg; Pkg.develop(path="."); Pkg.instantiate() --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=test -e using Pkg; Pkg.develop(path="."); Pkg.instantiate() --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 --output-o /home/REDACTED/.julia/compiled/v1.12/MKL_jll/jl_kiOVxm --output-ji /home/REDACTED/.julia/compiled/v1.12/MKL_jll/jl_VotWNw --output-incremental=yes --startup-file=no --history-file=no --warn-overwrite=yes --color=auto - (dns block)

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

Copilot AI and others added 2 commits April 14, 2026 19:23
- Replace error in _classify_outage_component! for PSY.ThreeWindingTransformer
  with automatic decomposition into available winding arcs
- Add NetworkModification(mat, branch::PSY.ThreeWindingTransformer) constructor
- Add _classify_branch_modification for PSY.ThreeWindingTransformer
- Handle 3WT Ybus delta directly via ybus_branch_entries to avoid
  BA-matrix vs winding susceptance mismatch
- Use get_name instead of PSY.get_name for ThreeWindingTransformerWinding compat

Agent-Logs-Url: https://github.com/NREL-Sienna/PowerNetworkMatrices.jl/sessions/7950c45a-eba1-4cd1-a6d6-3e4d6238e999

Co-authored-by: jd-lara <16385323+jd-lara@users.noreply.github.com>
Copilot AI changed the title [WIP] Add support for ThreeWindingTransformer in NetworkModification Support ThreeWindingTransformer outages in NetworkModification Apr 14, 2026
Copilot AI requested a review from jd-lara April 14, 2026 19:36
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 14, 2026

Performance Results

Precompile Time

Main This Branch Delta
2.265 s 2.358 s +4.1%

Execution Time

Test Main This Branch Delta
matpower_ACTIVSg2000_sys-Build PTDF First 2.11 s 2.423 s +14.8%
matpower_ACTIVSg2000_sys-Build PTDF Second 517.3 ms 73.0 ms -85.9%
matpower_ACTIVSg2000_sys-Build Ybus First 11.9 ms 11.1 ms -6.1%
matpower_ACTIVSg2000_sys-Build Ybus Second 11.5 ms 10.8 ms -6.3%
matpower_ACTIVSg2000_sys-Build LODF First 127.6 ms 143.0 ms +12.1%
matpower_ACTIVSg2000_sys-Build LODF Second 139.1 ms 195.7 ms +40.7%
matpower_ACTIVSg2000_sys-Build VirtualMODF First 2.474 s 4.472 s +80.8%
matpower_ACTIVSg2000_sys-Build VirtualMODF Second 522.7 ms 1.152 s +120.4%
matpower_ACTIVSg2000_sys-VirtualMODF Query 10 rows 538.3 ms 550.4 ms +2.2%
matpower_ACTIVSg2000_sys-Radial network reduction First 574.0 ms 573.7 ms -0.1%
matpower_ACTIVSg2000_sys-Radial network reduction Second 0.8 ms 0.8 ms +1.8%
matpower_ACTIVSg2000_sys-Degree two network reduction First 2.001 s 1.997 s -0.2%
matpower_ACTIVSg2000_sys-Degree two network reduction Second 1.1 ms 1.1 ms -4.9%
Base_Eastern_Interconnect_515GW-Build Ybus First 882.0 ms 1.081 s +22.6%
Base_Eastern_Interconnect_515GW-Build Ybus Second 747.1 ms 552.9 ms -26.0%
Base_Eastern_Interconnect_515GW-Radial network reduction First 148.8 ms 36.0 ms -75.8%
Base_Eastern_Interconnect_515GW-Radial network reduction Second 36.8 ms 35.5 ms -3.6%
Base_Eastern_Interconnect_515GW-Degree two network reduction First 399.6 ms 386.9 ms -3.2%
Base_Eastern_Interconnect_515GW-Degree two network reduction Second 48.1 ms 44.5 ms -7.5%

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 14, 2026

Codecov Report

❌ Patch coverage is 92.30769% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 79.67%. Comparing base (abede1d) to head (bcfc2a4).
⚠️ Report is 121 commits behind head on main.

Files with missing lines Patch % Lines
src/network_modification.jl 92.30% 3 Missing ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##            main     #289       +/-   ##
==========================================
+ Coverage   0.07%   79.67%   +79.59%     
==========================================
  Files         38       38               
  Lines       3778     3794       +16     
==========================================
+ Hits           3     3023     +3020     
+ Misses      3775      771     -3004     
Flag Coverage Δ
unittests 79.67% <92.30%> (+79.59%) ⬆️

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

Files with missing lines Coverage Δ
src/network_modification.jl 83.09% <92.30%> (+83.09%) ⬆️

... and 35 files with indirect coverage changes

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

…-winding-transformer-outages

# Conflicts:
#	test/test_network_modification.jl
@jd-lara jd-lara marked this pull request as ready for review May 29, 2026 18:21
@jd-lara jd-lara requested a review from m-bossart May 29, 2026 18:21
@jd-lara
Copy link
Copy Markdown
Member

jd-lara commented May 29, 2026

@m-bossart I just wrapped up this PR to accept 3WT outages but it only does full outage not partial.

Comment on lines +323 to +327
push!(direct_mods, ArcModification(
arc_idx, -b_arc,
YBUS_ELTYPE(-Y11), YBUS_ELTYPE(-Y12),
YBUS_ELTYPE(-Y21), YBUS_ELTYPE(-Y22),
))
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[JuliaFormatter] reported by reviewdog 🐶

Suggested change
push!(direct_mods, ArcModification(
arc_idx, -b_arc,
YBUS_ELTYPE(-Y11), YBUS_ELTYPE(-Y12),
YBUS_ELTYPE(-Y21), YBUS_ELTYPE(-Y22),
))
push!(
direct_mods,
ArcModification(
arc_idx, -b_arc,
YBUS_ELTYPE(-Y11), YBUS_ELTYPE(-Y12),
YBUS_ELTYPE(-Y21), YBUS_ELTYPE(-Y22),
),
)

if !get_equivalent_available(winding)
continue
end
append!(mods, _classify_branch_modification(nr, arc_lookup, arc_susceptances, winding))
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[JuliaFormatter] reported by reviewdog 🐶

Suggested change
append!(mods, _classify_branch_modification(nr, arc_lookup, arc_susceptances, winding))
append!(
mods,
_classify_branch_modification(nr, arc_lookup, arc_susceptances, winding),
)

Comment on lines +495 to +499
return [ArcModification(
arc_idx, -b_arc,
YBUS_ELTYPE(-Y11), YBUS_ELTYPE(-Y12),
YBUS_ELTYPE(-Y21), YBUS_ELTYPE(-Y22),
)]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[JuliaFormatter] reported by reviewdog 🐶

Suggested change
return [ArcModification(
arc_idx, -b_arc,
YBUS_ELTYPE(-Y11), YBUS_ELTYPE(-Y12),
YBUS_ELTYPE(-Y21), YBUS_ELTYPE(-Y22),
)]
return [
ArcModification(
arc_idx, -b_arc,
YBUS_ELTYPE(-Y11), YBUS_ELTYPE(-Y12),
YBUS_ELTYPE(-Y21), YBUS_ELTYPE(-Y22),
),
]

Comment thread test/test_3wt_outage.jl
Comment on lines +119 to +120
star_bus = first(b for b in PSY.get_components(PSY.ACBus, sys2)
if PSY.get_number(b) == star_num)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

[JuliaFormatter] reported by reviewdog 🐶

Suggested change
star_bus = first(b for b in PSY.get_components(PSY.ACBus, sys2)
if PSY.get_number(b) == star_num)
star_bus = first(
b for b in PSY.get_components(PSY.ACBus, sys2)
if PSY.get_number(b) == star_num
)

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR adds direct support for using PSY.ThreeWindingTransformer components as network modification outages by decomposing them into winding-level arc modifications, while adding targeted tests for 3WT outage behavior.

Changes:

  • Adds NetworkModification and outage-classification support for full ThreeWindingTransformer outages.
  • Handles 3WT Ybus deltas directly and tracks real-bus islanding for full 3WT outages.
  • Adds regression tests for full, partial, supplemental-attribute, Ybus, PTDF, and VirtualMODF 3WT outage paths.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments.

File Description
src/network_modification.jl Implements 3WT decomposition, classification, Ybus delta handling, and real-bus islanding detection.
test/test_network_modification.jl Adds basic coverage for full/single/partial 3WT outages and outage attributes.
test/test_3wt_outage.jl Adds deeper validation against PTDF/Ybus references and cache behavior for 3WT outages.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

Comment on lines +422 to +426
for winding_num in 1:3
winding = ThreeWindingTransformerWinding(component, winding_num)
if !get_equivalent_available(winding)
continue
end
Comment on lines +466 to +470
mods = ArcModification[]
for winding_num in 1:3
winding = ThreeWindingTransformerWinding(branch, winding_num)
if !get_equivalent_available(winding)
continue
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this is correct, there seems to be a discrepancy in where phase shifting is allowed with respect to outages

Comment thread test/test_3wt_outage.jl
@testset "is_islanding is true for radial-terminal full 3WT outage" begin
sys = PSB.build_system(PSB.PSITestSystems, "case10_radial_series_reductions")
vptdf = VirtualPTDF(sys)
trf = first(PSY.get_components(PSY.ThreeWindingTransformer, sys))
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

use only instead of first so it is clear that there is only one ThreeWindingTransformer in this system and that it will cause an island when outaged. Applies to other tests below as well.

Comment thread test/test_3wt_outage.jl
mod = NetworkModification(vptdf, trf)
arc_ax = PNM.get_arc_axis(vptdf)
wind = [am.arc_index for am in mod.arc_modifications]
star_num = unique([arc_ax[e][2] for e in wind])[1]
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

# star bus is to bus of three winding transformer arcs 
star_num = arc_ax[wind[1]][2]

# Single winding outage
for w in 1:3
winding = PNM.ThreeWindingTransformerWinding(trf, w)
mod = NetworkModification(vptdf, winding)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This seemingly is supporting partial outages. Can you clarify the comment that said they were not supported?

Comment on lines +466 to +470
mods = ArcModification[]
for winding_num in 1:3
winding = ThreeWindingTransformerWinding(branch, winding_num)
if !get_equivalent_available(winding)
continue
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

I think this is correct, there seems to be a discrepancy in where phase shifting is allowed with respect to outages

)
for winding_num in 1:3
winding = ThreeWindingTransformerWinding(component, winding_num)
if !get_equivalent_available(winding)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

If a winding is available but the parent transformer is not, get_equivalent_available will return available=true. I think that the parent transformer being unavailable should over-ride this?

Comment thread test/test_3wt_outage.jl
mod = NetworkModification(vptdf, sys, outage)
@test mod.is_islanding == true
end

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Add a test where is_islanding is false for a ThreeWindingTransformer full outage (i.e. a case where only the star bus is islanded)

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.

Support ThreeWindingTransformer outages in NetworkModification

4 participants