All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.powsybl.openrao.searchtreerao.commons.objectivefunctionevaluator.ObjectiveFunctionResultImpl Maven / Gradle / Ivy

/*
 * 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.searchtreerao.commons.objectivefunctionevaluator;

import com.powsybl.openrao.data.cracapi.cnec.FlowCnec;
import com.powsybl.openrao.data.raoresultapi.ComputationStatus;
import com.powsybl.openrao.searchtreerao.result.api.FlowResult;
import com.powsybl.openrao.searchtreerao.result.api.ObjectiveFunctionResult;
import com.powsybl.openrao.searchtreerao.result.api.RangeActionActivationResult;
import com.powsybl.openrao.searchtreerao.result.api.SensitivityResult;
import org.apache.commons.lang3.tuple.Pair;

import java.util.*;

/**
 * @author Joris Mancini {@literal }
 */
public class ObjectiveFunctionResultImpl implements ObjectiveFunctionResult {
    private final ObjectiveFunction objectiveFunction;
    private final FlowResult flowResult;
    private final RangeActionActivationResult rangeActionActivationResult;
    private final SensitivityResult sensitivityResult;
    private final ComputationStatus sensitivityStatus;
    private boolean areCostsComputed;
    private Double functionalCost;
    private Map virtualCosts;
    private List orderedLimitingElements;
    private Map> orderedCostlyElements;

    private Set excludedContingencies;

    public ObjectiveFunctionResultImpl(ObjectiveFunction objectiveFunction,
                                       FlowResult flowResult,
                                       RangeActionActivationResult rangeActionActivationResult,
                                       SensitivityResult sensitivityResult,
                                       ComputationStatus sensitivityStatus) {
        this.objectiveFunction = objectiveFunction;
        this.flowResult = flowResult;
        this.rangeActionActivationResult = rangeActionActivationResult;
        this.sensitivityResult = sensitivityResult;
        this.sensitivityStatus = sensitivityStatus;
        this.areCostsComputed = false;
    }

    @Override
    public ObjectiveFunction getObjectiveFunction() {
        return objectiveFunction;
    }

    @Override
    public double getFunctionalCost() {
        if (!areCostsComputed) {
            computeCosts(new HashSet<>());
        }
        return functionalCost;
    }

    @Override
    public List getMostLimitingElements(int number) {
        if (!areCostsComputed) {
            computeCosts(new HashSet<>());
        }
        return orderedLimitingElements.subList(0, Math.min(orderedLimitingElements.size(), number));
    }

    @Override
    public double getVirtualCost() {
        if (!areCostsComputed) {
            computeCosts(new HashSet<>());
        }
        if (virtualCosts.size() > 0) {
            return virtualCosts.values().stream().mapToDouble(v -> v).sum();
        }
        return 0;
    }

    @Override
    public Set getVirtualCostNames() {
        return objectiveFunction.getVirtualCostNames();
    }

    @Override
    public double getVirtualCost(String virtualCostName) {
        if (!areCostsComputed) {
            computeCosts(new HashSet<>());
        }
        return virtualCosts.getOrDefault(virtualCostName, Double.NaN);
    }

    @Override
    public List getCostlyElements(String virtualCostName, int number) {
        if (!areCostsComputed) {
            computeCosts(new HashSet<>());
        }
        return orderedCostlyElements.get(virtualCostName).subList(0, Math.min(orderedCostlyElements.get(virtualCostName).size(), number));
    }

    @Override
    public void excludeContingencies(Set contingenciesToExclude) {
        if (!contingenciesToExclude.equals(excludedContingencies)) {
            computeCosts(contingenciesToExclude);
        }
    }

    private void computeCosts(Set contingenciesToExclude) {
        Pair> functionalCostAndLimitingElements = objectiveFunction.getFunctionalCostAndLimitingElements(flowResult, rangeActionActivationResult, sensitivityResult, sensitivityStatus, contingenciesToExclude);
        functionalCost = functionalCostAndLimitingElements.getLeft();
        orderedLimitingElements = functionalCostAndLimitingElements.getRight();
        virtualCosts = new HashMap<>();
        orderedCostlyElements = new HashMap<>();
        getVirtualCostNames().forEach(vcn -> {
            Pair> virtualCostAndCostlyElements = objectiveFunction.getVirtualCostAndCostlyElements(flowResult, rangeActionActivationResult, sensitivityResult, sensitivityStatus, vcn, contingenciesToExclude);
            virtualCosts.put(vcn, virtualCostAndCostlyElements.getLeft());
            orderedCostlyElements.put(vcn, virtualCostAndCostlyElements.getRight());
        });
        areCostsComputed = true;
        excludedContingencies = contingenciesToExclude;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy