/*************************************************************************** * blitz/tiny/matvec.h TinyMatrix/TinyVector product metaprogram * * $Id: matvec.h,v 1.1.1.1 1999-04-09 17:59:03 ansari Exp $ * * Copyright (C) 1997,1998 Todd Veldhuizen * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * Suggestions: blitz-suggest@cybervision.com * Bugs: blitz-bugs@cybervision.com * * For more information, please see the Blitz++ Home Page: * http://seurat.uwaterloo.ca/blitz/ * *************************************************************************** * $Log: not supported by cvs2svn $ * Revision 1.3 1998/03/14 00:08:44 tveldhui * 0.2-alpha-05 * * Revision 1.2 1998/03/14 00:04:47 tveldhui * 0.2-alpha-05 * * Revision 1.1 1997/07/16 14:51:20 tveldhui * Update: Alpha release 0.2 (Arrays) * */ #ifndef BZ_META_MATVEC_H #define BZ_META_MATVEC_H #ifndef BZ_BLITZ_H #include #endif #ifndef BZ_VECEXPRWRAP_H #include #endif #ifndef BZ_METAPROG_H #include #endif BZ_NAMESPACE(blitz) // Forward declarations template class _bz_meta_matrixVectorProduct2; template class _bz_tinyMatrixVectorProduct { public: typedef BZ_PROMOTE(T_numtype1, T_numtype2) T_numtype; _bz_tinyMatrixVectorProduct(const _bz_tinyMatrixVectorProduct& z) : matrix_(z.matrix_), vector_(z.vector_) { } _bz_tinyMatrixVectorProduct(const T_numtype1* matrix, const T_numtype2* vector) : matrix_(matrix), vector_(vector) { } T_numtype operator[](unsigned i) const { return _bz_meta_matrixVectorProduct2::f(matrix_, vector_, i); } T_numtype operator()(unsigned i) const { return _bz_meta_matrixVectorProduct2::f(matrix_, vector_, i); } enum { _bz_staticLengthCount = 1, _bz_dynamicLengthCount = 0, _bz_staticLength = N_rows #ifdef BZ_HAVE_COSTS , _bz_costPerEval = 2 * N_columns * costs::memoryAccess + (N_columns-1) * costs::add #endif }; unsigned _bz_suggestLength() const { return N_rows; } _bz_bool _bz_hasFastAccess() const { return _bz_true; } T_numtype _bz_fastAccess(unsigned i) const { return _bz_meta_matrixVectorProduct2::f(matrix_, vector_, i); } unsigned length(unsigned recommendedLength) const { return N_rows; } const T_numtype1* matrix() const { return matrix_; } const T_numtype2* vector() const { return vector_; } protected: const T_numtype1* matrix_; const T_numtype2* vector_; }; template inline _bz_VecExpr<_bz_tinyMatrixVectorProduct > product(const TinyMatrix& matrix, const TinyVector& vector) { typedef _bz_tinyMatrixVectorProduct T_expr; return _bz_VecExpr(T_expr(matrix.data(), vector.data())); } // Template metaprogram for matrix-vector multiplication template class _bz_meta_matrixVectorProduct2 { public: enum { go = J < (N_columns-1) }; template static inline BZ_PROMOTE(T_numtype1, T_numtype2) f(const T_numtype1* matrix, const T_numtype2* vector, int i) { return matrix[i * N_rowStride + J * N_colStride] * vector[J * N_vecStride] + _bz_meta_matrixVectorProduct2 ::f(matrix, vector, i); } }; template<> class _bz_meta_matrixVectorProduct2<0,0,0,0,0,0> { public: static inline _bz_meta_nullOperand f(const void*, const void*, int) { return _bz_meta_nullOperand(); } }; template class _bz_meta_matrixVectorProduct { public: enum { go = I < (N_rows - 1) }; template static inline void f(TinyVector& result, const T_numtype1* matrix, const T_numtype2* vector) { result[I] = _bz_meta_matrixVectorProduct2::f(matrix,vector, I); _bz_meta_matrixVectorProduct ::f(result, matrix, vector); } }; template<> class _bz_meta_matrixVectorProduct<0,0,0,0,0,0> { public: static inline void f(const _bz_tinyBase&, const void*, const void*) { } }; BZ_NAMESPACE_END #endif // BZ_META_MATVEC_H