NetworkActionParametersTest.java
/*
* Copyright (c) 2022, RTE (http://www.rte-france.com)
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.powsybl.openrao.searchtreerao.commons.parameters;
import com.powsybl.openrao.data.crac.api.Crac;
import com.powsybl.openrao.data.crac.api.CracFactory;
import com.powsybl.openrao.data.crac.api.InstantKind;
import com.powsybl.openrao.data.crac.api.networkaction.ActionType;
import com.powsybl.openrao.data.crac.api.networkaction.NetworkAction;
import com.powsybl.openrao.data.crac.api.usagerule.UsageMethod;
import com.powsybl.openrao.data.crac.impl.utils.ExhaustiveCracCreation;
import com.powsybl.openrao.raoapi.parameters.RaoParameters;
import com.powsybl.openrao.raoapi.parameters.extensions.OpenRaoSearchTreeParameters;
import com.powsybl.openrao.searchtreerao.commons.NetworkActionCombination;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import static org.junit.jupiter.api.Assertions.*;
/**
* @author Baptiste Seguinot {@literal <baptiste.seguinot at rte-france.com>}
*/
class NetworkActionParametersTest {
private static final String PREVENTIVE_INSTANT_ID = "preventive";
private Crac crac;
@Test
void buildFromRaoParametersTestOk() {
crac = ExhaustiveCracCreation.create();
RaoParameters raoParameters = new RaoParameters();
raoParameters.addExtension(OpenRaoSearchTreeParameters.class, new OpenRaoSearchTreeParameters());
OpenRaoSearchTreeParameters searchTreeParameters = raoParameters.getExtension(OpenRaoSearchTreeParameters.class);
searchTreeParameters.getTopoOptimizationParameters().setPredefinedCombinations(Collections.singletonList(List.of("complexNetworkActionId", "switchPairRaId")));
raoParameters.getTopoOptimizationParameters().setAbsoluteMinImpactThreshold(20.);
raoParameters.getTopoOptimizationParameters().setRelativeMinImpactThreshold(0.01);
searchTreeParameters.getTopoOptimizationParameters().setSkipActionsFarFromMostLimitingElement(true);
searchTreeParameters.getTopoOptimizationParameters().setMaxNumberOfBoundariesForSkippingActions(4);
NetworkActionParameters nap = NetworkActionParameters.buildFromRaoParameters(raoParameters, crac);
assertEquals(1, nap.getNetworkActionCombinations().size());
assertEquals(2, nap.getNetworkActionCombinations().get(0).getNetworkActionSet().size());
assertTrue(nap.getNetworkActionCombinations().get(0).getNetworkActionSet().contains(crac.getNetworkAction("complexNetworkActionId")));
assertTrue(nap.getNetworkActionCombinations().get(0).getNetworkActionSet().contains(crac.getNetworkAction("switchPairRaId")));
assertEquals(20., nap.getAbsoluteNetworkActionMinimumImpactThreshold(), 1e-6);
assertEquals(0.01, nap.getRelativeNetworkActionMinimumImpactThreshold(), 1e-6);
assertTrue(nap.skipNetworkActionFarFromMostLimitingElements());
assertEquals(4, nap.getMaxNumberOfBoundariesForSkippingNetworkActions());
Set<NetworkAction> naSet = Set.of(Mockito.mock(NetworkAction.class), Mockito.mock(NetworkAction.class));
NetworkActionCombination naCombination = new NetworkActionCombination(naSet);
nap.addNetworkActionCombination(naCombination);
assertEquals(2, nap.getNetworkActionCombinations().size());
assertTrue(nap.getNetworkActionCombinations().contains(naCombination));
// Test unicity
NetworkActionCombination naCombinationDetectedInRao = new NetworkActionCombination(naSet, true);
nap.addNetworkActionCombination(naCombinationDetectedInRao);
assertEquals(2, nap.getNetworkActionCombinations().size());
assertTrue(nap.getNetworkActionCombinations().contains(naCombinationDetectedInRao));
assertFalse(nap.getNetworkActionCombinations().contains(naCombination));
}
@Test
void testNetworkActionCombinations() {
crac = CracFactory.findDefault().create("crac")
.newInstant(PREVENTIVE_INSTANT_ID, InstantKind.PREVENTIVE);
crac.newNetworkAction()
.withId("topological-action-1")
.withOperator("operator-1")
.newSwitchAction().withActionType(ActionType.OPEN).withNetworkElement("any-network-element").add()
.newOnInstantUsageRule().withUsageMethod(UsageMethod.AVAILABLE).withInstant(PREVENTIVE_INSTANT_ID).add()
.add();
crac.newNetworkAction()
.withId("topological-action-2")
.withOperator("operator-2")
.newTerminalsConnectionAction().withActionType(ActionType.CLOSE).withNetworkElement("any-other-network-element").add()
.newOnInstantUsageRule().withUsageMethod(UsageMethod.AVAILABLE).withInstant(PREVENTIVE_INSTANT_ID).add()
.add();
crac.newNetworkAction()
.withId("pst-setpoint")
.withOperator("operator-2")
.newPhaseTapChangerTapPositionAction().withTapPosition(10).withNetworkElement("any-other-network-element").add()
.newOnInstantUsageRule().withUsageMethod(UsageMethod.AVAILABLE).withInstant(PREVENTIVE_INSTANT_ID).add()
.add();
// test list
RaoParameters parameters = new RaoParameters();
parameters.addExtension(OpenRaoSearchTreeParameters.class, new OpenRaoSearchTreeParameters());
OpenRaoSearchTreeParameters searchTreeParameters = parameters.getExtension(OpenRaoSearchTreeParameters.class);
searchTreeParameters.getTopoOptimizationParameters().setPredefinedCombinations(List.of(
List.of("topological-action-1", "topological-action-2"), // OK
List.of("topological-action-1", "topological-action-2", "pst-setpoint"), // OK
List.of("topological-action-1", "unknown-na-id"), // should be filtered
List.of("topological-action-1"), // should be filtered (one action only)
new ArrayList<>())); // should be filtered
List<NetworkActionCombination> naCombinations = NetworkActionParameters.computePredefinedCombinations(crac, parameters);
assertEquals(5, searchTreeParameters.getTopoOptimizationParameters().getPredefinedCombinations().size());
assertEquals(2, naCombinations.size());
assertEquals(2, naCombinations.get(0).getNetworkActionSet().size());
assertEquals(3, naCombinations.get(1).getNetworkActionSet().size());
}
}