/usr/include/trilinos/AbstractLinAlgPack_SparseVectorOpDecl.hpp is in libtrilinos-dev 10.4.0.dfsg-1ubuntu2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 | // @HEADER
// ***********************************************************************
//
// Moocho: Multi-functional Object-Oriented arCHitecture for Optimization
// Copyright (2003) Sandia Corporation
//
// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
// license for use of this work by or on behalf of the U.S. Government.
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
// USA
// Questions? Contact Roscoe A. Bartlett (rabartl@sandia.gov)
//
// ***********************************************************************
// @HEADER
//
// Declarations for sparse vector operations.
//
#ifndef SPARSE_VECTOR_OP_DECL_H
#define SPARSE_VECTOR_OP_DECL_H
#include "DenseLinAlgPack_DMatrixAsTriSym.hpp"
namespace AbstractLinAlgPack {
/** @name Template operations for sparse vectors.
*
* These functions implement level 1 and 2 BLAS like
* linear algebra operations on unsorted sparse
* vectors. These templated sparse vector objects
* give information about the sparse vector (size, nonzeros etc.)
* and give access to the sparse elements as iterators.
* The iterators yield sparse elements that give the elements
* indice in the full vector and its value.
*
* The specification for these interfaces is as follows:
*
\begin{verbatim}
class SparseElementTemplateInterface {
public:
typedef .... value_type;
typedef .... indice_type;
value_type& value();
value_type value() const;
indice_type indice() const;
};
class SparseVectorTemplateInterface {
public:
typedef ... difference_type;
typedef ... element_type; // SparseElementTemplateInterface compliant
typedef ... iterator; // *(iter) yields a element_type
typedef ... const_iterator; // *(iter) yields a const element_type
typedef ... reverse_iterator; // *(iter) yields a element_type
typedef ... const_reverse_iterator; // *(iter) yields a const element_type
// Information
size_type size() const; // size of the full vector
size_type nz() const; // number of nonzero elements
difference_type offset() const; // ith real real indice = begin()[i-1] + offset()
bool is_sorted() const; // true if elements are sorted by indice
// iterate forward (sorted) through elemlents
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
// iterate backward (sorted) through elemlents
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;
};
/end{verbatim}
*
* In all of these functions where we have some operation that yields a dense vector
* being added to another function such as:
*
* v_lhs = operation + vs_rhs2
*
* it is allowed that v_lhs.overlap(vs_rhs2) == SAME_MEM. In this case no unnecesary
* operations will be performed. Also, it is up the the user to ensure that
* there is not an alias problem where if v_lhs is the same as vs_rhs2 and vs_rhs2
* is also used in the operation. This has undefined results. If a future version
* of the library this may be handeled but for now it is not.
*
* These operations use the same nameing convensions as those for DVector and
* DVectorSlice in DenseLinAlgPack with the acception that the sparse vectors
* are given the tag #SV# instead of #V# so as to not destroy the intended
* behavior of the operations in DenseLinAlgPack and the implicit conversion of
* a DVector to a DVectorSlice.
*
* It should be noted that these operations will be more efficient for large
* dense vectors and sparse vectors with many nonzero elements if the sparse
* elements are sorted by indice. This is because in many operations the elements of the
* dense vectors are accessed using random access and this could cause
* virtual page thrashing if the nonzero sparse elements are not sorted.
*/
//@{
/// result = dot(vs_rhs1,sv_rhs2) (BLAS xDOT)
template<class T_SpVec>
value_type dot_V_SV(const DVectorSlice& vs_rhs1, const T_SpVec& sv_rhs2);
/// result = dot(sv_rhs1,vs_rhs2) (BLAS xDOT)
template<class T_SpVec>
value_type dot_SV_V(const T_SpVec& sv_rhs1, const DVectorSlice& vs_rhs2);
/// result = ||sv_rhs||1 (BLAS xASUM)
template<class T_SpVec>
value_type norm_1_SV(const T_SpVec& sv_rhs);
/// result = ||sv_rhs||2 (BLAS xNRM2)
template<class T_SpVec>
value_type norm_2_SV(const T_SpVec& sv_rhs);
/// result = ||sv_rhs||inf (BLAS IxAMAX)
template<class T_SpVec>
value_type norm_inf_SV(const T_SpVec& sv_rhs);
/// result = max(sv_rhs)
template<class T_SpVec>
value_type max_SV(const T_SpVec& sv_rhs);
/// result = min(sv_rhs)
template<class T_SpVec>
value_type min_SV(const T_SpVec& sv_rhs);
/// sv_lhs *= alpha (BLAS xSCAL)
template<class T_SpVec>
void Vt_S( T_SpVec* sv_lhs, value_type alpha );
/// vs_lhs += alpha * sv_rhs (BLAS xAXPY)
template<class T_SpVec>
void Vp_StSV(DVectorSlice* vs_lhs, value_type alpha, const T_SpVec& sv_rhs);
/// vs_lhs += alpha * op(gms_rhs1) * sv_rhs2 (BLAS xGEMV)
template<class T_SpVec>
void Vp_StMtSV(DVectorSlice* vs_lhs, value_type alpha, const DMatrixSlice& gms_rhs1
, BLAS_Cpp::Transp trans_rhs1, const T_SpVec& sv_rhs2);
/// vs_lhs += alpha * op(tri_gms_rhs1) * sv_rhs2 (BLAS xTRMV)
template<class T_SpVec>
void Vp_StMtSV(DVectorSlice* vs_lhs, value_type alpha, const DMatrixSliceTri& tri_rhs1
, BLAS_Cpp::Transp trans_rhs1, const T_SpVec& sv_rhs2);
/// vs_lhs += alpha * op(sym_gms_rhs1) * sv_rhs2 (BLAS xSYMV)
template<class T_SpVec>
void Vp_StMtSV(DVectorSlice* vs_lhs, value_type alpha, const DMatrixSliceSym& sym_rhs1
, BLAS_Cpp::Transp trans_rhs1, const T_SpVec& sv_rhs2);
//@}
} // end namespace AbstractLinAlgPack
#endif // SPARSE_VECTOR_OP_DECL_H
|