Skip to content

Replaced LoadProfileInput with LoadProfileTimeSeries #1229

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Feb 6, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Removed attribute `dsm` from `LoadInput` [#1195](https://github.com/ie3-institute/PowerSystemDataModel/issues/1195)
- Fix spotless deprecations [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1223)
- Refactored `CongestionResult`, removed `ModelResultEntity` [#1234](https://github.com/ie3-institute/PowerSystemDataModel/issues/1234)
- Replaced `LoadProfileInput` with `LoadProfileTimeSeries` [#1228](https://github.com/ie3-institute/PowerSystemDataModel/issues/1228)

## [5.1.0] - 2024-06-24

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,11 @@ public synchronized BufferedCsvWriter getOrInitWriter(
}
}

public synchronized <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public synchronized <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
BufferedCsvWriter getOrInitWriter(T timeSeries, CsvFileDefinition fileDefinition)
throws ConnectorException {
/* Try to the right writer */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,11 @@ public CsvFileDefinition(
* @param fileNamingStrategy that should be used
* @throws FileException If the definition cannot be determined
*/
public <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
CsvFileDefinition(
T timeSeries,
String[] headLineElements,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* © 2024. TU Dortmund University,
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
* Research group Distribution grid planning and operation
*/
package edu.ie3.datamodel.io.factory.timeseries;

import edu.ie3.datamodel.io.factory.FactoryData;
import edu.ie3.datamodel.models.value.load.LoadValues;
import java.util.Map;

/**
* Data, that is used to build a {@link
* edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry} within a factory
*
* @param <V> Type of load values class
*/
public class LoadProfileData<V extends LoadValues> extends FactoryData {
public LoadProfileData(Map<String, String> fieldsToAttributes, Class<V> targetClass) {
super(fieldsToAttributes, targetClass);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* © 2024. TU Dortmund University,
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
* Research group Distribution grid planning and operation
*/
package edu.ie3.datamodel.io.factory.timeseries;

import edu.ie3.datamodel.io.factory.Factory;
import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation;
import edu.ie3.datamodel.models.profile.LoadProfile;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileEntry;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries;
import edu.ie3.datamodel.models.value.load.LoadValues;
import edu.ie3.util.quantities.PowerSystemUnits;
import java.util.Set;
import javax.measure.quantity.Energy;
import javax.measure.quantity.Power;
import tech.units.indriya.ComparableQuantity;
import tech.units.indriya.quantity.Quantities;

/**
* Base factory for all {@link LoadProfileTimeSeries}.
*
* @param <P> type of load profile
* @param <V> type of load values
*/
public abstract class LoadProfileFactory<P extends LoadProfile, V extends LoadValues>
extends Factory<V, LoadProfileData<V>, LoadProfileEntry<V>> {
protected static final String QUARTER_HOUR = "quarterHour";

public LoadProfileFactory(Class<? extends V> valueClass) {

Check warning on line 31 in src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java

View check run for this annotation

SonarQubeGithubPRChecks / PowerSystemDataModel Sonarqube Results

src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java#L31

Change the visibility of this constructor to "protected".
super(valueClass);
}

public abstract LoadProfileTimeSeries<V> build(
LoadProfileMetaInformation metaInformation, Set<LoadProfileEntry<V>> entries);

public abstract P parseProfile(String profile);

/**
* Calculates the maximum average power consumption per quarter-hour for a given calculated over
* all seasons and weekday types of given load profile
*
* @param loadProfile given load profile
* @param entries with power values
* @return the maximal average power
*/
public abstract ComparableQuantity<Power> calculateMaxPower(
P loadProfile, Set<LoadProfileEntry<V>> entries);

/** Returns the quarter-hour field. */
public String getTimeFieldString() {
return QUARTER_HOUR;
}

/** Returns the load profile energy scaling. The default value is 1000 kWh */
public ComparableQuantity<Energy> getLoadProfileEnergyScaling(P loadProfile) {

Check warning on line 57 in src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java

View check run for this annotation

SonarQubeGithubPRChecks / PowerSystemDataModel Sonarqube Results

src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java#L57

Remove this unused method parameter "loadProfile".
return Quantities.getQuantity(1000, PowerSystemUnits.KILOWATTHOUR);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@

import edu.ie3.datamodel.io.factory.EntityData;
import edu.ie3.datamodel.io.factory.EntityFactory;
import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation;
import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme;
import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation;
import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation;
import java.util.Collections;
import java.util.List;
import java.util.Set;
Expand All @@ -21,12 +23,13 @@
* mappings
*/
public class TimeSeriesMetaInformationFactory
extends EntityFactory<IndividualTimeSeriesMetaInformation, EntityData> {
extends EntityFactory<TimeSeriesMetaInformation, EntityData> {
private static final String TIME_SERIES = "timeSeries";
private static final String COLUMN_SCHEME = "columnScheme";
private static final String LOAD_PROFILE = "loadProfile";

public TimeSeriesMetaInformationFactory() {
super(IndividualTimeSeriesMetaInformation.class);
super(IndividualTimeSeriesMetaInformation.class, LoadProfileMetaInformation.class);
}

@Override
Expand All @@ -36,9 +39,15 @@ protected List<Set<String>> getFields(Class<?> entityClass) {
}

@Override
protected IndividualTimeSeriesMetaInformation buildModel(EntityData data) {
UUID timeSeries = data.getUUID(TIME_SERIES);
ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow();
return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme);
protected TimeSeriesMetaInformation buildModel(EntityData data) {
if (LoadProfileMetaInformation.class.isAssignableFrom(data.getTargetClass())) {
String profile = data.getField(LOAD_PROFILE);
return new LoadProfileMetaInformation(profile);
} else {
UUID timeSeries = data.getUUID(TIME_SERIES);

ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow();
return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import edu.ie3.datamodel.models.timeseries.TimeSeries;
import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry;
import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries;
import edu.ie3.datamodel.models.value.Value;
import java.util.Optional;

Expand All @@ -21,7 +21,7 @@ public class DatabaseNamingStrategy {

private static final String TIME_SERIES_PREFIX = "time_series_";

private static final String LOAD_PROFILE_PREFIX = "load_profile_";
private static final String LOAD_PROFILE = "load_profiles";

private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy;

Expand All @@ -42,6 +42,11 @@ public String getTimeSeriesPrefix() {
return TIME_SERIES_PREFIX;
}

/** Returns the String of the load profile table */
public String getLoadProfileTableName() {
return LOAD_PROFILE;
}

/**
* Provides the name of a time series table given a column scheme
*
Expand All @@ -53,13 +58,12 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) {
}

/**
* Provides the name of a load profile given by the load profile key
* Provides the name of the load profile table.
*
* @param lpKey Load profile key
* @return the table name
*/
private String getLoadProfileEntityName(String lpKey) {
return LOAD_PROFILE_PREFIX + lpKey;
public String getLoadProfileEntityName() {
return getLoadProfileTableName();
}

/**
Expand All @@ -78,7 +82,11 @@ public Optional<String> getEntityName(Class<? extends Entity> cls) {
* @param timeSeries to be named TimeSeries
* @return the table name
*/
public <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
Optional<String> getEntityName(T timeSeries) {
if (timeSeries instanceof IndividualTimeSeries individualTimeSeries) {
Optional<E> maybeFirstElement = individualTimeSeries.getEntries().stream().findFirst();
Expand All @@ -89,8 +97,8 @@ Optional<String> getEntityName(T timeSeries) {
logger.error("Unable to determine content of time series {}", timeSeries);
return Optional.empty();
}
} else if (timeSeries instanceof LoadProfileInput loadProfileInput) {
return Optional.of(getLoadProfileEntityName(loadProfileInput.getType().getKey()));
} else if (timeSeries instanceof LoadProfileTimeSeries<?>) {
return Optional.of(getLoadProfileEntityName());
} else {
logger.error("There is no naming strategy defined for {}", timeSeries);
return Optional.empty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import edu.ie3.datamodel.models.result.system.*;
import edu.ie3.datamodel.models.result.thermal.ThermalUnitResult;
import edu.ie3.datamodel.models.timeseries.TimeSeries;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
Expand Down Expand Up @@ -250,9 +249,7 @@ private enum SubDirectories {
StorageTypeInput.class,
WecTypeInput.class,
OperatorInput.class,
WecCharacteristicInput.class,
RandomLoadParameters.class,
LoadProfileInput.class)
WecCharacteristicInput.class)
.collect(Collectors.toSet())),
PARTICIPANTS_INPUT(
Constants.INPUT_SUB_TREE.resolve("participants"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme;
import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation;
import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation;
import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation;
import edu.ie3.datamodel.io.source.TimeSeriesMappingSource;
import edu.ie3.datamodel.models.Entity;
import edu.ie3.datamodel.models.input.*;
Expand All @@ -17,7 +17,7 @@
import edu.ie3.datamodel.models.timeseries.TimeSeries;
import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry;
import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries;
import edu.ie3.datamodel.models.value.*;
import edu.ie3.util.StringUtils;
import java.util.Optional;
Expand Down Expand Up @@ -60,7 +60,7 @@ public class EntityPersistenceNamingStrategy {
* profile is accessible via the named capturing group "profile", the uuid by the group "uuid"
*/
private static final String LOAD_PROFILE_TIME_SERIES =
"lpts_(?<profile>[a-zA-Z][0-9])_(?<uuid>" + UUID_STRING + ")";
"lpts_(?<profile>[a-zA-Z]{1,11}[0-9]{0,3})";

/**
* Pattern to identify load profile time series in this instance of the naming strategy (takes
Expand Down Expand Up @@ -156,15 +156,13 @@ public IndividualTimeSeriesMetaInformation individualTimesSeriesMetaInformation(
* @param fileName File name to extract information from
* @return Meta information form load profile time series file name
*/
public LoadProfileTimeSeriesMetaInformation loadProfileTimesSeriesMetaInformation(
String fileName) {
public LoadProfileMetaInformation loadProfileTimesSeriesMetaInformation(String fileName) {
Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName);
if (!matcher.matches())
throw new IllegalArgumentException(
"Cannot extract meta information on load profile time series from '" + fileName + "'.");

return new LoadProfileTimeSeriesMetaInformation(
UUID.fromString(matcher.group("uuid")), matcher.group("profile"));
return new LoadProfileMetaInformation(matcher.group("profile"));
}

/**
Expand Down Expand Up @@ -215,8 +213,6 @@ public Optional<String> getInputEntityName(Class<? extends InputEntity> cls) {
return getTypeEntityName(cls.asSubclass(AssetTypeInput.class));
if (AssetInput.class.isAssignableFrom(cls))
return getAssetInputEntityName(cls.asSubclass(AssetInput.class));
if (RandomLoadParameters.class.isAssignableFrom(cls))
return getRandomLoadParametersEntityName(cls.asSubclass(RandomLoadParameters.class));
if (GraphicInput.class.isAssignableFrom(cls))
return getGraphicsInputEntityName(cls.asSubclass(GraphicInput.class));
if (OperatorInput.class.isAssignableFrom(cls))
Expand Down Expand Up @@ -274,19 +270,6 @@ public Optional<String> getAssetCharacteristicsEntityName(
return Optional.of(addPrefixAndSuffix(assetCharString));
}

/**
* Get the entity name for all {@link RandomLoadParameters}
*
* @param randomLoadParamClass the random load parameters class an entity name string should be
* generated from
* @return the entity name string
*/
public Optional<String> getRandomLoadParametersEntityName(
Class<? extends RandomLoadParameters> randomLoadParamClass) {
String loadParamString = camelCaseToSnakeCase(randomLoadParamClass.getSimpleName());
return Optional.of(addPrefixAndSuffix(loadParamString.concat("_input")));
}

/**
* Converts a given camel case string to its snake case representation
*
Expand Down Expand Up @@ -359,7 +342,11 @@ public Optional<String> getTimeSeriesMappingEntityName() {
* @param timeSeries Time series to derive naming information from
* @return A file name for this particular time series
*/
public <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
Optional<String> getEntityName(T timeSeries) {
if (timeSeries instanceof IndividualTimeSeries) {
Optional<E> maybeFirstElement = timeSeries.getEntries().stream().findFirst();
Expand All @@ -383,14 +370,12 @@ Optional<String> getEntityName(T timeSeries) {
logger.error("Unable to determine content of time series {}", timeSeries);
return Optional.empty();
}
} else if (timeSeries instanceof LoadProfileInput loadProfileInput) {
} else if (timeSeries instanceof LoadProfileTimeSeries<?> loadProfileTimeSeries) {
return Optional.of(
prefix
.concat("lpts")
.concat("_")
.concat(loadProfileInput.getType().getKey())
.concat("_")
.concat(loadProfileInput.getUuid().toString())
.concat(loadProfileTimeSeries.getLoadProfile().getKey())
.concat(suffix));
} else {
logger.error("There is no naming strategy defined for {}", timeSeries);
Expand Down
Loading