int hpartition(const vector< set<int> > &graph, vector<int>& npartitions, int partition_method, vector<int> &decomp){ vector<int> hdecomp; int edgecut = gpartition(graph, npartitions[0], partition_method, hdecomp); if(npartitions.size()==2){ decomp.resize(graph.size()); for(int i=0;i<npartitions[0];i++){ map<int, int> renumber; int cnt=0; for(size_t j=0;j<hdecomp.size();j++){ if(i==hdecomp[j]){ renumber[j]=cnt++; } } vector< set<int> > pgraph(renumber.size()); for(map<int, int>::const_iterator it=renumber.begin();it!=renumber.end();++it){ for(set<int>::const_iterator jt=graph[it->first].begin();jt!=graph[it->first].end();++jt){ if(renumber.find((*jt)-1)!=renumber.end()){ pgraph[it->second].insert(renumber[(*jt)-1]+1); } } } vector<int> pdecomp, ncores(npartitions[1], 0); set<int> parts; int sedgecut = gpartition(pgraph, npartitions[1], partition_method, pdecomp); for(map<int, int>::const_iterator it=renumber.begin();it!=renumber.end();++it){ ncores[pdecomp[it->second]]++; decomp[it->first] = hdecomp[it->first]*npartitions[1] + pdecomp[it->second]; parts.insert(decomp[it->first]); } } }else{ decomp.swap(hdecomp); } return edgecut; }
void eb_sys_init() { if (!eb_sys_ncores) { eb_atomic_compare_and_swap(&eb_sys_ncores, 0, ncores()); } }