Skip to content
Snippets Groups Projects
Forked from Eclipse Projects / aidge / aidge_core
1226 commits behind the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
FuseToMetaOps.cpp 1.52 KiB
/********************************************************************************
 * Copyright (c) 2023 CEA-List
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 ********************************************************************************/

#include <memory>

#include "aidge/graph/Node.hpp"
#include "aidge/graph/GraphView.hpp"
#include "aidge/operator/MetaOperator.hpp"
#include "aidge/recipes/Recipes.hpp"

//Graph Regex
#include "aidge/graphRegex/GraphRegex.hpp"

void Aidge::fuseToMetaOps(std::shared_ptr<GraphView> graphView, const std::string& query, const std::string& name) {
    std::shared_ptr<GraphRegex> regex = std::make_shared<GraphRegex>();
    regex->setKeyFromGraph(graphView);
    regex->addQuery(query);

    size_t nbReplaced = 0;
    const auto matches = regex->match(graphView);

    for (const auto& solution : matches) {
        auto microGraph = std::make_shared<GraphView>();
        microGraph->add(solution->getAll());

        auto metaOp = MetaOperator(query.c_str(), microGraph, name);
        const auto success = GraphView::replace(solution->getAll(), {metaOp});

        if (!success) {
            Log::notice("Could not replace sub-graph with meta operator");
        }
        else {
            ++nbReplaced;
        }
    }

    Log::info("Replaced {} (out of {}) matching sub-graph with meta operators", nbReplaced, matches.size());
}