51 #ifndef ZOLTAN2_METRIC_HPP 52 #define ZOLTAN2_METRIC_HPP 56 #include <Tpetra_Map.hpp> 57 #include <Tpetra_CrsMatrix.hpp> 60 #include <Epetra_SerialDenseVector.h> 75 template <
typename scalar_t>
82 values_ = arcp(tmp, 0, evalNumMetrics,
true);
84 ArrayRCP<scalar_t> values_;
85 std::string metricName_;
132 void setName(std::string name) { metricName_ = name;}
165 const std::string &
getName()
const {
return metricName_; }
201 template <
typename scalar_t>
208 values_ = arcp(tmp, 0, evalNumMetrics,
true);
210 ArrayRCP<scalar_t> values_;
211 std::string metricName_;
232 values_(), metricName_(mname) {
237 values_(), metricName_(
"unset") {
241 void setName(std::string name) { metricName_ = name;}
250 const std::string &
getName()
const {
return metricName_; }
260 template <
typename scalar_t>
263 std::string label(metricName_);
266 std::ostringstream oss;
269 oss << metricName_ <<
" (1)";
272 oss << metricName_ <<
" (2)";
275 oss << metricName_ <<
" (inf)";
278 oss << metricName_ <<
" (?)";
285 os << std::setw(20) << label;
286 os << std::setw(12) << std::setprecision(4) << values_[
evalGlobalMin];
287 os << std::setw(12) << std::setprecision(4) << values_[
evalGlobalMax];
288 os << std::setw(12) << std::setprecision(4) << values_[
evalGlobalAvg];
289 os << std::setw(2) <<
" ";
296 template <
typename scalar_t>
299 os << std::setw(20) <<
" ";
300 os << std::setw(36) <<
"------------SUM PER PART-----------";
301 os << std::setw(2) <<
" ";
302 os << std::setw(18) <<
"IMBALANCE PER PART";
305 os << std::setw(20) <<
" ";
306 os << std::setw(12) <<
"min" << std::setw(12) <<
"max" << std::setw(12) <<
"avg";
307 os << std::setw(2) <<
" ";
308 os << std::setw(6) <<
"min" << std::setw(6) <<
"max" << std::setw(6) <<
"avg";
312 template <
typename scalar_t>
315 std::string label(metricName_);
317 os << std::setw(20) << label;
318 os << std::setw(12) << std::setprecision(4) << values_[
evalGlobalSum];
319 os << std::setw(12) << std::setprecision(4) << values_[
evalGlobalMax];
323 template <
typename scalar_t>
326 os << std::setw(20) <<
" ";
327 os << std::setw(24) <<
"----------SUM----------";
330 os << std::setw(20) <<
" ";
331 os << std::setw(12) <<
"sum" << std::setw(12) <<
"max";
348 template <
typename scalar_t>
350 int offset, scalar_t &min, scalar_t &max, scalar_t &sum)
352 if (v.size() < 1)
return;
353 min = max = sum = v[offset];
355 for (
int i=offset+stride; i < v.size(); i += stride){
356 if (v[i] < min) min = v[i];
357 else if (v[i] > max) max = v[i];
370 template <
typename scalar_t>
372 int offset, scalar_t &max, scalar_t &sum)
374 if (v.size() < 1)
return;
375 max = sum = v[offset];
377 for (
int i=offset+stride; i < v.size(); i += stride){
378 if (v[i] > max) max = v[i];
401 template <
typename scalar_t,
typename lno_t,
typename part_t>
403 const RCP<const Environment> &env,
404 part_t numberOfParts,
405 const ArrayView<const part_t> &parts,
410 env->localInputAssertion(__FILE__, __LINE__,
"parts or weights",
413 int numObjects = parts.size();
414 int vwgtDim = vwgts.size();
416 memset(weights, 0,
sizeof(scalar_t) * numberOfParts);
422 for (lno_t i=0; i < numObjects; i++){
426 else if (vwgtDim == 1){
427 for (lno_t i=0; i < numObjects; i++){
428 weights[parts[i]] += vwgts[0][i];
434 for (
int wdim=0; wdim < vwgtDim; wdim++){
435 for (lno_t i=0; i < numObjects; i++){
436 weights[parts[i]] += vwgts[wdim][i];
442 for (lno_t i=0; i < numObjects; i++){
444 for (
int wdim=0; wdim < vwgtDim; wdim++)
445 ssum += (vwgts[wdim][i] * vwgts[wdim][i]);
446 weights[parts[i]] += sqrt(ssum);
451 for (lno_t i=0; i < numObjects; i++){
453 for (
int wdim=0; wdim < vwgtDim; wdim++)
454 if (vwgts[wdim][i] > max)
455 max = vwgts[wdim][i];
456 weights[parts[i]] += max;
461 env->localBugAssertion(__FILE__, __LINE__,
"invalid norm",
false,
509 template <
typename scalar_t,
typename lno_t,
typename part_t>
511 const RCP<const Environment> &env,
512 const RCP<
const Comm<int> > &comm,
513 const ArrayView<const part_t> &part,
518 part_t &numNonemptyParts,
520 ArrayRCP<scalar_t> &globalSums)
526 numParts = numNonemptyParts = 0;
529 if (vwgtDim) numMetrics++;
530 if (vwgtDim > 1) numMetrics += vwgtDim;
533 mv_t *newMetrics =
new mv_t [numMetrics];
534 env->localMemoryAssertion(__FILE__, __LINE__, numMetrics, newMetrics);
535 ArrayRCP<mv_t> metricArray(newMetrics, 0, numMetrics,
true);
537 metrics = metricArray;
543 lno_t localNumObj = part.size();
544 part_t localNum[2], globalNum[2];
545 localNum[0] =
static_cast<part_t
>(vwgtDim);
548 for (lno_t i=0; i < localNumObj; i++)
549 if (part[i] > localNum[1]) localNum[1] = part[i];
552 reduceAll<int, part_t>(*comm, Teuchos::REDUCE_MAX, 2,
553 localNum, globalNum);
557 env->globalBugAssertion(__FILE__,__LINE__,
558 "inconsistent number of vertex weights",
561 part_t nparts = globalNum[1] + 1;
563 part_t globalSumSize = nparts * numMetrics;
564 scalar_t * sumBuf =
new scalar_t [globalSumSize];
565 env->localMemoryAssertion(__FILE__, __LINE__, globalSumSize, sumBuf);
566 globalSums = arcp(sumBuf, 0, globalSumSize);
571 scalar_t *localBuf =
new scalar_t [globalSumSize];
572 env->localMemoryAssertion(__FILE__, __LINE__, globalSumSize, localBuf);
573 memset(localBuf, 0,
sizeof(scalar_t) * globalSumSize);
575 scalar_t *obj = localBuf;
577 for (lno_t i=0; i < localNumObj; i++)
582 scalar_t *wgt = localBuf + nparts;
584 normedPartWeights<scalar_t, lno_t, part_t>(env, nparts,
585 part, vwgts, mcNorm, wgt);
593 for (
int vdim = 0; vdim < vwgtDim; vdim++){
594 for (lno_t i=0; i < localNumObj; i++)
595 wgt[part[i]] += vwgts[vdim][i];
605 metrics[next].setName(
"object count");
606 metrics[next].setLocalSum(localNumObj);
610 scalar_t *wgt = localBuf + nparts;
611 scalar_t total = 0.0;
613 for (
int p=0; p < nparts; p++){
618 metrics[next].setName(
"weight 1");
620 metrics[next].setName(
"normed weight");
622 metrics[next].setLocalSum(total);
626 for (
int vdim = 0; vdim < vwgtDim; vdim++){
629 for (
int p=0; p < nparts; p++){
633 std::ostringstream oss;
634 oss <<
"weight " << vdim+1;
636 metrics[next].setName(oss.str());
637 metrics[next].setLocalSum(total);
647 reduceAll<int, scalar_t>(*comm, Teuchos::REDUCE_SUM, globalSumSize,
658 scalar_t min=0, max=0, sum=0;
661 ArrayView<scalar_t> objVec(obj, nparts);
662 getStridedStats<scalar_t>(objVec, 1, 0, min, max, sum);
664 metrics[next].setGlobalMin(min);
665 metrics[next].setGlobalMax(max);
666 metrics[next].setGlobalSum(sum);
667 metrics[next].setGlobalAvg(sum / nparts);
671 scalar_t *wgt = sumBuf + nparts;
673 ArrayView<scalar_t> normedWVec(wgt, nparts);
674 getStridedStats<scalar_t>(normedWVec, 1, 0, min, max, sum);
679 metrics[next].setGlobalMin(min);
680 metrics[next].setGlobalMax(max);
681 metrics[next].setGlobalSum(sum);
682 metrics[next].setGlobalAvg(sum / nparts);
686 for (
int vdim=0; vdim < vwgtDim; vdim++){
688 ArrayView<scalar_t> fromVec(wgt, nparts);
689 getStridedStats<scalar_t>(fromVec, 1, 0, min, max, sum);
691 metrics[next].setGlobalMin(min);
692 metrics[next].setGlobalMax(max);
693 metrics[next].setGlobalSum(sum);
694 metrics[next].setGlobalAvg(sum / nparts);
711 numNonemptyParts = numParts;
713 for (part_t p=0; p < numParts; p++)
714 if (obj[p] == 0) numNonemptyParts--;
748 template <
typename Adapter>
750 const RCP<const Environment> &env,
751 const RCP<
const Comm<int> > &comm,
753 const ArrayView<const typename Adapter::part_t> &part,
754 typename Adapter::part_t &numParts,
756 ArrayRCP<typename Adapter::scalar_t> &globalSums)
764 int ewgtDim = graph->getNumWeightsPerEdge();
767 if (ewgtDim > 1) numMetrics = ewgtDim;
769 typedef typename Adapter::scalar_t scalar_t;
770 typedef typename Adapter::gno_t gno_t;
771 typedef typename Adapter::lno_t lno_t;
772 typedef typename Adapter::node_t node_t;
773 typedef typename Adapter::part_t part_t;
777 typedef Tpetra::CrsMatrix<part_t,lno_t,gno_t,node_t> sparse_matrix_type;
778 typedef Tpetra::Map<lno_t, gno_t, node_t> map_type;
780 const GST
INVALID = Teuchos::OrdinalTraits<GST>::invalid ();
784 mv_t *newMetrics =
new mv_t [numMetrics];
785 env->localMemoryAssertion(__FILE__,__LINE__,numMetrics,newMetrics);
786 ArrayRCP<mv_t> metricArray(newMetrics, 0, numMetrics,
true);
788 metrics = metricArray;
794 lno_t localNumObj = part.size();
795 part_t localNum[2], globalNum[2];
796 localNum[0] =
static_cast<part_t
>(ewgtDim);
799 for (lno_t i=0; i < localNumObj; i++)
800 if (part[i] > localNum[1]) localNum[1] = part[i];
803 reduceAll<int, part_t>(*comm, Teuchos::REDUCE_MAX, 2,
804 localNum, globalNum);
808 env->globalBugAssertion(__FILE__,__LINE__,
809 "inconsistent number of edge weights",
812 part_t nparts = globalNum[1] + 1;
814 part_t globalSumSize = nparts * numMetrics;
815 scalar_t * sumBuf =
new scalar_t [globalSumSize];
816 env->localMemoryAssertion(__FILE__, __LINE__, globalSumSize, sumBuf);
817 globalSums = arcp(sumBuf, 0, globalSumSize);
822 scalar_t *localBuf =
new scalar_t [globalSumSize];
823 env->localMemoryAssertion(__FILE__,__LINE__,globalSumSize,localBuf);
824 memset(localBuf, 0,
sizeof(scalar_t) * globalSumSize);
826 scalar_t *cut = localBuf;
828 ArrayView<const gno_t> Ids;
829 ArrayView<input_t> vwgts;
831 graph->getVertexList(Ids, vwgts);
833 ArrayView<const gno_t> edgeIds;
834 ArrayView<const lno_t> offsets;
835 ArrayView<input_t> wgts;
837 graph->getEdgeList(edgeIds, offsets, wgts);
842 Array<gno_t> vertexGIDs;
843 RCP<const map_type> vertexMapG;
846 vertexGIDs.resize(localNumObj);
848 min = as<gno_t> (Ids[0]);
849 for (lno_t i = 0; i < localNumObj; ++i) {
850 vertexGIDs[i] = as<gno_t> (Ids[i]);
852 if (vertexGIDs[i] < min) {
858 Teuchos::reduceAll<int, gno_t>(*comm,Teuchos::REDUCE_MIN,1,&min,&gmin);
861 vertexMapG = rcp(
new map_type(INVALID, vertexGIDs(), gmin, comm));
867 RCP<sparse_matrix_type> adjsMatrix;
870 adjsMatrix = rcp (
new sparse_matrix_type (vertexMapG, 0));
873 ArrayView<part_t> justOneAV = Teuchos::arrayView (&justOne, 1);
875 for (lno_t localElement=0; localElement<localNumObj; ++localElement){
878 gno_t globalRowT = as<gno_t> (Ids[localElement]);
880 for (lno_t j=offsets[localElement]; j<offsets[localElement+1]; ++j){
881 gno_t globalCol = as<gno_t> (edgeIds[j]);
883 ArrayView<gno_t> globalColAV = Teuchos::arrayView (&globalCol,1);
886 adjsMatrix->insertGlobalValues(globalRowT,globalColAV,justOneAV);
965 reduceAll<int, scalar_t>(*comm, Teuchos::REDUCE_SUM, globalSumSize,
976 scalar_t max=0, sum=0;
979 ArrayView<scalar_t> cutVec(cut, nparts);
980 getStridedStats<scalar_t>(cutVec, 1, 0, max, sum);
982 metrics[next].setName(
"cut count");
983 metrics[next].setGlobalMax(max);
984 metrics[next].setGlobalSum(sum);
987 scalar_t *wgt = sumBuf;
989 for (
int edim=0; edim < ewgtDim; edim++){
990 ArrayView<scalar_t> fromVec(wgt, nparts);
991 getStridedStats<scalar_t>(fromVec, 1, 0, max, sum);
993 std::ostringstream oss;
994 oss <<
"weight " << edim+1;
996 metrics[next].setName(oss.str());
997 metrics[next].setGlobalMax(max);
998 metrics[next].setGlobalSum(sum);
1039 template <
typename scalar_t,
typename part_t>
1041 const scalar_t *psizes, scalar_t sumVals ,
const scalar_t *
vals,
1042 scalar_t &min, scalar_t &max, scalar_t &avg)
1047 if (sumVals <= 0 || targetNumParts < 1 || numParts < 1)
1050 if (targetNumParts==1 || numParts==1){
1051 min = max = avg = 0;
1056 scalar_t target = sumVals / targetNumParts;
1057 for (part_t p=0; p < numParts; p++){
1058 scalar_t diff = abs(vals[p] - target);
1059 scalar_t tmp = diff / target;
1061 if (tmp > max) max = tmp;
1062 if (tmp < min) min = tmp;
1064 part_t emptyParts = targetNumParts - numParts;
1065 if (emptyParts > 0){
1072 for (part_t p=0; p < targetNumParts; p++){
1075 scalar_t target = sumVals * psizes[p];
1076 scalar_t diff = abs(vals[p] - target);
1077 scalar_t tmp = diff / target;
1079 if (tmp > max) max = tmp;
1080 if (tmp < min) min = tmp;
1091 avg /= targetNumParts;
1127 template <
typename scalar_t,
typename part_t>
1129 int numSizes, ArrayView<ArrayRCP<scalar_t> > psizes,
1130 scalar_t sumVals ,
const scalar_t *
vals,
1131 scalar_t &min, scalar_t &max, scalar_t &avg)
1136 if (sumVals <= 0 || targetNumParts < 1 || numParts < 1)
1139 if (targetNumParts==1 && numParts==1){
1140 min = max = avg = 0;
1144 bool allUniformParts =
true;
1145 for (
int i=0; i < numSizes; i++){
1146 if (psizes[i].size() != 0){
1147 allUniformParts =
false;
1152 if (allUniformParts){
1153 computeImbalances<scalar_t, part_t>(numParts, targetNumParts, NULL,
1154 sumVals,
vals, min, max, avg);
1158 double uniformSize = 1.0 / targetNumParts;
1159 ArrayRCP<double> sizeVec(
new double [numSizes], 0, numSizes,
true);
1160 for (
int i=0; i < numSizes; i++){
1161 sizeVec[i] = uniformSize;
1164 for (part_t p=0; p < numParts; p++){
1171 if (p >= targetNumParts)
1176 for (
int i=0; i < numSizes; i++)
1177 if (psizes[i].size() > 0)
1178 sizeVec[i] = psizes[i][p];
1180 Epetra_SerialDenseVector target(View, sizeVec.getRawPtr(), numSizes);
1181 target.Scale(sumVals);
1182 double targetNorm = target.Norm2();
1187 if (targetNorm > 0){
1191 Epetra_SerialDenseVector actual(numSizes);
1192 for (
int i=0; i < numSizes; i++)
1193 actual[i] = vals[p] * -1.0;
1199 scalar_t imbalance = actual.Norm2() / targetNorm;
1201 if (imbalance < min)
1203 else if (imbalance > max)
1209 part_t numEmptyParts = 0;
1211 for (part_t p=numParts; p < targetNumParts; p++){
1212 bool nonEmptyPart =
false;
1213 for (
int i=0; !nonEmptyPart && i < numSizes; i++)
1214 if (psizes[i].size() > 0 && psizes[i][p] > 0.0)
1215 nonEmptyPart =
true;
1224 if (numEmptyParts > 0){
1225 avg += numEmptyParts;
1230 avg /= targetNumParts;
1262 template <
typename Adapter>
1264 const RCP<const Environment> &env,
1265 const RCP<
const Comm<int> > &comm,
1267 const RCP<const Adapter> &ia,
1269 typename Adapter::part_t &numParts,
1270 typename Adapter::part_t &numNonemptyParts,
1275 typedef typename Adapter::scalar_t scalar_t;
1276 typedef typename Adapter::lno_t lno_t;
1277 typedef typename Adapter::part_t part_t;
1282 size_t numLocalObjects = ia->getLocalNumIDs();
1286 const part_t *parts = solution->getPartListView();
1287 env->localInputAssertion(__FILE__, __LINE__,
"parts not set",
1289 ArrayView<const part_t> partArray(parts, numLocalObjects);
1293 int nWeights = ia->getNumWeightsPerID();
1294 int numCriteria = (nWeights > 0 ? nWeights : 1);
1295 Array<sdata_t> weights(numCriteria);
1300 weights[0] = sdata_t();
1303 for (
int i=0; i < nWeights; i++){
1305 const scalar_t *wgt;
1306 ia->getWeightsView(wgt, stride, i);
1307 ArrayRCP<const scalar_t> wgtArray(wgt, 0, stride*numLocalObjects,
false);
1308 weights[i] = sdata_t(wgtArray, stride);
1314 part_t targetNumParts = solution->getTargetGlobalNumberOfParts();
1315 scalar_t *psizes = NULL;
1317 ArrayRCP<ArrayRCP<scalar_t> > partSizes(numCriteria);
1318 for (
int dim=0; dim < numCriteria; dim++){
1319 if (solution->criteriaHasUniformPartSizes(dim) !=
true){
1320 psizes =
new scalar_t [targetNumParts];
1321 env->localMemoryAssertion(__FILE__, __LINE__, numParts, psizes);
1322 for (part_t i=0; i < targetNumParts; i++){
1323 psizes[i] = solution->getCriteriaPartSize(dim, i);
1325 partSizes[dim] = arcp(psizes, 0, targetNumParts,
true);
1333 ArrayRCP<scalar_t> globalSums;
1336 globalSumsByPart<scalar_t, lno_t, part_t>(env, comm,
1337 partArray, nWeights, weights.view(0, numCriteria), mcNorm,
1338 numParts, numNonemptyParts, metrics, globalSums);
1346 scalar_t *objCount = globalSums.getRawPtr();
1347 scalar_t min, max, avg;
1350 if (partSizes[0].size() > 0)
1351 psizes = partSizes[0].getRawPtr();
1353 computeImbalances<scalar_t, part_t>(numParts, targetNumParts, psizes,
1354 metrics[0].getGlobalSum(), objCount,
1357 metrics[0].setMinImbalance(1.0 + min);
1358 metrics[0].setMaxImbalance(1.0 + max);
1359 metrics[0].setAvgImbalance(1.0 + avg);
1364 scalar_t *wgts = globalSums.getRawPtr() + numParts;
1366 if (metrics.size() > 1){
1368 computeImbalances<scalar_t, part_t>(numParts, targetNumParts,
1369 numCriteria, partSizes.view(0, numCriteria),
1370 metrics[1].getGlobalSum(), wgts,
1373 metrics[1].setMinImbalance(1.0 + min);
1374 metrics[1].setMaxImbalance(1.0 + max);
1375 metrics[1].setAvgImbalance(1.0 + avg);
1377 if (metrics.size() > 2){
1384 for (
int vdim=0; vdim < numCriteria; vdim++){
1388 if (partSizes[vdim].size() > 0)
1389 psizes = partSizes[vdim].getRawPtr();
1391 computeImbalances<scalar_t, part_t>(numParts, targetNumParts, psizes,
1392 metrics[next].getGlobalSum(), wgts, min, max, avg);
1394 metrics[next].setMinImbalance(1.0 + min);
1395 metrics[next].setMaxImbalance(1.0 + max);
1396 metrics[next].setAvgImbalance(1.0 + avg);
1408 template <
typename scalar_t,
typename part_t>
1410 part_t targetNumParts, part_t numParts, part_t numNonemptyParts,
1413 os <<
"NUMBER OF PARTS IS " << numParts;
1414 if (numNonemptyParts < numParts)
1415 os <<
" (" << numNonemptyParts <<
" of which are non-empty)";
1417 if (targetNumParts != numParts)
1418 os <<
"TARGET NUMBER OF PARTS IS " << targetNumParts << std::endl;
1420 std::string unset(
"unset");
1424 for (
int i=0; i < infoList.size(); i++)
1425 if (infoList[i].
getName() != unset)
1434 template <
typename scalar_t,
typename part_t>
1436 part_t targetNumParts, part_t numParts, part_t numNonemptyParts,
1439 ArrayView<MetricValues<scalar_t> > infoList(&info, 1);
1440 printMetrics( os, targetNumParts, numParts, numNonemptyParts, infoList);
1446 template <
typename scalar_t>
1450 size_t dim = weights.size();
1456 scalar_t nweight = 0;
1461 for (
size_t i=0; i <dim; i++)
1462 nweight += weights[i];
1467 for (
size_t i=0; i <dim; i++)
1468 nweight += (weights[i] * weights[i]);
1470 nweight = sqrt(nweight);
1476 nweight = weights[0];
1477 for (
size_t i=1; i <dim; i++)
1478 if (weights[i] > nweight)
1479 nweight = weights[i];
1495 template<
typename lno_t,
typename scalar_t>
1499 size_t dim = weights.size();
1503 Array<scalar_t> vec(dim, 1.0);
1504 for (
size_t i=0; i < dim; i++)
1505 if (weights[i].size() > 0)
1506 vec[dim] = weights[i][idx];
metricOffset
Enumerator for offsets into metric data.
scalar_t getMaxImbalance() const
Get the imbalance of the most imbalanced part. This is what we normally call the imbalance of a parti...
void setName(std::string name)
Set or reset the name.
void computeImbalances(part_t numParts, part_t targetNumParts, const scalar_t *psizes, scalar_t sumVals, const scalar_t *vals, scalar_t &min, scalar_t &max, scalar_t &avg)
Compute the imbalance.
fast typical checks for valid arguments
void normedPartWeights(const RCP< const Environment > &env, part_t numberOfParts, const ArrayView< const part_t > &parts, const ArrayView< StridedData< lno_t, scalar_t > > &vwgts, multiCriteriaNorm mcNorm, scalar_t *weights)
Compute the total weight in each part on this process.
void setAvgImbalance(scalar_t x)
Set the average imbalance of all parts.
#define Z2_FORWARD_EXCEPTIONS
Forward an exception back through call stack.
void setGlobalSum(scalar_t x)
Set the global sum.
scalar_t getGlobalMin() const
Get the global minimum across all parts.
scalar_t getGlobalMax() const
Get the global maximum across all parts.
metricOffset
Enumerator for offsets into metric data.
void objectMetrics(const RCP< const Environment > &env, const RCP< const Comm< int > > &comm, multiCriteriaNorm mcNorm, const RCP< const Adapter > &ia, const RCP< const PartitioningSolution< Adapter > > &solution, typename Adapter::part_t &numParts, typename Adapter::part_t &numNonemptyParts, ArrayRCP< MetricValues< typename Adapter::scalar_t > > &metrics)
Compute imbalance metrics for a distribution.
scalar_t getGlobalAvg() const
Get the average of the sum over all parts.
void setGlobalMax(scalar_t x)
Set the global maximum across parts.
void printMetrics(std::ostream &os, part_t targetNumParts, part_t numParts, part_t numNonemptyParts, const ArrayView< MetricValues< scalar_t > > &infoList)
Print out a header and the values for a list of metrics.
Defines the PartitioningSolution class.
void setGlobalSum(scalar_t x)
Set the global sum.
scalar_t getLocalSum() const
Get the sum on the local process.
sub-steps, each method's entry and exit
scalar_t getAvgImbalance() const
Get the average of the part imbalances.
const std::string & getName() const
Get the name of the item measured.
const std::string & getName() const
Get the name of the item measured.
void setNorm(multiCriteriaNorm normVal)
Set or reset the norm.
GraphMetricValues(std::string mname)
Constructor.
void getStridedStats(const ArrayView< scalar_t > &v, int stride, int offset, scalar_t &min, scalar_t &max, scalar_t &sum)
Find min, max and sum of metric values.
A PartitioningSolution is a solution to a partitioning problem.
void setGlobalAvg(scalar_t x)
Set the global average (sum / numParts).
void localBugAssertion(const char *file, int lineNum, const char *msg, bool ok, AssertionLevel level) const
Test for valid library behavior on local process only.
The StridedData class manages lists of weights or coordinates.
void setMinImbalance(scalar_t x)
Set the imbalance of the least imbalanced part.
scalar_t getGlobalSum() const
Get the global sum for all parts.
The user parameters, debug, timing and memory profiling output objects, and error checking methods...
static void printHeader(std::ostream &os)
Print a standard header.
GraphMetricValues()
Constructor.
void setName(std::string name)
Set or reset the name.
MetricValues(std::string mname)
Constructor.
void printLine(std::ostream &os) const
Print a standard line of data that fits under the header.
GraphModel defines the interface required for graph models.
scalar_t getGlobalMax() const
Get the global maximum across all parts.
void setGlobalMin(scalar_t x)
Set the global minimum across parts.
A class containing the metrics for one measurable item.
multiCriteriaNorm
Enumerator used in code for multicriteria norm choice.
A class containing the metrics for one measurable item.
MetricValues()
Constructor.
void setGlobalMax(scalar_t x)
Set the global maximum across parts.
void globalSumsByPart(const RCP< const Environment > &env, const RCP< const Comm< int > > &comm, const ArrayView< const part_t > &part, int vwgtDim, const ArrayView< StridedData< lno_t, scalar_t > > &vwgts, multiCriteriaNorm mcNorm, part_t &numParts, part_t &numNonemptyParts, ArrayRCP< MetricValues< scalar_t > > &metrics, ArrayRCP< scalar_t > &globalSums)
Given the local partitioning, compute the global sums in each part.
void setLocalSum(scalar_t x)
Set the sum on the local process.
multiCriteriaNorm getNorm()
Get the norm.
Defines the GraphModel interface.
#define Z2_THROW_OUTSIDE_ERROR(env)
Throw an error returned from outside the Zoltan2 library.
void globalWeightedCutsByPart(const RCP< const Environment > &env, const RCP< const Comm< int > > &comm, const RCP< const GraphModel< typename Adapter::base_adapter_t > > &graph, const ArrayView< const typename Adapter::part_t > &part, typename Adapter::part_t &numParts, ArrayRCP< GraphMetricValues< typename Adapter::scalar_t > > &metrics, ArrayRCP< typename Adapter::scalar_t > &globalSums)
Given the local partitioning, compute the global weighted cuts in each part.
static void printHeader(std::ostream &os)
Print a standard header.
scalar_t getMinImbalance() const
Get the imbalance of the least imbalanced part.
scalar_t getGlobalSum() const
Get the global sum for all parts.
void setMaxImbalance(scalar_t x)
Set the imbalance of the worst imbalanced part. This is what we normally call the imbalance of a part...
void printLine(std::ostream &os) const
Print a standard line of data that fits under the header.
This file defines the StridedData class.
scalar_t normedWeight(ArrayView< scalar_t > weights, multiCriteriaNorm norm)
Compute the norm of the vector of weights.