BlackBoxModelSupplier.java

/**
 * Copyright (c) 2025, 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.dynawo;

import com.powsybl.dynawo.models.BlackBoxModel;
import com.powsybl.dynawo.models.EquipmentBlackBoxModel;
import com.powsybl.iidm.network.Identifiable;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

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

    private final Map<String, BlackBoxModel> dynamicModelMap;
    private final Map<String, BlackBoxModel> pureDynamicModelMap;

    public static BlackBoxModelSupplier createFrom(List<BlackBoxModel> dynamicModels) {
        Map<Boolean, Map<String, BlackBoxModel>> maps = createDynamicModelMaps(dynamicModels);
        return new BlackBoxModelSupplier(maps.get(true), maps.get(false));
    }

    public static BlackBoxModelSupplier createFrom(BlackBoxModelSupplier bbmSupplier, List<BlackBoxModel> dynamicModels) {
        Map<Boolean, Map<String, BlackBoxModel>> newMaps = createDynamicModelMaps(dynamicModels);
        newMaps.get(true).putAll(bbmSupplier.dynamicModelMap);
        newMaps.get(false).putAll(bbmSupplier.pureDynamicModelMap);
        return new BlackBoxModelSupplier(newMaps.get(true), newMaps.get(false));
    }

    private static Map<Boolean, Map<String, BlackBoxModel>> createDynamicModelMaps(List<BlackBoxModel> dynamicModels) {
        return dynamicModels.stream()
                .collect(Collectors.partitioningBy(EquipmentBlackBoxModel.class::isInstance,
                        Collectors.toMap(BlackBoxModel::getDynamicModelId, Function.identity())));
    }

    private BlackBoxModelSupplier(Map<String, BlackBoxModel> dynamicModelMap, Map<String, BlackBoxModel> pureDynamicModelMap) {
        this.dynamicModelMap = dynamicModelMap;
        this.pureDynamicModelMap = pureDynamicModelMap;
    }

    public BlackBoxModel getEquipmentDynamicModel(String id) {
        return dynamicModelMap.get(id);
    }

    public BlackBoxModel getPureDynamicModel(String id) {
        return pureDynamicModelMap.get(id);
    }

    public boolean hasDynamicModel(Identifiable<?> equipment) {
        return dynamicModelMap.containsKey(equipment.getId());
    }
}