29 #if defined(__MINGW32__) || defined(_MSC_VER)
37 #include <boost/config.hpp>
38 #include <boost/graph/adjacency_list.hpp>
39 #include <boost/graph/push_relabel_max_flow.hpp>
40 #include <boost/graph/edmonds_karp_max_flow.hpp>
41 #include <boost/graph/boykov_kolmogorov_max_flow.hpp>
44 #include "./../../common/src/signalhandler.h"
46 #include "./../../common/src/pgr_types.h"
58 typedef boost::adjacency_list_traits<boost::vecS, boost::vecS, boost::directedS>
60 typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS,
62 boost::property<boost::vertex_name_t, std::string,
63 boost::property<boost::vertex_index_t, int64_t,
64 boost::property<boost::vertex_color_t, boost::default_color_type,
65 boost::property<boost::vertex_distance_t, int64_t,
66 boost::property<boost::vertex_predecessor_t, Traits::edge_descriptor> > > > >,
68 boost::property<boost::edge_capacity_t, int64_t,
69 boost::property<boost::edge_residual_capacity_t, int64_t,
70 boost::property<boost::edge_reverse_t, Traits::edge_descriptor> > > >
78 typedef typename boost::graph_traits<G>::vertex_descriptor
V;
79 typedef typename boost::graph_traits<G>::edge_descriptor
E;
80 typedef typename boost::graph_traits<G>::vertex_iterator
V_it;
81 typedef typename boost::graph_traits<G>::edge_iterator
E_it;
83 typename boost::property_map<G, boost::edge_capacity_t>::type
capacity;
84 typename boost::property_map<G, boost::edge_reverse_t>::type
rev;
85 typename boost::property_map<G, boost::edge_residual_capacity_t>::type
122 std::vector<boost::default_color_type> color(num_v);
123 std::vector<int64_t> distance(num_v);
124 return boost::boykov_kolmogorov_max_flow(
boost_graph,
131 const std::set<int64_t> &source_vertices,
132 const std::set<int64_t> &sink_vertices,
138 std::set<int64_t> vertices;
139 for (int64_t source : source_vertices) {
140 vertices.insert(source);
142 for (int64_t sink : sink_vertices) {
143 vertices.insert(sink);
145 for (
size_t i = 0; i < total_tuples; ++i) {
146 vertices.insert(data_edges[i].source);
147 vertices.insert(data_edges[i].target);
149 for (int64_t
id : vertices) {
151 id_to_V.insert(std::pair<int64_t, V>(
id, v));
152 V_to_id.insert(std::pair<V, int64_t>(v,
id));
157 for (int64_t source_id : source_vertices) {
160 boost::tie(e, added) =
162 boost::tie(e_rev, added) =
171 for (int64_t sink_id : sink_vertices) {
174 boost::tie(e, added) = boost::add_edge(sink, supersink,
boost_graph);
175 boost::tie(e_rev, added) =
194 if (strcmp(algorithm,
"push_relabel") == 0) {
195 for (
size_t i = 0; i < total_tuples; ++i) {
198 E e1, e1_rev, e2, e2_rev;
199 if (data_edges[i].cost > 0) {
200 boost::tie(e1, added) = boost::add_edge(v1, v2,
boost_graph);
201 boost::tie(e1_rev, added) =
203 E_to_id.insert(std::pair<E, int64_t>(e1, data_edges[i].
id));
204 E_to_id.insert(std::pair<E, int64_t>(e1_rev,
206 capacity[e1] = (int64_t) data_edges[i].cost;
211 if (data_edges[i].reverse_cost > 0) {
212 boost::tie(e2, added) = boost::add_edge(v2, v1,
boost_graph);
213 boost::tie(e2_rev, added) =
215 E_to_id.insert(std::pair<E, int64_t>(e2, data_edges[i].
id));
216 E_to_id.insert(std::pair<E, int64_t>(e2_rev,
218 capacity[e2] = (int64_t) data_edges[i].reverse_cost;
225 for (
size_t i = 0; i < total_tuples; ++i) {
229 boost::tie(e, added) = boost::add_edge(v1, v2,
boost_graph);
230 boost::tie(e_rev, added) =
232 E_to_id.insert(std::pair<E, int64_t>(e, data_edges[i].
id));
233 E_to_id.insert(std::pair<E, int64_t>(e_rev, data_edges[i].
id));
235 data_edges[i].
cost > 0 ? (int64_t) data_edges[i].cost : 0;
237 ? (int64_t) data_edges[i].reverse_cost : 0;
258 flow_edges.push_back(edge);
boost::graph_traits< G >::vertex_descriptor V
void create_flow_graph(pgr_edge_t *data_edges, size_t total_tuples, const std::set< int64_t > &source_vertices, const std::set< int64_t > &sink_vertices, char *algorithm)
boost::graph_traits< G >::edge_iterator E_it
boost::adjacency_list_traits< boost::vecS, boost::vecS, boost::directedS > Traits
V get_boost_vertex(int64_t id)
boost::property_map< G, boost::edge_reverse_t >::type rev
std::map< V, int64_t > V_to_id
boost::graph_traits< G >::vertex_iterator V_it
boost::graph_traits< G >::edge_descriptor E
boost::adjacency_list< boost::listS, boost::vecS, boost::directedS, boost::property< boost::vertex_name_t, std::string, boost::property< boost::vertex_index_t, int64_t, boost::property< boost::vertex_color_t, boost::default_color_type, boost::property< boost::vertex_distance_t, int64_t, boost::property< boost::vertex_predecessor_t, Traits::edge_descriptor > > > > >, boost::property< boost::edge_capacity_t, int64_t, boost::property< boost::edge_residual_capacity_t, int64_t, boost::property< boost::edge_reverse_t, Traits::edge_descriptor > > > > FlowGraph
std::map< E, int64_t > E_to_id
std::map< int64_t, V > id_to_V
boost::property_map< G, boost::edge_residual_capacity_t >::type residual_capacity
int64_t residual_capacity
boost::property_map< G, boost::edge_capacity_t >::type capacity
int64_t get_vertex_id(V v)
void get_flow_edges(std::vector< pgr_flow_t > &flow_edges)
int64_t boykov_kolmogorov()