Skip to content

Commit 0122e50

Browse files
authored
Experiment/robustify one state only rao result (#1481)
use default values in OneStateOnly delete getOptimizationResult method, replace its usages --------- Signed-off-by: Thomas Bouquet <[email protected]>
1 parent 70394fe commit 0122e50

File tree

4 files changed

+51
-101
lines changed

4 files changed

+51
-101
lines changed

ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/castor/algorithm/CastorFullOptimization.java

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.powsybl.openrao.data.crac.api.Instant;
1313
import com.powsybl.openrao.data.crac.api.InstantKind;
1414
import com.powsybl.openrao.data.crac.api.State;
15+
import com.powsybl.openrao.data.crac.api.cnec.FlowCnec;
1516
import com.powsybl.openrao.data.crac.api.networkaction.NetworkAction;
1617
import com.powsybl.openrao.data.raoresult.api.ComputationStatus;
1718
import com.powsybl.openrao.data.raoresult.api.OptimizationStepsExecuted;
@@ -37,6 +38,7 @@
3738
import com.powsybl.openrao.sensitivityanalysis.AppliedRemedialActions;
3839
import com.powsybl.iidm.network.Network;
3940
import org.apache.commons.lang3.exception.ExceptionUtils;
41+
import org.apache.commons.lang3.tuple.Pair;
4042

4143
import java.time.temporal.ChronoUnit;
4244
import java.util.*;
@@ -126,15 +128,18 @@ public CompletableFuture<RaoResult> run() {
126128
network.getVariantManager().setWorkingVariant(PREVENTIVE_SCENARIO);
127129

128130
if (stateTree.getContingencyScenarios().isEmpty()) {
129-
OneStateOnlyRaoResultImpl result = optimizePreventivePerimeter(stateTree, toolProvider, initialOutput);
131+
Pair<OptimizationResult, Set<FlowCnec>> preventiveResultsAndOptimizedCnecs = optimizePreventivePerimeter(stateTree, toolProvider, initialOutput);
132+
OptimizationResult preventiveResult = preventiveResultsAndOptimizedCnecs.getLeft();
133+
Set<FlowCnec> optimizedFlowCnecs = preventiveResultsAndOptimizedCnecs.getRight();
130134
BUSINESS_LOGS.info("----- Preventive perimeter optimization [end]");
131135
// log final result
132-
RaoLogger.logMostLimitingElementsResults(TECHNICAL_LOGS, result.getPostOptimizationResult(), raoParameters.getObjectiveFunctionParameters().getType(), raoParameters.getObjectiveFunctionParameters().getUnit(), 10);
133-
RaoLogger.checkIfMostLimitingElementIsFictional(BUSINESS_LOGS, result.getPostOptimizationResult());
134-
return postCheckResults(result, initialOutput, raoParameters.getObjectiveFunctionParameters(), true);
136+
RaoLogger.logMostLimitingElementsResults(TECHNICAL_LOGS, preventiveResult, raoParameters.getObjectiveFunctionParameters().getType(), raoParameters.getObjectiveFunctionParameters().getUnit(), 10);
137+
RaoLogger.checkIfMostLimitingElementIsFictional(BUSINESS_LOGS, preventiveResult);
138+
RaoResult raoResult = new OneStateOnlyRaoResultImpl(crac.getPreventiveState(), initialOutput, preventiveResult, optimizedFlowCnecs);
139+
return postCheckResults(raoResult, initialOutput, raoParameters.getObjectiveFunctionParameters(), true);
135140
}
136141

137-
OptimizationResult preventiveResult = optimizePreventivePerimeter(stateTree, toolProvider, initialOutput).getOptimizationResult(crac.getPreventiveState());
142+
OptimizationResult preventiveResult = optimizePreventivePerimeter(stateTree, toolProvider, initialOutput).getLeft();
138143
BUSINESS_LOGS.info("----- Preventive perimeter optimization [end]");
139144
java.time.Instant preventiveRaoEndInstant = java.time.Instant.now();
140145
long preventiveRaoTime = ChronoUnit.SECONDS.between(preventiveRaoStartInstant, preventiveRaoEndInstant);
@@ -346,7 +351,7 @@ private CompletableFuture<RaoResult> postCheckResults(RaoResult raoResult, PrePe
346351
return CompletableFuture.completedFuture(finalRaoResult);
347352
}
348353

349-
private OneStateOnlyRaoResultImpl optimizePreventivePerimeter(StateTree stateTree, ToolProvider toolProvider, PrePerimeterResult initialResult) {
354+
private Pair<OptimizationResult, Set<FlowCnec>> optimizePreventivePerimeter(StateTree stateTree, ToolProvider toolProvider, PrePerimeterResult initialResult) {
350355

351356
PreventiveOptimizationPerimeter optPerimeter = PreventiveOptimizationPerimeter.buildFromBasecaseScenario(stateTree.getBasecaseScenario(), crac, network, raoParameters, initialResult);
352357

@@ -372,7 +377,7 @@ private OneStateOnlyRaoResultImpl optimizePreventivePerimeter(StateTree stateTre
372377

373378
OptimizationResult optResult = new SearchTree(searchTreeInput, searchTreeParameters, true).run().join();
374379
applyRemedialActions(network, optResult, crac.getPreventiveState());
375-
return new OneStateOnlyRaoResultImpl(crac.getPreventiveState(), initialResult, optResult, searchTreeInput.getOptimizationPerimeter().getFlowCnecs());
380+
return Pair.of(optResult, optPerimeter.getFlowCnecs());
376381
}
377382

378383
private Map<State, PostPerimeterResult> mergeRaoAndPstRegulationResults(Set<PstRegulationResult> pstRegulationResults, PostPerimeterResult postPraResult, Map<State, PostPerimeterResult> postContingencyResults, PrePerimeterSensitivityAnalysis prePerimeterSensitivityAnalysis, FlowResult initialFlowResult, ToolProvider toolProvider) {

ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/castor/algorithm/CastorSecondPreventive.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,7 @@ private SecondPreventiveRaoResult runSecondPreventiveRao(PrePerimeterSensitivity
251251
String newVariant = RandomizedString.getRandomizedString("SecondPreventive", network.getVariantManager().getVariantIds(), 10);
252252
network.getVariantManager().cloneVariant(SECOND_PREVENTIVE_SCENARIO_BEFORE_OPT, newVariant, true);
253253
network.getVariantManager().setWorkingVariant(newVariant);
254-
OptimizationResult secondPreventiveResult = optimizeSecondPreventivePerimeter(initialOutput, sensiWithPostContingencyRemedialActions, firstPreventiveResult, appliedArasAndCras)
255-
.join().getOptimizationResult(crac.getPreventiveState());
254+
OptimizationResult secondPreventiveResult = optimizeSecondPreventivePerimeter(initialOutput, sensiWithPostContingencyRemedialActions, firstPreventiveResult, appliedArasAndCras).join();
256255
// Re-run sensitivity computation based on PRAs without CRAs, to access after PRA results
257256
PrePerimeterResult postPraSensitivityAnalysisOutput = prePerimeterSensitivityAnalysis.runBasedOnInitialResults(network, initialOutput, stateTree.getOperatorsNotSharingCras(), null);
258257
if (postPraSensitivityAnalysisOutput.getSensitivityStatus() == ComputationStatus.FAILURE) {
@@ -292,7 +291,7 @@ private Map<State, Set<NetworkAction>> getAllAppliedNetworkAraAndCra(AppliedReme
292291
return appliedNetworkActions;
293292
}
294293

295-
private CompletableFuture<OneStateOnlyRaoResultImpl> optimizeSecondPreventivePerimeter(PrePerimeterResult initialOutput,
294+
private CompletableFuture<OptimizationResult> optimizeSecondPreventivePerimeter(PrePerimeterResult initialOutput,
296295
PrePerimeterResult prePerimeterResult,
297296
OptimizationResult firstPreventiveResult,
298297
AppliedRemedialActions appliedCras) {
@@ -334,7 +333,7 @@ private CompletableFuture<OneStateOnlyRaoResultImpl> optimizeSecondPreventivePer
334333
result.getActivatedRangeActions(preventiveState).forEach(rangeAction -> rangeAction.apply(network, result.getOptimizedSetpoint(rangeAction, preventiveState)));
335334
result.getActivatedNetworkActions().forEach(networkAction -> networkAction.apply(network));
336335

337-
return CompletableFuture.completedFuture(new OneStateOnlyRaoResultImpl(preventiveState, prePerimeterResult, result, optPerimeter.getFlowCnecs()));
336+
return CompletableFuture.completedFuture(result);
338337
}
339338

340339
/**

ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/result/impl/OneStateOnlyRaoResultImpl.java

Lines changed: 23 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,12 @@
2828
import static com.powsybl.openrao.searchtreerao.commons.RaoUtil.getDuplicateCnecs;
2929

3030
/**
31+
* Implementation of {@link com.powsybl.openrao.data.raoresult.api.RaoResult} used when only one state
32+
* was optimized by the RAO. The methods are not expected to be called with other states.
33+
*
3134
* @author Joris Mancini {@literal <joris.mancini at rte-france.com>}
3235
*/
3336
public class OneStateOnlyRaoResultImpl extends AbstractFlowRaoResult {
34-
public static final String WRONG_STATE = "Trying to access perimeter result for the wrong state.";
3537
private final State optimizedState;
3638
private final PrePerimeterResult initialResult;
3739
private final OptimizationResult postOptimizationResult;
@@ -46,29 +48,29 @@ public OneStateOnlyRaoResultImpl(State optimizedState, PrePerimeterResult initia
4648
excludeDuplicateCnec();
4749
}
4850

49-
private FlowResult getAppropriateResult(Instant optimizedInstant, FlowCnec flowCnec) {
51+
private Optional<FlowResult> getAppropriateResult(Instant optimizedInstant, FlowCnec flowCnec) {
5052
if (!optimizedFlowCnecs.contains(flowCnec)) {
51-
throw new OpenRaoException("Cnec not optimized in this perimeter.");
53+
return Optional.empty();
5254
}
5355
State state = flowCnec.getState();
5456
if (optimizedInstant == null) {
55-
return initialResult;
57+
return Optional.of(initialResult);
5658
}
5759
if (optimizedState.isPreventive()) {
58-
return postOptimizationResult;
60+
return Optional.of(postOptimizationResult);
5961
}
6062
if (state.isPreventive()) {
61-
return initialResult;
63+
return Optional.of(initialResult);
6264
}
6365
if (!optimizedState.isPreventive()) {
6466
Contingency optimizedContingency = optimizedState.getContingency().orElseThrow(() -> new OpenRaoException("Should not happen"));
6567
Contingency contingency = state.getContingency().orElseThrow(() -> new OpenRaoException("Should not happen"));
6668
if (optimizedContingency.equals(contingency)
6769
&& state.compareTo(optimizedState) >= 0) {
68-
return postOptimizationResult;
70+
return Optional.of(postOptimizationResult);
6971
}
7072
}
71-
return initialResult;
73+
return Optional.of(initialResult);
7274
}
7375

7476
public OptimizationResult getPostOptimizationResult() {
@@ -93,39 +95,32 @@ public ComputationStatus getComputationStatus(State state) {
9395

9496
@Override
9597
public double getMargin(Instant optimizedInstant, FlowCnec flowCnec, Unit unit) {
96-
return getAppropriateResult(optimizedInstant, flowCnec).getMargin(flowCnec, unit);
98+
return getAppropriateResult(optimizedInstant, flowCnec).map(flowResult -> flowResult.getMargin(flowCnec, unit)).orElse(Double.NaN);
9799
}
98100

99101
@Override
100102
public double getRelativeMargin(Instant optimizedInstant, FlowCnec flowCnec, Unit unit) {
101-
return getAppropriateResult(optimizedInstant, flowCnec).getRelativeMargin(flowCnec, unit);
103+
return getAppropriateResult(optimizedInstant, flowCnec).map(flowResult -> flowResult.getRelativeMargin(flowCnec, unit)).orElse(Double.NaN);
102104
}
103105

104106
@Override
105107
public double getFlow(Instant optimizedInstant, FlowCnec flowCnec, TwoSides side, Unit unit) {
106-
return getAppropriateResult(optimizedInstant, flowCnec).getFlow(flowCnec, side, unit);
108+
return getAppropriateResult(optimizedInstant, flowCnec).map(flowResult -> flowResult.getFlow(flowCnec, side, unit)).orElse(Double.NaN);
107109
}
108110

109111
@Override
110112
public double getCommercialFlow(Instant optimizedInstant, FlowCnec flowCnec, TwoSides side, Unit unit) {
111-
return getAppropriateResult(optimizedInstant, flowCnec).getCommercialFlow(flowCnec, side, unit);
113+
return getAppropriateResult(optimizedInstant, flowCnec).map(flowResult -> flowResult.getCommercialFlow(flowCnec, side, unit)).orElse(Double.NaN);
112114
}
113115

114116
@Override
115117
public double getLoopFlow(Instant optimizedInstant, FlowCnec flowCnec, TwoSides side, Unit unit) {
116-
return getAppropriateResult(optimizedInstant, flowCnec).getLoopFlow(flowCnec, side, unit);
118+
return getAppropriateResult(optimizedInstant, flowCnec).map(flowResult -> flowResult.getLoopFlow(flowCnec, side, unit)).orElse(Double.NaN);
117119
}
118120

119121
@Override
120122
public double getPtdfZonalSum(Instant optimizedInstant, FlowCnec flowCnec, TwoSides side) {
121-
return getAppropriateResult(optimizedInstant, flowCnec).getPtdfZonalSum(flowCnec, side);
122-
}
123-
124-
public OptimizationResult getOptimizationResult(State state) {
125-
if (!state.equals(optimizedState)) {
126-
throw new OpenRaoException(WRONG_STATE);
127-
}
128-
return postOptimizationResult;
123+
return getAppropriateResult(optimizedInstant, flowCnec).map(flowResult -> flowResult.getPtdfZonalSum(flowCnec, side)).orElse(Double.NaN);
129124
}
130125

131126
public PrePerimeterResult getInitialResult() {
@@ -189,91 +184,57 @@ public List<FlowCnec> getCostlyElements(Instant optimizedInstant, String virtual
189184

190185
@Override
191186
public boolean wasActivatedBeforeState(State state, NetworkAction networkAction) {
192-
if (!state.equals(optimizedState)) {
193-
throw new OpenRaoException(WRONG_STATE);
194-
}
195187
return false;
196188
}
197189

198190
@Override
199191
public boolean isActivatedDuringState(State state, NetworkAction networkAction) {
200-
if (!state.equals(optimizedState)) {
201-
throw new OpenRaoException(WRONG_STATE);
202-
}
203-
return postOptimizationResult.isActivated(networkAction);
192+
return state.equals(optimizedState) && postOptimizationResult.isActivated(networkAction);
204193
}
205194

206195
@Override
207196
public Set<NetworkAction> getActivatedNetworkActionsDuringState(State state) {
208-
if (!state.equals(optimizedState)) {
209-
throw new OpenRaoException(WRONG_STATE);
210-
}
211-
return postOptimizationResult.getActivatedNetworkActions();
197+
return state.equals(optimizedState) ? postOptimizationResult.getActivatedNetworkActions() : Set.of();
212198
}
213199

214200
@Override
215201
public boolean isActivatedDuringState(State state, RangeAction<?> rangeAction) {
216-
if (!state.equals(optimizedState)) {
217-
throw new OpenRaoException(WRONG_STATE);
218-
}
219-
return postOptimizationResult.getOptimizedSetpoint(rangeAction, state) != initialResult.getSetpoint(rangeAction);
202+
return state.equals(optimizedState) && postOptimizationResult.getOptimizedSetpoint(rangeAction, state) != initialResult.getSetpoint(rangeAction);
220203
}
221204

222205
@Override
223206
public int getPreOptimizationTapOnState(State state, PstRangeAction pstRangeAction) {
224-
if (!state.equals(optimizedState)) {
225-
throw new OpenRaoException(WRONG_STATE);
226-
}
227207
return initialResult.getTap(pstRangeAction);
228208
}
229209

230210
@Override
231211
public int getOptimizedTapOnState(State state, PstRangeAction pstRangeAction) {
232-
if (!state.equals(optimizedState)) {
233-
throw new OpenRaoException(WRONG_STATE);
234-
}
235-
return postOptimizationResult.getOptimizedTap(pstRangeAction, state);
212+
return state.equals(optimizedState) ? postOptimizationResult.getOptimizedTap(pstRangeAction, state) : initialResult.getTap(pstRangeAction);
236213
}
237214

238215
@Override
239216
public double getPreOptimizationSetPointOnState(State state, RangeAction<?> rangeAction) {
240-
if (!state.equals(optimizedState)) {
241-
throw new OpenRaoException(WRONG_STATE);
242-
}
243217
return initialResult.getSetpoint(rangeAction);
244218
}
245219

246220
@Override
247221
public double getOptimizedSetPointOnState(State state, RangeAction<?> rangeAction) {
248-
if (!state.equals(optimizedState)) {
249-
throw new OpenRaoException(WRONG_STATE);
250-
}
251-
return postOptimizationResult.getOptimizedSetpoint(rangeAction, state);
222+
return state.equals(optimizedState) ? postOptimizationResult.getOptimizedSetpoint(rangeAction, state) : initialResult.getSetpoint(rangeAction);
252223
}
253224

254225
@Override
255226
public Set<RangeAction<?>> getActivatedRangeActionsDuringState(State state) {
256-
if (!state.equals(optimizedState)) {
257-
throw new OpenRaoException(WRONG_STATE);
258-
}
259227
return postOptimizationResult.getRangeActions().stream().filter(rangeAction -> isActivatedDuringState(state, rangeAction)).collect(Collectors.toSet());
260228
}
261229

262230
@Override
263231
public Map<PstRangeAction, Integer> getOptimizedTapsOnState(State state) {
264-
if (!state.equals(optimizedState)) {
265-
throw new OpenRaoException(WRONG_STATE);
266-
}
267-
return postOptimizationResult.getOptimizedTapsOnState(state);
268-
232+
return state.equals(optimizedState) ? postOptimizationResult.getOptimizedTapsOnState(state) : Map.of();
269233
}
270234

271235
@Override
272236
public Map<RangeAction<?>, Double> getOptimizedSetPointsOnState(State state) {
273-
if (!state.equals(optimizedState)) {
274-
throw new OpenRaoException(WRONG_STATE);
275-
}
276-
return postOptimizationResult.getOptimizedSetpointsOnState(state);
237+
return state.equals(optimizedState) ? postOptimizationResult.getOptimizedSetpointsOnState(state) : Map.of();
277238
}
278239

279240
@Override

0 commit comments

Comments
 (0)