This file is indexed.

/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