22 #define xstr(x) x1str(x) 26 #define xcat(x,y) cat(x,y) 30 #define GRAPHCODE_NS xcat(graphcode_,MAP) 37 extern "C" void METIS_PartGraphRecursive
38 (
unsigned* n,
unsigned* xadj,
unsigned* adjncy,
unsigned* vwgt,
unsigned* adjwgt,
39 unsigned* wgtflag,
unsigned* numflag,
unsigned* nparts,
unsigned* options,
40 unsigned* edgecut,
unsigned* part);
41 extern "C" void METIS_PartGraphKway
42 (
unsigned* n,
unsigned* xadj,
unsigned* adjncy,
unsigned* vwgt,
unsigned* adjwgt,
43 unsigned* wgtflag,
unsigned* numflag,
unsigned* nparts,
unsigned* options,
44 unsigned* edgecut,
unsigned* part);
77 typedef unsigned long GraphID_t;
80 const GraphID_t bad_ID=~0UL;
90 using classdesc::string;
94 inline bool MPI_running()
96 int fi, ff=0; MPI_Initialized(&fi);
97 #if (defined(MPI_VERSION) && MPI_VERSION>1 || defined(MPICH_NAME)) 105 inline unsigned myid()
109 if (MPI_running()) MPI_Comm_rank(MPI_COMM_WORLD,&m);
115 inline unsigned nprocs()
119 if (MPI_running()) MPI_Comm_size(MPI_COMM_WORLD,&m);
127 template <
typename TYPE>
128 inline TYPE Wrap(TYPE val, TYPE limit)
158 id_eq(GraphID_t i): id(i) {}
159 bool operator()(
const objref& x) {
return x.
ID==id;}
162 objref(GraphID_t i=0,
int p=
myid(),
object *o=NULL):
163 payload(o), managed(
false), ID(i), proc(p) {}
164 objref(GraphID_t i,
int p,
object &o):
165 payload(&o), managed(
false), ID(i), proc(p) {}
169 object& operator*() {assert(payload!=NULL);
return *payload;}
170 object* operator->() {assert(payload!=NULL);
return payload;}
171 const object& operator*()
const {assert(payload!=NULL);
return *payload;}
172 const object* operator->()
const {assert(payload!=NULL);
return payload;}
177 {nullify(); payload=o; managed=mflag;}
178 bool nullref()
const {
return payload==NULL;}
179 inline void nullify();
191 omap() {bad_thing.
ID=bad_ID;}
192 inline objref& operator[](GraphID_t i);
193 inline omap& operator=(
const omap& x);
197 inline omap& objectMap()
211 vector<objref*> list;
216 typedef vector<objref*>::size_type size_type;
218 class iterator:
public std::iterator<std::random_access_iterator_tag,objref>
220 typedef vector<objref*>::const_iterator vec_it;
223 iterator& operator=(
const vec_it& x) {iter=x;
return *
this;}
227 objref& operator*() {
return **iter;}
228 objref* operator->() {
return *iter;}
233 bool operator==(
const iterator& x)
const {
return x.iter==iter;}
234 bool operator!=(
const iterator& x)
const {
return x.iter!=iter;}
235 size_t operator-(
const iterator& x)
const {
return iter-x.iter;}
240 objref& front() {
return *list.front();}
241 objref& back() {
return *list.back();}
242 const objref& front()
const {
return *list.front();}
243 const objref& back()
const {
return *list.back();}
244 objref& operator[](
unsigned i)
const 246 assert(i<list.size());
252 list.push_back(&objectMap()[x->ID]);
254 void push_back(
objref& x) {push_back(&x);}
255 void erase(GraphID_t i)
257 vector<objref*>::iterator it;
258 for (it=list.begin(); it!=list.end(); it++)
if ((*it)->ID==i)
break;
259 if ((*it)->ID==i) list.erase(it);
261 void clear() {list.clear();}
262 size_type size()
const {
return list.size();}
267 list.resize(x.size());
268 for (size_type i=0; i<size(); i++)
269 list[i]=&objectMap()[x[i].ID];
272 void lpack(
pack_t& targ)
const 275 for (
iterator i=begin(); i!=end(); i++) targ << i->ID;
277 void lunpack(
pack_t& targ)
280 size_type size; targ>>size;
281 for (
unsigned i=0; i<size; i++)
283 GraphID_t id; targ>>id;
284 push_back(&objectMap()[
id]);
298 #ifdef TCL_OBJ_BASE_H 299 virtual void TCL_obj(
const classdesc::string& d) {}
303 virtual idxtype
weight()
const {
return 1;}
304 virtual idxtype edgeweight(
const objref& x)
const {
return 1;}
314 if (managed)
delete payload;
315 managed=
false; payload=NULL;
322 if (x.managed && x.payload)
324 payload=
dynamic_cast<object*
>(x->clone());
335 inline objref& omap::operator[](GraphID_t i)
347 inline omap& omap::operator=(
const omap& x)
350 for (const_iterator i=x.begin(); i!=x.end(); i++)
353 o.
ID=i->ID; o.
proc=i->proc;
356 if (o.nullref() ||o->type()!=(*i)->type())
358 o.
addref(dynamic_cast<object*>((*i)->clone()),
true);
374 vector<vector<GraphID_t> > rec_req;
375 vector<vector<GraphID_t> > requests;
377 bool type_registered(
const object& x) {
return x.type()>=0;}
381 Graph(): tag(0), objects(objectMap()) {}
382 Graph(
Graph& g): objects(objectMap()) {*
this=g;}
390 rebuild_local_list();
400 for (omap::iterator p=objectMap().begin(); p!=objectMap().end(); p++)
401 if (p->proc==
myid()) Ptrlist::push_back(*p);
409 for (omap::iterator i=objectMap().begin(); i!=objectMap().end(); i++)
410 if (i->proc!=
myid()) i->nullify();
419 for (
iterator i=begin(); i!=end(); i++)
421 std::cout <<
" i->ID="<<i->ID<<
":";
423 std::cout << j->ID <<
",";
424 std::cout << std::endl;
435 void Prepare_Neighbours(
bool cache_requests=
false);
436 void Partition_Objects();
441 inline void Distribute_Objects();
448 objref& p=objectMap()[id];
451 assert(type_registered(*o));
454 objref& AddObject(
object& p, GraphID_t
id) {
return AddObject(&p,
id);}
463 return AddObject(o,
id,
true);
471 object* o=
new T(master_copy);
472 return AddObject(o,
id,
true);
483 MPIbuf() << objectMap() <<
bcast(0) >> objectMap();
484 rebuild_local_list();
495 #pragma omit pack GRAPHCODE_NS::omap 496 #pragma omit unpack GRAPHCODE_NS::omap 497 #pragma omit isa GRAPHCODE_NS::omap 498 #pragma omit pack GRAPHCODE_NS::omap::iterator 499 #pragma omit unpack GRAPHCODE_NS::omap::iterator 500 #pragma omit isa GRAPHCODE_NS::omap::iterator 501 #pragma omit pack GRAPHCODE_NS::Ptrlist 502 #pragma omit unpack GRAPHCODE_NS::Ptrlist 503 #pragma omit pack GRAPHCODE_NS::Ptrlist::iterator 504 #pragma omit unpack GRAPHCODE_NS::Ptrlist::iterator 505 #pragma omit pack GRAPHCODE_NS::object 506 #pragma omit unpack GRAPHCODE_NS::object 507 #pragma omit pack GRAPHCODE_NS::objref 508 #pragma omit unpack GRAPHCODE_NS::objref 509 #pragma omit isa GRAPHCODE_NS::objref 520 void operator()(
cd::pack_t& t,
const cd::string& d, U& a)
521 {pack(t,d,static_cast<const GRAPHCODE_NS::Ptrlist&>(a));}
528 void operator()(
cd::pack_t& t,
const cd::string& d, U& a)
536 void operator()(
cd::pack_t& buf,
const cd::string& desc, U& arg)
539 for (
typename U::iterator i=arg.begin(); i!=arg.end(); i++)
548 void operator()(
cd::pack_t& buf,
const cd::string& desc, U& arg)
550 typename U::size_type sz; buf>>sz;
551 GRAPHCODE_NS::GraphID_t ID;
564 void operator()(
cd::pack_t& targ,
const cd::string& desc, U& arg)
572 void operator()(
cd::pack_t& targ,
const cd::string& desc, U& arg)
576 #ifdef TCL_OBJ_BASE_H 579 #pragma omit TCL_obj GRAPHCODE_NS::object 580 #pragma omit pack classdesc_access::access_TCL_obj 581 #pragma omit unpack classdesc_access::access_TCL_obj 587 void operator()(
cd::TCL_obj_t& targ,
const cd::string& desc,U& arg)
589 static bool not_in_virt=
true;
593 TCL_obj(targ,desc+
".type",arg,&GRAPHCODE_NS::object::type);
607 void operator()(
cd::pack_t& targ,
const cd::string& desc, U& arg)
609 ::pack(targ,desc,arg.ID);
610 ::pack(targ,desc,arg.proc);
615 ::pack(targ,desc,arg->type());
625 void operator()(
cd::pack_t& targ,
const cd::string& desc, U& arg)
635 else if (arg.nullref() || arg->type()!=t)
641 arg.addref(obj,
true);
unsigned int proc
location of object
Definition: graphcode.h:153
descriptor access to a class's privates
Definition: graphcode.h:295
Definition: graphcode.h:218
unsigned myid
main window of application
Definition: classdesc.h:794
size_t size() const
size of buffer
Definition: pack_base.h:154
MPIbuf manipulator to broadcast the MPIbuf's contents to all processes.
Definition: classdescMP.h:58
void nullify()
is reference invalid?
Definition: graphcode.h:312
Definition: graphcode.h:155
buffer object providing MPI functionality
Definition: classdescMP.h:75
objref & AddObject(const T &master_copy, GraphID_t id)
Definition: graphcode.h:469
Definition: graphcode.h:187
objref & AddObject(GraphID_t id)
Definition: graphcode.h:460
Definition: graphcode.h:209
class to allow access to private members
Definition: classdesc_access.h:21
virtual idxtype weight() const
Definition: graphcode.h:303
class to allow access to private members
Definition: classdesc_access.h:22
#define CLASSDESC_ACCESS(type)
add friend statements for each accessor function
Definition: classdesc_access.h:36
void rebuild_local_list()
Definition: graphcode.h:397
Definition: graphcode.h:369
GraphID_t ID
object's ID
Definition: graphcode.h:152
serialisation for standard containers
Definition: TCL_obj_base.h:364
MPI parallel processing library.
Contains definitions related to classdesc functionality.
Definition: arrays.h:2514
Definition: pack_base.h:124
TCL_obj descriptor object.
Definition: TCL_obj_base.h:327
void print(unsigned proc)
Definition: graphcode.h:416
Definition: graphcode.h:74
objref & AddObject(object *o, GraphID_t id, bool managed=false)
Definition: graphcode.h:446
Contains access_* structs, and nothing else. These structs are used to gain access to private members...
Definition: accessor.h:55
void Distribute_Objects()
Definition: graphcode.h:479
Definition: graphcode.h:145
void addref(object *o, bool mflag=false)
Definition: graphcode.h:176
void clear_non_local()
Definition: graphcode.h:407
void unpack(unpack_t &targ, const string &desc, is_treenode dum, T *&arg)
unserialise a tree.
Definition: pack_graph.h:44