Skip to content

Commit

Permalink
average cost/angle for PSTs
Browse files Browse the repository at this point in the history
Signed-off-by: Thomas Bouquet <[email protected]>
  • Loading branch information
bqth29 committed Dec 18, 2024
1 parent 435c084 commit 66ad6e4
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.powsybl.openrao.commons.OpenRaoException;
import com.powsybl.openrao.commons.Unit;
import com.powsybl.openrao.data.crac.api.State;
import com.powsybl.openrao.data.crac.api.rangeaction.PstRangeAction;
import com.powsybl.openrao.data.crac.api.rangeaction.RangeAction;
import com.powsybl.openrao.raoapi.parameters.RangeActionsOptimizationParameters;
import com.powsybl.openrao.searchtreerao.commons.RaoUtil;
Expand Down Expand Up @@ -110,8 +111,10 @@ protected void fillObjective(LinearProblem linearProblem) {
OpenRaoMPVariable downwardVariationVariable = linearProblem.getRangeActionVariationVariable(ra, state, LinearProblem.VariationDirectionExtension.DOWNWARD);

double defaultVariationCost = getRangeActionPenaltyCost(ra, rangeActionParameters);
linearProblem.getObjective().setCoefficient(upwardVariationVariable, ra.getVariationCost(RangeAction.VariationDirection.UP).orElse(defaultVariationCost));
linearProblem.getObjective().setCoefficient(downwardVariationVariable, ra.getVariationCost(RangeAction.VariationDirection.DOWN).orElse(defaultVariationCost));
// convert cost/tap to cost/degree for PSTs
double conversionCoefficient = ra instanceof PstRangeAction pstRangeAction ? getCostPerAngleCoefficient(pstRangeAction) : 1.0;
linearProblem.getObjective().setCoefficient(upwardVariationVariable, conversionCoefficient * ra.getVariationCost(RangeAction.VariationDirection.UP).orElse(defaultVariationCost));
linearProblem.getObjective().setCoefficient(downwardVariationVariable, conversionCoefficient * ra.getVariationCost(RangeAction.VariationDirection.DOWN).orElse(defaultVariationCost));

if (ra.getActivationCost().isPresent() && ra.getActivationCost().get() > 0) {
OpenRaoMPVariable activationVariable = linearProblem.getRangeActionVariationBinary(ra, state);
Expand All @@ -120,4 +123,16 @@ protected void fillObjective(LinearProblem linearProblem) {
}
));
}

/**
* Approximates the cost of changing the angle of a PST by a degree.
* @param pstRangeAction : PST range action to optimize
* @return averaged cost per degree
*/
private static double getCostPerAngleCoefficient(PstRangeAction pstRangeAction) {
double maxAngle = pstRangeAction.getTapToAngleConversionMap().values().stream().max(Double::compareTo).orElseThrow();
double minAngle = pstRangeAction.getTapToAngleConversionMap().values().stream().min(Double::compareTo).orElseThrow();
int numberOfTaps = pstRangeAction.getTapToAngleConversionMap().size();
return numberOfTaps / (maxAngle - minAngle);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,8 @@ void fillTestOnPreventive() {

// check objective
assertEquals(15.0, linearProblem.getObjective().getCoefficient(activationVariable));
assertEquals(10.0, linearProblem.getObjective().getCoefficient(upwardVariationVariable));
assertEquals(10.0, linearProblem.getObjective().getCoefficient(downwardVariationVariable));
assertEquals(26.49, linearProblem.getObjective().getCoefficient(upwardVariationVariable), 0.01);
assertEquals(26.49, linearProblem.getObjective().getCoefficient(downwardVariationVariable), 0.01);
}

@Test
Expand Down Expand Up @@ -268,8 +268,8 @@ void fillTestOnPreventiveFiltered() {

// check objective
assertEquals(15.0, linearProblem.getObjective().getCoefficient(activationVariable));
assertEquals(10.0, linearProblem.getObjective().getCoefficient(upwardVariationVariable));
assertEquals(10.0, linearProblem.getObjective().getCoefficient(downwardVariationVariable));
assertEquals(26.49, linearProblem.getObjective().getCoefficient(upwardVariationVariable), 0.01);
assertEquals(26.49, linearProblem.getObjective().getCoefficient(downwardVariationVariable), 0.01);
}

@Test
Expand Down Expand Up @@ -353,8 +353,8 @@ void fillTestOnCurative() {

// check objective
assertEquals(15.0, linearProblem.getObjective().getCoefficient(activationVariable));
assertEquals(10.0, linearProblem.getObjective().getCoefficient(upwardVariationVariable));
assertEquals(10.0, linearProblem.getObjective().getCoefficient(downwardVariationVariable));
assertEquals(26.49, linearProblem.getObjective().getCoefficient(upwardVariationVariable), 0.01);
assertEquals(26.49, linearProblem.getObjective().getCoefficient(downwardVariationVariable), 0.01);
}

@Test
Expand Down Expand Up @@ -499,11 +499,11 @@ void fillTestOnGlobal() {

// check objective
assertEquals(15.0, linearProblem.getObjective().getCoefficient(prevActivationVariable));
assertEquals(10.0, linearProblem.getObjective().getCoefficient(prevUpwardVariationVariable));
assertEquals(10.0, linearProblem.getObjective().getCoefficient(prevDownwardVariationVariable));
assertEquals(26.49, linearProblem.getObjective().getCoefficient(prevUpwardVariationVariable), 0.01);
assertEquals(26.49, linearProblem.getObjective().getCoefficient(prevDownwardVariationVariable), 0.01);
assertEquals(15.0, linearProblem.getObjective().getCoefficient(curActivationVariable));
assertEquals(10.0, linearProblem.getObjective().getCoefficient(curUpwardVariationVariable));
assertEquals(10.0, linearProblem.getObjective().getCoefficient(curDownwardVariationVariable));
assertEquals(26.49, linearProblem.getObjective().getCoefficient(curUpwardVariationVariable), 0.01);
assertEquals(26.49, linearProblem.getObjective().getCoefficient(curDownwardVariationVariable), 0.01);
}

private void updateLinearProblem() {
Expand Down

0 comments on commit 66ad6e4

Please sign in to comment.