| /** | |
| * This file provides a network flow implementation. | |
| * https://en.wikipedia.org/wiki/Flow_network | |
| * | |
| * It aims to mirror some of the behavior of networkx, which is/was used by | |
| * functorch partitioners for splitting the graph into a forward and backward | |
| * graph. | |
| */ | |
| namespace c10 { | |
| enum class C10_API_ENUM MinCutStatus { | |
| SUCCESS = 0, | |
| UNBOUNDED = 1, | |
| OVERFLOW_INF = 2, | |
| INVALID = 3, | |
| }; | |
| struct MinCutResult { | |
| MinCutStatus status; | |
| int64_t max_flow; | |
| std::vector<std::string> reachable; | |
| std::vector<std::string> unreachable; | |
| }; | |
| // Modeled after networkx implementation | |
| class C10_API NetworkFlowGraph { | |
| public: | |
| // selected such that INF + INF is < INT64_MAX | |
| constexpr static int64_t INF = (1LL << 62) - 1; | |
| struct Edge { | |
| std::string source, dest; | |
| int64_t capacity; | |
| }; | |
| MinCutStatus add_edge( | |
| const std::string& source, | |
| const std::string& dest, | |
| int64_t capacity = 1); | |
| MinCutResult minimum_cut(const std::string& s, const std::string& t) const; | |
| std::vector<Edge> edges; | |
| }; | |
| } // namespace c10 | |