00001
00002
00003 #include "angel/include/angel_comm.hpp"
00004
00005 #ifdef USE_MPI
00006
00007 #include <algorithm>
00008
00009 namespace GMPI {
00010
00011 using namespace std;
00012 using namespace boost;
00013 using namespace angel;
00014
00015 comm_buffer_t& operator<< (comm_buffer_t& buffer, const c_graph_t& cg) {
00016 int x= cg.x(), y= cg.y(), v= cg.v(), e= num_edges (cg);
00017 buffer.reserve (y + v + 2 * e + 5);
00018 buffer << c_graph_id << x << y << v << e;
00019 for (int c= 0; c < y; c++) buffer << cg.dependents[c];
00020
00021
00022 c_graph_t::const_ew_t ew= get(edge_weight, cg);
00023 c_graph_t::vi_t vi, v_end;
00024 for (tie (vi, v_end)= vertices (cg); vi != v_end; vi++) {
00025 buffer << out_degree (*vi, cg);
00026 c_graph_t::oei_t oei, oe_end;
00027 for (tie (oei, oe_end)= out_edges (*vi, cg); oei != oe_end; oei++)
00028 buffer << target (*oei, cg) << ew[*oei]; }
00029 return buffer;
00030 }
00031
00032 const comm_buffer_t& operator>> (const comm_buffer_t& buffer, c_graph_t& cg) {
00033 int x, y, v, e, idtmp;
00034 buffer >> idtmp >> x >> y >> v >> e;
00035
00036
00037 vector<c_graph_t::vertex_t> depvec (y);
00038 for (int c= 0; c < y; c++) buffer >> depvec[c];
00039 c_graph_t gtmp (v, x, depvec); cg= gtmp;
00040
00041 c_graph_t::ew_t ew= get(edge_weight, cg);
00042 for (int cv= 0; cv < v; cv++) {
00043 int out_degree= buffer.read();
00044 for (int ce= 0; ce < out_degree; ce++) {
00045 int target= buffer.read(), weight= buffer.read();
00046 pair<c_graph_t::edge_t, bool> newedge= add_edge (cv, target, cg);
00047 ew[newedge.first]= weight; } }
00048 return buffer;
00049 }
00050
00051 comm_buffer_t& operator<< (comm_buffer_t& buffer, const line_graph_t& lg) {
00052 int x= lg.x(), y= lg.y(), v= lg.v(), e= num_edges (lg);
00053 buffer.reserve (y + 4 * v + e + 5);
00054 buffer << line_graph_id << x << y << v << e;
00055 for (int c= 0; c < y; c++) buffer << lg.dependents[c];
00056
00057
00058 line_graph_t::const_ed_t ed= get(vertex_degree, lg);
00059 line_graph_t::const_evn_t evn= get(vertex_name, lg);
00060 line_graph_t::ei_t ei, e_end;
00061 for (tie (ei, e_end)= vertices (lg); ei != e_end; ei++) {
00062 buffer << ed[*ei] << evn[*ei].first << evn[*ei].second << out_degree (*ei, lg);
00063 line_graph_t::ofi_t ofi, of_end;
00064 for (tie (ofi, of_end)= out_edges (*ei, lg); ofi != of_end; ofi++)
00065 buffer << target (*ofi, lg); }
00066 return buffer;
00067 }
00068
00069 const comm_buffer_t& operator>> (const comm_buffer_t& buffer, line_graph_t& lg) {
00070 int x, y, v, e, idtmp;
00071 buffer >> idtmp >> x >> y >> v >> e;
00072
00073
00074 vector<line_graph_t::edge_t> depvec (y);
00075 for (int c= 0; c < y; c++) buffer >> depvec[c];
00076 line_graph_t gtmp (v, x, depvec); lg= gtmp;
00077
00078 line_graph_t::ed_t ed= get(vertex_degree, lg);
00079 line_graph_t::evn_t evn= get(vertex_name, lg);
00080 for (int cv= 0; cv < v; cv++) {
00081 int out_degree;
00082 buffer >> ed[cv] >> evn[cv].first >> evn[cv].second >> out_degree;
00083 for (int ce= 0; ce < out_degree; ce++) {
00084 int target= buffer.read();
00085 add_edge (cv, target, lg); } }
00086 return buffer;
00087 }
00088
00089 }
00090
00091 #endif // USE_MPI