From b6150158830eb9bf3454554a483be4871ba50d63 Mon Sep 17 00:00:00 2001 From: Daniel Thom Date: Mon, 3 Feb 2025 13:25:02 -0700 Subject: [PATCH 1/2] Fix set_bus_number! This fixes a bug in a12f90349e2aadfc2f9fbeee23276115099ead08. It was leaving the original bus number in sys.bus_numbers. --- src/base.jl | 12 ++++++++++-- test/test_system.jl | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/base.jl b/src/base.jl index 40d9c4e67b..41bfa57b53 100644 --- a/src/base.jl +++ b/src/base.jl @@ -2623,11 +2623,19 @@ end Set the number of a bus. """ function set_bus_number!(sys::System, bus::ACBus, number::Int) + throw_if_not_attached(bus, sys) + + orig = get_number(bus) + if number == orig + return + end + if number in sys.bus_numbers throw(ArgumentError("bus number $number is already stored in the system")) end - bus.number = number - push!(sys.bus_numbers, number) + + set_number!(bus, number) + replace!(sys.bus_numbers, orig => number) return end diff --git a/test/test_system.jl b/test/test_system.jl index 4a6c4fece6..14e7e7d1e2 100644 --- a/test/test_system.jl +++ b/test/test_system.jl @@ -625,5 +625,23 @@ end @test orig != new_number set_bus_number!(sys, bus1, new_number) @test get_number(bus1) == new_number + bus_numbers = get_bus_numbers(sys) + @test new_number in bus_numbers + @test !(orig in bus_numbers) + + # Ensure that the no-op case works. + set_bus_number!(sys, bus1, new_number) + @test get_number(bus1) == new_number + @test new_number in get_bus_numbers(sys) + + # Ensure that duplicate numbers are blocked. @test_throws ArgumentError set_bus_number!(sys, bus1, get_number(bus2)) + + # Ensure that you can't change an unattached bus. + remove_component!(sys, bus1) + @test_throws ArgumentError set_bus_number!(sys, bus1, new_number + 1) + + # Ensure that this is exported. This can be deleted in PSY5. + set_number!(bus1, new_number + 2) + @test get_number(bus1) == new_number + 2 end From 9fd6573a45e9bc3f4b9f50a9d0124a2788961fdb Mon Sep 17 00:00:00 2001 From: Daniel Thom Date: Fri, 31 Jan 2025 18:32:16 -0700 Subject: [PATCH 2/2] Remove workaround for set_number!(::ACBus, ::Int) --- src/parsers/psse_metadata_reimport.jl | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/src/parsers/psse_metadata_reimport.jl b/src/parsers/psse_metadata_reimport.jl index e848b86aca..f9414fae73 100644 --- a/src/parsers/psse_metadata_reimport.jl +++ b/src/parsers/psse_metadata_reimport.jl @@ -75,19 +75,11 @@ function remap_bus_numbers!(sys::System, bus_number_mapping) old_number = get_number(bus) new_number = parse(Int, bus_number_mapping[old_number]) if new_number != old_number - if new_number in get_bus_numbers(sys) - # We would only reach this case if one bus's PSS/E number is another bus's - # Sienna number. That never happens because _psse_bus_numbers on the - # exporting side guarantees that bus numbers that are already compliant with - # the PSS/E spec will not be changed. - throw( - ArgumentError( - "Trying to remap bus number $old_number to $new_number, which is already a bus number", - ), - ) - end - replace!(sys.bus_numbers, old_number => new_number) - set_number!(bus, new_number) + # This will throw an exception if one bus's PSS/E number is another bus's + # Sienna number. That never happens because _psse_bus_numbers on the + # exporting side guarantees that bus numbers that are already compliant with + # the PSS/E spec will not be changed. + set_bus_number!(sys, bus, new_number) end end end