diff --git a/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/AbstractCoreProblemFiller.java b/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/AbstractCoreProblemFiller.java index e793940b3f..d57970a023 100644 --- a/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/AbstractCoreProblemFiller.java +++ b/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/linearoptimisation/algorithms/fillers/AbstractCoreProblemFiller.java @@ -59,6 +59,7 @@ public abstract class AbstractCoreProblemFiller implements ProblemFiller { protected final boolean raRangeShrinking; protected final PstModel pstModel; protected final OffsetDateTime timestamp; + private final Map, Set>> memoizedSameRangeActions = new HashMap<>(); protected AbstractCoreProblemFiller(OptimizationPerimeter optimizationContext, RangeActionSetpointResult prePerimeterRangeActionSetpoints, @@ -409,6 +410,9 @@ protected static List getMinAndMaxAbsoluteAndRelativeSetpoints(RangeActi } private Set> getAvailableRangeActionsOnSameAction(RangeAction rangeAction) { + if (memoizedSameRangeActions.containsKey(rangeAction)) { + return memoizedSameRangeActions.get(rangeAction); + } Set> rangeActions = new HashSet<>(); optimizationContext.getRangeActionsPerState().forEach((state, raSet) -> raSet.forEach(ra -> { @@ -417,6 +421,7 @@ private Set> getAvailableRangeActionsOnSameAction(RangeAction } }) ); + memoizedSameRangeActions.put(rangeAction, rangeActions); return rangeActions; } diff --git a/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/result/impl/RangeActionActivationResultImpl.java b/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/result/impl/RangeActionActivationResultImpl.java index 81ac5cf8dc..37107a1d3e 100644 --- a/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/result/impl/RangeActionActivationResultImpl.java +++ b/ra-optimisation/search-tree-rao/src/main/java/com/powsybl/openrao/searchtreerao/result/impl/RangeActionActivationResultImpl.java @@ -27,9 +27,10 @@ public class RangeActionActivationResultImpl implements RangeActionActivationRes private final Map, ElementaryResult> elementaryResultMap = new HashMap<>(); - boolean shouldRecomputeSetpointsPerState = true; + boolean shouldRecomputeSetpointsPerState; private Map > setpointPerStatePerPstId; + private Map> memoizedPreviousState = new HashMap<>(); private static class ElementaryResult { private final double refSetpoint; @@ -81,6 +82,7 @@ public RangeActionActivationResultImpl(RangeActionSetpointResult rangeActionSetp public void putResult(RangeAction rangeAction, State state, double setpoint) { shouldRecomputeSetpointsPerState = true; elementaryResultMap.get(rangeAction).put(state, setpoint); + memoizedPreviousState = new HashMap<>(); } private synchronized void computeSetpointsPerStatePerPst() { @@ -202,10 +204,15 @@ public int getTapVariation(PstRangeAction pstRangeAction, State state) { } private Optional getPreviousState(State state) { - return elementaryResultMap.values().stream() + if (memoizedPreviousState.containsKey(state)) { + return memoizedPreviousState.get(state); + } + Optional previousState = elementaryResultMap.values().stream() .flatMap(eR -> eR.getAllStatesWithActivation().stream()) .filter(s -> s.getContingency().equals(state.getContingency()) || s.getContingency().isEmpty()) .filter(s -> s.getInstant().comesBefore(state.getInstant())) .max(Comparator.comparingInt(s -> s.getInstant().getOrder())); + memoizedPreviousState.put(state, previousState); + return previousState; } } diff --git a/tests/src/test/java/com/powsybl/openrao/tests/steps/InterTemporalRaoSteps.java b/tests/src/test/java/com/powsybl/openrao/tests/steps/InterTemporalRaoSteps.java index e599fefeb0..16d262020f 100644 --- a/tests/src/test/java/com/powsybl/openrao/tests/steps/InterTemporalRaoSteps.java +++ b/tests/src/test/java/com/powsybl/openrao/tests/steps/InterTemporalRaoSteps.java @@ -103,4 +103,4 @@ public static void loadDataForInterTemporalRao(DataTable arg1) throws IOExceptio public static void iLaunchMarmot() { InterTemporalRao.run(interTemporalRaoInput, CommonTestData.getRaoParameters()); } -} \ No newline at end of file +}