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"
50 template <
class Graph>
65 template <
class Graph>
68 const std::vector<int>& num_nodes_with_color);
72 template <
class Graph>
75 std::vector<typename Graph::NodeIndex> adj;
79 if (!out.empty()) out +=
'\n';
80 absl::StrAppend(&out, node,
"->", graph.
Head(
arc));
88 std::sort(adj.begin(), adj.end());
90 if (node != 0) out +=
'\n';
91 absl::StrAppend(&out, node,
": ", absl::StrJoin(adj,
" "));
97 template <
class Graph>
100 const std::vector<int>& num_nodes_with_color) {
101 FILE* f = fopen(filename.c_str(),
"w");
103 return absl::Status(absl::StatusCode::kInvalidArgument,
104 "Could not open file: '" + filename +
"'");
108 int num_self_arcs = 0;
112 if (graph.
Head(
arc) == node) ++num_self_arcs;
115 if ((graph.
num_arcs() - num_self_arcs) % 2 != 0) {
117 return absl::Status(absl::StatusCode::kInvalidArgument,
118 "WriteGraphToFile() called with directed=false"
119 " and with a graph with an odd number of (non-self)"
124 f,
"%d %d",
static_cast<int64_t
>(graph.
num_nodes()),
125 static_cast<int64_t
>(directed ? graph.
num_arcs()
126 : (graph.
num_arcs() + num_self_arcs) / 2));
127 if (!num_nodes_with_color.empty()) {
128 if (std::accumulate(num_nodes_with_color.begin(),
129 num_nodes_with_color.end(), 0) != graph.
num_nodes() ||
130 *std::min_element(num_nodes_with_color.begin(),
131 num_nodes_with_color.end()) <= 0) {
132 return absl::Status(absl::StatusCode::kInvalidArgument,
133 "WriteGraphToFile() called with invalid coloring.");
135 absl::FPrintF(f,
" %d", num_nodes_with_color.size());
136 for (
int i = 0; i < num_nodes_with_color.size() - 1; ++i) {
137 absl::FPrintF(f,
" %d",
static_cast<int64_t
>(num_nodes_with_color[i]));
140 absl::FPrintF(f,
"\n");
145 if (directed ||
head >= node) {
146 absl::FPrintF(f,
"%d %d\n",
static_cast<int64_t
>(node),
147 static_cast<uint64_t
>(
head));
152 if (fclose(f) != 0) {
153 return absl::Status(absl::StatusCode::kInternal,
154 "Could not close file '" + filename +
"'");
157 return ::absl::OkStatus();
ArcIndexType num_arcs() const
NodeIndexType num_nodes() const
IntegerRange< NodeIndex > AllNodes() const
NodeIndexType Head(ArcIndexType arc) const
BeginEndWrapper< OutgoingArcIterator > OutgoingArcs(NodeIndexType node) const
@ PRINT_GRAPH_ADJACENCY_LISTS
@ PRINT_GRAPH_ADJACENCY_LISTS_SORTED
std::string GraphToString(const Graph &graph, GraphToStringFormat format)
absl::Status WriteGraphToFile(const Graph &graph, const std::string &filename, bool directed, const std::vector< int > &num_nodes_with_color)