trsv.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_LAPACK_TRSV_H_
36 #define _BLAZE_MATH_LAPACK_TRSV_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
43 #include <boost/cast.hpp>
51 #include <blaze/util/Assert.h>
52 #include <blaze/util/Complex.h>
54 #include <blaze/util/Exception.h>
56 
57 
58 namespace blaze {
59 
60 //=================================================================================================
61 //
62 // LAPACK FORWARD DECLARATIONS
63 //
64 //=================================================================================================
65 
66 //*************************************************************************************************
68 extern "C" {
69 
70 void strsv_( char* uplo, char* trans, char* diag, int* n, float* A, int* lda, float* x, int* incX );
71 void dtrsv_( char* uplo, char* trans, char* diag, int* n, double* A, int* lda, double* x, int* incX );
72 void ctrsv_( char* uplo, char* trans, char* diag, int* n, float* A, int* lda, float* x, int* incX );
73 void ztrsv_( char* uplo, char* trans, char* diag, int* n, double* A, int* lda, double* x, int* incX );
74 
75 }
77 //*************************************************************************************************
78 
79 
80 
81 
82 //=================================================================================================
83 //
84 // LAPACK TRIANGULAR LINEAR SYSTEM FUNCTIONS (TRSV)
85 //
86 //=================================================================================================
87 
88 //*************************************************************************************************
91 inline void trsv( char uplo, char trans, char diag, int n, const float* A,
92  int lda, float* x, int incX );
93 
94 inline void trsv( char uplo, char trans, char diag, int n, const double* A,
95  int lda, double* x, int incX );
96 
97 inline void trsv( char uplo, char trans, char diag, int n, const complex<float>* A,
98  int lda, complex<float>* x, int incX );
99 
100 inline void trsv( char uplo, char trans, char diag, int n, const complex<double>* A,
101  int lda, complex<double>* x, int incX );
102 
103 template< typename MT, bool SO, typename VT, bool TF >
104 inline void trsv( const DenseMatrix<MT,SO>& A, DenseVector<VT,TF>& b,
105  char uplo, char trans, char diag );
107 //*************************************************************************************************
108 
109 
110 //*************************************************************************************************
144 inline void trsv( char uplo, char trans, char diag, int n, const float* A,
145  int lda, float* x, int incX )
146 {
147  strsv_( &uplo, &trans, &diag, &n, const_cast<float*>( A ), &lda, x, &incX );
148 }
149 //*************************************************************************************************
150 
151 
152 //*************************************************************************************************
186 inline void trsv( char uplo, char trans, char diag, int n, const double* A,
187  int lda, double* x, int incX )
188 {
189  dtrsv_( &uplo, &trans, &diag, &n, const_cast<double*>( A ), &lda, x, &incX );
190 }
191 //*************************************************************************************************
192 
193 
194 //*************************************************************************************************
228 inline void trsv( char uplo, char trans, char diag, int n, const complex<float>* A,
229  int lda, complex<float>* x, int incX )
230 {
231  BLAZE_STATIC_ASSERT( sizeof( complex<float> ) == 2UL*sizeof( float ) );
232 
233  ctrsv_( &uplo, &trans, &diag, &n, const_cast<float*>( reinterpret_cast<const float*>( A ) ),
234  &lda, reinterpret_cast<float*>( x ), &incX );
235 }
236 //*************************************************************************************************
237 
238 
239 //*************************************************************************************************
273 inline void trsv( char uplo, char trans, char diag, int n, const complex<double>* A,
274  int lda, complex<double>* x, int incX )
275 {
276  BLAZE_STATIC_ASSERT( sizeof( complex<double> ) == 2UL*sizeof( double ) );
277 
278  ztrsv_( &uplo, &trans, &diag, &n, const_cast<double*>( reinterpret_cast<const double*>( A ) ),
279  &lda, reinterpret_cast<double*>( x ), &incX );
280 }
281 //*************************************************************************************************
282 
283 
284 //*************************************************************************************************
371 template< typename MT // Type of the system matrix
372  , bool SO // Storage order of the system matrix
373  , typename VT // Type of the right-hand side vector
374  , bool TF > // Transpose flag of the right-hand side vector
375 inline void trsv( const DenseMatrix<MT,SO>& A, DenseVector<VT,TF>& b, char uplo, char trans, char diag )
376 {
377  using boost::numeric_cast;
378 
383 
384  if( !isSquare( ~A ) ) {
385  BLAZE_THROW_INVALID_ARGUMENT( "Invalid non-square matrix provided" );
386  }
387 
388  if( uplo != 'L' && uplo != 'U' ) {
389  BLAZE_THROW_INVALID_ARGUMENT( "Invalid uplo argument provided" );
390  }
391 
392  if( trans != 'N' && trans != 'T' && trans != 'C' ) {
393  BLAZE_THROW_INVALID_ARGUMENT( "Invalid trans argument provided" );
394  }
395 
396  if( diag != 'U' && diag != 'N' ) {
397  BLAZE_THROW_INVALID_ARGUMENT( "Invalid diag argument provided" );
398  }
399 
400  int n ( numeric_cast<int>( (~A).rows() ) );
401  int lda ( numeric_cast<int>( (~A).spacing() ) );
402  int incX( 1 );
403 
404  if( n == 0 ) {
405  return;
406  }
407 
409  ( uplo == 'L' )?( uplo = 'U' ):( uplo = 'L' );
410  }
411 
412  trsv( uplo, trans, diag, n, (~A).data(), lda, (~b).data(), incX );
413 }
414 //*************************************************************************************************
415 
416 } // namespace blaze
417 
418 #endif
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exceptionThis macro encapsulates the default way of...
Definition: Exception.h:187
Constraint on the data type.
Data type constraint.
#define BLAZE_CONSTRAINT_MUST_HAVE_MUTABLE_DATA_ACCESS(T)
Constraint on the data type.In case the given data type T does not provide low-level data access to m...
Definition: MutableDataAccess.h:79
BLAZE_ALWAYS_INLINE bool isSquare(const Matrix< MT, SO > &matrix)
Checks if the given matrix is a square matrix.
Definition: Matrix.h:603
#define BLAZE_CONSTRAINT_MUST_NOT_BE_COMPUTATION_TYPE(T)
Constraint on the data type.In case the given data type T is a computational expression (i...
Definition: Computation.h:118
void trsv(char uplo, char trans, char diag, int n, const float *A, int lda, float *x, int incX)
LAPACK kernel for solving a triangular single precision linear system of equations ( )...
Definition: trsv.h:144
BLAZE_ALWAYS_INLINE size_t rows(const Matrix< MT, SO > &matrix)
Returns the current number of rows of the matrix.
Definition: Matrix.h:308
Header file for the DenseVector base class.
Constraint on the data type.
#define BLAZE_CONSTRAINT_MUST_NOT_BE_ADAPTOR_TYPE(T)
Constraint on the data type.In case the given data type T is an adaptor type (as for instance LowerMa...
Definition: Adaptor.h:118
Base class for dense matrices.The DenseMatrix class is a base class for all dense matrix classes...
Definition: DenseMatrix.h:70
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
Compile time assertion.
Compile time check for row-major matrix types.This type trait tests whether or not the given template...
Definition: IsRowMajorMatrix.h:110
Header file for the DenseMatrix base class.
Base class for N-dimensional dense vectors.The DenseVector class is a base class for all arbitrarily ...
Definition: DenseVector.h:70
Type ElementType
Type of the sparse matrix elements.
Definition: CompressedMatrix.h:2586
Constraint on the data type.
Constraint on the data type.
const bool spacing
Adding an additional spacing line between two log messages.This setting gives the opportunity to add ...
Definition: Logging.h:70
Header file for run time assertion macros.
#define BLAZE_CONSTRAINT_MUST_BE_BLAS_COMPATIBLE_TYPE(T)
Constraint on the data type.In case the given data type T is not a BLAS compatible data type (i...
Definition: BlasCompatible.h:79
Header file for the IsRowMajorMatrix type trait.
const DMatTransExpr< MT,!SO > trans(const DenseMatrix< MT, SO > &dm)
Calculation of the transpose of the given dense matrix.
Definition: DMatTransExpr.h:944
Header file for the complex data type.
Header file for exception macros.
#define BLAZE_STATIC_ASSERT(expr)
Compile time assertion macro.In case of an invalid compile time expression, a compilation error is cr...
Definition: StaticAssert.h:143