|
Prev
| Next
|
|
|
|
|
|
sparse_rc.cpp |
Headings |
@(@\newcommand{\W}[1]{ \; #1 \; }
\newcommand{\R}[1]{ {\rm #1} }
\newcommand{\B}[1]{ {\bf #1} }
\newcommand{\D}[2]{ \frac{\partial #1}{\partial #2} }
\newcommand{\DD}[3]{ \frac{\partial^2 #1}{\partial #2 \partial #3} }
\newcommand{\Dpow}[2]{ \frac{\partial^{#1}}{\partial {#2}^{#1}} }
\newcommand{\dpow}[2]{ \frac{ {\rm d}^{#1}}{{\rm d}\, {#2}^{#1}} }@)@
sparse_rc: Example and Test
# include <cppad/utility/sparse_rc.hpp>
# include <vector>
bool sparse_rc(void)
{ bool ok = true;
typedef std::vector<size_t> SizeVector;
// 3 by 3 identity matrix
size_t nr = 3;
size_t nc = 3;
size_t nnz = 3;
CppAD::sparse_rc<SizeVector> pattern(nr, nc, nnz);
for(size_t k = 0; k < nnz; k++)
pattern.set(k, k, k);
// row and column vectors corresponding to pattern
const SizeVector& row = pattern.row();
const SizeVector& col = pattern.row();
// check pattern
ok &= pattern.nnz() == nnz;
ok &= pattern.nr() == nr;
ok &= pattern.nc() == nc;
for(size_t k = 0; k < nnz; k++)
{ ok &= row[k] == k;
ok &= col[k] == k;
}
// change to sparsity pattern for a 5 by 5 diagonal matrix
nr = 5;
nc = 5;
nnz = 5;
pattern.resize(nr, nc, nnz);
for(size_t k = 0; k < nnz; k++)
{ size_t r = nnz - k - 1; // reverse or row-major order
size_t c = nnz - k - 1;
pattern.set(k, r, c);
}
SizeVector row_major = pattern.row_major();
// check row and column
for(size_t k = 0; k < nnz; k++)
{ ok &= row[ row_major[k] ] == k;
ok &= col[ row_major[k] ] == k;
}
// create an empty pattern
CppAD::sparse_rc<SizeVector> other;
ok &= other.nnz() == 0;
ok &= other.nr() == 0;
ok &= other.nc() == 0;
// now swap other with pattern
pattern.swap(other);
ok &= pattern.nnz() == 0;
ok &= pattern.nr() == 0;
ok &= pattern.nc() == 0;
for(size_t k = 0; k < nnz; k++)
{ ok &= other.row()[k] == nnz - k - 1;
ok &= other.col()[k] == nnz - k - 1;
}
// now use the assignment statement
pattern = other;
ok &= other.nr() == pattern.nr();
ok &= other.nc() == pattern.nc();
ok &= other.nnz() == pattern.nnz();
for(size_t k = 0; k < nnz; k++)
{ ok &= pattern.row()[k] == other.row()[k];
ok &= pattern.col()[k] == other.col()[k];
}
return ok;
}
Input File: example/utility/sparse_rc.cpp