14#ifndef _ZOLTAN2_XPETRACRSGRAPHADAPTER_HPP_
15#define _ZOLTAN2_XPETRACRSGRAPHADAPTER_HPP_
22#include <Xpetra_CrsGraph.hpp>
46template <
typename User,
typename UserCoord=User>
51#ifndef DOXYGEN_SHOULD_SKIP_THIS
58 typedef Xpetra::CrsGraph<lno_t, gno_t, node_t>
xgraph_t;
60 typedef UserCoord userCoord_t;
75 int nVtxWeights=0,
int nEdgeWeights=0);
172 ids = graph_->getRowMap()->getLocalElementList().getRawPtr();
179 offsets = offs_.getRawPtr();
186 int idx)
const override
188 if(idx<0 || idx >= nWeightsPerVertex_)
190 std::ostringstream emsg;
191 emsg << __FILE__ <<
":" << __LINE__
192 <<
" Invalid vertex weight index " << idx << std::endl;
193 throw std::runtime_error(emsg.str());
198 vertexWeights_[idx].getStridedList(length,
weights, stride);
207 if(idx<0 || idx >= nWeightsPerEdge_)
209 std::ostringstream emsg;
210 emsg << __FILE__ <<
":" << __LINE__
211 <<
" Invalid edge weight index " << idx << std::endl;
212 throw std::runtime_error(emsg.str());
217 edgeWeights_[idx].getStridedList(length,
weights, stride);
220 template <
typename Adapter>
224 template <
typename Adapter>
230 RCP<const User > ingraph_;
231 RCP<const xgraph_t > graph_;
232 RCP<const Comm<int> > comm_;
234 ArrayRCP<const offset_t> offs_;
235 ArrayRCP<const gno_t> adjids_;
237 int nWeightsPerVertex_;
238 ArrayRCP<StridedData<lno_t, scalar_t> > vertexWeights_;
239 ArrayRCP<bool> vertexDegreeWeight_;
241 int nWeightsPerEdge_;
242 ArrayRCP<StridedData<lno_t, scalar_t> > edgeWeights_;
245 ArrayRCP<StridedData<lno_t, scalar_t> > coords_;
253template <
typename User,
typename UserCoord>
255 const RCP<const User> &ingraph,
int nVtxWgts,
int nEdgeWgts):
256 ingraph_(ingraph), graph_(), comm_() , offs_(), adjids_(),
257 nWeightsPerVertex_(nVtxWgts), vertexWeights_(), vertexDegreeWeight_(),
258 nWeightsPerEdge_(nEdgeWgts), edgeWeights_(),
259 coordinateDim_(0), coords_()
264 graph_ = rcp_const_cast<const xgraph_t>(
269 comm_ = graph_->getComm();
270 size_t nvtx = graph_->getLocalNumRows();
271 size_t nedges = graph_->getLocalNumEntries();
281 std::cerr <<
"Error: " << __FILE__ <<
", " << __LINE__<< std::endl;
282 std::cerr << n <<
" objects" << std::endl;
283 throw std::bad_alloc();
286 gno_t *adjids = NULL;
289 adjids =
new gno_t [nedges];
293 std::cerr <<
"Error: " << __FILE__ <<
", " << __LINE__<< std::endl;
294 std::cerr << nedges <<
" objects" << std::endl;
295 throw std::bad_alloc();
300 for (
size_t v=0; v < nvtx; v++){
301 ArrayView<const lno_t> nbors;
302 graph_->getLocalRowView(v, nbors);
303 offs[v+1] = offs[v] + nbors.size();
304 for (
offset_t e=offs[v], i=0; e < offs[v+1]; e++)
305 adjids[e] = graph_->getColMap()->getGlobalElement(nbors[i++]);
308 offs_ = arcp(offs, 0, n,
true);
309 adjids_ = arcp(adjids, 0, nedges,
true);
311 if (nWeightsPerVertex_ > 0) {
313 arcp(
new input_t[nWeightsPerVertex_], 0, nWeightsPerVertex_,
true);
314 vertexDegreeWeight_ =
315 arcp(
new bool[nWeightsPerVertex_], 0, nWeightsPerVertex_,
true);
316 for (
int i=0; i < nWeightsPerVertex_; i++)
317 vertexDegreeWeight_[i] =
false;
320 if (nWeightsPerEdge_ > 0)
321 edgeWeights_ = arcp(
new input_t[nWeightsPerEdge_], 0, nWeightsPerEdge_,
true);
325template <
typename User,
typename UserCoord>
327 const scalar_t *weightVal,
int stride,
int idx)
330 setVertexWeights(weightVal, stride, idx);
332 setEdgeWeights(weightVal, stride, idx);
336template <
typename User,
typename UserCoord>
338 const scalar_t *weightVal,
int stride,
int idx)
342 if(idx<0 || idx >= nWeightsPerVertex_)
344 std::ostringstream emsg;
345 emsg << __FILE__ <<
":" << __LINE__
346 <<
" Invalid vertex weight index " << idx << std::endl;
347 throw std::runtime_error(emsg.str());
350 size_t nvtx = getLocalNumVertices();
351 ArrayRCP<const scalar_t> weightV(weightVal, 0, nvtx*stride,
false);
352 vertexWeights_[idx] = input_t(weightV, stride);
356template <
typename User,
typename UserCoord>
361 setVertexWeightIsDegree(idx);
363 std::ostringstream emsg;
364 emsg << __FILE__ <<
"," << __LINE__
365 <<
" error: setWeightIsNumberOfNonZeros is supported only for"
366 <<
" vertices" << std::endl;
367 throw std::runtime_error(emsg.str());
372template <
typename User,
typename UserCoord>
376 if(idx<0 || idx >= nWeightsPerVertex_)
378 std::ostringstream emsg;
379 emsg << __FILE__ <<
":" << __LINE__
380 <<
" Invalid vertex weight index " << idx << std::endl;
381 throw std::runtime_error(emsg.str());
384 vertexDegreeWeight_[idx] =
true;
388template <
typename User,
typename UserCoord>
390 const scalar_t *weightVal,
int stride,
int idx)
394 if(idx<0 || idx >= nWeightsPerEdge_)
396 std::ostringstream emsg;
397 emsg << __FILE__ <<
":" << __LINE__
398 <<
" Invalid edge weight index " << idx << std::endl;
399 throw std::runtime_error(emsg.str());
402 size_t nedges = getLocalNumEdges();
403 ArrayRCP<const scalar_t> weightV(weightVal, 0, nedges*stride,
false);
404 edgeWeights_[idx] = input_t(weightV, stride);
408template <
typename User,
typename UserCoord>
409 template<
typename Adapter>
411 const User &in, User *&out,
416 ArrayRCP<gno_t> importList;
420 (solution,
this, importList);
426 importList.getRawPtr());
432template <
typename User,
typename UserCoord>
433 template<
typename Adapter>
435 const User &in, RCP<User> &out,
440 ArrayRCP<gno_t> importList;
444 (solution,
this, importList);
450 importList.getRawPtr());
Zoltan2::BasicUserTypes< zscalar_t, zlno_t, zgno_t > user_t
#define Z2_FORWARD_EXCEPTIONS
Forward an exception back through call stack.
Defines the GraphAdapter interface.
Helper functions for Partitioning Problems.
This file defines the StridedData class.
Traits of Xpetra classes, including migration method.
typename InputTraits< User >::node_t node_t
typename InputTraits< User >::lno_t lno_t
typename InputTraits< User >::scalar_t scalar_t
typename InputTraits< User >::gno_t gno_t
typename InputTraits< User >::offset_t offset_t
typename InputTraits< User >::part_t part_t
GraphAdapter defines the interface for graph-based user data.
A PartitioningSolution is a solution to a partitioning problem.
The StridedData class manages lists of weights or coordinates.
Provides access for Zoltan2 to Xpetra::CrsGraph data.
RCP< const xgraph_t > getXpetraGraph() const
Access to Xpetra-wrapped user's graph.
bool useDegreeAsVertexWeight(int idx) const override
Indicate whether vertex weight with index idx should be the global degree of the vertex.
void setWeightIsDegree(int idx)
Specify an index for which the weight should be the degree of the entity.
void setWeights(const scalar_t *val, int stride, int idx)
Provide a pointer to weights for the primary entity type.
void setWeightsDevice(typename Base::ConstWeightsDeviceView &val, int idx)
void setWeightsHost(typename Base::ConstWeightsHostView &val, int idx)
void setVertexWeightsHost(typename Base::ConstWeightsHostView &val, int idx)
size_t getLocalNumEdges() const override
Returns the number of edges on this process.
void setEdgeWeightsHost(typename Base::ConstWeightsHostView &val, int idx)
void setVertexWeightIsDegree(int idx)
Specify an index for which the vertex weight should be the degree of the vertex.
void applyPartitioningSolution(const User &in, User *&out, const PartitioningSolution< Adapter > &solution) const
void setVertexWeights(const scalar_t *val, int stride, int idx)
Provide a pointer to vertex weights.
void setEdgeWeights(const scalar_t *val, int stride, int idx)
Provide a pointer to edge weights.
size_t getLocalNumVertices() const override
Returns the number of vertices on this process.
void setVertexWeightsDevice(typename Base::ConstWeightsDeviceView &val, int idx)
void getEdgeWeightsView(const scalar_t *&weights, int &stride, int idx) const override
Provide a pointer to the edge weights, if any.
XpetraCrsGraphAdapter(const RCP< const User > &ingraph, int nVtxWeights=0, int nEdgeWeights=0)
Constructor for graph with no weights or coordinates.
void getEdgesView(const offset_t *&offsets, const gno_t *&adjIds) const override
void getVertexWeightsView(const scalar_t *&weights, int &stride, int idx) const override
Provide a pointer to the vertex weights, if any.
RCP< const User > getUserGraph() const
Access to user's graph.
int getNumWeightsPerEdge() const override
Returns the number (0 or greater) of edge weights.
int getNumWeightsPerVertex() const override
Returns the number (0 or greater) of weights per vertex.
void setEdgeWeightsDevice(typename Base::ConstWeightsDeviceView &val, int idx)
void getVertexIDsView(const gno_t *&ids) const override
map_t::global_ordinal_type gno_t
Created by mbenlioglu on Aug 31, 2020.
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...
Defines the traits required for Tpetra, Eptra and Xpetra objects.
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...