10 #ifndef __Teuchos_MatrixMarket_Raw_Graph_Adder_hpp
11 #define __Teuchos_MatrixMarket_Raw_Graph_Adder_hpp
14 #include "Teuchos_ArrayRCP.hpp"
15 #include "Teuchos_CommHelpers.hpp"
17 #include "Teuchos_MatrixMarket_Banner.hpp"
18 #include "Teuchos_MatrixMarket_CoordDataReader.hpp"
29 namespace MatrixMarket {
53 template<
class Ordinal>
64 rowIndex_ (i), colIndex_ (j) {}
68 return rowIndex_ == rhs.rowIndex_ && colIndex_ == rhs.colIndex_;
73 return ! (*
this == rhs);
78 if (rowIndex_ < rhs.rowIndex_)
80 else if (rowIndex_ > rhs.rowIndex_)
83 return colIndex_ < rhs.colIndex_;
94 Ordinal rowIndex_, colIndex_;
101 template<
class Ordinal>
103 operator<< (std::ostream& out, const GraphElement<Ordinal>& elt)
105 out << elt.rowIndex () <<
" " << elt.colIndex ();
128 template<
class Ordinal>
131 typedef Ordinal index_type;
133 typedef typename std::vector<element_type>::size_type size_type;
148 expectedNumEntries_(0),
174 const Ordinal expectedNumCols,
175 const Ordinal expectedNumEntries,
176 const bool tolerant=
false,
177 const bool debug=
false) :
178 expectedNumRows_(expectedNumRows),
179 expectedNumCols_(expectedNumCols),
180 expectedNumEntries_(expectedNumEntries),
184 tolerant_ (tolerant),
211 const bool countAgainstTotal=
true)
214 const bool indexPairOutOfRange = i < 1 || j < 1 ||
215 i > expectedNumRows_ || j > expectedNumCols_;
218 std::invalid_argument,
"Graph is " << expectedNumRows_ <<
" x "
219 << expectedNumCols_ <<
", so entry A(" << i <<
"," << j
220 <<
") is out of range.");
221 if (countAgainstTotal) {
223 std::invalid_argument,
"Cannot add entry A(" << i <<
"," << j
224 <<
") to graph; already have expected number "
225 "of entries " << expectedNumEntries_ <<
".");
236 seenNumRows_ = std::max (seenNumRows_, i);
237 seenNumCols_ = std::max (seenNumCols_, j);
238 if (countAgainstTotal) {
260 print (std::ostream& out,
const bool doMerge,
const bool replace=
false)
264 (replace, std::logic_error,
"replace = true not implemented!");
268 std::sort (elts_.begin(), elts_.end());
271 typedef std::ostream_iterator<element_type> iter_type;
272 std::copy (elts_.begin(), elts_.end(), iter_type (out,
"\n"));
288 std::pair<size_type, size_type>
291 typedef typename std::vector<element_type>::iterator iter_type;
300 std::sort (elts_.begin(), elts_.end());
304 it = std::unique(elts_.begin(), elts_.end());
305 size_type numUnique = std::distance(elts_.begin(),it);
306 const size_type numRemoved = elts_.size() - numUnique;
307 elts_.resize( std::distance(elts_.begin(),it) );
308 elts_.resize (numUnique);
309 return std::make_pair (numUnique, numRemoved);
345 size_type& numRemovedElts,
352 std::pair<size_type, size_type> mergeResult =
merge();
359 const Ordinal nrows = tolerant_ ? seenNumRows_ : expectedNumRows_;
368 typedef typename std::vector<element_type>::const_iterator iter_type;
370 for (iter_type it = elts_.begin(); it != elts_.end(); ++it) {
371 const Ordinal i = it->rowIndex ();
372 const Ordinal j = it->colIndex ();
375 "current graph entry's row index " << i <<
" is less then what "
376 "should be the current row index lower bound " << curRow <<
".");
377 for (Ordinal k = curRow+1; k <= i; ++k) {
383 static_cast<size_t> (curInd) >= elts_.size (),
384 std::logic_error,
"The current index " << curInd <<
" into ind "
385 "is >= the number of matrix entries " << elts_.size ()
390 for (Ordinal k = curRow+1; k <= nrows; ++k) {
399 numUniqueElts = mergeResult.first;
400 numRemovedElts = mergeResult.second;
419 const Ordinal
numRows()
const {
return seenNumRows_; }
424 const Ordinal
numCols()
const {
return seenNumCols_; }
427 Ordinal expectedNumRows_, expectedNumCols_, expectedNumEntries_;
428 Ordinal seenNumRows_, seenNumCols_, seenNumEntries_;
433 std::vector<element_type> elts_;
439 #endif // #ifndef __Teuchos_MatrixMarket_Raw_Graph_Adder_hpp
bool operator==(const GraphElement &rhs)
Compare row and column indices.
To be used with Checker for "raw" sparse matrix input.
GraphAdder()
Default constructor.
bool operator<(const GraphElement &rhs) const
Lexicographic order first by row index, then by column index.
void clear()
Clear all the added graph entries and reset metadata.
bool operator!=(const GraphElement &rhs)
Compare row and column indices.
const std::vector< element_type > & getEntries() const
A temporary const view of the entries of the graph.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
const Ordinal numRows() const
Computed number of rows.
const Ordinal numCols() const
Computed number of columns.
Teuchos header file which uses auto-configuration information to include necessary C++ headers...
GraphElement()
Default constructor: an invalid entry of the graph.
Templated Parameter List class.
Ordinal colIndex() const
Column index (zero-based) of this GraphElement.
GraphElement(const Ordinal i, const Ordinal j)
Create a sparse graph entry at (i,j).
void operator()(const Ordinal i, const Ordinal j, const bool countAgainstTotal=true)
Add an entry to the sparse graph.
This structure defines some basic traits for the ordinal field type.
void print(std::ostream &out, const bool doMerge, const bool replace=false)
Print the sparse graph data.
GraphAdder(const Ordinal expectedNumRows, const Ordinal expectedNumCols, const Ordinal expectedNumEntries, const bool tolerant=false, const bool debug=false)
Standard constructor.
Ordinal rowIndex() const
Row index (zero-based) of this GraphElement.
void mergeAndConvertToCSR(size_type &numUniqueElts, size_type &numRemovedElts, Teuchos::ArrayRCP< Ordinal > &rowptr, Teuchos::ArrayRCP< Ordinal > &colind)
Merge duplicate elements and convert to zero-based CSR.
std::pair< size_type, size_type > merge()
Merge duplicate elements.
Stores one entry of a sparse graph.
Reference-counted smart pointer for managing arrays.