angel_comm.cpp

Go to the documentation of this file.
00001 // $Id: angel_comm.cpp,v 1.5 2008/02/28 14:57:32 gottschling Exp $
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   // for each vertex: #out_edge;, each out_edge: target+weight
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   // graph_id_t id= (graph_id_t) idtmp;
00036   // if (id != c_graph_id) throw comm_exception ("Buffer contains no c graph");
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   // for each vertex: degree+c_edge_name+#out_edge; each out_edge: target
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   // graph_id_t id= (graph_id_t) idtmp;
00073   // if (id != line_graph_id) throw comm_exception ("Buffer contains no line graph");
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 } // namespace GMPI
00090 
00091 #endif // USE_MPI

Generated on Wed Mar 11 10:33:11 2009 for angel by  doxygen 1.5.3