ExtendedBalanceComputationImpl.java

/**
 * Copyright (c) 2023, Coreso SA (https://www.coreso.eu/) and TSCNET Services GmbH (https://www.tscnet.eu/)
 * 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.balances_adjustment.balance_computation.extension;

import com.powsybl.balances_adjustment.balance_computation.BalanceComputationArea;
import com.powsybl.balances_adjustment.balance_computation.BalanceComputationImpl;
import com.powsybl.computation.ComputationManager;
import com.powsybl.loadflow.LoadFlow;
import com.powsybl.loadflow.LoadFlowResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.List;

/**
 * an example extending default BalanceComputationImpl
 * @author Marine Guibert {@literal <marine.guibert at artelys.com>}
 * @author Damien Jeandemange {@literal <damien.jeandemange at artelys.com>}
 */
class ExtendedBalanceComputationImpl extends BalanceComputationImpl {

    private static final Logger LOGGER = LoggerFactory.getLogger(ExtendedBalanceComputationImpl.class);

    public ExtendedBalanceComputationImpl(List<BalanceComputationArea> areas, ComputationManager computationManager, LoadFlow.Runner loadFlowRunner) {
        super(areas, computationManager, loadFlowRunner);
    }

    @Override
    protected boolean isLoadFlowResultOk(BalanceComputationRunningContext context, LoadFlowResult loadFlowResult) {
        // example override requiring all components to be converged (just for testing - this is not a practical use case)
        return loadFlowResult.getComponentResults().stream()
                .map(LoadFlowResult.ComponentResult::getStatus)
                .allMatch(LoadFlowResult.ComponentResult.Status.CONVERGED::equals);
    }

    @Override
    protected double computeTotalMismatch(BalanceComputationRunningContext context) {
        context.getBalanceMismatches().forEach((area, mismatch) -> LOGGER.info("{} area mismatch is {} (thresholdNetPosition is {})", area.getName(), mismatch, context.getParameters().getThresholdNetPosition()));
        // example override using max mismatch
        return context.getBalanceMismatches().values().stream().mapToDouble(Double::doubleValue)
                .map(Math::abs).max()
                .orElse(0.0);
    }
}