50 #ifndef ZOLTAN2_EVALUATEPARTITION_HPP 51 #define ZOLTAN2_EVALUATEPARTITION_HPP 65 template <
typename Adapter>
70 typedef typename Adapter::lno_t lno_t;
71 typedef typename Adapter::part_t part_t;
72 typedef typename Adapter::scalar_t scalar_t;
75 const RCP<const Environment> env_;
77 part_t numGlobalParts_;
78 part_t targetGlobalParts_;
81 ArrayRCP<MetricValues<scalar_t> > metrics_;
82 ArrayRCP<const MetricValues<scalar_t> > metricsConst_;
83 ArrayRCP<GraphMetricValues<scalar_t> > graphMetrics_;
84 ArrayRCP<const GraphMetricValues<scalar_t> > graphMetricsConst_;
100 const RCP<
const Comm<int> > &problemComm,
101 const RCP<const typename Adapter::base_adapter_t> &ia,
103 bool useDegreeAsWeight,
118 const RCP<
const Comm<int> > &problemComm,
119 const RCP<const typename Adapter::base_adapter_t> &ia,
129 if(metricsConst_.is_null())
return metrics_;
130 return metricsConst_;
137 imbalance = metrics_[0].getMaxImbalance();
146 if (metrics_.size() > 1)
147 imbalance = metrics_[1].getMaxImbalance();
149 imbalance = metrics_[0].getMaxImbalance();
160 if (metrics_.size() > 2)
161 imbalance = metrics_[idx+2].getMaxImbalance();
162 else if (metrics_.size() == 2)
163 imbalance = metrics_[1].getMaxImbalance();
165 imbalance = metrics_[0].getMaxImbalance();
171 Zoltan2::printMetrics<scalar_t, part_t>(os,
172 targetGlobalParts_, numGlobalParts_, numNonEmpty_,
173 metrics_.view(0, metrics_.size()));
180 if(graphMetricsConst_.is_null())
return graphMetrics_;
181 return graphMetricsConst_;
191 if (graphMetrics_.size() < idx)
192 cut = graphMetrics_[graphMetrics_.size()-1].getGlobalMax();
194 cut = graphMetrics_[0].getGlobalMax();
196 cut = graphMetrics_[idx].getGlobalMax();
202 Zoltan2::printMetrics<scalar_t, part_t>(os,
203 targetGlobalParts_, numGlobalParts_,
204 graphMetrics_.view(0, graphMetrics_.size()));
208 template <
typename Adapter>
210 const RCP<const Environment> &env,
211 const RCP<
const Comm<int> > &problemComm,
212 const RCP<const typename Adapter::base_adapter_t> &ia,
214 bool useDegreeAsWeight,
216 env_(env), numGlobalParts_(0), targetGlobalParts_(0), numNonEmpty_(0),
217 metrics_(), metricsConst_()
220 env->debug(
DETAILED_STATUS, std::string(
"Entering EvaluatePartition"));
227 const Teuchos::ParameterList &pl = env->getParameters();
230 const Teuchos::ParameterEntry *pe = pl.getEntryPtr(
"partitioning_objective");
233 std::string strChoice = pe->getValue<std::string>(&strChoice);
234 if (strChoice == std::string(
"multicriteria_minimize_total_weight"))
236 else if (strChoice == std::string(
"multicriteria_minimize_maximum_weight"))
241 objectMetrics<Adapter>(env, problemComm, mcnorm, ia, soln,
242 useDegreeAsWeight, graphModel, numGlobalParts_,
243 numNonEmpty_,metrics_);
247 targetGlobalParts_ = soln->getTargetGlobalNumberOfParts();
253 template <
typename Adapter>
255 const RCP<const Environment> &env,
256 const RCP<
const Comm<int> > &problemComm,
257 const RCP<const typename Adapter::base_adapter_t> &ia,
260 env_(env), numGlobalParts_(0), targetGlobalParts_(0),
261 graphMetrics_(), graphMetricsConst_()
265 std::string(
"Entering EvaluatePartition"));
266 env->timerStart(
MACRO_TIMERS,
"Computing graph metrics");
271 typedef typename Adapter::part_t part_t;
272 typedef typename Adapter::base_adapter_t base_adapter_t;
274 std::bitset<NUM_MODEL_FLAGS> modelFlags;
278 RCP<GraphModel<base_adapter_t> > graph;
279 if (graphModel == Teuchos::null)
284 size_t numLocalObjects = ia->getLocalNumIDs();
289 if (soln != Teuchos::null) {
290 parts = soln->getPartListView();
291 env->localInputAssertion(__FILE__, __LINE__,
"parts not set",
294 part_t *procs =
new part_t [numLocalObjects];
295 for (
size_t i=0; i<numLocalObjects; i++) procs[i] = problemComm->getRank();
298 ArrayView<const part_t> partArray(parts, numLocalObjects);
300 ArrayRCP<scalar_t> globalSums;
302 if (graphModel == Teuchos::null) {
304 globalWeightedCutsByPart<Adapter>(env,
305 problemComm, graph, partArray,
306 numGlobalParts_, graphMetrics_,
312 globalWeightedCutsByPart<Adapter>(env,
313 problemComm, graphModel, partArray,
314 numGlobalParts_, graphMetrics_,
320 targetGlobalParts_ = soln->getTargetGlobalNumberOfParts();
322 env->timerStop(
MACRO_TIMERS,
"Computing graph metrics");
324 std::string(
"Exiting EvaluatePartition"));
Time an algorithm (or other entity) as a whole.
void printMetrics(std::ostream &os) const
Print all the metrics.
fast typical checks for valid arguments
#define Z2_FORWARD_EXCEPTIONS
Forward an exception back through call stack.
Metric class and namespace methods to compute quality metrics.
ArrayRCP< const MetricValues< scalar_t > > getMetrics() const
Return the metric values.
Defines the PartitioningSolution class.
void getObjectCountImbalance(scalar_t &imbalance) const
Return the object count imbalance.
void getNormedImbalance(scalar_t &imbalance) const
Return the object normed weight imbalance.
sub-steps, each method's entry and exit
EvaluatePartition(const RCP< const Environment > &env, const RCP< const Comm< int > > &problemComm, const RCP< const typename Adapter::base_adapter_t > &ia, const RCP< const PartitioningSolution< Adapter > > &soln, bool useDegreeAsWeight, const RCP< const GraphModel< typename Adapter::base_adapter_t > > &graphModel=Teuchos::null)
Constructor.
A PartitioningSolution is a solution to a partitioning problem.
void printGraphMetrics(std::ostream &os) const
Print all the metrics.
The StridedData class manages lists of weights or coordinates.
ArrayRCP< const GraphMetricValues< scalar_t > > getGraphMetrics() const
Return the graph metric values.
GraphModel defines the interface required for graph models.
multiCriteriaNorm
Enumerator used in code for multicriteria norm choice.
void getWeightImbalance(scalar_t &imbalance, int idx=0) const
Return the imbalance for the requested weight.
void getWeightCut(scalar_t &cut, int idx=0) const
Return the max cut for the requested weight.
A class that computes and returns quality metrics.