RangeActionResultTest.java

/*
 * Copyright (c) 2021, 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.data.raoresult.impl;

import com.powsybl.openrao.commons.Unit;
import com.powsybl.openrao.data.crac.api.Crac;
import com.powsybl.openrao.data.crac.api.Instant;
import com.powsybl.iidm.network.TwoSides;
import com.powsybl.openrao.data.crac.impl.utils.CommonCracCreation;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.*;

/**
 * @author Baptiste Seguinot {@literal <baptiste.seguinot at rte-france.com>}
 */
class RangeActionResultTest {
    private static final String OUTAGE_INSTANT_ID = "outage";
    private static final String AUTO_INSTANT_ID = "auto";
    private static final String CURATIVE_INSTANT_ID = "curative";

    private Crac crac;
    private Instant outageInstant;
    private Instant autoInstant;
    private Instant curativeInstant;

    @BeforeEach
    public void setUp() {
        crac = CommonCracCreation.create();
        outageInstant = crac.getInstant(OUTAGE_INSTANT_ID);
        autoInstant = crac.getInstant(AUTO_INSTANT_ID);
        curativeInstant = crac.getInstant(CURATIVE_INSTANT_ID);

        //define CNECs on Outage state so that the Crac contains outage states
        crac.newFlowCnec()
                .withId("cnec-outage-co1")
                .withNetworkElement("anyNetworkElement")
                .withContingency("Contingency FR1 FR2")
                .withInstant(OUTAGE_INSTANT_ID)
                .newThreshold().withSide(TwoSides.ONE).withUnit(Unit.MEGAWATT).withMax(1000.).add()
                .add();

        crac.newFlowCnec()
                .withId("cnec-outage-co2")
                .withNetworkElement("anyNetworkElement")
                .withContingency("Contingency FR1 FR3")
                .withInstant(OUTAGE_INSTANT_ID)
                .newThreshold().withSide(TwoSides.ONE).withUnit(Unit.MEGAWATT).withMax(1000.).add()
                .add();
    }

    @Test
    void defaultValuesTest() {
        RangeActionResult rangeActionResult = new RangeActionResult();

        assertFalse(rangeActionResult.isActivatedDuringState(crac.getPreventiveState()));
        assertFalse(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR2", outageInstant)));
        assertFalse(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR3", outageInstant)));
        assertFalse(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR2", curativeInstant)));
        assertFalse(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR3", curativeInstant)));

        assertEquals(Double.NaN, rangeActionResult.getInitialSetpoint());
        assertEquals(Double.NaN, rangeActionResult.getOptimizedSetpointOnState(crac.getPreventiveState()));
    }

    @Test
    void pstActivatedInPreventiveTest() {
        RangeActionResult rangeActionResult = new RangeActionResult();

        rangeActionResult.setInitialSetpoint(0.3);
        rangeActionResult.addActivationForState(crac.getPreventiveState(), 1.6);

        //is activated

        assertTrue(rangeActionResult.isActivatedDuringState(crac.getPreventiveState()));
        assertFalse(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR2", curativeInstant)));
        assertFalse(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR3", curativeInstant)));

        // initial values
        assertEquals(0.3, rangeActionResult.getInitialSetpoint(), 1e-3);

        // preventive state
        assertEquals(1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getPreventiveState()), 1e-3);

        // outage state
        assertEquals(1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR2", outageInstant)), 1e-3);

        // curative state
        assertEquals(1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR2", curativeInstant)), 1e-3);
    }

    @Test
    void pstActivatedInCurativeTest() {
        RangeActionResult rangeActionResult = new RangeActionResult();

        rangeActionResult.setInitialSetpoint(0.3);
        rangeActionResult.addActivationForState(crac.getState("Contingency FR1 FR2", curativeInstant), -1.6);

        //is activated

        assertFalse(rangeActionResult.isActivatedDuringState(crac.getPreventiveState()));
        assertTrue(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR2", curativeInstant)));
        assertFalse(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR3", curativeInstant)));

        // preventive state
        assertEquals(0.3, rangeActionResult.getOptimizedSetpointOnState(crac.getPreventiveState()), 1e-3);

        // outage state
        assertEquals(0.3, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR2", outageInstant)), 1e-3);

        // curative state
        assertEquals(-1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR2", curativeInstant)), 1e-3);

        // other curative state (not activated)
        assertEquals(0.3, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR3", curativeInstant)), 1e-3);
    }

    @Test
    void pstActivatedInPreventiveAndCurative() {
        RangeActionResult rangeActionResult = new RangeActionResult();

        rangeActionResult.setInitialSetpoint(0.3);
        rangeActionResult.addActivationForState(crac.getPreventiveState(), 1.6);
        rangeActionResult.addActivationForState(crac.getState("Contingency FR1 FR2", curativeInstant), -1.6);

        //is activated

        assertTrue(rangeActionResult.isActivatedDuringState(crac.getPreventiveState()));
        assertTrue(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR2", curativeInstant)));
        assertFalse(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR3", curativeInstant)));
        assertEquals(2, rangeActionResult.getStatesWithActivation().size());

        // preventive state
        assertEquals(1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getPreventiveState()), 1e-3);

        // outage state
        assertEquals(1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR2", outageInstant)), 1e-3);

        // curative state
        assertEquals(-1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR2", curativeInstant)), 1e-3);

        // other curative state (not activated)
        assertEquals(1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR3", curativeInstant)), 1e-3);
    }

    @Test
    void pstActivatedInPreventiveAndAutoAndCurative() {
        RangeActionResult rangeActionResult = new RangeActionResult();

        // Add dummy flow cnec to create auto state
        crac.newFlowCnec().withId("dummy").withContingency("Contingency FR1 FR2").withInstant(AUTO_INSTANT_ID).withNetworkElement("ne")
                .newThreshold().withMax(1.).withSide(TwoSides.ONE).withUnit(Unit.MEGAWATT).add()
                .add();

        rangeActionResult.setInitialSetpoint(0.3);
        rangeActionResult.addActivationForState(crac.getPreventiveState(), 1.6);
        rangeActionResult.addActivationForState(crac.getState("Contingency FR1 FR2", curativeInstant), -1.6);

        //is activated

        assertTrue(rangeActionResult.isActivatedDuringState(crac.getPreventiveState()));
        assertTrue(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR2", curativeInstant)));
        assertFalse(rangeActionResult.isActivatedDuringState(crac.getState("Contingency FR1 FR3", curativeInstant)));
        assertEquals(2, rangeActionResult.getStatesWithActivation().size());

        // preventive state
        assertEquals(1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getPreventiveState()), 1e-3);

        // outage state
        assertEquals(1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR2", outageInstant)), 1e-3);

        // auto state
        assertEquals(1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR2", autoInstant)), 1e-3);

        // curative state
        assertEquals(-1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR2", curativeInstant)), 1e-3);

        // other curative state (not activated)
        assertEquals(1.6, rangeActionResult.getOptimizedSetpointOnState(crac.getState("Contingency FR1 FR3", curativeInstant)), 1e-3);
    }
}