This file is indexed.

/usr/include/trilinos/AbstractLinAlgPack_MatrixVectorTemplateOpDef.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
// @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
//
// Definitions of template functions declared in AbstractLinAlgPack_MatrixVectorTemplateOp.hpp.

#ifndef MATRIX_VECTOR_TEMPLATE_OP_DEF_H
#define MATRIX_VECTOR_TEMPLATE_OP_DEF_H

#include "AbstractLinAlgPack_MatrixVectorTemplateOp.hpp"
#include "DenseLinAlgPack_DMatrixClass.hpp"

// ///////////////////////////////////
// Matrix assignment

namespace {
// Typedef for vector returning functions (row or col but not diagonal)
typedef AbstractLinAlgPack::DVectorSlice (AbstractLinAlgPack::DMatrixSlice::*Pvec_func)
  (AbstractLinAlgPack::DMatrixSlice::size_type);
// Implement sparse matrix, dense matrix assignment.  Sizes are not checked.
template<class T_Matrix>
void imp_assign(AbstractLinAlgPack::DMatrixSlice& gms_lhs, const T_Matrix& gm_rhs
  , BLAS_Cpp::Transp trans_rhs)
{
  // If trans, then copy col into row, otherwise copy col into col.
  Pvec_func vec_func;
  if(trans_rhs == BLAS_Cpp::no_trans)		vec_func = &AbstractLinAlgPack::DMatrixSlice::col;
  else									vec_func = &AbstractLinAlgPack::DMatrixSlice::row;
  for(int k = 1; k <= gm_rhs.cols(); ++k)
    AbstractLinAlgPack::assign((gms_lhs.*vec_func)(k), gm_rhs.col(k));
}
} // end namespace

// Definitions of template functions for matrix-matrix assignment

/// gm_lhs = T_M (templated matrix type T_M)
template<class T_Matrix>
void AbstractLinAlgPack::assign(DMatrix& gm_lhs, const T_Matrix& gm_rhs
  , BLAS_Cpp::Transp trans_rhs)
{
  DenseLinAlgPack::resize_gm_lhs(gm_lhs,gm_rhs.rows(),gm_rhs.cols(),trans_rhs);
  DMatrixSlice gms_lhs = gm_lhs;
  imp_assign(gms_lhs,gm_rhs,trans_rhs);
}

/// gms_lhs = T_M (templated matrix type T_M)
template<class T_Matrix>
void AbstractLinAlgPack::assign(DMatrixSlice& gms_lhs, const T_Matrix& gm_rhs
  , BLAS_Cpp::Transp trans_rhs)
{
  DenseLinAlgPack::assert_gms_lhs(gms_lhs,gm_rhs.rows(),gm_rhs.cols(),trans_rhs);
  imp_assign(gms_lhs,gm_rhs,trans_rhs);
}

// //////////////////////////////////
// Matrix-DVector multiplication

namespace {
// Throw an exeption of the rhs arguments do not match
template<class T_Matrix>
void imp_assert_V_MtV_rhs_sizes(const T_Matrix& gm_rhs1, BLAS_Cpp::Transp trans_rhs1
  , const AbstractLinAlgPack::DVectorSlice& vs_rhs2)
{
  typename T_Matrix::size_type
    cols = (trans_rhs1 == BLAS_Cpp::no_trans) ? gm_rhs1.cols() : gm_rhs1.rows();

  if(cols != vs_rhs2.size())
    throw std::length_error("V_MtV: The sizes of the rhs expression do not match");
}

// Implementation of matrix-vector multiply (no transpose).  Sizes are not checked.
template<class T_Matrix>
void imp_V_MtV_no_trans(AbstractLinAlgPack::DVectorSlice& vs_lhs, const T_Matrix& gm_rhs1
  , const AbstractLinAlgPack::DVectorSlice& vs_rhs2)
{
  typedef typename T_Matrix::size_type size_type;
  size_type rows = gm_rhs1.rows();
  AbstractLinAlgPack::DVectorSlice::iterator itr_v_lhs = vs_lhs.begin();
  for(size_type i = 1; i <= rows; ++i)
    *itr_v_lhs++ = AbstractLinAlgPack::dot(vs_rhs2,gm_rhs1.row(i));
}
// Implementation of matrix-vector multiply (transpose).  Sizes are not checked.
template<class T_Matrix>
void imp_V_MtV_trans(AbstractLinAlgPack::DVectorSlice& vs_lhs, const T_Matrix& gm_rhs1
  , const AbstractLinAlgPack::DVectorSlice& vs_rhs2)
{
  typedef typename T_Matrix::size_type size_type;
  size_type cols = gm_rhs1.cols();
  AbstractLinAlgPack::DVectorSlice::iterator itr_v_lhs = vs_lhs.begin();
  for(size_type j = 1; j <= cols; ++j)
    *itr_v_lhs++ = AbstractLinAlgPack::dot(vs_rhs2,gm_rhs1.col(j));
}

} // end namespace

// Definitions of template functions for matrix-vector multiplication

template<class T_Matrix>
void AbstractLinAlgPack::V_MtV(DVector& v_lhs, const T_Matrix& gm_rhs1, BLAS_Cpp::Transp trans_rhs1
  , const DVectorSlice& vs_rhs2)
{
  imp_assert_V_MtV_rhs_sizes(gm_rhs1,trans_rhs1,vs_rhs2);
  v_lhs.resize( (trans_rhs1==BLAS_Cpp::no_trans) ? gm_rhs1.rows() : gm_rhs1.cols() );
  DVectorSlice vs_lhs = v_lhs;
  if(trans_rhs1 == BLAS_Cpp::no_trans)
    imp_V_MtV_no_trans(vs_lhs,gm_rhs1,vs_rhs2);
  else
    imp_V_MtV_trans(vs_lhs,gm_rhs1,vs_rhs2);
}

template<class T_Matrix>
void AbstractLinAlgPack::V_MtV(DVectorSlice& v_lhs, const T_Matrix& gm_rhs1, BLAS_Cpp::Transp trans_rhs1
  , const DVectorSlice& vs_rhs2)
{
  imp_assert_V_MtV_rhs_sizes(gm_rhs1,trans_rhs1,vs_rhs2);
  DenseLinAlgPack::assert_resize_vs_lhs(v_lhs, (trans_rhs1==BLAS_Cpp::no_trans) ? gm_rhs1.rows() : gm_rhs1.cols());
  if(trans_rhs1 == BLAS_Cpp::no_trans)
    imp_V_MtV_no_trans(v_lhs,gm_rhs1,vs_rhs2);
  else
    imp_V_MtV_trans(v_lhs,gm_rhs1,vs_rhs2);
}

#endif // MATRIX_VECTOR_TEMPLATE_OP_DEF_H