Skip to content

Commit a9e9fef

Browse files
author
paulf81
authored
external data to signals name (#179)
1 parent 7790243 commit a9e9fef

2 files changed

Lines changed: 30 additions & 30 deletions

File tree

hercules/hercules_model.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,12 @@ def __init__(self, input_file):
7070
self._controller = None
7171

7272
# Read in any external data
73-
self.external_data_all = {}
73+
self.external_signals_all = {}
7474
self.external_data_log_channels = None
75+
self.h_dict["external_signals"] = {}
7576
if "external_data" in self.h_dict:
7677
self._read_external_data_file(self.h_dict["external_data"]["external_data_file"])
7778
self.external_data_log_channels = self.h_dict["external_data"]["log_channels"]
78-
self.h_dict["external_signals"] = {}
7979

8080
# Initialize HDF5 output configuration
8181
if "output_file" in self.h_dict:
@@ -184,7 +184,7 @@ def _read_external_data_file(self, filename):
184184
This method reads external data from the specified file (CSV, feather, or pickle)
185185
and interpolates it according to the simulation time steps. The external data must
186186
include a 'time_utc' column which will be converted to simulation time.
187-
The interpolated data is stored in self.external_data_all.
187+
The interpolated data is stored in self.external_signals_all.
188188
189189
Args:
190190
filename (str): Path to the file containing external data. Supported formats:
@@ -228,7 +228,7 @@ def _read_external_data_file(self, filename):
228228

229229
# Convert interpolated DataFrame to dictionary format
230230
for col in df_interpolated.columns:
231-
self.external_data_all[col] = df_interpolated[col].values
231+
self.external_signals_all[col] = df_interpolated[col].values
232232

233233
def _initialize_hdf5_file(self):
234234
"""Initialize HDF5 file with metadata and data structure."""
@@ -494,7 +494,7 @@ def run(self):
494494
controller_step = self.controller.step
495495
plant_step = self.hybrid_plant.step
496496
log_current_state = self._log_data_to_hdf5
497-
external_data_all = self.external_data_all
497+
external_signals_all = self.external_signals_all
498498
h_dict = self.h_dict
499499

500500
# Set current time and run simulation through steps
@@ -517,11 +517,11 @@ def run(self):
517517
last_progress_update = self.step
518518

519519
# Fast external data lookup by step index (avoids per-step array equality checks)
520-
if external_data_all:
521-
for k in external_data_all:
520+
if external_signals_all:
521+
for k in external_signals_all:
522522
if k == "time":
523523
continue
524-
h_dict["external_signals"][k] = external_data_all[k][self.step]
524+
h_dict["external_signals"][k] = external_signals_all[k][self.step]
525525

526526
# Update controller and py sims
527527
h_dict["time"] = self.time

tests/hercules_model_test.py

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ def test_HerculesModel_instantiation():
8181
# Check default settings
8282
assert hmodel.output_file == "outputs/hercules_output.h5"
8383
assert hmodel.log_every_n == 1
84-
assert hmodel.external_data_all == {}
84+
assert hmodel.external_signals_all == {}
8585

8686
# Test with external data file and custom output file
8787
test_h_dict_2 = h_dict_solar.copy()
@@ -99,12 +99,12 @@ def test_HerculesModel_instantiation():
9999
hmodel = HerculesModel(test_h_dict_2)
100100

101101
# Check external data loading
102-
assert hmodel.external_data_all["power_reference"][0] == 1000
102+
assert hmodel.external_signals_all["power_reference"][0] == 1000
103103
# With dt=0.5 and endtime=5.0, we have times: 0.0, 0.5, 1.0, ..., 5.5, 6.0
104104
# At time 1.0: value is 2000 (from data), but at index 2 (time=1.0), value is interpolated
105-
# Actually external_data_all has times from starttime to endtime + 2*dt with step dt
105+
# Actually external_signals_all has times from starttime to endtime + 2*dt with step dt
106106
# So times are: 0.0, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0
107-
assert hmodel.external_data_all["power_reference"][-1] == 1000 # At time 6.0
107+
assert hmodel.external_signals_all["power_reference"][-1] == 1000 # At time 6.0
108108

109109
# Check custom output file
110110
assert hmodel.output_file == "test_output.h5"
@@ -194,11 +194,11 @@ def test_log_data_to_hdf5_with_external_signals():
194194
hmodel.h_dict["step"] = 5
195195

196196
# Update external signals (simulate what happens in the run loop)
197-
if hmodel.external_data_all:
198-
for k in hmodel.external_data_all:
197+
if hmodel.external_signals_all:
198+
for k in hmodel.external_signals_all:
199199
if k == "time":
200200
continue
201-
hmodel.h_dict["external_signals"][k] = hmodel.external_data_all[k][hmodel.step]
201+
hmodel.h_dict["external_signals"][k] = hmodel.external_signals_all[k][hmodel.step]
202202

203203
# Run controller and hybrid_plant steps to generate plant-level outputs
204204
hmodel.h_dict = hmodel.controller.step(hmodel.h_dict)
@@ -221,7 +221,7 @@ def test_log_data_to_hdf5_with_external_signals():
221221
hmodel._flush_buffer_to_hdf5()
222222

223223
# Check that external signal data was written correctly
224-
expected_value = hmodel.external_data_all["power_reference"][5] # Value at step 5
224+
expected_value = hmodel.external_signals_all["power_reference"][5] # Value at step 5
225225
assert hmodel.hdf5_datasets[expected_external_dataset][0] == expected_value
226226

227227
# Clean up
@@ -574,9 +574,9 @@ def test_external_data_new_format_with_log_channels():
574574
# Verify that external_data_log_channels was set
575575
assert hmodel.external_data_log_channels == ["power_reference"]
576576

577-
# Verify that all external data was loaded into external_data_all
578-
assert "power_reference" in hmodel.external_data_all
579-
assert len(hmodel.external_data_all["power_reference"]) > 0
577+
# Verify that all external data was loaded into external_signals_all
578+
assert "power_reference" in hmodel.external_signals_all
579+
assert len(hmodel.external_signals_all["power_reference"]) > 0
580580

581581
# Clean up
582582
hmodel.close()
@@ -611,13 +611,13 @@ def test_external_data_backward_compatibility():
611611
assert hmodel.external_data_log_channels is None
612612

613613
# Verify that data was loaded
614-
assert "power_reference" in hmodel.external_data_all
614+
assert "power_reference" in hmodel.external_signals_all
615615

616616
# Clean up
617617
hmodel.close()
618618

619619

620-
def test_external_data_all_channels_in_h_dict():
620+
def test_external_signals_all_channels_in_h_dict():
621621
"""Test that all external data channels are available in h_dict regardless of log_channels."""
622622
# Create a CSV with multiple channels
623623
import os
@@ -659,11 +659,11 @@ def test_external_data_all_channels_in_h_dict():
659659
hmodel.h_dict["step"] = 5
660660

661661
# Populate external signals (as done in run loop)
662-
if hmodel.external_data_all:
663-
for k in hmodel.external_data_all:
662+
if hmodel.external_signals_all:
663+
for k in hmodel.external_signals_all:
664664
if k == "time":
665665
continue
666-
hmodel.h_dict["external_signals"][k] = hmodel.external_data_all[k][hmodel.step]
666+
hmodel.h_dict["external_signals"][k] = hmodel.external_signals_all[k][hmodel.step]
667667

668668
# Verify ALL channels are in h_dict["external_signals"]
669669
assert "channel_1" in hmodel.h_dict["external_signals"]
@@ -733,11 +733,11 @@ def test_external_data_log_all_when_no_log_channels():
733733
hmodel.h_dict["step"] = 5
734734

735735
# Populate external signals
736-
if hmodel.external_data_all:
737-
for k in hmodel.external_data_all:
736+
if hmodel.external_signals_all:
737+
for k in hmodel.external_signals_all:
738738
if k == "time":
739739
continue
740-
hmodel.h_dict["external_signals"][k] = hmodel.external_data_all[k][hmodel.step]
740+
hmodel.h_dict["external_signals"][k] = hmodel.external_signals_all[k][hmodel.step]
741741

742742
# Run controller and hybrid_plant steps
743743
hmodel.h_dict = hmodel.controller.step(hmodel.h_dict)
@@ -801,11 +801,11 @@ def test_external_data_log_none_with_empty_list():
801801
hmodel.h_dict["step"] = 5
802802

803803
# Populate external signals (all channels should be available)
804-
if hmodel.external_data_all:
805-
for k in hmodel.external_data_all:
804+
if hmodel.external_signals_all:
805+
for k in hmodel.external_signals_all:
806806
if k == "time":
807807
continue
808-
hmodel.h_dict["external_signals"][k] = hmodel.external_data_all[k][hmodel.step]
808+
hmodel.h_dict["external_signals"][k] = hmodel.external_signals_all[k][hmodel.step]
809809

810810
# Verify ALL channels are in h_dict["external_signals"] (available to controller)
811811
assert "channel_x" in hmodel.h_dict["external_signals"]

0 commit comments

Comments
 (0)