NetworkActionCombinationsUtils.java

/*
 * Copyright (c) 2024, 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.searchtree.algorithms;

import com.powsybl.iidm.network.Network;
import com.powsybl.openrao.commons.Unit;
import com.powsybl.openrao.data.crac.api.Crac;
import com.powsybl.openrao.data.crac.api.State;
import com.powsybl.iidm.network.TwoSides;
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.range.RangeType;
import com.powsybl.openrao.data.crac.api.rangeaction.PstRangeAction;
import com.powsybl.openrao.data.crac.api.usagerule.UsageMethod;
import com.powsybl.openrao.data.crac.impl.utils.CommonCracCreation;
import com.powsybl.openrao.data.crac.impl.utils.NetworkImportsUtil;
import com.powsybl.openrao.searchtreerao.commons.NetworkActionCombination;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @author Thomas Bouquet {@literal <thomas.bouquet at rte-france.com>}
 */
public final class NetworkActionCombinationsUtils {
    private NetworkActionCombinationsUtils() { }

    public static final String PREVENTIVE_INSTANT_ID = "preventive";

    public static final Crac CRAC = initCrac();
    public static final Network NETWORK = NetworkImportsUtil.import12NodesNetwork();
    public static final State P_STATE = CRAC.getPreventiveState();

    public static final NetworkAction NA_FR_1 = createNetworkActionWithOperator("FFR1AA1  FFR2AA1  1", "fr");
    public static final NetworkAction NA_BE_1 = createNetworkActionWithOperator("BBE1AA1  BBE2AA1  1", "be");
    public static final PstRangeAction RA_BE_1 = createPstRangeActionWithOperator("BBE2AA1  BBE3AA1  1", "be");

    private static final NetworkAction NA_FR_2 = createNetworkActionWithOperator("FFR1AA1  FFR3AA1  1", "fr");
    private static final NetworkAction NA_FR_3 = createNetworkActionWithOperator("FFR2AA1  FFR3AA1  1", "fr");
    private static final NetworkAction NA_BE_2 = createNetworkActionWithOperator("BBE1AA1  BBE3AA1  1", "be");
    private static final NetworkAction NA_BE_3 = createNetworkActionWithOperator("BBE2AA1  BBE3AA1  1", "be");
    private static final NetworkAction NA_NL_1 = createNetworkActionWithOperator("NNL1AA1  NNL2AA1  1", "nl");
    private static final NetworkAction NA_DE_1 = createNetworkActionWithOperator("DDE1AA1  DDE3AA1  1", "de");
    private static final NetworkAction NA_DE_2 = createNetworkActionWithOperator("DDE2AA1  DDE3AA1  1", "de");
    private static final NetworkAction NA_FR_DE = createNetworkActionWithOperator("FFR2AA1  DDE3AA1  1", "fr");
    private static final NetworkAction NA_NL_BE = createNetworkActionWithOperator("NNL2AA1  BBE3AA1  1", "nl");
    private static final NetworkAction NA_DE_NL = createNetworkActionWithOperator("DDE2AA1  NNL3AA1  1", "de");

    public static final NetworkActionCombination IND_FR_1 = new NetworkActionCombination(NA_FR_1);
    public static final NetworkActionCombination IND_FR_2 = new NetworkActionCombination(NA_FR_2);
    public static final NetworkActionCombination IND_BE_1 = new NetworkActionCombination(NA_BE_1);
    public static final NetworkActionCombination IND_BE_2 = new NetworkActionCombination(NA_BE_2);
    public static final NetworkActionCombination IND_NL_1 = new NetworkActionCombination(NA_NL_1);
    public static final NetworkActionCombination IND_DE_1 = new NetworkActionCombination(NA_DE_1);
    public static final NetworkActionCombination IND_FR_DE = new NetworkActionCombination(NA_FR_DE);
    public static final NetworkActionCombination IND_NL_BE = new NetworkActionCombination(NA_NL_BE);
    public static final NetworkActionCombination IND_DE_NL = new NetworkActionCombination(NA_DE_NL);

    public static final NetworkActionCombination COMB_3_FR = new NetworkActionCombination(Set.of(NA_FR_1, NA_FR_2, NA_FR_3));
    public static final NetworkActionCombination COMB_2_FR = new NetworkActionCombination(Set.of(NA_FR_2, NA_FR_3));
    public static final NetworkActionCombination COMB_3_BE = new NetworkActionCombination(Set.of(NA_BE_1, NA_BE_2, NA_BE_3));
    public static final NetworkActionCombination COMB_2_DE = new NetworkActionCombination(Set.of(NA_DE_1, NA_DE_2));
    public static final NetworkActionCombination COMB_2_BE_NL = new NetworkActionCombination(Set.of(NA_BE_1, NA_NL_1));
    public static final NetworkActionCombination COMB_2_FR_NL = new NetworkActionCombination(Set.of(NA_FR_2, NA_NL_1));
    public static final NetworkActionCombination COMB_2_FR_DE_BE = new NetworkActionCombination(Set.of(NA_FR_DE, NA_BE_1));
    public static final NetworkActionCombination COMB_3_FR_NL_BE = new NetworkActionCombination(Set.of(NA_FR_2, NA_BE_2, NA_NL_BE));

    private static Crac initCrac() {
        Crac crac = CommonCracCreation.create();
        crac.newFlowCnec()
            .withId("cnecBe")
            .withNetworkElement("BBE1AA1  BBE2AA1  1")
            .withInstant(PREVENTIVE_INSTANT_ID).withOptimized(true)
            .withOperator("operator1").newThreshold()
            .withUnit(Unit.MEGAWATT)
            .withSide(TwoSides.ONE)
            .withMin(-1500.)
            .withMax(1500.)
            .add()
            .withNominalVoltage(380.)
            .withIMax(5000.)
            .add();
        return crac;
    }

    static NetworkAction createNetworkActionWithOperator(String networkElementId, String operator) {
        return CRAC.newNetworkAction().withId("na - " + networkElementId).withOperator(operator).newTerminalsConnectionAction().withNetworkElement(networkElementId).withActionType(ActionType.OPEN).add().add();
    }

    static PstRangeAction createPstRangeActionWithOperator(String networkElementId, String operator) {
        Map<Integer, Double> conversionMap = new HashMap<>();
        conversionMap.put(0, 0.);
        conversionMap.put(1, 1.);
        return CRAC.newPstRangeAction().withId("pst - " + networkElementId).withOperator(operator).withNetworkElement(networkElementId).newOnInstantUsageRule().withInstant(PREVENTIVE_INSTANT_ID).withUsageMethod(UsageMethod.AVAILABLE).add().newTapRange().withRangeType(RangeType.ABSOLUTE).withMinTap(-16).withMaxTap(16).add().withInitialTap(0).withTapToAngleConversionMap(conversionMap).add();
    }

    static PstRangeAction addPstRangeActionToCrac() {
        CommonCracCreation.IidmPstHelper iidmPstHelper = new CommonCracCreation.IidmPstHelper("BBE2AA1  BBE3AA1  1", NETWORK);

        Crac crac = CommonCracCreation.create();
        crac.newPstRangeAction()
            .withId("pst-range-action")
            .withName("pst-range-action")
            .withOperator("BE")
            .withNetworkElement("BBE2AA1  BBE3AA1  1")
            .withInitialTap(iidmPstHelper.getInitialTap())
            .withTapToAngleConversionMap(iidmPstHelper.getTapToAngleConversionMap())
            .add();

        return crac.getPstRangeAction("pst-range-action");
    }
}