MultipleSensitivityProvider.java

/*
 * Copyright (c) 2020, 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.sensitivityanalysis;

import com.powsybl.openrao.commons.Unit;
import com.powsybl.openrao.data.crac.api.cnec.FlowCnec;
import com.powsybl.openrao.data.crac.api.rangeaction.HvdcRangeAction;
import com.powsybl.contingency.Contingency;
import com.powsybl.iidm.network.*;
import com.powsybl.sensitivity.SensitivityFactor;
import com.powsybl.sensitivity.SensitivityVariableSet;

import java.util.*;

/**
 * @author Philippe Edwards {@literal <philippe.edwards at rte-france.com>}
 */
public class MultipleSensitivityProvider implements CnecSensitivityProvider {
    private final List<CnecSensitivityProvider> cnecSensitivityProviders;

    MultipleSensitivityProvider() {
        cnecSensitivityProviders = new ArrayList<>();
    }

    void addProvider(CnecSensitivityProvider cnecSensitivityProvider) {
        cnecSensitivityProviders.add(cnecSensitivityProvider);
    }

    @Override
    public void setRequestedUnits(Set<Unit> requestedUnits) {
        for (CnecSensitivityProvider cnecSensitivityProvider : cnecSensitivityProviders) {
            cnecSensitivityProvider.setRequestedUnits(requestedUnits);
        }
    }

    public Set<FlowCnec> getFlowCnecs() {
        Set<FlowCnec> cnecs = new HashSet<>();
        for (CnecSensitivityProvider cnecSensitivityProvider : cnecSensitivityProviders) {
            cnecs.addAll(cnecSensitivityProvider.getFlowCnecs());
        }
        return cnecs;
    }

    @Override
    public void disableFactorsForBaseCaseSituation() {
        cnecSensitivityProviders.forEach(CnecSensitivityProvider::disableFactorsForBaseCaseSituation);
    }

    @Override
    public void enableFactorsForBaseCaseSituation() {
        cnecSensitivityProviders.forEach(CnecSensitivityProvider::enableFactorsForBaseCaseSituation);
    }

    @Override
    public List<SensitivityFactor> getBasecaseFactors(Network network) {
        List<SensitivityFactor> factors = new ArrayList<>();
        for (CnecSensitivityProvider cnecSensitivityProvider : cnecSensitivityProviders) {
            factors.addAll(cnecSensitivityProvider.getBasecaseFactors(network));
        }
        return new ArrayList<>(factors);
    }

    @Override
    public List<SensitivityFactor> getContingencyFactors(Network network, List<Contingency> contingencies) {
        List<SensitivityFactor> factors = new ArrayList<>();
        for (CnecSensitivityProvider cnecSensitivityProvider : cnecSensitivityProviders) {
            factors.addAll(cnecSensitivityProvider.getContingencyFactors(network, contingencies));
        }
        return new ArrayList<>(factors);
    }

    @Override
    public List<SensitivityFactor> getAllFactors(Network network) {
        List<SensitivityFactor> factors = new ArrayList<>();
        factors.addAll(getBasecaseFactors(network));
        factors.addAll(getContingencyFactors(network, getContingencies(network)));
        return new ArrayList<>(factors);
    }

    @Override
    public List<SensitivityVariableSet> getVariableSets() {
        List<SensitivityVariableSet> glsks = new ArrayList<>();
        for (CnecSensitivityProvider cnecSensitivityProvider : cnecSensitivityProviders) {
            glsks.addAll(cnecSensitivityProvider.getVariableSets());
        }
        return new ArrayList<>(glsks);
    }

    @Override
    public Map<String, HvdcRangeAction> getHvdcs() {
        Map<String, HvdcRangeAction> hvdcs = new HashMap<>();
        for (CnecSensitivityProvider cnecSensitivityProvider : cnecSensitivityProviders) {
            hvdcs.putAll(cnecSensitivityProvider.getHvdcs());
        }
        return hvdcs;
    }

    @Override
    public List<Contingency> getContingencies(Network network) {
        //using a set to avoid duplicates
        Set<Contingency> contingencies = new TreeSet<>(Comparator.comparing(Contingency::getId));
        for (CnecSensitivityProvider cnecSensitivityProvider : cnecSensitivityProviders) {
            contingencies.addAll(cnecSensitivityProvider.getContingencies(network));
        }
        return new ArrayList<>(contingencies);

    }
}