Zoltan2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Zoltan2_EvaluatePartition.hpp
Go to the documentation of this file.
1 // @HEADER
2 //
3 // ***********************************************************************
4 //
5 // Zoltan2: A package of combinatorial algorithms for scientific computing
6 // Copyright 2012 Sandia Corporation
7 //
8 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9 // the U.S. Government retains certain rights in this software.
10 //
11 // Redistribution and use in source and binary forms, with or without
12 // modification, are permitted provided that the following conditions are
13 // met:
14 //
15 // 1. Redistributions of source code must retain the above copyright
16 // notice, this list of conditions and the following disclaimer.
17 //
18 // 2. Redistributions in binary form must reproduce the above copyright
19 // notice, this list of conditions and the following disclaimer in the
20 // documentation and/or other materials provided with the distribution.
21 //
22 // 3. Neither the name of the Corporation nor the names of the
23 // contributors may be used to endorse or promote products derived from
24 // this software without specific prior written permission.
25 //
26 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 //
38 // Questions? Contact Karen Devine (kddevin@sandia.gov)
39 // Erik Boman (egboman@sandia.gov)
40 // Siva Rajamanickam (srajama@sandia.gov)
41 //
42 // ***********************************************************************
43 //
44 // @HEADER
45 // @HEADER
46 //
47 // ***********************************************************************
48 //
49 // Zoltan2: A package of combinatorial algorithms for scientific computing
50 // Copyright 2012 Sandia Corporation
51 //
52 // Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
53 // the U.S. Government retains certain rights in this software.
54 //
55 // Redistribution and use in source and binary forms, with or without
56 // modification, are permitted provided that the following conditions are
57 // met:
58 //
59 // 1. Redistributions of source code must retain the above copyright
60 // notice, this list of conditions and the following disclaimer.
61 //
62 // 2. Redistributions in binary form must reproduce the above copyright
63 // notice, this list of conditions and the following disclaimer in the
64 // documentation and/or other materials provided with the distribution.
65 //
66 // 3. Neither the name of the Corporation nor the names of the
67 // contributors may be used to endorse or promote products derived from
68 // this software without specific prior written permission.
69 //
70 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
71 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
72 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
73 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
74 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
75 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
76 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
77 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
78 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
79 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
80 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
81 //
82 // Questions? Contact Karen Devine (kddevin@sandia.gov)
83 // Erik Boman (egboman@sandia.gov)
84 // Siva Rajamanickam (srajama@sandia.gov)
85 //
86 // ***********************************************************************
87 //
88 // @HEADER
89 
94 #ifndef ZOLTAN2_EVALUATEPARTITION_HPP
95 #define ZOLTAN2_EVALUATEPARTITION_HPP
96 
97 #include <Zoltan2_GraphMetrics.hpp>
103 
104 namespace Zoltan2{
105 
113 template <typename Adapter>
114 class EvaluatePartition : public EvaluateBaseClass<Adapter> {
115 
116 private:
117 
118  typedef typename Adapter::base_adapter_t base_adapter_t;
119  typedef typename Adapter::lno_t lno_t;
120  typedef typename Adapter::part_t part_t;
121  typedef typename Adapter::scalar_t scalar_t;
122 
124 
125  part_t numGlobalParts_; // desired
126  part_t targetGlobalParts_; // actual
127  part_t numNonEmpty_; // of actual
128 
130  typedef ArrayRCP<RCP<base_metric_type> > base_metric_array_type;
131  base_metric_array_type metricsBase_;
132 
133 protected:
134  void sharedConstructor(const Adapter *ia,
135  ParameterList *p,
136  const RCP<const Comm<int> > &problemComm,
137  const PartitioningSolution<Adapter> *soln,
138  const RCP<const GraphModel
139  <typename Adapter::base_adapter_t> > &graphModel);
140 
141 
142 
155  const Adapter *ia,
156  ParameterList *p,
157  const RCP<const Comm<int> > &problemComm,
158  const PartitioningSolution<Adapter> *soln,
159  bool force_evaluate,
160  const RCP<const GraphModel<typename Adapter::base_adapter_t> > &graphModel=
161  Teuchos::null):
162  numGlobalParts_(0), targetGlobalParts_(0), numNonEmpty_(0), metricsBase_() {
163  if (force_evaluate){
164  sharedConstructor(ia, p, problemComm, soln, graphModel);
165  }
166 
167  }
169  const RCP<const Environment> &_env,
170  const RCP<const Comm<int> > &_problemComm,
171  const RCP<const GraphModel<typename Adapter::base_adapter_t> > &_graph,
172  const ArrayView<const typename Adapter::part_t> &_partArray,
173  typename Adapter::part_t &_numGlobalParts,
174  ArrayRCP<RCP<BaseClassMetrics<typename Adapter::scalar_t> > > &_metricsBase,
175  ArrayRCP<typename Adapter::scalar_t> &_globalSums) {
176  globalWeightedByPart <Adapter>(_env, _problemComm, _graph,
177  _partArray, _numGlobalParts, _metricsBase, _globalSums);
178  }
179 public:
180  virtual ~EvaluatePartition(){}
181 
191  const Adapter *ia,
192  ParameterList *p,
193  const PartitioningSolution<Adapter> *soln,
194  const RCP<const GraphModel<typename Adapter::base_adapter_t> > &graphModel=
195  Teuchos::null):
196  numGlobalParts_(0), targetGlobalParts_(0), numNonEmpty_(0), metricsBase_()
197  {
198  Teuchos::RCP<const Comm<int> > problemComm = Tpetra::getDefaultComm();
199  sharedConstructor(ia, p, problemComm, soln, graphModel);
200  }
201 
202 
213  const Adapter *ia,
214  ParameterList *p,
215  const RCP<const Comm<int> > &problemComm,
216  const PartitioningSolution<Adapter> *soln,
217  const RCP<const GraphModel<typename Adapter::base_adapter_t> > &graphModel=
218  Teuchos::null):
219  numGlobalParts_(0), targetGlobalParts_(0), numNonEmpty_(0), metricsBase_()
220  {
221  sharedConstructor(ia, p, problemComm, soln, graphModel);
222  }
223 
224 #ifdef HAVE_ZOLTAN2_MPI
225 
235  const Adapter *ia,
236  ParameterList *p,
237  MPI_Comm comm,
238  const PartitioningSolution<Adapter> *soln,
239  const RCP<const GraphModel<typename Adapter::base_adapter_t> > &graphModel=
240  Teuchos::null):
241  numGlobalParts_(0), targetGlobalParts_(0), numNonEmpty_(0), metricsBase_()
242  {
243  RCP<Teuchos::OpaqueWrapper<MPI_Comm> > wrapper =
244  Teuchos::opaqueWrapper(comm);
245  RCP<const Comm<int> > problemComm =
246  rcp<const Comm<int> >(new Teuchos::MpiComm<int>(wrapper));
247  sharedConstructor(ia, p, problemComm, soln, graphModel);
248  }
249 #endif
250 
254  // TO DO - note that with current status it probably makes more sense to
255  // break up metricsBase_ into imbalanceMetrics_ and graphMetrics_.
256  // So instead of mixing them just keep two arrays and eliminate this function.
257  // That will clean up several places in this class.
258  ArrayView<RCP<base_metric_type>> getAllMetricsOfType(
259  std::string metricType) const {
260  // find the beginning and the end of the contiguous block
261  // the list is an ArrayRCP and must preserve any ordering
262  int beginIndex = -1;
263  int sizeOfArrayView = 0;
264  for(auto n = 0; n < metricsBase_.size(); ++n) {
265  if( metricsBase_[n]->getMetricType() == metricType ) {
266  if (beginIndex == -1) {
267  beginIndex = int(n);
268  }
269  ++sizeOfArrayView;
270  }
271  }
272  if (sizeOfArrayView == 0) {
273  return ArrayView<RCP<base_metric_type> >(); // empty array view
274  }
275  return metricsBase_.view(beginIndex, sizeOfArrayView);
276  }
277 
280  scalar_t getObjectCountImbalance() const {
282  if( metrics.size() <= 0 ) {
283  throw std::logic_error("getObjectCountImbalance() was called "
284  "but no metrics data was generated for " +
285  std::string(IMBALANCE_METRICS_TYPE_NAME) + "." );
286  }
287  return metrics[0]->getMetricValue("maximum imbalance");
288  }
289 
296  scalar_t getNormedImbalance() const{
298  if( metrics.size() <= 0 ) {
299  throw std::logic_error("getNormedImbalance() was called "
300  "but no metrics data was generated for " +
301  std::string(IMBALANCE_METRICS_TYPE_NAME) + "." );
302  }
303  if( metrics.size() <= 1 ) {
304  throw std::logic_error("getNormedImbalance() was called "
305  "but the normed data does not exist." );
306  }
307  return metrics[1]->getMetricValue("maximum imbalance");
308  }
309 
312  scalar_t getWeightImbalance(int weightIndex) const {
313  // In this case we could have
314  // Option 1
315  // object count
316  // Option 2
317  // object count
318  // weight 0
319  // Option 3
320  // object count
321  // normed imbalance
322  // weight 0
323  // weight 1
324 
325  // if we have multiple weights (meaning array size if 2 or greater) than
326  // the weights begin on index 2
327  // if we have one weight 0 (option 2) then the weights begin on index 1
329  int weight0IndexStartsAtThisArrayIndex = ( metrics.size() > 2 ) ? 2 : 1;
330  int numberOfWeights = metrics.size() - weight0IndexStartsAtThisArrayIndex;
331  int indexInArray = weight0IndexStartsAtThisArrayIndex + weightIndex;
332  if( metrics.size() <= indexInArray ) {
333  throw std::logic_error("getWeightImbalance was called with weight index "+
334  std::to_string(weightIndex) +
335  " but the maximum weight available for " +
336  std::string(IMBALANCE_METRICS_TYPE_NAME) +
337  " is weight " + std::to_string(numberOfWeights-1) +
338  "." );
339  }
340  return metrics[indexInArray]->getMetricValue("maximum imbalance");
341  }
342 
345  scalar_t getMaxEdgeCut() const{
346  auto graphMetrics = getAllMetricsOfType(GRAPH_METRICS_TYPE_NAME);
347  if( graphMetrics.size() < 1 ) {
348  throw std::logic_error("getMaxEdgeCut() was called "
349  "but no metrics data was generated for " +
350  std::string(GRAPH_METRICS_TYPE_NAME) + "." );
351  }
352  return graphMetrics[0]->getMetricValue("global maximum");
353  }
354 
357  scalar_t getMaxWeightEdgeCut(int weightIndex) const{
358  auto graphMetrics = getAllMetricsOfType(GRAPH_METRICS_TYPE_NAME);
359  int indexInArray = weightIndex + 1; // changed this - it used to start at 0
360  if( graphMetrics.size() <= 1 ) {
361  throw std::logic_error("getMaxWeightEdgeCut was called with "
362  "weight index " + std::to_string(weightIndex) +
363  " but no weights were available for " +
364  std::string(GRAPH_METRICS_TYPE_NAME) + "." );
365  }
366  else if( graphMetrics.size() <= indexInArray ) {
367  // the size() - 2 is because weight 0 starts at array element 1
368  // (so if the array size is 2, the maximum specified weight index is
369  // weight 0 ( 2-2 = 0 )
370  throw std::logic_error("getMaxWeightEdgeCut was called with "
371  "weight index " + std::to_string(weightIndex) +
372  " but the maximum weight available for " +
373  std::string(GRAPH_METRICS_TYPE_NAME) +
374  " is weight " +
375  std::to_string(graphMetrics.size() - 2) + "." );
376  }
377  return graphMetrics[indexInArray]->getMetricValue("global maximum");
378  }
379 
382  scalar_t getTotalEdgeCut() const{
383  auto graphMetrics = getAllMetricsOfType(GRAPH_METRICS_TYPE_NAME);
384  if( graphMetrics.size() < 1 ) {
385  throw std::logic_error("getTotalEdgeCut() was called but no metrics "
386  "data was generated for " +
387  std::string(GRAPH_METRICS_TYPE_NAME) + "." );
388  }
389  return graphMetrics[0]->getMetricValue("global sum");
390  }
391 
394  scalar_t getTotalWeightEdgeCut(int weightIndex) const{
395  auto graphMetrics = getAllMetricsOfType(GRAPH_METRICS_TYPE_NAME);
396  int indexInArray = weightIndex + 1; // changed this; it used to start at 0
397  if( graphMetrics.size() <= 1 ) {
398  // the size() - 2 is because weight 0 starts at array element 1 (so if
399  // the array size is 2, the maximum specified weight index is
400  // weight 0 ( 2-2 = 0 )
401  throw std::logic_error("getTotalWeightEdgeCut was called with "
402  "weight index " + std::to_string(weightIndex) +
403  " but no weights were available for " +
404  std::string(GRAPH_METRICS_TYPE_NAME) + "." );
405  }
406  else if( graphMetrics.size() <= indexInArray ) {
407  throw std::logic_error("getTotalWeightEdgeCut was called with "
408  "weight index " + std::to_string(weightIndex) +
409  " but the maximum weight available for " +
410  std::string(GRAPH_METRICS_TYPE_NAME) +
411  " is weight " +
412  std::to_string(graphMetrics.size() - 2) + "." );
413  }
414  return graphMetrics[indexInArray]->getMetricValue("global sum");
415  }
416 
419  scalar_t getTotalMessages() const{
420  auto graphMetrics = getAllMetricsOfType(GRAPH_METRICS_TYPE_NAME);
421  if( graphMetrics.size() < 1 ) {
422  throw std::logic_error("getTotalMessages() was called but no metrics "
423  "data was generated for " +
424  std::string(GRAPH_METRICS_TYPE_NAME) + "." );
425  }
426  // TODO: Would be better to avoid hard coding the array access to [1]
427  return graphMetrics[1]->getMetricValue("global sum");
428  }
429 
430 
433  scalar_t getMaxMessages() const{
434  auto graphMetrics = getAllMetricsOfType(GRAPH_METRICS_TYPE_NAME);
435  if( graphMetrics.size() < 1 ) {
436  throw std::logic_error("getMaxMessages() was called but no metrics "
437  "data was generated for " +
438  std::string(GRAPH_METRICS_TYPE_NAME) + "." );
439  }
440  // TODO: Would be better to avoid hard coding the array access to [1]
441  return graphMetrics[1]->getMetricValue("global maximum");
442  }
443 
446  void printMetrics(std::ostream &os) const {
447  // this could be a critical decision - do we want a blank table with
448  // headers when the list is empty - for debugging that is probably better
449  // but it's very messy to have lots of empty tables in the logs
450  ArrayView<RCP<base_metric_type>> graphMetrics =
452  if (graphMetrics.size() != 0) {
453  Zoltan2::printGraphMetrics<scalar_t, part_t>(os, targetGlobalParts_,
454  numGlobalParts_, graphMetrics);
455  }
456 
457  ArrayView<RCP<base_metric_type>> imbalanceMetrics =
459  if (imbalanceMetrics.size() != 0) {
460  Zoltan2::printImbalanceMetrics<scalar_t, part_t>(os, targetGlobalParts_,
461  numGlobalParts_, numNonEmpty_, imbalanceMetrics);
462  }
463  }
464 };
465 
466 // sharedConstructor
467 template <typename Adapter>
469  const Adapter *ia,
470  ParameterList *p,
471  const RCP<const Comm<int> > &comm,
472  const PartitioningSolution<Adapter> *soln,
473  const RCP<const GraphModel<typename Adapter::base_adapter_t> > &graphModel
474 )
475 {
476  RCP<const Comm<int> > problemComm;
477  if (comm == Teuchos::null) {
478  problemComm = Tpetra::getDefaultComm();
479  } else {
480  problemComm = comm;
481  }
482 
483  RCP<Environment> env;
484 
485  try{
486  env = rcp(new Environment(*p, problemComm));
487  }
489 
490  env->debug(DETAILED_STATUS, std::string("Entering EvaluatePartition"));
491  env->timerStart(MACRO_TIMERS, "Computing metrics");
492 
493  // Parts to which objects are assigned.
494  size_t numLocalObjects = ia->getLocalNumIDs();
495  ArrayRCP<const part_t> parts;
496 
497  if (soln) {
498  // User provided a partitioning solution; use it.
499  parts = arcp(soln->getPartListView(), 0, numLocalObjects, false);
500  env->localInputAssertion(__FILE__, __LINE__, "parts not set",
501  ((numLocalObjects == 0) || soln->getPartListView()), BASIC_ASSERTION);
502  } else {
503  // User did not provide a partitioning solution;
504  // Use input adapter's partition.
505  const part_t *tmp = NULL;
506  ia->getPartsView(tmp);
507  if (tmp != NULL)
508  parts = arcp(tmp, 0, numLocalObjects, false);
509  else {
510  // User has not provided input parts in input adapter
511  part_t *procs = new part_t[numLocalObjects];
512  for (size_t i=0;i<numLocalObjects;i++) procs[i]=problemComm->getRank();
513  parts = arcp(procs, 0, numLocalObjects, true);
514  }
515  }
516  ArrayView<const part_t> partArray = parts(0, numLocalObjects);
517 
518  // When we add parameters for which weights to use, we
519  // should check those here. For now we compute metrics
520  // using all weights.
521 
523  const Teuchos::ParameterEntry *pe = p->getEntryPtr("partitioning_objective");
524  if (pe){
525  std::string strChoice = pe->getValue<std::string>(&strChoice);
526  if (strChoice == std::string("multicriteria_minimize_total_weight"))
527  mcnorm = normMinimizeTotalWeight;
528  else if (strChoice == std::string("multicriteria_minimize_maximum_weight"))
529  mcnorm = normMinimizeMaximumWeight;
530  }
531 
532  const RCP<const base_adapter_t> bia =
533  rcp(dynamic_cast<const base_adapter_t *>(ia), false);
534 
535  try{
536  imbalanceMetrics<Adapter>(env, problemComm, mcnorm, ia, soln, partArray,
537  graphModel,
538  numGlobalParts_, numNonEmpty_, metricsBase_);
539  }
541 
542  if (soln)
543  targetGlobalParts_ = soln->getTargetGlobalNumberOfParts();
544  else
545  targetGlobalParts_ = problemComm->getSize();
546 
547  env->timerStop(MACRO_TIMERS, "Computing metrics");
548 
549  BaseAdapterType inputType = bia->adapterType();
550 
551  if (inputType == GraphAdapterType ||
552  inputType == MatrixAdapterType ||
553  inputType == MeshAdapterType){
554  env->timerStart(MACRO_TIMERS, "Computing graph metrics");
555  // When we add parameters for which weights to use, we
556  // should check those here. For now we compute graph metrics
557  // using all weights.
558 
559  std::bitset<NUM_MODEL_FLAGS> modelFlags;
560 
561  // Create a GraphModel based on input data.
562 
563  RCP<const GraphModel<base_adapter_t> > graph = graphModel;
564  if (graphModel == Teuchos::null) {
565  graph = rcp(new GraphModel<base_adapter_t>(bia, env, problemComm,
566  modelFlags));
567  }
568 
569  // compute weighted cuts
570  ArrayRCP<scalar_t> globalSums;
571  try {
572  this->calculate_graph_metrics(env, problemComm, graph, partArray,
573  numGlobalParts_, metricsBase_, globalSums);
574  }
576 
577  env->timerStop(MACRO_TIMERS, "Computing graph metrics");
578  }
579 
580  env->debug(DETAILED_STATUS, std::string("Exiting EvaluatePartition"));
581 }
582 
583 } // namespace Zoltan2
584 
585 #endif
void imbalanceMetrics(const RCP< const Environment > &env, const RCP< const Comm< int > > &comm, multiCriteriaNorm mcNorm, const Adapter *ia, const PartitioningSolution< Adapter > *solution, const ArrayView< const typename Adapter::part_t > &partArray, const RCP< const GraphModel< typename Adapter::base_adapter_t > > &graphModel, typename Adapter::part_t &numExistingParts, typename Adapter::part_t &numNonemptyParts, ArrayRCP< RCP< BaseClassMetrics< typename Adapter::scalar_t > > > &metrics)
Compute imbalance metrics for a distribution.
Zoltan2::BaseAdapter< userTypes_t > base_adapter_t
Time an algorithm (or other entity) as a whole.
void printMetrics(std::ostream &os) const
Print all metrics.
fast typical checks for valid arguments
#define Z2_FORWARD_EXCEPTIONS
Forward an exception back through call stack.
ArrayView< RCP< base_metric_type > > getAllMetricsOfType(std::string metricType) const
Return the metric list for types matching the given metric type.
virtual void calculate_graph_metrics(const RCP< const Environment > &_env, const RCP< const Comm< int > > &_problemComm, const RCP< const GraphModel< typename Adapter::base_adapter_t > > &_graph, const ArrayView< const typename Adapter::part_t > &_partArray, typename Adapter::part_t &_numGlobalParts, ArrayRCP< RCP< BaseClassMetrics< typename Adapter::scalar_t > > > &_metricsBase, ArrayRCP< typename Adapter::scalar_t > &_globalSums)
scalar_t getTotalEdgeCut() const
getTotalEdgeCut
Defines the PartitioningSolution class.
sub-steps, each method&#39;s entry and exit
scalar_t getWeightImbalance(int weightIndex) const
Return the imbalance for the requested weight.
scalar_t getMaxEdgeCut() const
Return the max cut for the requested weight.
#define IMBALANCE_METRICS_TYPE_NAME
SparseMatrixAdapter_t::part_t part_t
scalar_t getNormedImbalance() const
Return the object normed weight imbalance. Normed imbalance is only valid if there is at least 2 elem...
A PartitioningSolution is a solution to a partitioning problem.
const part_t * getPartListView() const
Returns the part list corresponding to the global ID list.
BaseAdapterType
An enum to identify general types of adapters.
EvaluatePartition(const Adapter *ia, ParameterList *p, const RCP< const Comm< int > > &problemComm, const PartitioningSolution< Adapter > *soln, const RCP< const GraphModel< typename Adapter::base_adapter_t > > &graphModel=Teuchos::null)
Constructor where Teuchos communicator is specified.
The StridedData class manages lists of weights or coordinates.
The user parameters, debug, timing and memory profiling output objects, and error checking methods...
Base class for the EvaluatePartition and EvaluateOrdering classes.
void sharedConstructor(const Adapter *ia, ParameterList *p, const RCP< const Comm< int > > &problemComm, const PartitioningSolution< Adapter > *soln, const RCP< const GraphModel< typename Adapter::base_adapter_t > > &graphModel)
#define GRAPH_METRICS_TYPE_NAME
GraphModel defines the interface required for graph models.
multiCriteriaNorm
Enumerator used in code for multicriteria norm choice.
EvaluatePartition(const Adapter *ia, ParameterList *p, const PartitioningSolution< Adapter > *soln, const RCP< const GraphModel< typename Adapter::base_adapter_t > > &graphModel=Teuchos::null)
Constructor where communicator is Teuchos default.
A class that computes and returns quality metrics.
scalar_t getTotalWeightEdgeCut(int weightIndex) const
getTotalWeightEdgeCut weighted for the specified index
EvaluatePartition(const Adapter *ia, ParameterList *p, const RCP< const Comm< int > > &problemComm, const PartitioningSolution< Adapter > *soln, bool force_evaluate, const RCP< const GraphModel< typename Adapter::base_adapter_t > > &graphModel=Teuchos::null)
Constructor where communicator is Teuchos default, and takes another parameter whether to evaluate me...
scalar_t getMaxWeightEdgeCut(int weightIndex) const
getMaxWeightEdgeCuts weighted for the specified index
size_t getTargetGlobalNumberOfParts() const
Returns the global number of parts desired in the solution.
scalar_t getObjectCountImbalance() const
Return the object count imbalance.
scalar_t getTotalMessages() const
getTotalMessages
scalar_t getMaxMessages() const
getMaxMessages