Skip to content

Commit 2eecd76

Browse files
Merge pull request #372 from ie3-institute/ms/#371-extend-FlexOption-handling-in-ExtInputContainer
Extending flex option handling in `ExtInputContainer`.
2 parents 257bfea + ffe891c commit 2eecd76

File tree

7 files changed

+112
-14
lines changed

7 files changed

+112
-14
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88

99
### Added
1010
- Adding some utility methods [#368](https://github.com/ie3-institute/simonaAPI/issues/368)
11+
- Extending flex option handling in `ExtInputContainer` [#371](https://github.com/ie3-institute/simonaAPI/issues/371)
1112

1213
### Changed
1314
- Changes to sent and received em data [#2366](https://github.com/ie3-institute/simonaAPI/issues/366)

src/main/java/edu/ie3/simona/api/data/container/ExtInputContainer.java

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88

99
import edu.ie3.datamodel.models.value.PValue;
1010
import edu.ie3.datamodel.models.value.Value;
11-
import edu.ie3.simona.api.data.model.em.EmCommunicationMessage;
12-
import edu.ie3.simona.api.data.model.em.EmSetPoint;
13-
import edu.ie3.simona.api.data.model.em.FlexOptionRequest;
14-
import edu.ie3.simona.api.data.model.em.FlexOptions;
11+
import edu.ie3.simona.api.data.model.em.*;
1512
import java.util.*;
1613

1714
/** Contains all inputs for SIMONA for a certain tick */
@@ -27,7 +24,7 @@ public final class ExtInputContainer implements ExtDataContainer {
2724
/** Map uuid to primary input value for SIMONA. */
2825
private final Map<UUID, Value> primaryData = new HashMap<>();
2926

30-
// mapping for em data
27+
// mappings for em data
3128
/** Map uuid to flex option requests. */
3229
private final Map<UUID, FlexOptionRequest> flexRequests = new HashMap<>();
3330

@@ -61,7 +58,8 @@ public boolean isEmpty() {
6158
return primaryData.isEmpty()
6259
&& flexRequests.isEmpty()
6360
&& flexOptions.isEmpty()
64-
&& setPoints.isEmpty();
61+
&& setPoints.isEmpty()
62+
&& emMessages.isEmpty();
6563
}
6664

6765
/** Returns the tick the data is provided for. */
@@ -100,8 +98,34 @@ public void addRequest(UUID receiver) {
10098
flexRequests.put(receiver, new FlexOptionRequest(receiver, false));
10199
}
102100

103-
public void addRequest(UUID receiver, FlexOptionRequest request) {
104-
flexRequests.put(receiver, request);
101+
/**
102+
* Method for adding a flex option request.
103+
*
104+
* @param request to be added
105+
*/
106+
public void addRequest(FlexOptionRequest request) {
107+
flexRequests.put(request.receiver(), request);
108+
}
109+
110+
/**
111+
* Method for adding flex options to a given receiver.
112+
*
113+
* @param multiFlexOptions that will be added to this container
114+
*/
115+
public void addFlexOptions(MultiFlexOptions multiFlexOptions) {
116+
flexOptions
117+
.computeIfAbsent(multiFlexOptions.receiver(), k -> new ArrayList<>())
118+
.addAll(multiFlexOptions.disaggregated().values());
119+
}
120+
121+
/**
122+
* Method for adding flex options to a given receiver.
123+
*
124+
* @param receiver that will receive the flex options
125+
* @param flexOption that will be added
126+
*/
127+
public void addFlexOptions(UUID receiver, FlexOptions flexOption) {
128+
flexOptions.computeIfAbsent(receiver, k -> new ArrayList<>()).add(flexOption);
105129
}
106130

107131
/**

src/main/java/edu/ie3/simona/api/data/model/em/GeneralFlexOptions.java renamed to src/main/java/edu/ie3/simona/api/data/model/em/EnergyBoundariesFlexOptions.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import tech.units.indriya.ComparableQuantity;
1717

1818
/**
19-
* General flex options that can represent various flex option types.
19+
* Energy boundaries flex options that can represent various flex option types.
2020
*
2121
* @param model That is providing this flex options.
2222
* @param flexType The type of the flex options.
@@ -27,7 +27,7 @@
2727
* @param tickToEnergyLimits A map: tick to energy limits.
2828
* @param disaggregated A map: uuid to disaggregated flex options.
2929
*/
30-
public record GeneralFlexOptions(
30+
public record EnergyBoundariesFlexOptions(
3131
UUID receiver,
3232
UUID model,
3333
String flexType,
@@ -39,7 +39,7 @@ public record GeneralFlexOptions(
3939
Map<UUID, FlexOptions> disaggregated)
4040
implements FlexOptions {
4141

42-
public GeneralFlexOptions(
42+
public EnergyBoundariesFlexOptions(
4343
UUID receiver,
4444
UUID model,
4545
String flexType,

src/main/java/edu/ie3/simona/api/data/model/em/FlexOptions.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
package edu.ie3.simona.api.data.model.em;
88

9+
import java.util.Map;
910
import java.util.UUID;
1011

1112
/** Interface that defines flex options. */
@@ -14,6 +15,9 @@ public interface FlexOptions extends EmData {
1415
/** Returns the receiver of this flex options. */
1516
UUID receiver();
1617

18+
/** Returns the disaggregated flex options. */
19+
Map<UUID, FlexOptions> disaggregated();
20+
1721
/**
1822
* Enriches the flex option with disaggregated flex options.
1923
*
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* © 2025. TU Dortmund University,
3+
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
4+
* Research group Distribution grid planning and operation
5+
*/
6+
7+
package edu.ie3.simona.api.data.model.em;
8+
9+
import java.util.*;
10+
11+
/**
12+
* Container class for grouping disaggregated flex options to a single receiver.
13+
*
14+
* @param receiver that should receive the flex options
15+
* @param disaggregated flex options
16+
*/
17+
public record MultiFlexOptions(UUID receiver, Map<UUID, FlexOptions> disaggregated)
18+
implements FlexOptions {
19+
public MultiFlexOptions(UUID receiver) {
20+
this(receiver, new HashMap<>());
21+
}
22+
23+
@Override
24+
public void addDisaggregated(UUID model, FlexOptions flexOptions) {
25+
disaggregated.put(model, flexOptions);
26+
}
27+
}

src/test/groovy/edu/ie3/simona/api/data/container/ExtInputContainerTest.groovy

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package edu.ie3.simona.api.data.container
33
import edu.ie3.datamodel.models.value.PValue
44
import edu.ie3.simona.api.data.model.em.EmSetPoint
55
import edu.ie3.simona.api.data.model.em.FlexOptionRequest
6+
import edu.ie3.simona.api.data.model.em.MultiFlexOptions
67
import edu.ie3.simona.api.data.model.em.PowerLimitFlexOptions
78
import spock.lang.Shared
89
import spock.lang.Specification
@@ -12,8 +13,34 @@ import static edu.ie3.util.quantities.PowerSystemUnits.KILOWATT
1213

1314
class ExtInputContainerTest extends Specification {
1415

15-
@Shared
16-
private UUID sender = UUID.randomUUID()
16+
def "An ExtInputContainer should return the tick correctly"() {
17+
expect:
18+
container.tick == expectedTick
19+
container.maybeNextTick == expectedMaybeNextTick
20+
21+
where:
22+
container | expectedTick | expectedMaybeNextTick
23+
new ExtInputContainer(0L) | 0L | Optional.empty()
24+
new ExtInputContainer(0L, 900L) | 0L | Optional.of(900L)
25+
}
26+
27+
def "An ExtInputContainer should check if it is empty correctly"() {
28+
expect:
29+
def container1 = new ExtInputContainer(0L)
30+
container1.empty
31+
container1.addPrimaryValue(UUID.randomUUID(), null)
32+
!container1.empty
33+
34+
def container2 = new ExtInputContainer(0L)
35+
container2.empty
36+
container2.addFlexComMessage(null)
37+
!container2.empty
38+
39+
def container3 = new ExtInputContainer(0L)
40+
container3.empty
41+
container3.addRequest(UUID.randomUUID())
42+
!container3.empty
43+
}
1744

1845
def "An ExtInputContainer should add primary data correctly"() {
1946
given:
@@ -57,6 +84,21 @@ class ExtInputContainerTest extends Specification {
5784
container.flexOptions == [(receiver): [flexOptions]]
5885
}
5986

87+
def "An ExtInputContainer should add multi flex option data correctly"() {
88+
given:
89+
UUID receiver = UUID.randomUUID()
90+
UUID sender = UUID.randomUUID()
91+
def flexOptions = new PowerLimitFlexOptions(receiver, sender, Quantities.getQuantity(0d, KILOWATT), Quantities.getQuantity(2d, KILOWATT), Quantities.getQuantity(5d, KILOWATT))
92+
93+
def container = new ExtInputContainer(0L)
94+
95+
when:
96+
container.addFlexOptions(new MultiFlexOptions(receiver, [(sender): flexOptions]))
97+
98+
then:
99+
container.flexOptions == [(receiver): [flexOptions]]
100+
}
101+
60102
def "An ExtInputContainer should add set point data correctly"() {
61103
given:
62104
UUID receiver = UUID.randomUUID()

src/test/groovy/edu/ie3/simona/api/data/model/em/FlexOptionsTest.groovy

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ class FlexOptionsTest extends Specification {
4646
UUID receiver = UUID.randomUUID()
4747

4848
when:
49-
def flexOptions = new GeneralFlexOptions(
49+
def flexOptions = new EnergyBoundariesFlexOptions(
5050
receiver,
5151
senderUuid,
5252
"general flex type",

0 commit comments

Comments
 (0)