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