66 Monitor m(*
this,
"BuildAggregates");
68 int minNodesPerAggregate = params.get<
int>(
"aggregation: min agg size");
69 int maxNodesPerAggregate = params.get<
int>(
"aggregation: max agg size");
70 bool matchMLbehavior = params.get<
bool>(
"aggregation: match ML phase2a");
73 const int myRank = graph.
GetComm()->getRank();
75 ArrayRCP<LO> vertex2AggId = aggregates.
GetVertex2AggId()->getDataNonConst(0);
76 ArrayRCP<LO> procWinner = aggregates.
GetProcWinner() ->getDataNonConst(0);
80 LO numLocalNodes = procWinner.size();
81 LO numLocalAggregated = numLocalNodes - numNonAggregatedNodes;
83 const double aggFactor = params.get<
double>(
"aggregation: phase2a agg factor");
84 double factor = as<double>(numLocalAggregated)/(numLocalNodes+1);
85 factor = pow(factor, aggFactor);
91 for (LO rootCandidate = 0; rootCandidate < numRows; rootCandidate++) {
92 if (aggStat[rootCandidate] !=
READY)
97 if (matchMLbehavior) {
98 aggList[aggSize++] = rootCandidate;
105 for (
int j = 0; j < neighOfINode.size(); j++) {
106 LO neigh = neighOfINode[j];
108 if (neigh != rootCandidate) {
115 if (aggSize < as<size_t>(maxNodesPerAggregate))
116 aggList[aggSize++] = neigh;
124 if (aggSize > as<size_t>(minNodesPerAggregate) &&
125 (aggSize > factor*numNeighbors)) {
129 aggIndex = numLocalAggregates++;
131 for (
size_t k = 0; k < aggSize; k++) {
133 vertex2AggId[aggList[k]] = aggIndex;
134 procWinner [aggList[k]] = myRank;
137 numNonAggregatedNodes -= aggSize;