16 #ifndef UTIL_GRAPH_IO_H_ 17 #define UTIL_GRAPH_IO_H_ 26 #include "absl/status/status.h" 27 #include "absl/status/statusor.h" 28 #include "absl/strings/numbers.h" 29 #include "absl/strings/str_format.h" 30 #include "absl/strings/str_join.h" 31 #include "absl/strings/str_split.h" 49 template <
class Graph>
64 template <
class Graph>
67 const std::vector<int>& num_nodes_with_color);
71 template <
class Graph>
74 std::vector<typename Graph::NodeIndex> adj;
78 if (!out.empty()) out +=
'\n';
79 absl::StrAppend(&out, node,
"->", graph.
Head(arc));
84 adj.push_back(graph.
Head(arc));
87 std::sort(adj.begin(), adj.end());
89 if (node != 0) out +=
'\n';
90 absl::StrAppend(&out, node,
": ", absl::StrJoin(adj,
" "));
96 template <
class Graph>
99 const std::vector<int>& num_nodes_with_color) {
100 FILE* f = fopen(filename.c_str(),
"w");
102 return absl::Status(absl::StatusCode::kInvalidArgument,
103 "Could not open file: '" + filename +
"'");
107 int num_self_arcs = 0;
111 if (graph.
Head(arc) == node) ++num_self_arcs;
114 if ((graph.
num_arcs() - num_self_arcs) % 2 != 0) {
116 return absl::Status(absl::StatusCode::kInvalidArgument,
117 "WriteGraphToFile() called with directed=false" 118 " and with a graph with an odd number of (non-self)" 123 f,
"%d %d", static_cast<int64_t>(graph.
num_nodes()),
124 static_cast<int64_t>(directed ? graph.
num_arcs()
125 : (graph.
num_arcs() + num_self_arcs) / 2));
126 if (!num_nodes_with_color.empty()) {
127 if (std::accumulate(num_nodes_with_color.begin(),
128 num_nodes_with_color.end(), 0) != graph.
num_nodes() ||
129 *std::min_element(num_nodes_with_color.begin(),
130 num_nodes_with_color.end()) <= 0) {
131 return absl::Status(absl::StatusCode::kInvalidArgument,
132 "WriteGraphToFile() called with invalid coloring.");
134 absl::FPrintF(f,
" %d", num_nodes_with_color.size());
135 for (
int i = 0; i < num_nodes_with_color.size() - 1; ++i) {
136 absl::FPrintF(f,
" %d", static_cast<int64_t>(num_nodes_with_color[i]));
139 absl::FPrintF(f,
"\n");
144 if (directed ||
head >= node) {
145 absl::FPrintF(f,
"%d %d\n", static_cast<int64_t>(node),
146 static_cast<uint64_t>(
head));
150 if (fclose(f) != 0) {
151 return absl::Status(absl::StatusCode::kInternal,
152 "Could not close file '" + filename +
"'");
154 return ::absl::OkStatus();
159 #endif // UTIL_GRAPH_IO_H_
BeginEndWrapper< OutgoingArcIterator > OutgoingArcs(NodeIndexType node) const
NodeIndexType Head(ArcIndexType arc) const
ArcIndexType num_arcs() const
std::string GraphToString(const Graph &graph, GraphToStringFormat format)
IntegerRange< NodeIndex > AllNodes() const
absl::Status WriteGraphToFile(const Graph &graph, const std::string &filename, bool directed, const std::vector< int > &num_nodes_with_color)
NodeIndexType num_nodes() const