|
Prev
| Next
|
|
|
|
|
|
sparse_rcv.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}} }@)@
This is cppad-20221105 documentation. Here is a link to its
current documentation
.
sparse_rcv: Example and Test
# include <cppad/utility/sparse_rcv.hpp>
# include <vector>
bool sparse_rcv(void)
{ bool ok = true;
typedef std::vector<size_t> SizeVector;
typedef std::vector<double> ValueVector;
// sparsity pattern for a 5 by 5 diagonal matrix
size_t nr = 5;
size_t nc = 5;
size_t nnz = 5;
CppAD::sparse_rc<SizeVector> pattern(nr, nc, nnz);
for(size_t k = 0; k < nnz; k++)
{ size_t r = nnz - k - 1; // reverse or column-major order
size_t c = nnz - k - 1;
pattern.set(k, r, c);
}
// sparse matrix
CppAD::sparse_rcv<SizeVector, ValueVector> matrix(pattern);
for(size_t k = 0; k < nnz; k++)
{ double v = double(k);
matrix.set(nnz - k - 1, v);
}
// row, column, and value vectors
const SizeVector& row( matrix.row() );
const SizeVector& col( matrix.row() );
const ValueVector& val( matrix.val() );
SizeVector col_major = matrix.col_major();
// check row, column, and value
for(size_t k = 0; k < nnz; k++)
{ ok &= row[ col_major[k] ] == k;
ok &= col[ col_major[k] ] == k;
ok &= val[ col_major[k] ] == double(k);
}
// pat
const CppAD::sparse_rc<SizeVector> pat( matrix.pat() );
ok &= nnz == pat.nnz();
ok &= nr == pat.nr();
ok &= nc == pat.nc();
for(size_t k = 0; k < nnz; k++)
{ ok &= row[k] == pat.row()[k];
ok &= col[k] == pat.col()[k];
}
// create an empty matrix
CppAD::sparse_rcv<SizeVector, ValueVector> other;
ok &= other.nnz() == 0;
ok &= other.nr() == 0;
ok &= other.nc() == 0;
// now swap other with matrix
matrix.swap(other);
ok &= matrix.nnz() == 0;
ok &= matrix.nr() == 0;
ok &= matrix.nc() == 0;
for(size_t k = 0; k < nnz; k++)
{ ok &= other.row()[ col_major[k] ] == k;
ok &= other.col()[ col_major[k] ] == k;
ok &= other.val()[ col_major[k] ] == double(k);
}
// now use the assignment statement
matrix = other;
ok &= other.nr() == matrix.nr();
ok &= other.nc() == matrix.nc();
ok &= other.nnz() == matrix.nnz();
for(size_t k = 0; k < nnz; k++)
{ ok &= matrix.row()[k] == other.row()[k];
ok &= matrix.col()[k] == other.col()[k];
ok &= matrix.val()[k] == other.val()[k];
}
// now use the copy constructor
CppAD::sparse_rcv<SizeVector, ValueVector> copy(matrix);
ok &= copy.nr() == matrix.nr();
ok &= copy.nc() == matrix.nc();
ok &= copy.nnz() == matrix.nnz();
for(size_t k = 0; k < nnz; k++)
{ ok &= matrix.row()[k] == copy.row()[k];
ok &= matrix.col()[k] == copy.col()[k];
ok &= matrix.val()[k] == copy.val()[k];
}
return ok;
}
Input File: example/utility/sparse_rcv.cpp