/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
|