DynamicSecurityAnalysisExecutionBuilder.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.contingency.ContingenciesProviders;
import com.powsybl.security.distributed.*;
import com.powsybl.security.dynamic.DynamicSecurityAnalysisInput;
import com.powsybl.security.dynamic.distributed.DistributedDynamicSecurityAnalysisExecution;
import com.powsybl.security.dynamic.distributed.ForwardedDynamicSecurityAnalysisExecution;
import com.powsybl.security.execution.AbstractSecurityAnalysisExecutionBuilder;

import java.util.Objects;
import java.util.function.Supplier;

/**
 * Helper class to build a {@link DynamicSecurityAnalysisExecution},
 * based on specified options, in particular distribution options.
 *
 * @author Laurent Issertial {@literal <laurent.issertial at rte-france.com>}
 */
public class DynamicSecurityAnalysisExecutionBuilder extends AbstractSecurityAnalysisExecutionBuilder<DynamicSecurityAnalysisExecutionBuilder> {

    private final DynamicSecurityAnalysisInputBuildStrategy inputBuildStrategy;

    /**
     * Create a new builder.
     *
     * @param externalConfig     The method to load an external security analysis config, only used for forwarded and distributed executions.
     * @param providerName       The named security-analysis implementation to use. If {@literal null}, the default would be used.
     * @param inputBuildStrategy The method to translates execution inputs into actual security analysis inputs. Only used for local executions.
     */
    public DynamicSecurityAnalysisExecutionBuilder(Supplier<ExternalSecurityAnalysisConfig> externalConfig,
                                                   String providerName,
                                                   DynamicSecurityAnalysisInputBuildStrategy inputBuildStrategy) {
        super(externalConfig, providerName);
        this.inputBuildStrategy = Objects.requireNonNull(inputBuildStrategy);
    }

    public DynamicSecurityAnalysisExecution build() {
        if (forward) {
            return new ForwardedDynamicSecurityAnalysisExecution(externalConfig.get(), taskCount);
        } else if (taskCount != null) {
            return new DistributedDynamicSecurityAnalysisExecution(externalConfig.get(), taskCount);
        } else {
            return new DynamicSecurityAnalysisExecutionImpl(providerName, inputBuildStrategy());
        }
    }

    private DynamicSecurityAnalysisInputBuildStrategy inputBuildStrategy() {
        return subPart != null ? subPartBuildStrategy() : inputBuildStrategy;
    }

    protected DynamicSecurityAnalysisInputBuildStrategy subPartBuildStrategy() {
        return (executionInput, providerName) -> {
            DynamicSecurityAnalysisInput input = inputBuildStrategy.buildFrom(executionInput, providerName);
            input.setContingencies(ContingenciesProviders.newSubProvider(input.getContingenciesProvider(), subPart));
            return input;
        };
    }

    @Override
    protected DynamicSecurityAnalysisExecutionBuilder self() {
        return this;
    }
}