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

com.farao_community.farao.flowbased_computation.FlowBasedComputation Maven / Gradle / Ivy

/*
 * Copyright (c) 2018, 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.farao_community.farao.flowbased_computation;

import com.farao_community.farao.commons.FaraoException;
import com.farao_community.farao.data.crac_file.CracFile;
import com.farao_community.farao.flowbased_computation.glsk_provider.GlskProvider;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.powsybl.commons.Versionable;
import com.powsybl.commons.config.PlatformConfig;
import com.powsybl.commons.util.ServiceLoaderCache;
import com.powsybl.computation.ComputationManager;
import com.powsybl.computation.local.LocalComputationManager;
import com.powsybl.iidm.network.Network;

import java.util.List;
import java.util.Objects;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;

/**
 * FlowBased main API. It is a utility class (so with only static methods) used as an entry point for running
 * a flowbased computation allowing to choose either a specific find implementation or just to rely on default one.
 *
 * @author Sebastien Murgey {@literal }
 */
public final class FlowBasedComputation {

    private FlowBasedComputation() {
        throw new AssertionError("Utility class should not been instantiated");
    }

    private static final Supplier> PROVIDERS_SUPPLIERS
            = Suppliers.memoize(() -> new ServiceLoaderCache<>(FlowBasedComputationProvider.class).getServices());

    /**
     * A FlowBased  computation runner is responsible for providing convenient methods on top of {@link FlowBasedComputationProvider}:
     * several variants of synchronous and asynchronous run with default parameters.
     */
    public static class Runner implements Versionable {

        private final FlowBasedComputationProvider provider;

        public Runner(FlowBasedComputationProvider provider) {
            this.provider = Objects.requireNonNull(provider);
        }

        public CompletableFuture runAsync(Network network, CracFile cracFile, GlskProvider glskProvider, String workingStateId, ComputationManager computationManager, FlowBasedComputationParameters parameters) {
            Objects.requireNonNull(workingStateId);
            Objects.requireNonNull(parameters);
            return provider.run(network, cracFile, glskProvider, computationManager, workingStateId, parameters);
        }

        public CompletableFuture runAsync(Network network, CracFile cracFile, GlskProvider glskProvider, ComputationManager computationManager, FlowBasedComputationParameters parameters) {
            return runAsync(network, cracFile, glskProvider, network.getVariantManager().getWorkingVariantId(), computationManager, parameters);
        }

        public CompletableFuture runAsync(Network network, CracFile cracFile, GlskProvider glskProvider, FlowBasedComputationParameters parameters) {
            return runAsync(network, cracFile, glskProvider, LocalComputationManager.getDefault(), parameters);
        }

        public CompletableFuture runAsync(Network network, CracFile cracFile, GlskProvider glskProvider) {
            return runAsync(network, cracFile, glskProvider, FlowBasedComputationParameters.load());
        }

        public FlowBasedComputationResult run(Network network, CracFile cracFile, GlskProvider glskProvider, String workingStateId, ComputationManager computationManager, FlowBasedComputationParameters parameters) {
            Objects.requireNonNull(workingStateId);
            Objects.requireNonNull(parameters);
            return provider.run(network, cracFile, glskProvider, computationManager, workingStateId, parameters).join();
        }

        public FlowBasedComputationResult run(Network network, CracFile cracFile, GlskProvider glskProvider, ComputationManager computationManager, FlowBasedComputationParameters parameters) {
            return run(network, cracFile, glskProvider, network.getVariantManager().getWorkingVariantId(), computationManager, parameters);
        }

        public FlowBasedComputationResult run(Network network, CracFile cracFile, GlskProvider glskProvider, FlowBasedComputationParameters parameters) {
            return run(network, cracFile, glskProvider, LocalComputationManager.getDefault(), parameters);
        }

        public FlowBasedComputationResult run(Network network, CracFile cracFile, GlskProvider glskProvider) {
            return run(network, cracFile, glskProvider, FlowBasedComputationParameters.load());
        }

        @Override
        public String getName() {
            return provider.getName();
        }

        @Override
        public String getVersion() {
            return provider.getVersion();
        }
    }

    /**
     * Get a runner for flowbased implementation named {@code name}. In the case of a null {@code name}, default
     * implementation is used.
     *
     * @param name name of the flowbased implementation, null if we want to use default one
     * @return a runner for flowbased implementation named {@code name}
     */
    public static Runner find(String name) {
        return find(name, PROVIDERS_SUPPLIERS.get(), PlatformConfig.defaultConfig());
    }

    /**
     * Get a runner for default flowbased implementation.
     *
     * @throws FaraoException in case we cannot find a default implementation
     * @return a runner for default flowbased implementation
     */
    public static Runner find() {
        return find(null);
    }

    /**
     * A variant of {@link FlowBasedComputation#find(String)} intended to be used for unit testing that allow passing
     * an explicit provider list instead of relying on service loader and an explicit {@link PlatformConfig}
     * instead of global one.
     *
     * @param name name of the flowbased implementation, null if we want to use default one
     * @param providers flowbased provider list
     * @param platformConfig platform config to look for default flowbased implementation name
     * @return a runner for flowbased implementation named {@code name}
     */
    public static Runner find(String name, List providers, PlatformConfig platformConfig) {
        Objects.requireNonNull(providers);
        Objects.requireNonNull(platformConfig);

        if (providers.isEmpty()) {
            throw new FaraoException("No flowbased providers found");
        }

        // if no flowbased implementation name is provided through the API we look for information
        // in platform configuration
        String flowbasedName = name != null ? name : platformConfig.getOptionalModuleConfig("flowbased-computation")
                .flatMap(mc -> mc.getOptionalStringProperty("default"))
                .orElse(null);
        FlowBasedComputationProvider provider;
        if (providers.size() == 1 && flowbasedName == null) {
            // no information to select the implementation but only one provider, so we can use it by default
            // (that is be the most common use case)
            provider = providers.get(0);
        } else {
            if (providers.size() > 1 && flowbasedName == null) {
                // several providers and no information to select which one to choose, we can only throw
                // an exception
                List flowbasedNames = providers.stream().map(FlowBasedComputationProvider::getName).collect(Collectors.toList());
                throw new FaraoException("Several flowbased implementations found (" + flowbasedNames
                        + "), you must add configuration to select the implementation");
            }
            provider = providers.stream()
                    .filter(p -> p.getName().equals(flowbasedName))
                    .findFirst()
                    .orElseThrow(() -> new FaraoException("FlowBased computation provider '" + flowbasedName + "' not found"));
        }

        return new Runner(provider);
    }

    public static CompletableFuture runAsync(Network network, CracFile cracFile, GlskProvider glskProvider, String workingStateId, ComputationManager computationManager, FlowBasedComputationParameters parameters) {
        return find().runAsync(network, cracFile, glskProvider, workingStateId, computationManager, parameters);
    }

    public static CompletableFuture runAsync(Network network, CracFile cracFile, GlskProvider glskProvider, ComputationManager computationManager, FlowBasedComputationParameters parameters) {
        return find().runAsync(network, cracFile, glskProvider, computationManager, parameters);
    }

    public static CompletableFuture runAsync(Network network, CracFile cracFile, GlskProvider glskProvider, FlowBasedComputationParameters parameters) {
        return find().runAsync(network, cracFile, glskProvider, parameters);
    }

    public static CompletableFuture runAsync(Network network, CracFile cracFile, GlskProvider glskProvider) {
        return find().runAsync(network, cracFile, glskProvider);
    }

    public static FlowBasedComputationResult run(Network network, CracFile cracFile, GlskProvider glskProvider, String workingStateId, ComputationManager computationManager, FlowBasedComputationParameters parameters) {
        return find().run(network, cracFile, glskProvider, workingStateId, computationManager, parameters);
    }

    public static FlowBasedComputationResult run(Network network, CracFile cracFile, GlskProvider glskProvider, ComputationManager computationManager, FlowBasedComputationParameters parameters) {
        return find().run(network, cracFile, glskProvider, computationManager, parameters);
    }

    public static FlowBasedComputationResult run(Network network, CracFile cracFile, GlskProvider glskProvider, FlowBasedComputationParameters parameters) {
        return find().run(network, cracFile, glskProvider, parameters);
    }

    public static FlowBasedComputationResult run(Network network, CracFile cracFile, GlskProvider glskProvider) {
        return find().run(network, cracFile, glskProvider);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy