22 const std::vector<std::vector<size_t>> &nodeNeighs,
23 std::vector<size_t> &nodePartition,
26 auto t1 = steady_clock::now();
27 idx_t nvtxs = nodeNeighs.size();
32 std::vector<idx_t> part(nvtxs, 0);
33 std::vector<idx_t> vwgt(nvtxs * nWeights, 0);
34 auto nParts = idx_t(nPartitions);
38 std::vector<idx_t> xadj(
static_cast<size_t>(nvtxs) + 1, 0);
39 std::vector<idx_t> adjncy;
40 for (
size_t i=0; i<static_cast<size_t>(nvtxs); i++) {
41 adjncy.insert(adjncy.end(), nodeNeighs[i].begin(), nodeNeighs[i].end());
42 xadj[i+1] = xadj[i] + idx_t(nodeNeighs[i].size());
44 std::cout << std::format(
"adjcny size = {}, xadj[end] = {}\n",
45 adjncy.size(), xadj[nvtxs]);
47 std::cout <<
"\nmetisGraphPartition():\n";
48 if (partitionMethod ==
"metis_recursive") {
49 std::cout <<
" METIS_PartGraphRecursive partitions a graph into K parts\n";
50 std::cout <<
" using multilevel recursive bisection.\n";
52 metis_return = METIS_PartGraphRecursive(&nvtxs, &ncon, xadj.data(),
53 adjncy.data(), NULL, NULL,
54 NULL, &nParts, NULL, NULL, NULL, &objval,
56 }
else if (partitionMethod ==
"metis_kway") {
57 std::cout <<
" METIS_PartGraphKway partitions a graph into K parts\n";
58 std::cout <<
" using multilevel K-way partition.\n";
60 metis_return = METIS_PartGraphKway(&nvtxs, &ncon, xadj.data(),
61 adjncy.data(), NULL, NULL,
62 NULL, &nParts, NULL, NULL, NULL, &objval,
65 throw std::runtime_error(
67 <<
"Argument partitionMethod = "
68 << partitionMethod <<
" is invalid.\n"
69 <<
"Valid values are {'metis_recursive', 'metis_kway'}.\n");
73 auto t2 = steady_clock::now();
75 std::cout << std::format(
"\n Return code = {}\n"
76 " Edge cuts for partition = {}\n"
77 " Partition calculation time (ms) = {}\n",
78 metis_return, (
int) objval,
82 nodePartition.resize(0);
83 nodePartition.insert(nodePartition.end(), part.begin(), part.end());
void metisGraphPartition(std::string partitionMethod, const std::vector< std::vector< size_t > > &nodeNeighs, std::vector< size_t > &nodePartition, size_t nPartitions)
Partitions the nodes based on node neighborlist supplied. Function first creates a graph with nodes a...
float timeDiff(std::chrono::steady_clock::time_point begin, std::chrono::steady_clock::time_point end, std::string unit="microseconds")
Returns difference between two times.