Skip to content

Commit 8e7ebe9

Browse files
committed
Change default carrier handling
1 parent 568eff5 commit 8e7ebe9

3 files changed

Lines changed: 30 additions & 35 deletions

File tree

flixopt/color_accessor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,8 @@ def setup(self, config: dict[str, str] | str | Path) -> ColorAccessor:
104104
config = fx_io.load_yaml(Path(config))
105105

106106
for label, color in config.items():
107-
# Check if it's a known carrier (in CONFIG.Carriers or lowercase convention)
108-
if label in CONFIG.Carriers.defaults or label.islower():
107+
# Check if it's a known carrier (has attribute on CONFIG.Carriers or lowercase)
108+
if hasattr(CONFIG.Carriers, label) or label.islower():
109109
self._carrier_colors[label] = color
110110
# Check if it's a component
111111
elif label in self._fs.components:

flixopt/config.py

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -174,17 +174,6 @@ def format(self, record):
174174
'compute_infeasibilities': True,
175175
}
176176
),
177-
# Default carriers - colors from D3/Plotly palettes
178-
'carriers': MappingProxyType(
179-
{
180-
'electricity': '#FECB52', # Yellow - lightning
181-
'heat': '#D62728', # Red - warmth/fire
182-
'gas': '#1F77B4', # Blue - natural gas
183-
'hydrogen': '#9467BD', # Purple - clean/future
184-
'fuel': '#8C564B', # Brown - fossil/oil
185-
'biomass': '#2CA02C', # Green - organic/renewable
186-
}
187-
),
188177
}
189178
)
190179

@@ -608,13 +597,13 @@ class Carriers:
608597

609598
from .carrier import Carrier
610599

611-
# Default carriers - created from _DEFAULTS
612-
electricity: Carrier = Carrier('electricity', _DEFAULTS['carriers']['electricity'])
613-
heat: Carrier = Carrier('heat', _DEFAULTS['carriers']['heat'])
614-
gas: Carrier = Carrier('gas', _DEFAULTS['carriers']['gas'])
615-
hydrogen: Carrier = Carrier('hydrogen', _DEFAULTS['carriers']['hydrogen'])
616-
fuel: Carrier = Carrier('fuel', _DEFAULTS['carriers']['fuel'])
617-
biomass: Carrier = Carrier('biomass', _DEFAULTS['carriers']['biomass'])
600+
# Default carriers - colors from D3/Plotly palettes
601+
electricity: Carrier = Carrier('electricity', '#FECB52') # Yellow
602+
heat: Carrier = Carrier('heat', '#D62728') # Red
603+
gas: Carrier = Carrier('gas', '#1F77B4') # Blue
604+
hydrogen: Carrier = Carrier('hydrogen', '#9467BD') # Purple
605+
fuel: Carrier = Carrier('fuel', '#8C564B') # Brown
606+
biomass: Carrier = Carrier('biomass', '#2CA02C') # Green
618607

619608
config_name: str = _DEFAULTS['config_name']
620609

@@ -645,12 +634,12 @@ def reset(cls) -> None:
645634
# Reset Carriers to defaults
646635
from .carrier import Carrier
647636

648-
cls.Carriers.electricity = Carrier('electricity', _DEFAULTS['carriers']['electricity'])
649-
cls.Carriers.heat = Carrier('heat', _DEFAULTS['carriers']['heat'])
650-
cls.Carriers.gas = Carrier('gas', _DEFAULTS['carriers']['gas'])
651-
cls.Carriers.hydrogen = Carrier('hydrogen', _DEFAULTS['carriers']['hydrogen'])
652-
cls.Carriers.fuel = Carrier('fuel', _DEFAULTS['carriers']['fuel'])
653-
cls.Carriers.biomass = Carrier('biomass', _DEFAULTS['carriers']['biomass'])
637+
cls.Carriers.electricity = Carrier('electricity', '#FECB52')
638+
cls.Carriers.heat = Carrier('heat', '#D62728')
639+
cls.Carriers.gas = Carrier('gas', '#1F77B4')
640+
cls.Carriers.hydrogen = Carrier('hydrogen', '#9467BD')
641+
cls.Carriers.fuel = Carrier('fuel', '#8C564B')
642+
cls.Carriers.biomass = Carrier('biomass', '#2CA02C')
654643

655644
cls.config_name = _DEFAULTS['config_name']
656645

flixopt/flow_system.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -855,6 +855,7 @@ def connect_and_transform(self):
855855
return
856856

857857
self._connect_network()
858+
self._register_missing_carriers()
858859
for element in chain(self.components.values(), self.effects.values(), self.buses.values()):
859860
element.transform_data()
860861

@@ -863,6 +864,16 @@ def connect_and_transform(self):
863864

864865
self._connected_and_transformed = True
865866

867+
def _register_missing_carriers(self) -> None:
868+
"""Auto-register carriers from CONFIG for buses that reference unregistered carriers."""
869+
for bus in self.buses.values():
870+
if bus.carrier and bus.carrier not in self._carriers:
871+
# Try to get from CONFIG defaults
872+
default_carrier = getattr(CONFIG.Carriers, bus.carrier, None)
873+
if default_carrier is not None:
874+
self._carriers[bus.carrier] = default_carrier
875+
logger.debug(f"Auto-registered carrier '{bus.carrier}' from CONFIG")
876+
866877
def add_elements(self, *elements: Element) -> None:
867878
"""
868879
Add Components(Storages, Boilers, Heatpumps, ...), Buses or Effects to the FlowSystem
@@ -934,22 +945,17 @@ def add_carrier(self, carrier: Carrier) -> None:
934945
def get_carrier(self, name: str) -> Carrier | None:
935946
"""Get a carrier by name.
936947
937-
Looks up carriers in this order:
938-
1. Carriers registered on this FlowSystem via add_carrier()
939-
2. Global carriers in CONFIG.Carriers
948+
Returns carriers registered on this FlowSystem. After connect_and_transform(),
949+
this includes carriers auto-registered from CONFIG.Carriers for buses that
950+
reference them.
940951
941952
Args:
942953
name: Carrier name (case-insensitive).
943954
944955
Returns:
945956
Carrier object or None if not found.
946957
"""
947-
name_lower = name.lower()
948-
# Check local registry first
949-
if name_lower in self._carriers:
950-
return self._carriers[name_lower]
951-
# Fall back to CONFIG
952-
return CONFIG.Carriers.get(name_lower)
958+
return self._carriers.get(name.lower())
953959

954960
@property
955961
def carriers(self) -> CarrierContainer:

0 commit comments

Comments
 (0)