Skip to content

Commit

Permalink
Duplicated solar prepro folder to wind
Browse files Browse the repository at this point in the history
  • Loading branch information
Sigurd-Borge committed Sep 9, 2024
1 parent b3de368 commit c7361e4
Show file tree
Hide file tree
Showing 9 changed files with 262 additions and 5 deletions.
5 changes: 4 additions & 1 deletion src/antares/model/study.py
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,10 @@ def _correlation_defaults() -> dict[str, dict[str, str]]:
desktop_ini_file.write(desktop_ini_content)

# Create various .ini files for the study
correlation_inis_to_create = [("solar_correlation", IniFileTypes.SOLAR_CORRELATION_INI)]
correlation_inis_to_create = [
("solar_correlation", IniFileTypes.SOLAR_CORRELATION_INI),
("wind_correlation", IniFileTypes.WIND_CORRELATION_INI),
]
ini_files = {
correlation: IniFile(study_directory, file_type, ini_contents=_correlation_defaults())
for (correlation, file_type) in correlation_inis_to_create
Expand Down
74 changes: 72 additions & 2 deletions src/antares/model/wind.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,80 @@
# SPDX-License-Identifier: MPL-2.0
#
# This file is part of the Antares project.
from pathlib import Path
from typing import Optional, Any

import pandas as pd

from antares.tools.time_series_tool import TimeSeries
from antares.tools.ini_tool import IniFile, IniFileTypes
from antares.tools.time_series_tool import TimeSeries, ConversionFile, TimeSeriesFile, TimeSeriesFileType, DataFile


class Wind(TimeSeries):
pass
def __init__(
self,
*,
study_path: Optional[Path] = None,
area_id: Optional[str] = None,
settings: Optional[IniFile] = None,
conversion: Optional[TimeSeries] = None,
data: Optional[TimeSeries] = None,
k: Optional[TimeSeries] = None,
translation: Optional[TimeSeries] = None,
**kwargs: Any,
) -> None:
super().__init__(**kwargs)
if study_path:
self._settings = (
settings if settings is not None else IniFile(study_path, IniFileTypes.WIND_SETTINGS_INI, area_id)
)
self._conversion = (
conversion
if conversion is not None
else TimeSeries(
ConversionFile().data,
TimeSeriesFile(TimeSeriesFileType.WIND_CONVERSION, study_path, area_id, ConversionFile().data),
)
)
self._data = (
data
if data is not None
else TimeSeries(
DataFile().data, TimeSeriesFile(TimeSeriesFileType.WIND_DATA, study_path, area_id, DataFile().data)
)
)
self._k = (
k
if k is not None
else TimeSeries(
pd.DataFrame([]), TimeSeriesFile(TimeSeriesFileType.WIND_K, study_path, area_id, pd.DataFrame([]))
)
)
self._translation = (
translation
if translation is not None
else TimeSeries(
pd.DataFrame([]),
TimeSeriesFile(TimeSeriesFileType.WIND_TRANSLATION, study_path, area_id, pd.DataFrame([])),
)
)

@property
def settings(self) -> IniFile:
return self._settings

@property
def conversion(self) -> TimeSeries:
return self._conversion

@property
def data(self) -> TimeSeries:
return self._data

@property
def k(self) -> TimeSeries:
return self._k

@property
def translation(self) -> TimeSeries:
return self._translation
2 changes: 1 addition & 1 deletion src/antares/service/api_services/area_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -370,7 +370,7 @@ def create_wind(self, area: Area, series: Optional[pd.DataFrame]) -> Wind:
series = series if series is not None else pd.DataFrame([])
series_path = f"input/wind/series/wind_{area.id}"
self._upload_series(area, series, series_path)
return Wind(series)
return Wind(time_series=series)

def create_reserves(self, area: Area, series: Optional[pd.DataFrame]) -> Reserves:
series = series if series is not None else pd.DataFrame([])
Expand Down
2 changes: 1 addition & 1 deletion src/antares/service/local_services/area_local.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ def create_st_storage(
def create_wind(self, area: Area, series: Optional[pd.DataFrame]) -> Wind:
series = series if series is not None else pd.DataFrame([])
local_file = TimeSeriesFile(TimeSeriesFileType.WIND, self.config.study_path, area.id, series)
return Wind(series, local_file)
return Wind(time_series=series, local_file=local_file, study_path=self.config.study_path, area_id=area.id)

def create_reserves(self, area: Area, series: Optional[pd.DataFrame]) -> Reserves:
series = series if series is not None else pd.DataFrame([])
Expand Down
2 changes: 2 additions & 0 deletions src/antares/tools/ini_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ class IniFileTypes(Enum):
ST_STORAGE_LIST_INI = "input/st-storage/clusters/{area_name}/list.ini"
THERMAL_AREAS_INI = "input/thermal/areas.ini"
THERMAL_LIST_INI = "input/thermal/clusters/{area_name}/list.ini"
WIND_CORRELATION_INI = "input/wind/prepro/correlation.ini"
WIND_SETTINGS_INI = "input/wind/prepro/{area_name}/settings.ini"


class IniFile:
Expand Down
4 changes: 4 additions & 0 deletions src/antares/tools/time_series_tool.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ class TimeSeriesFileType(Enum):
SOLAR_K = "input/solar/prepro/{area_id}/k.txt"
SOLAR_TRANSLATION = "input/solar/prepro/{area_id}/translation.txt"
WIND = "input/wind/series/wind_{area_id}.txt"
WIND_CONVERSION = "input/wind/prepro/{area_id}/conversion.txt"
WIND_DATA = "input/wind/prepro/{area_id}/data.txt"
WIND_K = "input/wind/prepro/{area_id}/k.txt"
WIND_TRANSLATION = "input/wind/prepro/{area_id}/translation.txt"


class TimeSeriesFile:
Expand Down
6 changes: 6 additions & 0 deletions tests/antares/services/local_services/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
LawOption,
ThermalCostGeneration,
)
from antares.model.wind import Wind
from antares.tools.ini_tool import IniFile, IniFileTypes


Expand Down Expand Up @@ -216,3 +217,8 @@ def area_fr(local_study_with_hydro) -> Area:
@pytest.fixture
def fr_solar(area_fr) -> Solar:
return area_fr.create_solar(None)


@pytest.fixture
def fr_wind(area_fr) -> Wind:
return area_fr.create_wind(None)
118 changes: 118 additions & 0 deletions tests/antares/services/local_services/test_area.py
Original file line number Diff line number Diff line change
Expand Up @@ -758,6 +758,124 @@ def test_can_create_wind_ts_file_with_time_series(self, area_fr):
assert actual_time_series.equals(expected_time_series)
assert actual_time_series_string == expected_time_series_string

def test_settings_ini_exists(self, area_fr, fr_wind):
# Given
expected_ini_path = area_fr._area_service.config.study_path / "input/wind/prepro/fr/settings.ini"

# Then
assert expected_ini_path.exists()
assert expected_ini_path.is_file()
assert expected_ini_path == fr_wind.settings.ini_path

def test_conversion_txt_exists(self, area_fr, fr_wind):
# Given
expected_file_path = area_fr._area_service.config.study_path / TimeSeriesFileType.WIND_CONVERSION.value.format(
area_id=area_fr.id
)

# Then
assert expected_file_path.exists()
assert expected_file_path.is_file()
assert fr_wind.conversion.local_file.file_path == expected_file_path

def test_conversion_txt_has_correct_default_values(self, area_fr, fr_wind):
# Given
expected_file_contents = """-9999999980506447872\t0\t9999999980506447872
0\t0\t0
"""
# data has to be compared as strings as the first value in the first column is too small for python apparently
expected_file_data = pd.read_csv(StringIO(expected_file_contents), sep="\t", header=None).astype(str)

# When
with fr_wind.conversion.local_file.file_path.open("r") as fr_wind_file:
actual_file_contents = fr_wind_file.read()
actual_file_data = fr_wind.conversion.time_series.astype(str)

# Then
assert actual_file_data.equals(expected_file_data)
assert actual_file_contents == expected_file_contents

def test_data_txt_exists(self, area_fr, fr_wind):
# Given
expected_file_path = area_fr._area_service.config.study_path / TimeSeriesFileType.WIND_DATA.value.format(
area_id=area_fr.id
)

# Then
assert expected_file_path.exists()
assert expected_file_path.is_file()
assert fr_wind.data.local_file.file_path == expected_file_path

def test_data_txt_has_correct_default_values(self, area_fr, fr_wind):
# Given
expected_file_contents = """1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
1\t1\t0\t1\t1\t1
"""
expected_file_data = pd.read_csv(StringIO(expected_file_contents), sep="\t", header=None)

# When
with fr_wind.data.local_file.file_path.open("r") as fr_wind_file:
actual_file_contents = fr_wind_file.read()
actual_file_data = fr_wind.data.time_series

# Then
assert actual_file_data.equals(expected_file_data)
assert actual_file_contents == expected_file_contents

def test_k_txt_exists(self, area_fr, fr_wind):
# Given
expected_file_path = area_fr._area_service.config.study_path / TimeSeriesFileType.WIND_K.value.format(
area_id=area_fr.id
)

# Then
assert expected_file_path.exists()
assert expected_file_path.is_file()
assert fr_wind.k.local_file.file_path == expected_file_path

def test_k_txt_is_empty_by_default(self, area_fr, fr_wind):
# Given
expected_file_contents = """"""

# When
with fr_wind.k.local_file.file_path.open("r") as fr_wind_file:
actual_file_contents = fr_wind_file.read()

# Then
assert actual_file_contents == expected_file_contents

def test_translation_txt_exists(self, area_fr, fr_wind):
# Given
expected_file_path = area_fr._area_service.config.study_path / TimeSeriesFileType.WIND_TRANSLATION.value.format(
area_id=area_fr.id
)

# Then
assert expected_file_path.exists()
assert expected_file_path.is_file()
assert fr_wind.translation.local_file.file_path == expected_file_path

def test_translation_txt_is_empty_by_default(self, area_fr, fr_wind):
# Given
expected_file_contents = """"""

# When
with fr_wind.translation.local_file.file_path.open("r") as fr_wind_file:
actual_file_contents = fr_wind_file.read()

# Then
assert actual_file_contents == expected_file_contents


class TestCreateSolar:
def test_can_create_solar_ts_file(self, area_fr):
Expand Down
54 changes: 54 additions & 0 deletions tests/antares/services/local_services/test_study.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,60 @@ def test_solar_correlation_ini_has_default_values(self, local_study_with_hydro):
assert actual_ini.parsed_ini.sections() == expected_ini.sections()
assert actual_ini.parsed_ini == expected_ini

def test_wind_correlation_ini_exists(self, local_study_with_hydro):
# Given
expected_ini_path = local_study_with_hydro.service.config.study_path / "input/wind/prepro/correlation.ini"

# Then
assert expected_ini_path.exists()
assert expected_ini_path.is_file()
assert local_study_with_hydro._ini_files["wind_correlation"].ini_path == expected_ini_path

def test_wind_correlation_ini_has_default_values(self, local_study_with_hydro):
# Given
expected_ini_content = """[general]
mode = annual
[annual]
[0]
[1]
[2]
[3]
[4]
[5]
[6]
[7]
[8]
[9]
[10]
[11]
"""
expected_ini = ConfigParser()
actual_ini = local_study_with_hydro._ini_files["wind_correlation"]

# When
expected_ini.read_string(expected_ini_content)
with actual_ini.ini_path.open("r") as ini_file:
actual_ini_content = ini_file.read()

# Then
assert actual_ini_content == expected_ini_content
assert actual_ini.parsed_ini.sections() == expected_ini.sections()
assert actual_ini.parsed_ini == expected_ini


class TestCreateArea:
def test_areas_sets_ini_content(self, tmp_path, local_study):
Expand Down

0 comments on commit c7361e4

Please sign in to comment.