// Copyright Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT #pragma once #include "GraphUtilities.hpp" #include #include #include #include #include namespace rocRoller { namespace Graph { template EdgePredicate> void removeRedundantEdges(AGraph& graph, EdgePredicate edgePredicate) { for(auto edge : findRedundantEdges(graph, edgePredicate)) { graph.deleteElement(edge); } } template EdgePredicate> Generator findRedundantEdges(AGraph const& graph, EdgePredicate edgePredicate) { auto edges = graph.getEdges().filter(edgePredicate).template to(); for(auto edge : edges) { auto tail = only(graph.template getNeighbours(edge)).value(); auto head = only(graph.template getNeighbours(edge)).value(); auto onlyFollowDifferentMatchingEdges = [&](int x) -> bool { return x != edge && edgePredicate(x); }; auto reachable = !graph .depthFirstVisit(tail, onlyFollowDifferentMatchingEdges, Direction::Downstream) .filter([head](int x) { return x == head; }) .empty(); if(reachable) { co_yield edge; } } } } }