Skip to content

Commit

Permalink
finalize first version of optimizer
Browse files Browse the repository at this point in the history
Signed-off-by: Thomas Bouquet <[email protected]>
  • Loading branch information
bqth29 committed Feb 11, 2025
1 parent 58a0e47 commit ec34954
Show file tree
Hide file tree
Showing 9 changed files with 470 additions and 180 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ public static LinearOptimizationResult optimize(IteratingLinearOptimizerInput in
RangeActionActivationResult currentRangeActionActivationResult = roundResult(linearProblemResult, bestResult, input, parameters);
currentRangeActionActivationResult = resolveIfApproximatedPstTaps(bestResult, linearProblem, iteration, currentRangeActionActivationResult, input, parameters);

if (!hasRemedialActionsChanged(currentRangeActionActivationResult, previousResult, input.optimizationPerimeter())) {
if (!hasAnyRangeActionChanged(currentRangeActionActivationResult, previousResult, input.optimizationPerimeter())) {
// If the solution has not changed, no need to run a new sensitivity computation and iteration can stop
TECHNICAL_LOGS.info("Iteration {}: same results as previous iterations, optimal solution found", iteration);
return bestResult;
Expand Down Expand Up @@ -155,7 +155,7 @@ private static LinearProblemStatus solveLinearProblem(LinearProblem linearProble
return status;
}

private static boolean hasRemedialActionsChanged(RangeActionActivationResult newRangeActionActivationResult, RangeActionActivationResult oldRangeActionActivationResult, OptimizationPerimeter optimizationContext) {
private static boolean hasAnyRangeActionChanged(RangeActionActivationResult newRangeActionActivationResult, RangeActionActivationResult oldRangeActionActivationResult, OptimizationPerimeter optimizationContext) {
return optimizationContext.getRangeActionsPerState().entrySet().stream()
.anyMatch(e -> e.getValue().stream()
.anyMatch(ra -> Math.abs(newRangeActionActivationResult.getOptimizedSetpoint(ra, e.getKey()) - oldRangeActionActivationResult.getOptimizedSetpoint(ra, e.getKey())) >= 1e-6));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,4 +216,4 @@ static boolean tsoHasCra(String tso, Crac crac) {
crac.getPotentiallyAvailableRangeActions(state).stream().map(RemedialAction::getOperator).anyMatch(tso::equals)
);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@
import com.powsybl.openrao.data.crac.api.NetworkElement;
import com.powsybl.openrao.data.crac.api.State;
import com.powsybl.openrao.data.crac.api.rangeaction.InjectionRangeAction;
import com.powsybl.openrao.data.crac.api.usagerule.UsageMethod;
import com.powsybl.openrao.data.intertemporalconstraint.PowerGradient;
import com.powsybl.openrao.raoapi.InterTemporalRaoInput;
import com.powsybl.openrao.raoapi.RaoInput;
import com.powsybl.openrao.searchtreerao.linearoptimisation.algorithms.linearproblem.LinearProblem;
import com.powsybl.openrao.searchtreerao.linearoptimisation.algorithms.linearproblem.OpenRaoMPConstraint;
import com.powsybl.openrao.searchtreerao.linearoptimisation.algorithms.linearproblem.OpenRaoMPVariable;
Expand All @@ -29,7 +26,6 @@

import java.time.OffsetDateTime;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.util.List;
import java.util.Map;
import java.util.Optional;
Expand All @@ -52,8 +48,9 @@ public PowerGradientConstraintFiller(TemporalData<State> preventiveStates, Tempo
this.injectionRangeActionsPerTimestamp = injectionRangeActionsPerTimestamp;
this.powerGradients = powerGradients;
}
@Override

// TODO : only create generator variables when necessary (map injection range actions/generators)
@Override
public void fill(LinearProblem linearProblem, FlowResult flowResult, SensitivityResult sensitivityResult, RangeActionActivationResult rangeActionActivationResult) {
List<OffsetDateTime> timestamps = preventiveStates.getTimestamps();
IntStream.range(0, timestamps.size()).forEach(timestampIndex -> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,36 @@

import com.powsybl.openrao.commons.TemporalData;
import com.powsybl.openrao.commons.TemporalDataImpl;
import com.powsybl.openrao.searchtreerao.commons.objectivefunction.ObjectiveFunction;
import com.powsybl.openrao.searchtreerao.result.api.FlowResult;
import com.powsybl.openrao.searchtreerao.result.api.LinearOptimizationResult;
import com.powsybl.openrao.searchtreerao.result.api.LinearProblemStatus;
import com.powsybl.openrao.searchtreerao.result.api.RangeActionActivationResult;
import com.powsybl.openrao.searchtreerao.result.api.RemedialActionActivationResult;
import com.powsybl.openrao.searchtreerao.result.api.SensitivityResult;
import com.powsybl.openrao.searchtreerao.result.impl.NetworkActionsResultImpl;
import com.powsybl.openrao.searchtreerao.result.impl.RemedialActionActivationResultImpl;

import java.time.OffsetDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
* @author Thomas Bouquet {@literal <thomas.bouquet at rte-france.com>}
* @author Godelaine de Montmorillon {@literal <godelaine.demontmorillon at rte-france.com>}
*/
public class InterTemporalIteratingLinearOptimizationResult {
private LinearProblemStatus status;
private int nbOfIteration;
private TemporalData<LinearOptimizationResult> resultPerTimestamp;
// TODO: ObjectiveFunctionResult that computes for all TS

public InterTemporalIteratingLinearOptimizationResult(LinearProblemStatus status, int nbOfIteration) {
public InterTemporalIteratingLinearOptimizationResult(LinearProblemStatus status, int nbOfIteration, TemporalData<FlowResult> flowResults, TemporalData<SensitivityResult> sensitivityResult, TemporalData<RangeActionActivationResult> rangeActionActivation, ObjectiveFunction objectiveFunction) {
this.status = status;
this.nbOfIteration = nbOfIteration;
this.resultPerTimestamp = new TemporalDataImpl<>();
this.resultPerTimestamp = mergeFlowSensitivityAndRangeActionResults(flowResults, sensitivityResult, rangeActionActivation, objectiveFunction, status);
}

public void setStatus(LinearProblemStatus status) {
Expand All @@ -34,15 +49,25 @@ public LinearProblemStatus getStatus() {
return status;
}

public int getNbOfIteration() {
return nbOfIteration;
}

public void setNbOfIteration(int nbOfIteration) {
this.nbOfIteration = nbOfIteration;
}

public TemporalData<LinearOptimizationResult> getResultPerTimestamp() {
return resultPerTimestamp;
}

private static TemporalData<LinearOptimizationResult> mergeFlowSensitivityAndRangeActionResults(TemporalData<FlowResult> flowResults, TemporalData<SensitivityResult> sensitivityResults, TemporalData<RangeActionActivationResult> rangeActionActivationResults, ObjectiveFunction objectiveFunction, LinearProblemStatus status) {
Map<OffsetDateTime, LinearOptimizationResult> linearOptimizationResults = new HashMap<>();
List<OffsetDateTime> timestamps = flowResults.getTimestamps();
for (OffsetDateTime timestamp : timestamps) {
FlowResult flowResult = flowResults.getData(timestamp).orElseThrow();
SensitivityResult sensitivityResult = sensitivityResults.getData(timestamp).orElseThrow();
RangeActionActivationResult rangeActionActivationResult = rangeActionActivationResults.getData(timestamp).orElseThrow();
RemedialActionActivationResult remedialActionActivationResult = new RemedialActionActivationResultImpl(rangeActionActivationResult, new NetworkActionsResultImpl(Set.of()));
LinearOptimizationResult linearOptimizationResult = new LinearOptimizationResultImpl(flowResult, sensitivityResult, rangeActionActivationResult, objectiveFunction.evaluate(flowResult, remedialActionActivationResult), status);
linearOptimizationResults.put(timestamp, linearOptimizationResult);
}
return new TemporalDataImpl<>(linearOptimizationResults);
}
}
Loading

0 comments on commit ec34954

Please sign in to comment.