50 #ifndef _ZOLTAN2_XPETRACRSGRAPHADAPTER_HPP_
51 #define _ZOLTAN2_XPETRACRSGRAPHADAPTER_HPP_
58 #include <Xpetra_CrsGraph.hpp>
83 template <
typename User,
typename UserCoord=User>
88 #ifndef DOXYGEN_SHOULD_SKIP_THIS
95 typedef Xpetra::CrsGraph<lno_t, gno_t, node_t>
xgraph_t;
97 typedef UserCoord userCoord_t;
114 int nVtxWeights=0,
int nEdgeWeights=0);
209 ids = graph_->getRowMap()->getNodeElementList().getRawPtr();
216 offsets = offs_.getRawPtr();
225 if(idx<0 || idx >= nWeightsPerVertex_)
227 std::ostringstream emsg;
228 emsg << __FILE__ <<
":" << __LINE__
229 <<
" Invalid vertex weight index " << idx << std::endl;
230 throw std::runtime_error(emsg.str());
235 vertexWeights_[idx].getStridedList(length, weights, stride);
244 if(idx<0 || idx >= nWeightsPerEdge_)
246 std::ostringstream emsg;
247 emsg << __FILE__ <<
":" << __LINE__
248 <<
" Invalid edge weight index " << idx << std::endl;
249 throw std::runtime_error(emsg.str());
254 edgeWeights_[idx].getStridedList(length, weights, stride);
258 template <
typename Adapter>
262 template <
typename Adapter>
268 RCP<const User > ingraph_;
269 RCP<const xgraph_t > graph_;
270 RCP<const Comm<int> > comm_;
272 ArrayRCP<const offset_t> offs_;
273 ArrayRCP<const gno_t> adjids_;
275 int nWeightsPerVertex_;
276 ArrayRCP<StridedData<lno_t, scalar_t> > vertexWeights_;
277 ArrayRCP<bool> vertexDegreeWeight_;
279 int nWeightsPerEdge_;
280 ArrayRCP<StridedData<lno_t, scalar_t> > edgeWeights_;
283 ArrayRCP<StridedData<lno_t, scalar_t> > coords_;
291 template <
typename User,
typename UserCoord>
293 const RCP<const User> &ingraph,
int nVtxWgts,
int nEdgeWgts):
294 ingraph_(ingraph), graph_(), comm_() , offs_(), adjids_(),
295 nWeightsPerVertex_(nVtxWgts), vertexWeights_(), vertexDegreeWeight_(),
296 nWeightsPerEdge_(nEdgeWgts), edgeWeights_(),
297 coordinateDim_(0), coords_()
302 graph_ = rcp_const_cast<
const xgraph_t>(
307 comm_ = graph_->getComm();
308 size_t nvtx = graph_->getNodeNumRows();
309 size_t nedges = graph_->getNodeNumEntries();
319 std::cerr <<
"Error: " << __FILE__ <<
", " << __LINE__<< std::endl;
320 std::cerr << n <<
" objects" << std::endl;
321 throw std::bad_alloc();
324 gno_t *adjids = NULL;
327 adjids =
new gno_t [nedges];
331 std::cerr <<
"Error: " << __FILE__ <<
", " << __LINE__<< std::endl;
332 std::cerr << nedges <<
" objects" << std::endl;
333 throw std::bad_alloc();
338 for (
size_t v=0; v < nvtx; v++){
339 ArrayView<const lno_t> nbors;
340 graph_->getLocalRowView(v, nbors);
341 offs[v+1] = offs[v] + nbors.size();
342 for (
offset_t e=offs[v], i=0; e < offs[v+1]; e++)
343 adjids[e] = graph_->getColMap()->getGlobalElement(nbors[i++]);
346 offs_ = arcp(offs, 0, n,
true);
347 adjids_ = arcp(adjids, 0, nedges,
true);
349 if (nWeightsPerVertex_ > 0) {
351 arcp(
new input_t[nWeightsPerVertex_], 0, nWeightsPerVertex_,
true);
352 vertexDegreeWeight_ =
353 arcp(
new bool[nWeightsPerVertex_], 0, nWeightsPerVertex_,
true);
354 for (
int i=0; i < nWeightsPerVertex_; i++)
355 vertexDegreeWeight_[i] =
false;
358 if (nWeightsPerEdge_ > 0)
359 edgeWeights_ = arcp(
new input_t[nWeightsPerEdge_], 0, nWeightsPerEdge_,
true);
363 template <
typename User,
typename UserCoord>
365 const scalar_t *weightVal,
int stride,
int idx)
368 setVertexWeights(weightVal, stride, idx);
370 setEdgeWeights(weightVal, stride, idx);
374 template <
typename User,
typename UserCoord>
376 const scalar_t *weightVal,
int stride,
int idx)
380 if(idx<0 || idx >= nWeightsPerVertex_)
382 std::ostringstream emsg;
383 emsg << __FILE__ <<
":" << __LINE__
384 <<
" Invalid vertex weight index " << idx << std::endl;
385 throw std::runtime_error(emsg.str());
388 size_t nvtx = getLocalNumVertices();
389 ArrayRCP<const scalar_t> weightV(weightVal, 0, nvtx*stride,
false);
390 vertexWeights_[idx] = input_t(weightV, stride);
394 template <
typename User,
typename UserCoord>
399 setVertexWeightIsDegree(idx);
401 std::ostringstream emsg;
402 emsg << __FILE__ <<
"," << __LINE__
403 <<
" error: setWeightIsNumberOfNonZeros is supported only for"
404 <<
" vertices" << std::endl;
405 throw std::runtime_error(emsg.str());
410 template <
typename User,
typename UserCoord>
414 if(idx<0 || idx >= nWeightsPerVertex_)
416 std::ostringstream emsg;
417 emsg << __FILE__ <<
":" << __LINE__
418 <<
" Invalid vertex weight index " << idx << std::endl;
419 throw std::runtime_error(emsg.str());
422 vertexDegreeWeight_[idx] =
true;
426 template <
typename User,
typename UserCoord>
428 const scalar_t *weightVal,
int stride,
int idx)
432 if(idx<0 || idx >= nWeightsPerEdge_)
434 std::ostringstream emsg;
435 emsg << __FILE__ <<
":" << __LINE__
436 <<
" Invalid edge weight index " << idx << std::endl;
437 throw std::runtime_error(emsg.str());
440 size_t nedges = getLocalNumEdges();
441 ArrayRCP<const scalar_t> weightV(weightVal, 0, nedges*stride,
false);
442 edgeWeights_[idx] = input_t(weightV, stride);
446 template <
typename User,
typename UserCoord>
447 template<
typename Adapter>
449 const User &in, User *&out,
454 ArrayRCP<gno_t> importList;
458 (solution,
this, importList);
464 importList.getRawPtr());
470 template <
typename User,
typename UserCoord>
471 template<
typename Adapter>
473 const User &in, RCP<User> &out,
478 ArrayRCP<gno_t> importList;
482 (solution,
this, importList);
488 importList.getRawPtr());
InputTraits< User >::scalar_t scalar_t
~XpetraCrsGraphAdapter()
Destructor.
bool useDegreeAsVertexWeight(int idx) const
Indicate whether vertex weight with index idx should be the global degree of the vertex.
Helper functions for Partitioning Problems.
RCP< const xgraph_t > getXpetraGraph() const
Access to Xpetra-wrapped user's graph.
#define Z2_FORWARD_EXCEPTIONS
Forward an exception back through call stack.
InputTraits< User >::gno_t gno_t
GraphAdapter defines the interface for graph-based user data.
void setWeights(const scalar_t *val, int stride, int idx)
Provide a pointer to weights for the primary entity type.
InputTraits< User >::lno_t lno_t
static RCP< User > doMigration(const User &from, size_t numLocalRows, const gno_t *myNewRows)
Migrate the object Given a user object and a new row distribution, create and return a new user objec...
Provides access for Zoltan2 to Xpetra::CrsGraph data.
Traits of Xpetra classes, including migration method.
int getNumWeightsPerEdge() const
Returns the number (0 or greater) of edge weights.
RCP< const User > getUserGraph() const
Access to user's graph.
static RCP< User > convertToXpetra(const RCP< User > &a)
Convert the object to its Xpetra wrapped version.
size_t getLocalNumEdges() const
Returns the number of edges on this process.
size_t getImportList(const PartitioningSolution< SolutionAdapter > &solution, const DataAdapter *const data, ArrayRCP< typename DataAdapter::gno_t > &imports)
From a PartitioningSolution, get a list of IDs to be imported. Assumes part numbers in PartitioningSo...
XpetraCrsGraphAdapter(const RCP< const User > &ingraph, int nVtxWeights=0, int nEdgeWeights=0)
Constructor for graph with no weights or coordinates.
A PartitioningSolution is a solution to a partitioning problem.
int getNumWeightsPerVertex() const
Returns the number (0 or greater) of weights per vertex.
void setWeightIsDegree(int idx)
Specify an index for which the weight should be the degree of the entity.
The StridedData class manages lists of weights or coordinates.
InputTraits< User >::part_t part_t
void getEdgesView(const offset_t *&offsets, const gno_t *&adjIds) const
Gets adjacency lists for all vertices in a compressed sparse row (CSR) format.
void setEdgeWeights(const scalar_t *val, int stride, int idx)
Provide a pointer to edge weights.
void getEdgeWeightsView(const scalar_t *&weights, int &stride, int idx) const
void getVertexIDsView(const gno_t *&ids) const
Sets pointers to this process' graph entries.
Defines the GraphAdapter interface.
void getVertexWeightsView(const scalar_t *&weights, int &stride, int idx) const
void setVertexWeightIsDegree(int idx)
Specify an index for which the vertex weight should be the degree of the vertex.
InputTraits< User >::offset_t offset_t
void setVertexWeights(const scalar_t *val, int stride, int idx)
Provide a pointer to vertex weights.
void applyPartitioningSolution(const User &in, User *&out, const PartitioningSolution< Adapter > &solution) const
This file defines the StridedData class.
Zoltan2::BasicUserTypes< zscalar_t, zlno_t, zgno_t > user_t
size_t getLocalNumVertices() const
Returns the number of vertices on this process.