From 06b89a24ff46e93e084c2d49e14484417acb18bc Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 4 Feb 2025 14:28:56 +0100 Subject: [PATCH 1/5] Refactoring `CongestionResult` --- CHANGELOG.md | 1 + .../models/result/grid/congestion.md | 32 +++----- .../result/CongestionResultFactory.java | 22 +++--- .../result/ConnectorResultFactory.java | 2 +- .../result/FlexOptionsResultFactory.java | 2 +- .../io/factory/result/ModelResultFactory.java | 23 ------ .../io/factory/result/NodeResultFactory.java | 2 +- .../factory/result/ResultEntityFactory.java | 1 + .../factory/result/SwitchResultFactory.java | 2 +- .../SystemParticipantResultFactory.java | 2 +- .../factory/result/ThermalResultFactory.java | 2 +- .../models/result/CongestionResult.java | 78 ++++++------------- .../models/result/ModelResultEntity.java | 54 ------------- .../datamodel/models/result/NodeResult.java | 2 +- .../datamodel/models/result/ResultEntity.java | 15 +++- .../result/connector/ConnectorResult.java | 4 +- .../models/result/connector/SwitchResult.java | 4 +- .../result/system/FlexOptionsResult.java | 4 +- .../system/SystemParticipantResult.java | 4 +- .../result/thermal/ThermalUnitResult.java | 4 +- .../validation/UniquenessValidationUtils.java | 24 ++---- .../result/ResultEntityProcessorTest.groovy | 4 +- .../UniquenessValidationUtilsTest.groovy | 29 +++---- 23 files changed, 101 insertions(+), 216 deletions(-) delete mode 100644 src/main/java/edu/ie3/datamodel/io/factory/result/ModelResultFactory.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/result/ModelResultEntity.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 3abd7d730..f93c8b178 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Renamed timeseries mapping `participant` column to `asset` [#1191](https://github.com/ie3-institute/PowerSystemDataModel/issues/1191) - 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) ## [5.1.0] - 2024-06-24 diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index e0f687fa4..57f639917 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -2,7 +2,7 @@ # Congestion -Representation of a congestion result for a given subnet. +Representation of a congestion result for a given asset. ## Attributes, Units and Remarks @@ -18,30 +18,22 @@ Representation of a congestion result for a given subnet. * - time - ZonedDateTime - date and time for the produced result - + + * - inputModel + - + - uuid for the associated input model + * - subgrid - - Sub grid number - * - vMin - - p.u. - - minimal voltage of the subnet - - * - vMax - - p.u. - - maximal voltage of the subnet - - * - voltage - - - - Boolean indicator, if a voltage congestion occurred + * - min + - % + - minimal value that is possible - * - line - - - - Boolean indicator, if a line congestion occurred - - * - transformer - - - - Boolean indicator, if a transformer congestion occurred + * - max + - % + - maximal value that is possible ``` ## Caveats diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java index 9950a3eaf..082b5d91d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.result; -import static edu.ie3.util.quantities.PowerSystemUnits.PU; +import static tech.units.indriya.unit.Units.PERCENT; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.result.CongestionResult; @@ -13,16 +13,14 @@ import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Set; +import java.util.UUID; import javax.measure.quantity.Dimensionless; import tech.units.indriya.ComparableQuantity; public class CongestionResultFactory extends ResultEntityFactory { private static final String SUBGRID = "subgrid"; - private static final String VMIN = "vMin"; - private static final String VMAX = "vMax"; - private static final String VOLTAGE = "voltage"; - private static final String LINE = "line"; - private static final String TRANSFORMER = "transformer"; + private static final String MIN = "min"; + private static final String MAX = "max"; public CongestionResultFactory() { super(CongestionResult.class); @@ -34,19 +32,17 @@ public CongestionResultFactory(DateTimeFormatter dateTimeFormatter) { @Override protected List> getFields(Class entityClass) { - return List.of(newSet(TIME, SUBGRID, VMIN, VMAX, VOLTAGE, LINE, TRANSFORMER)); + return List.of(newSet(TIME, SUBGRID, MIN, MAX)); } @Override protected CongestionResult buildModel(EntityData data) { ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); + UUID inputModel = data.getUUID(INPUT_MODEL); int subgrid = data.getInt(SUBGRID); - ComparableQuantity vMin = data.getQuantity(VMIN, PU); - ComparableQuantity vMax = data.getQuantity(VMAX, PU); - boolean voltage = data.getBoolean(VOLTAGE); - boolean line = data.getBoolean(LINE); - boolean transformer = data.getBoolean(TRANSFORMER); + ComparableQuantity min = data.getQuantity(MIN, PERCENT); + ComparableQuantity max = data.getQuantity(MAX, PERCENT); - return new CongestionResult(zdtTime, subgrid, vMin, vMax, voltage, line, transformer); + return new CongestionResult(zdtTime, inputModel, subgrid, min, max); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java index d211528ef..495ee9bb9 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java @@ -20,7 +20,7 @@ import javax.measure.quantity.ElectricCurrent; import tech.units.indriya.ComparableQuantity; -public class ConnectorResultFactory extends ModelResultFactory { +public class ConnectorResultFactory extends ResultEntityFactory { private static final String IAMAG = "iAMag"; private static final String IAANG = "iAAng"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java index d3d63af84..1c31ea9db 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java @@ -14,7 +14,7 @@ import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; -public class FlexOptionsResultFactory extends ModelResultFactory { +public class FlexOptionsResultFactory extends ResultEntityFactory { private static final String P_REF = "pRef"; private static final String P_MIN = "pMin"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ModelResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ModelResultFactory.java deleted file mode 100644 index c888b7ee5..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ModelResultFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * © 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.result; - -import edu.ie3.datamodel.models.result.ModelResultEntity; -import java.time.format.DateTimeFormatter; - -public abstract class ModelResultFactory - extends ResultEntityFactory { - protected static final String INPUT_MODEL = "inputModel"; - - protected ModelResultFactory(Class... allowedClasses) { - super(allowedClasses); - } - - protected ModelResultFactory( - DateTimeFormatter dateTimeFormatter, Class... allowedClasses) { - super(dateTimeFormatter, allowedClasses); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java index 858480fbd..e7cbf1ea9 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java @@ -15,7 +15,7 @@ import javax.measure.quantity.Dimensionless; import tech.units.indriya.ComparableQuantity; -public class NodeResultFactory extends ModelResultFactory { +public class NodeResultFactory extends ResultEntityFactory { private static final String VMAG = "vMag"; private static final String VANG = "vAng"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java index f4c239795..6eadf1cd9 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java @@ -22,6 +22,7 @@ public abstract class ResultEntityFactory extends EntityFactory { protected static final String TIME = "time"; + protected static final String INPUT_MODEL = "inputModel"; protected final TimeUtil timeUtil; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java index 039928148..0db6a14dc 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java @@ -11,7 +11,7 @@ import java.time.format.DateTimeFormatter; import java.util.*; -public class SwitchResultFactory extends ModelResultFactory { +public class SwitchResultFactory extends ResultEntityFactory { private static final String CLOSED = "closed"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java index 68243f438..1d819be4e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java @@ -23,7 +23,7 @@ * Factory class for creating {@link SystemParticipantResult} entities from provided {@link * EntityData} data objects. */ -public class SystemParticipantResultFactory extends ModelResultFactory { +public class SystemParticipantResultFactory extends ResultEntityFactory { private static final String POWER = "p"; private static final String REACTIVE_POWER = "q"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java index 0ff9180d0..6a84b6d73 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java @@ -21,7 +21,7 @@ import javax.measure.quantity.Temperature; import tech.units.indriya.ComparableQuantity; -public class ThermalResultFactory extends ModelResultFactory { +public class ThermalResultFactory extends ResultEntityFactory { private static final String Q_DOT = "qDot"; private static final String INDOOR_TEMPERATURE = "indoorTemperature"; private static final String ENERGY = "energy"; diff --git a/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java b/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java index 61db3fb62..95c57c7bf 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java @@ -7,6 +7,7 @@ import java.time.ZonedDateTime; import java.util.Objects; +import java.util.UUID; import javax.measure.quantity.Dimensionless; import tech.units.indriya.ComparableQuantity; @@ -14,62 +15,39 @@ public class CongestionResult extends ResultEntity { /** Values */ private final Integer subgrid; - private final ComparableQuantity vMin; - private final ComparableQuantity vMax; - private final boolean voltage; - private final boolean line; - private final boolean transformer; + private final ComparableQuantity min; + private final ComparableQuantity max; /** * Standard constructor which includes auto generation of the resulting output models uuid. * * @param time date and time when the result is produced * @param subgrid the subgrid - * @param vMin minimum voltage in pu - * @param vMax maximal voltage in pu - * @param voltage {@code true} if a voltage congestion occurred in the subnet - * @param line {@code true} if a line congestion occurred in the subnet - * @param transformer {@code true} if a transformer congestion occurred in the subnet + * @param min minimum value in percent + * @param max maximal value in percent */ public CongestionResult( ZonedDateTime time, + UUID inputModel, int subgrid, - ComparableQuantity vMin, - ComparableQuantity vMax, - boolean voltage, - boolean line, - boolean transformer) { - super(time); + ComparableQuantity min, + ComparableQuantity max) { + super(time, inputModel); this.subgrid = subgrid; - this.vMin = vMin; - this.vMax = vMax; - this.voltage = voltage; - this.line = line; - this.transformer = transformer; + this.min = min; + this.max = max; } public int getSubgrid() { return subgrid; } - public boolean getVoltage() { - return voltage; + public ComparableQuantity getMin() { + return min; } - public boolean getLine() { - return line; - } - - public boolean getTransformer() { - return transformer; - } - - public ComparableQuantity getVMin() { - return vMin; - } - - public ComparableQuantity getVMax() { - return vMax; + public ComparableQuantity getMax() { + return max; } @Override @@ -79,35 +57,27 @@ public boolean equals(Object o) { CongestionResult that = (CongestionResult) o; return getTime().equals(that.getTime()) && Objects.equals(subgrid, that.subgrid) - && vMin.equals(that.vMin) - && vMax.equals(that.vMax) - && voltage == that.voltage - && line == that.line - && transformer == that.transformer; + && min.equals(that.min) + && max.equals(that.max); } @Override public int hashCode() { - return Objects.hash( - super.hashCode(), getTime(), subgrid, vMin, vMax, voltage, line, transformer); + return Objects.hash(super.hashCode(), getTime(), subgrid, min, max); } @Override public String toString() { return "InputResultEntity{time=" + getTime() + + ", inputModel=" + + getInputModel() + ", subgrid=" + subgrid - + ", vMin=" - + vMin - + ", vMan=" - + vMax - + ", voltage=" - + voltage - + ", line=" - + line - + ", transformer=" - + transformer + + ", min=" + + min + + ", max=" + + max + '}'; } } diff --git a/src/main/java/edu/ie3/datamodel/models/result/ModelResultEntity.java b/src/main/java/edu/ie3/datamodel/models/result/ModelResultEntity.java deleted file mode 100644 index abc90cec4..000000000 --- a/src/main/java/edu/ie3/datamodel/models/result/ModelResultEntity.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.result; - -import java.time.ZonedDateTime; -import java.util.Objects; -import java.util.UUID; - -/** Abstract class to hold all mappings common to all input result models */ -public abstract class ModelResultEntity extends ResultEntity { - - /** uuid of the input model that produces the result */ - private UUID inputModel; - - /** - * Standard constructor which includes auto generation of the resulting output models uuid. - * - * @param time date and time when the result is produced - * @param inputModel uuid of the input model that produces the result - */ - protected ModelResultEntity(ZonedDateTime time, UUID inputModel) { - super(time); - this.inputModel = inputModel; - } - - public UUID getInputModel() { - return inputModel; - } - - public void setInputModel(UUID inputID) { - inputModel = inputID; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - ModelResultEntity that = (ModelResultEntity) o; - return getTime().equals(that.getTime()) && inputModel.equals(that.inputModel); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getTime(), inputModel); - } - - @Override - public String toString() { - return "InputResultEntity{time=" + getTime() + ", inputModel=" + inputModel + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java b/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java index f0db14df3..0724a8344 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/NodeResult.java @@ -13,7 +13,7 @@ import tech.units.indriya.ComparableQuantity; /** Represents calculation results of a {@link edu.ie3.datamodel.models.input.NodeInput} */ -public class NodeResult extends ModelResultEntity { +public class NodeResult extends ResultEntity { /** Voltage magnitude @ this node in p.u. */ private ComparableQuantity vMag; diff --git a/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java b/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java index ba4dd58af..0d8b229bf 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java +++ b/src/main/java/edu/ie3/datamodel/models/result/ResultEntity.java @@ -8,20 +8,33 @@ import edu.ie3.datamodel.models.Entity; import java.time.ZonedDateTime; import java.util.Objects; +import java.util.UUID; /** Abstract class to hold all mappings common to all result models */ public abstract class ResultEntity implements Entity { /** date and time of the produced result */ private ZonedDateTime time; + /** uuid of the input model that produces the result */ + private UUID inputModel; /** * Standard constructor which includes auto generation of the resulting output models uuid. * * @param time date and time when the result is produced + * @param inputModel uuid of the input model that produces the result */ - protected ResultEntity(ZonedDateTime time) { + protected ResultEntity(ZonedDateTime time, UUID inputModel) { this.time = time; + this.inputModel = inputModel; + } + + public UUID getInputModel() { + return inputModel; + } + + public void setInputModel(UUID inputID) { + inputModel = inputID; } public ZonedDateTime getTime() { diff --git a/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java b/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java index 187a27fc0..c5d9b99cd 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/connector/ConnectorResult.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.result.connector; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -14,7 +14,7 @@ import tech.units.indriya.ComparableQuantity; /** Abstract class to hold most 'ElectricCurrent and Angle'-mappings common to all connectors */ -public abstract class ConnectorResult extends ModelResultEntity { +public abstract class ConnectorResult extends ResultEntity { /** Electric current magnitude @ port A, normally provided in Ampere */ private ComparableQuantity iAMag; diff --git a/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java b/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java index c0b650558..7b5c15c5b 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/connector/SwitchResult.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.result.connector; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -13,7 +13,7 @@ /** * Represents calculation results of a {@link edu.ie3.datamodel.models.input.connector.SwitchInput} */ -public class SwitchResult extends ModelResultEntity { +public class SwitchResult extends ResultEntity { /** is the switching state 'closed'? */ private boolean closed; diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java index ea85fc554..210bc761b 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/FlexOptionsResult.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.result.system; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -13,7 +13,7 @@ import tech.units.indriya.ComparableQuantity; /** Represents results of flexibility request */ -public class FlexOptionsResult extends ModelResultEntity { +public class FlexOptionsResult extends ResultEntity { /** * Active power (might be negative, thus feed-in) that was suggested for regular usage by the diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java index 225833777..4b5067896 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/SystemParticipantResult.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.result.system; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -13,7 +13,7 @@ import tech.units.indriya.ComparableQuantity; /** Abstract class that holds values common to all other result entities */ -public abstract class SystemParticipantResult extends ModelResultEntity { +public abstract class SystemParticipantResult extends ResultEntity { /** active power output normally provided in MW */ private ComparableQuantity p; diff --git a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java index d3265bbae..07ba81913 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/thermal/ThermalUnitResult.java @@ -6,7 +6,7 @@ package edu.ie3.datamodel.models.result.thermal; import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -14,7 +14,7 @@ import tech.units.indriya.ComparableQuantity; /** Representation of a result with regard to a thermal unit */ -public abstract class ThermalUnitResult extends ModelResultEntity { +public abstract class ThermalUnitResult extends ResultEntity { /** * Average thermal power flowing into the thermal unit (+: Power flowing into unit, -: Power diff --git a/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java b/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java index 50f71c78c..cdf980fad 100644 --- a/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/validation/UniquenessValidationUtils.java @@ -11,8 +11,7 @@ import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.AssetInput; import edu.ie3.datamodel.models.input.IdCoordinateInput; -import edu.ie3.datamodel.models.result.CongestionResult; -import edu.ie3.datamodel.models.result.ModelResultEntity; +import edu.ie3.datamodel.models.result.ResultEntity; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; import edu.ie3.datamodel.models.value.WeatherValue; import edu.ie3.datamodel.utils.Try; @@ -28,10 +27,8 @@ public class UniquenessValidationUtils extends ValidationUtils { protected static final FieldSetSupplier uuidFieldSupplier = entity -> Set.of(entity.getUuid()); protected static final FieldSetSupplier idFieldSupplier = e -> Set.of(e.getId()); - protected static final FieldSetSupplier modelResultFieldSupplier = + protected static final FieldSetSupplier resultFieldSupplier = entity -> Set.of(entity.getTime(), entity.getInputModel()); - protected static final FieldSetSupplier congestionResultFieldSupplier = - entity -> Set.of(entity.getTime(), entity.getSubgrid()); protected static final FieldSetSupplier mappingFieldSupplier = entity -> Set.of(entity.getAsset()); protected static final FieldSetSupplier idCoordinateSupplier = @@ -72,25 +69,14 @@ public static void checkAssetUniqueness(Collection entitie } /** - * Checks the uniqueness of a collection of {@link CongestionResult}. + * Checks the uniqueness of a collection of {@link ResultEntity}. * * @param entities to be checked * @throws DuplicateEntitiesException if uniqueness is violated */ - public static void checkCongestionResultUniqueness( - Collection entities) throws DuplicateEntitiesException { - checkUniqueness(entities, congestionResultFieldSupplier).getOrThrow(); - } - - /** - * Checks the uniqueness of a collection of {@link ModelResultEntity}. - * - * @param entities to be checked - * @throws DuplicateEntitiesException if uniqueness is violated - */ - public static void checkModelResultUniqueness(Collection entities) + public static void checkResultUniqueness(Collection entities) throws DuplicateEntitiesException { - checkUniqueness(entities, modelResultFieldSupplier).getOrThrow(); + checkUniqueness(entities, resultFieldSupplier).getOrThrow(); } /** diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy index 7bf12fbb9..4f5c4a0f1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/result/ResultEntityProcessorTest.groovy @@ -7,8 +7,8 @@ package edu.ie3.datamodel.io.processor.result import edu.ie3.datamodel.exceptions.EntityProcessorException import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.result.ModelResultEntity import edu.ie3.datamodel.models.result.NodeResult +import edu.ie3.datamodel.models.result.ResultEntity import edu.ie3.datamodel.models.result.connector.LineResult import edu.ie3.datamodel.models.result.connector.SwitchResult import edu.ie3.datamodel.models.result.connector.Transformer2WResult @@ -285,7 +285,7 @@ class ResultEntityProcessorTest extends Specification { thrown(EntityProcessorException) } - private static class InvalidTestResult extends ModelResultEntity { + private static class InvalidTestResult extends ResultEntity { InvalidTestResult(ZonedDateTime time, UUID inputModel) { super(time, inputModel) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index 95b2f0472..f8ac14ec8 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -10,14 +10,15 @@ import static edu.ie3.datamodel.utils.validation.UniquenessValidationUtils.* import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM import static edu.ie3.util.quantities.PowerSystemUnits.PU import static tech.units.indriya.unit.Units.METRE_PER_SECOND +import static tech.units.indriya.unit.Units.PERCENT import edu.ie3.datamodel.exceptions.DuplicateEntitiesException import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.AssetInput import edu.ie3.datamodel.models.result.CongestionResult -import edu.ie3.datamodel.models.result.ModelResultEntity import edu.ie3.datamodel.models.result.NodeResult +import edu.ie3.datamodel.models.result.ResultEntity import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.value.SolarIrradianceValue import edu.ie3.datamodel.models.value.TemperatureValue @@ -107,19 +108,19 @@ class UniquenessValidationUtilsTest extends Specification { Quantity vMag = Quantities.getQuantity(0.95, PU) Quantity vAng = Quantities.getQuantity(45, StandardUnits.VOLTAGE_ANGLE) - Set uniqueResults = [ + Set uniqueResults = [ new NodeResult(time, uuid, vMag, vAng), new NodeResult(time.plusHours(1), uuid, vMag, vAng) ] when: - checkModelResultUniqueness(uniqueResults) + checkResultUniqueness(uniqueResults) then: noExceptionThrown() } - def "Duplicates in model result inputs lead to an exception"() { + def "Duplicates in result inputs lead to an exception"() { given: ZonedDateTime time = ZonedDateTime.parse("2024-02-15T13:49:44+01:00[Europe/Berlin]") UUID uuid1 = UUID.fromString("4f7938ad-3d8f-4d56-a76c-525f2362e8b6") @@ -127,7 +128,7 @@ class UniquenessValidationUtilsTest extends Specification { Quantity vMag = Quantities.getQuantity(0.95, PU) Quantity vAng = Quantities.getQuantity(45, StandardUnits.VOLTAGE_ANGLE) - Set notUniqueResults = [ + Set notUniqueResults = [ new NodeResult(time, uuid1, vMag, vAng), new NodeResult(time, uuid1, vMag, vAng), new NodeResult(time.plusHours(1), uuid2, vMag, vAng), @@ -135,7 +136,7 @@ class UniquenessValidationUtilsTest extends Specification { ] when: - checkModelResultUniqueness(notUniqueResults) + checkResultUniqueness(notUniqueResults) then: DuplicateEntitiesException de = thrown() @@ -145,20 +146,22 @@ class UniquenessValidationUtilsTest extends Specification { def "Duplicates in congestion result inputs lead to an exception"() { given: ZonedDateTime time = ZonedDateTime.parse("2024-02-15T13:49:44+01:00[Europe/Berlin]") + UUID inputModel1 = UUID.randomUUID() + UUID inputModel2 = UUID.randomUUID() int subgrid1 = 1 int subgrid2 = 2 - Quantity vMin = Quantities.getQuantity(0.9, PU) - Quantity vMax = Quantities.getQuantity(1.1, PU) + Quantity min = Quantities.getQuantity(90, PERCENT) + Quantity max = Quantities.getQuantity(110, PERCENT) Set notUniqueResults = [ - new CongestionResult(time, subgrid1, vMin, vMax, false, false, false), - new CongestionResult(time, subgrid1, vMin, vMax, false, true, false), - new CongestionResult(time.plusHours(1), subgrid1, vMin, vMax, false, false, false), - new CongestionResult(time.plusHours(1), subgrid2, vMin, vMax, false, true, false), + new CongestionResult(time, inputModel1, subgrid1, min, max), + new CongestionResult(time, inputModel2, subgrid1, min, max), + new CongestionResult(time.plusHours(1), inputModel1, subgrid1, min, max), + new CongestionResult(time.plusHours(1), inputModel2, subgrid2, min, max), ] when: - checkCongestionResultUniqueness(notUniqueResults) + checkResultUniqueness(notUniqueResults) then: DuplicateEntitiesException de = thrown() From 39fdd99f141a1b8f98edf3122b06d406cbf4a967 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Tue, 4 Feb 2025 14:39:31 +0100 Subject: [PATCH 2/5] Fixing failing test. --- .../utils/validation/UniquenessValidationUtilsTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index f8ac14ec8..09192cd47 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -155,7 +155,7 @@ class UniquenessValidationUtilsTest extends Specification { Set notUniqueResults = [ new CongestionResult(time, inputModel1, subgrid1, min, max), - new CongestionResult(time, inputModel2, subgrid1, min, max), + new CongestionResult(time, inputModel1, subgrid2, min, max), new CongestionResult(time.plusHours(1), inputModel1, subgrid1, min, max), new CongestionResult(time.plusHours(1), inputModel2, subgrid2, min, max), ] From 5d5d9e68f2806edfbe40bb8ccc2b5eff76b67e83 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 5 Feb 2025 10:06:09 +0100 Subject: [PATCH 3/5] Enhancing `CongestionResult` with input model type and value. --- .../models/result/grid/congestion.md | 12 ++++- .../result/CongestionResultFactory.java | 18 ++++++- .../models/result/CongestionResult.java | 51 ++++++++++++++++++- .../UniquenessValidationUtilsTest.groovy | 10 ++-- 4 files changed, 82 insertions(+), 9 deletions(-) diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index 57f639917..7b21278fb 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -23,16 +23,24 @@ Representation of a congestion result for a given asset. - - uuid for the associated input model + * - inputModelType + - + - the type of the input model (e.g. node, line, etc.) + * - subgrid - - Sub grid number * - min - - % + - Percent + - the actual value that was calculated + + * - min + - Percent - minimal value that is possible * - max - - % + - Percent - maximal value that is possible ``` diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java index 082b5d91d..1ff917089 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/CongestionResultFactory.java @@ -7,8 +7,12 @@ import static tech.units.indriya.unit.Units.PERCENT; +import edu.ie3.datamodel.exceptions.FactoryException; +import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.result.CongestionResult; +import edu.ie3.datamodel.models.result.CongestionResult.InputModelType; +import edu.ie3.datamodel.utils.Try; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.List; @@ -18,7 +22,9 @@ import tech.units.indriya.ComparableQuantity; public class CongestionResultFactory extends ResultEntityFactory { + private static final String TYPE = "type"; private static final String SUBGRID = "subgrid"; + private static final String VALUE = "value"; private static final String MIN = "min"; private static final String MAX = "max"; @@ -32,17 +38,25 @@ public CongestionResultFactory(DateTimeFormatter dateTimeFormatter) { @Override protected List> getFields(Class entityClass) { - return List.of(newSet(TIME, SUBGRID, MIN, MAX)); + return List.of(newSet(TIME, INPUT_MODEL, TYPE, SUBGRID, MIN, MAX)); } @Override protected CongestionResult buildModel(EntityData data) { ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); UUID inputModel = data.getUUID(INPUT_MODEL); + + InputModelType type = + Try.of(() -> InputModelType.parse(data.getField(TYPE)), ParsingException.class) + .transformF(FactoryException::new) + .getOrThrow(); + int subgrid = data.getInt(SUBGRID); + + ComparableQuantity value = data.getQuantity(VALUE, PERCENT); ComparableQuantity min = data.getQuantity(MIN, PERCENT); ComparableQuantity max = data.getQuantity(MAX, PERCENT); - return new CongestionResult(zdtTime, inputModel, subgrid, min, max); + return new CongestionResult(zdtTime, inputModel, type, subgrid, value, min, max); } } diff --git a/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java b/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java index 95c57c7bf..cada19c7f 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/CongestionResult.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.models.result; +import edu.ie3.datamodel.exceptions.ParsingException; import java.time.ZonedDateTime; import java.util.Objects; import java.util.UUID; @@ -15,6 +16,8 @@ public class CongestionResult extends ResultEntity { /** Values */ private final Integer subgrid; + private final InputModelType type; + private final ComparableQuantity value; private final ComparableQuantity min; private final ComparableQuantity max; @@ -22,26 +25,41 @@ public class CongestionResult extends ResultEntity { * Standard constructor which includes auto generation of the resulting output models uuid. * * @param time date and time when the result is produced + * @param inputModel identifier of the input model + * @param type of the input model * @param subgrid the subgrid + * @param value the actual value in percent * @param min minimum value in percent * @param max maximal value in percent */ public CongestionResult( ZonedDateTime time, UUID inputModel, + InputModelType type, int subgrid, + ComparableQuantity value, ComparableQuantity min, ComparableQuantity max) { super(time, inputModel); + this.type = type; this.subgrid = subgrid; + this.value = value; this.min = min; this.max = max; } + public InputModelType getType() { + return type; + } + public int getSubgrid() { return subgrid; } + public ComparableQuantity getValue() { + return value; + } + public ComparableQuantity getMin() { return min; } @@ -56,14 +74,17 @@ public boolean equals(Object o) { if (o == null || getClass() != o.getClass()) return false; CongestionResult that = (CongestionResult) o; return getTime().equals(that.getTime()) + && getInputModel().equals(that.getInputModel()) + && type.equals(that.type) && Objects.equals(subgrid, that.subgrid) + && value.equals(that.value) && min.equals(that.min) && max.equals(that.max); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), getTime(), subgrid, min, max); + return Objects.hash(super.hashCode(), getTime(), type, subgrid, value, min, max); } @Override @@ -72,12 +93,40 @@ public String toString() { + getTime() + ", inputModel=" + getInputModel() + + ", type=" + + type + ", subgrid=" + subgrid + + ", value=" + + value + ", min=" + min + ", max=" + max + '}'; } + + public enum InputModelType { + NODE("node"), + LINE("line"), + TRANSFORMER_2W("transformer_2w"), + TRANSFORMER_3W("transforerm_3w"); + + public final String type; + + InputModelType(String type) { + this.type = type; + } + + public static InputModelType parse(String inputModelType) throws ParsingException { + return switch (inputModelType) { + case "node" -> NODE; + case "line" -> LINE; + case "transformer_2w" -> TRANSFORMER_2W; + case "transformer_3w" -> TRANSFORMER_3W; + default -> throw new ParsingException( + "InputModelType '" + inputModelType + "' cannot be parsed!"); + }; + } + } } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index 09192cd47..e291227c4 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.utils.validation +import static edu.ie3.datamodel.models.result.CongestionResult.InputModelType.NODE import static edu.ie3.datamodel.utils.validation.DummyAssetInput.valid import static edu.ie3.datamodel.utils.validation.UniquenessValidationUtils.* import static edu.ie3.util.quantities.PowerSystemUnits.DEGREE_GEOM @@ -150,14 +151,15 @@ class UniquenessValidationUtilsTest extends Specification { UUID inputModel2 = UUID.randomUUID() int subgrid1 = 1 int subgrid2 = 2 + Quantity value = Quantities.getQuantity(100, PERCENT) Quantity min = Quantities.getQuantity(90, PERCENT) Quantity max = Quantities.getQuantity(110, PERCENT) Set notUniqueResults = [ - new CongestionResult(time, inputModel1, subgrid1, min, max), - new CongestionResult(time, inputModel1, subgrid2, min, max), - new CongestionResult(time.plusHours(1), inputModel1, subgrid1, min, max), - new CongestionResult(time.plusHours(1), inputModel2, subgrid2, min, max), + new CongestionResult(time, inputModel1, NODE, subgrid1, value, min, max), + new CongestionResult(time, inputModel1, NODE, subgrid2, value, min, max), + new CongestionResult(time.plusHours(1), inputModel1, NODE, subgrid1, value, min, max), + new CongestionResult(time.plusHours(1), inputModel2, NODE, subgrid2, value, min, max), ] when: From f09f53d03a8a32e7a4f9cb70ca7624353c7809aa Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 5 Feb 2025 10:17:28 +0100 Subject: [PATCH 4/5] Addressing reviewer's comments. --- docs/readthedocs/models/result/grid/congestion.md | 6 +++--- .../utils/validation/UniquenessValidationUtilsTest.groovy | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index 7b21278fb..299648eeb 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -31,17 +31,17 @@ Representation of a congestion result for a given asset. - - Sub grid number - * - min + * - value - Percent - the actual value that was calculated * - min - Percent - - minimal value that is possible + - minimal limit value * - max - Percent - - maximal value that is possible + - maximal limit value ``` ## Caveats diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy index e291227c4..82066c52c 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/UniquenessValidationUtilsTest.groovy @@ -151,7 +151,7 @@ class UniquenessValidationUtilsTest extends Specification { UUID inputModel2 = UUID.randomUUID() int subgrid1 = 1 int subgrid2 = 2 - Quantity value = Quantities.getQuantity(100, PERCENT) + Quantity value = Quantities.getQuantity(120, PERCENT) Quantity min = Quantities.getQuantity(90, PERCENT) Quantity max = Quantities.getQuantity(110, PERCENT) From 09806f5c74057d5c78aba23ac5123397c0f59d86 Mon Sep 17 00:00:00 2001 From: staudtMarius Date: Wed, 5 Feb 2025 13:47:08 +0100 Subject: [PATCH 5/5] Addressing reviewer's comments. --- docs/readthedocs/models/result/grid/congestion.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/readthedocs/models/result/grid/congestion.md b/docs/readthedocs/models/result/grid/congestion.md index 299648eeb..2113706ac 100644 --- a/docs/readthedocs/models/result/grid/congestion.md +++ b/docs/readthedocs/models/result/grid/congestion.md @@ -33,7 +33,7 @@ Representation of a congestion result for a given asset. * - value - Percent - - the actual value that was calculated + - the actual value that was calculated in relation to its base value * - min - Percent