10#ifndef __Teuchos_MatrixMarket_Raw_Adder_hpp
11#define __Teuchos_MatrixMarket_Raw_Adder_hpp
14#include "Teuchos_ArrayRCP.hpp"
15#include "Teuchos_CommHelpers.hpp"
17#include "Teuchos_MatrixMarket_Banner.hpp"
18#include "Teuchos_MatrixMarket_CoordDataReader.hpp"
54 template<
class Scalar,
class Ordinal>
66 rowIndex_ (
i), colIndex_ (
j), value_ (
Aij) {}
70 return rowIndex_ == rhs.rowIndex_ && colIndex_ == rhs.colIndex_;
75 return ! (*
this == rhs);
80 if (rowIndex_ < rhs.rowIndex_)
82 else if (rowIndex_ > rhs.rowIndex_)
85 return colIndex_ < rhs.colIndex_;
94 template<
class BinaryFunction>
98 std::invalid_argument,
99 "Attempt to merge elements at different locations in the sparse "
100 "matrix. The current element is at (" <<
rowIndex() <<
", "
101 <<
colIndex() <<
") and the element you asked me to merge with it "
103 "probably indicates a bug in the sparse matrix reader.");
105 value_ =
f (rhs.value_, value_);
117 std::invalid_argument,
118 "Attempt to merge elements at different locations in the sparse "
119 "matrix. The current element is at (" <<
rowIndex() <<
", "
120 <<
colIndex() <<
") and the element you asked me to merge with it "
122 "probably indicates a bug in the sparse matrix reader.");
128 value_ += rhs.value_;
139 Scalar
value()
const {
return value_; }
142 Ordinal rowIndex_, colIndex_;
156 template<
class Scalar,
class Ordinal>
161 std::ios::fmtflags
f( out.flags() );
178 if (! STS::isOrdinal) {
183 out << std::scientific;
186 out << std::setbase (10);
200 out << std::setprecision (
numDigits + 1);
202 out <<
elt.rowIndex () <<
" " <<
elt.colIndex () <<
" ";
203 if (STS::isComplex) {
204 out << STS::real (
elt.value ()) <<
" " << STS::imag (
elt.value ());
250 template<
class Scalar,
class Ordinal>
253 typedef Ordinal index_type;
254 typedef Scalar value_type;
256 typedef typename std::vector<element_type>::size_type size_type;
271 expectedNumEntries_(0),
300 const bool debug=
false) :
339 i > expectedNumRows_ ||
j > expectedNumCols_;
342 std::invalid_argument,
"Matrix is " << expectedNumRows_ <<
" x "
343 << expectedNumCols_ <<
", so entry A(" <<
i <<
"," <<
j <<
") = "
344 <<
Aij <<
" is out of range.");
347 std::invalid_argument,
"Cannot add entry A(" <<
i <<
"," <<
j
348 <<
") = " <<
Aij <<
" to matrix; already have expected number "
349 "of entries " << expectedNumEntries_ <<
".");
360 seenNumRows_ = std::max (seenNumRows_,
i);
361 seenNumCols_ = std::max (seenNumCols_,
j);
382 std::sort (elts_.begin(), elts_.end());
385 typedef std::ostream_iterator<element_type>
iter_type;
386 std::copy (elts_.begin(), elts_.end(),
iter_type (out,
"\n"));
411 std::pair<size_type, size_type>
414 typedef typename std::vector<element_type>::iterator
iter_type;
423 std::sort (elts_.begin(), elts_.end());
432 if (
cur == elts_.end()) {
433 return std::make_pair (
numUnique, size_type (0));
439 while (
next != elts_.end()) {
521 const Ordinal
nrows = tolerant_ ? seenNumRows_ : expectedNumRows_;
530 typedef typename std::vector<element_type>::const_iterator
iter_type;
533 const Ordinal
i =
it->rowIndex ();
534 const Ordinal
j =
it->colIndex ();
535 const Scalar
Aij =
it->value ();
538 "current matrix entry's row index " <<
i <<
" is less then what "
539 "should be the current row index lower bound " <<
curRow <<
".");
546 static_cast<size_t> (
curInd) >= elts_.size (),
547 std::logic_error,
"The current index " <<
curInd <<
" into ind "
548 "and val is >= the number of matrix entries " << elts_.size ()
584 const Ordinal
numRows()
const {
return seenNumRows_; }
589 const Ordinal
numCols()
const {
return seenNumCols_; }
598 Ordinal expectedNumRows_, expectedNumCols_, expectedNumEntries_;
599 Ordinal seenNumRows_, seenNumCols_, seenNumEntries_;
604 std::vector<element_type> elts_;
Teuchos header file which uses auto-configuration information to include necessary C++ headers.
Templated Parameter List class.
Reference-counted smart pointer for managing arrays.
To be used with Checker for "raw" sparse matrix input.
void operator()(const Ordinal i, const Ordinal j, const Scalar &Aij, const bool countAgainstTotal=true)
Add an entry to the sparse matrix.
void print(std::ostream &out, const bool doMerge, const bool replace=false)
Print the sparse matrix data.
const std::vector< element_type > & getEntries() const
A temporary const view of the entries of the matrix.
const Ordinal numEntries() const
Computed number of columns.
Adder(const Ordinal expectedNumRows, const Ordinal expectedNumCols, const Ordinal expectedNumEntries, const bool tolerant=false, const bool debug=false)
Standard constructor.
std::pair< size_type, size_type > merge(const bool replace=false)
Merge duplicate elements.
const Ordinal numCols() const
Computed number of columns.
void mergeAndConvertToCSR(size_type &numUniqueElts, size_type &numRemovedElts, Teuchos::ArrayRCP< Ordinal > &rowptr, Teuchos::ArrayRCP< Ordinal > &colind, Teuchos::ArrayRCP< Scalar > &values, const bool replace=false)
Merge duplicate elements and convert to zero-based CSR.
void clear()
Clear all the added matrix entries and reset metadata.
Adder()
Default constructor.
const Ordinal numRows() const
Computed number of rows.
Stores one entry of a sparse matrix.
bool operator==(const Element &rhs) const
Ignore the matrix value for comparisons.
bool operator!=(const Element &rhs) const
Ignore the matrix value for comparisons.
Scalar value() const
Value (A(rowIndex(), colIndex()) of this Element.
bool operator<(const Element &rhs) const
Lexicographic order first by row index, then by column index.
void merge(const Element &rhs, const BinaryFunction &f)
Merge rhs into this Element, using custom binary function.
Ordinal colIndex() const
Column index (zero-based) of this Element.
Ordinal rowIndex() const
Row index (zero-based) of this Element.
void merge(const Element &rhs, const bool replace=false)
Merge rhs into this Element, either by addition or replacement.
Element()
Default constructor: an invalid entry of the matrix.
Element(const Ordinal i, const Ordinal j, const Scalar &Aij)
Create a sparse matrix entry at (i,j) with value Aij.
Smart reference counting pointer class for automatic garbage collection.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
Matrix Market file utilities.
"Raw" input of sparse matrices from Matrix Market files.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
This structure defines some basic traits for the ordinal field type.
This structure defines some basic traits for a scalar field type.