DynamicSecurityAnalysisExecutionImpl.java

/**
 * Copyright (c) 2023, 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/.
 * SPDX-License-Identifier: MPL-2.0
 */
package com.powsybl.security.dynamic.execution;

import com.powsybl.computation.ComputationManager;
import com.powsybl.dynamicsimulation.DynamicModelsSupplier;
import com.powsybl.dynamicsimulation.groovy.DynamicSimulationSupplierFactory;
import com.powsybl.security.SecurityAnalysisReport;
import com.powsybl.security.dynamic.DynamicSecurityAnalysis;
import com.powsybl.security.dynamic.DynamicSecurityAnalysisInput;
import com.powsybl.security.dynamic.DynamicSecurityAnalysisRunParameters;

import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.util.ArrayList;
import java.util.concurrent.CompletableFuture;

import static java.util.Objects.requireNonNull;

/**
 * @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
 */
public class DynamicSecurityAnalysisExecutionImpl implements DynamicSecurityAnalysisExecution {

    private final String providerName;
    private final DynamicSecurityAnalysisInputBuildStrategy inputBuildStrategy;

    public DynamicSecurityAnalysisExecutionImpl() {
        this(null, DynamicSecurityAnalysisExecutionImpl::buildDefault);
    }

    /**
     * The execution will use the {@literal providerName} implementation.
     */
    public DynamicSecurityAnalysisExecutionImpl(String providerName) {
        this(providerName, DynamicSecurityAnalysisExecutionImpl::buildDefault);
    }

    public DynamicSecurityAnalysisExecutionImpl(String providerName, DynamicSecurityAnalysisInputBuildStrategy inputBuildStrategy) {
        this.providerName = providerName;
        this.inputBuildStrategy = requireNonNull(inputBuildStrategy);
    }

    private static DynamicSecurityAnalysisInput buildDefault(DynamicSecurityAnalysisExecutionInput executionInput, String providerName) {
        DynamicModelsSupplier dynamicModelsSupplier;
        try (InputStream is = executionInput.getDynamicModelsSource().openBufferedStream()) {
            dynamicModelsSupplier = DynamicSimulationSupplierFactory.createDynamicModelsSupplier(is, providerName);
        } catch (IOException e) {
            throw new UncheckedIOException(e);
        }
        return new DynamicSecurityAnalysisInput(executionInput.getNetworkVariant(), dynamicModelsSupplier);
    }

    @Override
    public CompletableFuture<SecurityAnalysisReport> execute(ComputationManager computationManager, DynamicSecurityAnalysisExecutionInput data) {
        DynamicSecurityAnalysis.Runner runner = DynamicSecurityAnalysis.find(providerName);
        DynamicSecurityAnalysisInput input = inputBuildStrategy.buildFrom(data, runner.getName());
        DynamicSecurityAnalysisRunParameters runParameters = new DynamicSecurityAnalysisRunParameters()
                .setDynamicSecurityAnalysisParameters(input.getParameters())
                .setComputationManager(computationManager)
                .setFilter(input.getFilter())
                .setInterceptors(new ArrayList<>(input.getInterceptors()))
                .setOperatorStrategies(data.getOperatorStrategies())
                .setActions(data.getActions())
                .setMonitors(data.getMonitors());
        return runner.runAsync(input.getNetworkVariant().getNetwork(),
                input.getNetworkVariant().getVariantId(),
                input.getDynamicModels(),
                input.getContingenciesProvider(),
                runParameters);
    }
}