Blaze 3.9
posv.h
Go to the documentation of this file.
1//=================================================================================================
33//=================================================================================================
34
35#ifndef _BLAZE_MATH_LAPACK_POSV_H_
36#define _BLAZE_MATH_LAPACK_POSV_H_
37
38
39//*************************************************************************************************
40// Includes
41//*************************************************************************************************
42
43#include <blaze/math/Aliases.h>
54#include <blaze/util/Assert.h>
57
58
59namespace blaze {
60
61//=================================================================================================
62//
63// LAPACK POSITIVE DEFINITE LINEAR SYSTEM FUNCTIONS (POSV)
64//
65//=================================================================================================
66
67//*************************************************************************************************
70template< typename MT, bool SO, typename VT, bool TF >
71void posv( DenseMatrix<MT,SO>& A, DenseVector<VT,TF>& b, char uplo );
72
73template< typename MT1, bool SO1, typename MT2, bool SO2 >
74void posv( DenseMatrix<MT1,SO1>& A, DenseMatrix<MT2,SO2>& B, char uplo );
76//*************************************************************************************************
77
78
79//*************************************************************************************************
137template< typename MT // Type of the system matrix
138 , bool SO // Storage order of the system matrix
139 , typename VT // Type of the right-hand side vector
140 , bool TF > // Transpose flag of the right-hand side vector
141inline void posv( DenseMatrix<MT,SO>& A, DenseVector<VT,TF>& b, char uplo )
142{
148
153
154 if( !isSquare( *A ) ) {
155 BLAZE_THROW_INVALID_ARGUMENT( "Invalid non-square matrix provided" );
156 }
157
158 if( (*b).size() != (*A).rows() ) {
159 BLAZE_THROW_INVALID_ARGUMENT( "Invalid right-hand side vector provided" );
160 }
161
162 if( uplo != 'L' && uplo != 'U' ) {
163 BLAZE_THROW_INVALID_ARGUMENT( "Invalid uplo argument provided" );
164 }
165
166 blas_int_t n ( numeric_cast<blas_int_t>( (*A).rows() ) );
167 blas_int_t nrhs( 1 );
168 blas_int_t lda ( numeric_cast<blas_int_t>( (*A).spacing() ) );
169 blas_int_t ldb ( numeric_cast<blas_int_t>( (*b).size() ) );
170 blas_int_t info( 0 );
171
172 if( n == 0 ) {
173 return;
174 }
175
176 if( IsRowMajorMatrix_v<MT> ) {
177 ( uplo == 'L' )?( uplo = 'U' ):( uplo = 'L' );
178 }
179
180 posv( uplo, n, nrhs, (*A).data(), lda, (*b).data(), ldb, &info );
181
182 BLAZE_INTERNAL_ASSERT( info >= 0, "Invalid function argument" );
183
184 if( info > 0 ) {
185 BLAZE_THROW_LAPACK_ERROR( "Inversion of singular matrix failed" );
186 }
187}
188//*************************************************************************************************
189
190
191//*************************************************************************************************
252template< typename MT1 // Type of the system matrix
253 , bool SO1 // Storage order of the system matrix
254 , typename MT2 // Type of the right-hand side matrix
255 , bool SO2 > // Storage order of the right-hand side matrix
256inline void posv( DenseMatrix<MT1,SO1>& A, DenseMatrix<MT2,SO2>& B, char uplo )
257{
263
269
270 if( !isSquare( *A ) ) {
271 BLAZE_THROW_INVALID_ARGUMENT( "Invalid non-square matrix provided" );
272 }
273
274 if( uplo != 'L' && uplo != 'U' ) {
275 BLAZE_THROW_INVALID_ARGUMENT( "Invalid uplo argument provided" );
276 }
277
278 blas_int_t n ( numeric_cast<blas_int_t>( (*A).rows() ) );
279 blas_int_t mrhs( numeric_cast<blas_int_t>( SO2 ? (*B).rows() : (*B).columns() ) );
280 blas_int_t nrhs( numeric_cast<blas_int_t>( SO2 ? (*B).columns() : (*B).rows() ) );
281 blas_int_t lda ( numeric_cast<blas_int_t>( (*A).spacing() ) );
282 blas_int_t ldb ( numeric_cast<blas_int_t>( (*B).spacing() ) );
283 blas_int_t info( 0 );
284
285 if( n != mrhs ) {
286 BLAZE_THROW_INVALID_ARGUMENT( "Invalid right-hand side matrix provided" );
287 }
288
289 if( n == 0 ) {
290 return;
291 }
292
293 if( IsRowMajorMatrix_v<MT1> ) {
294 ( uplo == 'L' )?( uplo = 'U' ):( uplo = 'L' );
295 }
296
297 posv( uplo, n, nrhs, (*A).data(), lda, (*B).data(), ldb, &info );
298
299 BLAZE_INTERNAL_ASSERT( info >= 0, "Invalid function argument" );
300
301 if( info > 0 ) {
302 BLAZE_THROW_LAPACK_ERROR( "Inversion of singular matrix failed" );
303 }
304}
305//*************************************************************************************************
306
307} // namespace blaze
308
309#endif
Constraint on the data type.
Header file for auxiliary alias declarations.
typename T::ElementType ElementType_t
Alias declaration for nested ElementType type definitions.
Definition: Aliases.h:190
Header file for run time assertion macros.
Constraint on the data type.
Constraint on the data type.
Header file for the IsRowMajorMatrix type trait.
Constraint on the data type.
Cast operators for numeric types.
Data type constraint.
Header file for the CLAPACK posv wrapper functions.
Base class for dense matrices.
Definition: DenseMatrix.h:82
Base class for N-dimensional dense vectors.
Definition: DenseVector.h:77
Constraint on the data type.
Header file for the DenseMatrix base class.
Header file for the DenseVector base class.
#define BLAZE_CONSTRAINT_MUST_BE_SAME_TYPE(A, B)
Data type constraint.
Definition: SameType.h:71
void posv(DenseMatrix< MT1, SO1 > &A, DenseMatrix< MT2, SO2 > &B, char uplo)
LAPACK kernel for solving a positive definite linear system of equations ( ).
Definition: posv.h:256
#define BLAZE_CONSTRAINT_MUST_BE_BLAS_COMPATIBLE_TYPE(T)
Constraint on the data type.
Definition: BLASCompatible.h:61
#define BLAZE_CONSTRAINT_MUST_BE_CONTIGUOUS_TYPE(T)
Constraint on the data type.
Definition: Contiguous.h:61
#define BLAZE_CONSTRAINT_MUST_NOT_BE_COMPUTATION_TYPE(T)
Constraint on the data type.
Definition: Computation.h:81
#define BLAZE_CONSTRAINT_MUST_NOT_BE_ADAPTOR_TYPE(T)
Constraint on the data type.
Definition: Adaptor.h:81
#define BLAZE_CONSTRAINT_MUST_HAVE_MUTABLE_DATA_ACCESS(T)
Constraint on the data type.
Definition: MutableDataAccess.h:61
int32_t blas_int_t
Signed integer type used in the BLAS/LAPACK wrapper functions.
Definition: Types.h:64
#define BLAZE_THROW_LAPACK_ERROR(MESSAGE)
Macro for the emission of an exception on detection of a LAPACK error.
Definition: Exception.h:146
bool isSquare(const Matrix< MT, SO > &matrix) noexcept
Checks if the given matrix is a square matrix.
Definition: Matrix.h:1383
#define BLAZE_INTERNAL_ASSERT(expr, msg)
Run time assertion macro for internal checks.
Definition: Assert.h:101
#define BLAZE_THROW_INVALID_ARGUMENT(MESSAGE)
Macro for the emission of a std::invalid_argument exception.
Definition: Exception.h:235
Header file for the exception macros of the math module.