50 #ifndef ZOLTAN2_SOLUTIONQUALITY_HPP 51 #define ZOLTAN2_SOLUTIONQUALITY_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;
74 const RCP<const Environment> env_;
76 part_t numGlobalParts_;
77 part_t targetGlobalParts_;
80 ArrayRCP<MetricValues<scalar_t> > metrics_;
81 ArrayRCP<const MetricValues<scalar_t> > metricsConst_;
95 const RCP<
const Comm<int> > &problemComm,
96 const RCP<const Adapter> &ia,
104 if(metricsConst_.is_null())
return metrics_;
105 return metricsConst_;
112 imbalance = metrics_[0].getMaxImbalance();
121 if (metrics_.size() > 1)
122 imbalance = metrics_[1].getMaxImbalance();
124 imbalance = metrics_[0].getMaxImbalance();
135 if (metrics_.size() > 2)
136 imbalance = metrics_[idx+2].getMaxImbalance();
137 else if (metrics_.size() == 2)
138 imbalance = metrics_[1].getMaxImbalance();
140 imbalance = metrics_[0].getMaxImbalance();
146 Zoltan2::printMetrics<scalar_t, part_t>(os,
147 targetGlobalParts_, numGlobalParts_, numNonEmpty_,
148 metrics_.view(0, metrics_.size()));
152 template <
typename Adapter>
157 typedef typename Adapter::lno_t lno_t;
158 typedef typename Adapter::part_t part_t;
159 typedef typename Adapter::scalar_t scalar_t;
161 const RCP<const Environment> env_;
163 part_t numGlobalParts_;
164 part_t targetGlobalParts_;
166 ArrayRCP<GraphMetricValues<scalar_t> > metrics_;
167 ArrayRCP<const GraphMetricValues<scalar_t> > metricsConst_;
181 const RCP<
const Comm<int> > &problemComm,
183 const RCP<const Adapter> &ia,
190 if(metricsConst_.is_null())
return metrics_;
191 return metricsConst_;
201 if (metrics_.size() < idx)
202 cut = metrics_[metrics_.size()-1].getGlobalMax();
204 cut = metrics_[0].getGlobalMax();
206 cut = metrics_[idx].getGlobalMax();
210 template <
typename Adapter>
212 const RCP<const Environment> &env,
213 const RCP<
const Comm<int> > &problemComm,
214 const RCP<const Adapter> &ia,
216 env_(env), numGlobalParts_(0), targetGlobalParts_(0), numNonEmpty_(0),
217 metrics_(), metricsConst_()
220 env->debug(
DETAILED_STATUS, std::string(
"Entering PartitioningSolutionQuality"));
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 numGlobalParts_, numNonEmpty_, metrics_);
246 targetGlobalParts_ = soln->getTargetGlobalNumberOfParts();
249 env->debug(
DETAILED_STATUS, std::string(
"Exiting PartitioningSolutionQuality"));
252 template <
typename Adapter>
254 const RCP<const Environment> &env,
255 const RCP<
const Comm<int> > &problemComm,
257 const RCP<const Adapter> &ia,
259 env_(env), numGlobalParts_(0), targetGlobalParts_(0),
260 metrics_(), metricsConst_()
264 std::string(
"Entering GraphPartitioningSolutionQuality"));
265 env->timerStart(
MACRO_TIMERS,
"Computing graph metrics");
270 typedef typename Adapter::part_t part_t;
274 size_t numLocalObjects = ia->getLocalNumIDs();
278 const part_t *parts = soln->getPartListView();
279 env->localInputAssertion(__FILE__, __LINE__,
"parts not set",
281 ArrayView<const part_t> partArray(parts, numLocalObjects);
283 ArrayRCP<scalar_t> globalSums;
286 globalWeightedCutsByPart<Adapter>(env,
287 problemComm, graph, partArray, numGlobalParts_, metrics_, globalSums);
291 targetGlobalParts_ = soln->getTargetGlobalNumberOfParts();
293 env->timerStop(
MACRO_TIMERS,
"Computing graph metrics");
295 std::string(
"Exiting GraphPartitioningSolutionQuality"));
void getWeightImbalance(scalar_t &imbalance, int idx=0) const
Return the imbalance for the requested weight.
void printMetrics(std::ostream &os) const
Print all the metrics.
Time an algorithm (or other entity) as a whole.
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.
void getObjectCountImbalance(scalar_t &imbalance) const
Return the object count imbalance.
void getWeightCut(scalar_t &cut, int idx=0) const
Return the max cut for the requested weight.
Defines the PartitioningSolution class.
sub-steps, each method's entry and exit
ArrayRCP< const GraphMetricValues< scalar_t > > getGraphMetrics() const
Return the graph metric values.
A class that computes and returns quality metrics.
A PartitioningSolution is a solution to a partitioning problem.
GraphPartitioningSolutionQuality(const RCP< const Environment > &env, const RCP< const Comm< int > > &problemComm, const RCP< const GraphModel< typename Adapter::base_adapter_t > > &graph, const RCP< const Adapter > &ia, const RCP< const PartitioningSolution< Adapter > > &soln)
Constructor.
GraphModel defines the interface required for graph models.
multiCriteriaNorm
Enumerator used in code for multicriteria norm choice.
void getNormedImbalance(scalar_t &imbalance) const
Return the object normed weight imbalance.
ArrayRCP< const MetricValues< scalar_t > > getMetrics() const
Return the metric values.
PartitioningSolutionQuality(const RCP< const Environment > &env, const RCP< const Comm< int > > &problemComm, const RCP< const Adapter > &ia, const RCP< const PartitioningSolution< Adapter > > &soln)
Constructor.