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"
32#include "ortools/base/filelineiter.h"
67 const std::vector<int>& num_nodes_with_color);
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,
" "));
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();
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)