From 08ef87963a9b65f3436fdc693e2cad0709297e91 Mon Sep 17 00:00:00 2001 From: Manasa Muralidharan Date: Mon, 31 Aug 2026 21:48:18 -0600 Subject: [PATCH 1/2] Add opt-in construction-attribute classification for MatrixImpedanceBranch The c_matrix threshold (> 0.05 uF/km = underground) misclassifies models whose converted underground cables carry default or low capacitance values. USE_CONSTRUCTION_ATTRIBUTE in gdm_mapping (default False, legacy behavior unchanged) switches the two distribution-line filters to the equipment's construction attribute instead. Co-Authored-By: Claude Fable 5 --- src/erad/gdm_mapping.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/erad/gdm_mapping.py b/src/erad/gdm_mapping.py index d2a1f5dc..47125c3a 100644 --- a/src/erad/gdm_mapping.py +++ b/src/erad/gdm_mapping.py @@ -1,9 +1,11 @@ import gdm.distribution.components as gdc import gdm.distribution.equipment as gde +from gdm.distribution.enums import LineType from erad.enums import AssetTypes from erad.models.asset_mapping import ComponentFilterModel +USE_CONSTRUCTION_ATTRIBUTE = False asset_to_gdm_mapping = { AssetTypes.switch: [ @@ -40,10 +42,11 @@ ), ComponentFilterModel( component_type=gdc.MatrixImpedanceBranch, - component_filter=lambda x: x.equipment.c_matrix[0, 0] - .to("microfarad/kilometer") - .magnitude - > 0.05 + component_filter=lambda x: ( + x.equipment.construction == LineType.UNDERGROUND + if USE_CONSTRUCTION_ATTRIBUTE + else x.equipment.c_matrix[0, 0].to("microfarad/kilometer").magnitude > 0.05 + ) and x.buses[0].rated_voltage.to("kilovolt").magnitude < 35.0, ), ], @@ -57,10 +60,11 @@ ), ComponentFilterModel( component_type=gdc.MatrixImpedanceBranch, - component_filter=lambda x: x.equipment.c_matrix[0, 0] - .to("microfarad/kilometer") - .magnitude - < 0.05 + component_filter=lambda x: ( + x.equipment.construction == LineType.OVERHEAD + if USE_CONSTRUCTION_ATTRIBUTE + else x.equipment.c_matrix[0, 0].to("microfarad/kilometer").magnitude < 0.05 + ) and x.buses[0].rated_voltage.to("kilovolt").magnitude < 35.0, ), ], From f6707f97e4b0f7e1412818cf46b213e5c3b64935 Mon Sep 17 00:00:00 2001 From: m1muralid Date: Tue, 1 Sep 2026 11:08:55 -0600 Subject: [PATCH 2/2] Adding context manager for use_construction_attribute flag Per copilot suggestion Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- src/erad/gdm_mapping.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/erad/gdm_mapping.py b/src/erad/gdm_mapping.py index 47125c3a..1f4a3647 100644 --- a/src/erad/gdm_mapping.py +++ b/src/erad/gdm_mapping.py @@ -1,3 +1,5 @@ +from contextlib import contextmanager + import gdm.distribution.components as gdc import gdm.distribution.equipment as gde from gdm.distribution.enums import LineType @@ -5,8 +7,22 @@ from erad.enums import AssetTypes from erad.models.asset_mapping import ComponentFilterModel -USE_CONSTRUCTION_ATTRIBUTE = False +# Feature flag: when True, classify distribution MatrixImpedanceBranch components using +# equipment.construction (LineType) instead of the c_matrix threshold heuristic. +USE_CONSTRUCTION_ATTRIBUTE: bool = False + +@contextmanager +def construction_attribute_enabled(enabled: bool = True): + """Temporarily set USE_CONSTRUCTION_ATTRIBUTE within a `with` block.""" + global USE_CONSTRUCTION_ATTRIBUTE + old = USE_CONSTRUCTION_ATTRIBUTE + USE_CONSTRUCTION_ATTRIBUTE = enabled + try: + yield + finally: + USE_CONSTRUCTION_ATTRIBUTE = old + asset_to_gdm_mapping = { AssetTypes.switch: [ ComponentFilterModel(