94 #ifndef ZOLTAN2_EVALUATEPARTITION_HPP
95 #define ZOLTAN2_EVALUATEPARTITION_HPP
113 template <
typename Adapter>
119 typedef typename Adapter::lno_t lno_t;
121 typedef typename Adapter::scalar_t scalar_t;
125 part_t numGlobalParts_;
126 part_t targetGlobalParts_;
130 typedef ArrayRCP<RCP<base_metric_type> > base_metric_array_type;
131 base_metric_array_type metricsBase_;
136 const RCP<
const Comm<int> > &problemComm,
157 const RCP<
const Comm<int> > &problemComm,
162 numGlobalParts_(0), targetGlobalParts_(0), numNonEmpty_(0), metricsBase_() {
169 const RCP<const Environment> &_env,
170 const RCP<
const Comm<int> > &_problemComm,
172 const ArrayView<const typename Adapter::part_t> &_partArray,
175 ArrayRCP<typename Adapter::scalar_t> &_globalSums){
176 globalWeightedCutsMessagesByPart <Adapter>(_env,
177 _problemComm, _graph, _partArray,
178 _numGlobalParts, _metricsBase,
198 numGlobalParts_(0), targetGlobalParts_(0), numNonEmpty_(0), metricsBase_()
200 Teuchos::RCP<const Comm<int> > problemComm = Tpetra::getDefaultComm();
217 const RCP<
const Comm<int> > &problemComm,
221 numGlobalParts_(0), targetGlobalParts_(0), numNonEmpty_(0), metricsBase_()
226 #ifdef HAVE_ZOLTAN2_MPI
243 numGlobalParts_(0), targetGlobalParts_(0), numNonEmpty_(0), metricsBase_()
245 RCP<Teuchos::OpaqueWrapper<MPI_Comm> > wrapper =
246 Teuchos::opaqueWrapper(comm);
247 RCP<const Comm<int> > problemComm =
248 rcp<const Comm<int> >(
new Teuchos::MpiComm<int>(wrapper));
261 std::string metricType)
const {
265 int sizeOfArrayView = 0;
266 for(
auto n = 0; n < metricsBase_.size(); ++n) {
267 if( metricsBase_[n]->getMetricType() == metricType ) {
268 if (beginIndex == -1) {
274 if (sizeOfArrayView == 0) {
275 return ArrayView<RCP<base_metric_type> >();
277 return metricsBase_.view(beginIndex, sizeOfArrayView);
284 if( metrics.size() <= 0 ) {
285 throw std::logic_error(
"getObjectCountImbalance() was called "
286 "but no metrics data was generated for " +
289 return metrics[0]->getMetricValue(
"maximum imbalance");
300 if( metrics.size() <= 0 ) {
301 throw std::logic_error(
"getNormedImbalance() was called "
302 "but no metrics data was generated for " +
305 if( metrics.size() <= 1 ) {
306 throw std::logic_error(
"getNormedImbalance() was called "
307 "but the normed data does not exist." );
309 return metrics[1]->getMetricValue(
"maximum imbalance");
331 int weight0IndexStartsAtThisArrayIndex = ( metrics.size() > 2 ) ? 2 : 1;
332 int numberOfWeights = metrics.size() - weight0IndexStartsAtThisArrayIndex;
333 int indexInArray = weight0IndexStartsAtThisArrayIndex + weightIndex;
334 if( metrics.size() <= indexInArray ) {
335 throw std::logic_error(
"getWeightImbalance was called with weight index "+
336 std::to_string(weightIndex) +
337 " but the maximum weight available for " +
339 " is weight " + std::to_string(numberOfWeights-1) +
342 return metrics[indexInArray]->getMetricValue(
"maximum imbalance");
349 if( graphMetrics.size() < 1 ) {
350 throw std::logic_error(
"getMaxEdgeCut() was called "
351 "but no metrics data was generated for " +
354 return graphMetrics[0]->getMetricValue(
"global maximum");
361 int indexInArray = weightIndex + 1;
362 if( graphMetrics.size() <= 1 ) {
363 throw std::logic_error(
"getMaxWeightEdgeCut was called with "
364 "weight index " + std::to_string(weightIndex) +
365 " but no weights were available for " +
368 else if( graphMetrics.size() <= indexInArray ) {
372 throw std::logic_error(
"getMaxWeightEdgeCut was called with "
373 "weight index " + std::to_string(weightIndex) +
374 " but the maximum weight available for " +
377 std::to_string(graphMetrics.size() - 2) +
"." );
379 return graphMetrics[indexInArray]->getMetricValue(
"global maximum");
386 if( graphMetrics.size() < 1 ) {
387 throw std::logic_error(
"getTotalEdgeCut() was called but no metrics "
388 "data was generated for " +
391 return graphMetrics[0]->getMetricValue(
"global sum");
398 int indexInArray = weightIndex + 1;
399 if( graphMetrics.size() <= 1 ) {
403 throw std::logic_error(
"getTotalWeightEdgeCut was called with "
404 "weight index " + std::to_string(weightIndex) +
405 " but no weights were available for " +
408 else if( graphMetrics.size() <= indexInArray ) {
409 throw std::logic_error(
"getTotalWeightEdgeCut was called with "
410 "weight index " + std::to_string(weightIndex) +
411 " but the maximum weight available for " +
414 std::to_string(graphMetrics.size() - 2) +
"." );
416 return graphMetrics[indexInArray]->getMetricValue(
"global sum");
425 ArrayView<RCP<base_metric_type>> graphMetrics =
427 if (graphMetrics.size() != 0) {
428 Zoltan2::printGraphMetrics<scalar_t, part_t>(os, targetGlobalParts_,
429 numGlobalParts_, graphMetrics);
435 Zoltan2::printImbalanceMetrics<scalar_t, part_t>(os, targetGlobalParts_,
442 template <
typename Adapter>
446 const RCP<
const Comm<int> > &comm,
451 RCP<const Comm<int> > problemComm;
452 if (comm == Teuchos::null) {
453 problemComm = Tpetra::getDefaultComm();
458 RCP<Environment> env;
465 env->debug(
DETAILED_STATUS, std::string(
"Entering EvaluatePartition"));
469 size_t numLocalObjects = ia->getLocalNumIDs();
470 ArrayRCP<const part_t> parts;
475 env->localInputAssertion(__FILE__, __LINE__,
"parts not set",
480 const part_t *tmp = NULL;
481 ia->getPartsView(tmp);
483 parts = arcp(tmp, 0, numLocalObjects,
false);
486 part_t *procs =
new part_t[numLocalObjects];
487 for (
size_t i=0;i<numLocalObjects;i++) procs[i]=problemComm->getRank();
488 parts = arcp(procs, 0, numLocalObjects,
true);
491 ArrayView<const part_t> partArray = parts(0, numLocalObjects);
498 const Teuchos::ParameterEntry *pe = p->getEntryPtr(
"partitioning_objective");
500 std::string strChoice = pe->getValue<std::string>(&strChoice);
501 if (strChoice == std::string(
"multicriteria_minimize_total_weight"))
503 else if (strChoice == std::string(
"multicriteria_minimize_maximum_weight"))
507 const RCP<const base_adapter_t> bia =
508 rcp(dynamic_cast<const base_adapter_t *>(ia),
false);
511 imbalanceMetrics<Adapter>(env, problemComm, mcnorm, ia, soln, partArray,
513 numGlobalParts_, numNonEmpty_, metricsBase_);
520 targetGlobalParts_ = problemComm->getSize();
529 env->timerStart(
MACRO_TIMERS,
"Computing graph metrics");
534 std::bitset<NUM_MODEL_FLAGS> modelFlags;
538 RCP<const GraphModel<base_adapter_t> > graph = graphModel;
539 if (graphModel == Teuchos::null) {
545 ArrayRCP<scalar_t> globalSums;
547 globalWeightedCutsByPart<Adapter>(env,
548 problemComm, graph, partArray,
549 numGlobalParts_, metricsBase_,
551 this->calculate_graph_metrics(env,
552 problemComm, graph, partArray,
553 numGlobalParts_, metricsBase_,
558 env->timerStop(
MACRO_TIMERS,
"Computing graph metrics");