Blaze 3.9
sysv.h
Go to the documentation of this file.
1//=================================================================================================
33//=================================================================================================
34
35#ifndef _BLAZE_MATH_LAPACK_SYSV_H_
36#define _BLAZE_MATH_LAPACK_SYSV_H_
37
38
39//*************************************************************************************************
40// Includes
41//*************************************************************************************************
42
43#include <memory>
44#include <blaze/math/Aliases.h>
55#include <blaze/util/Assert.h>
58
59
60namespace blaze {
61
62//=================================================================================================
63//
64// LAPACK SYMMETRIC INDEFINITE LINEAR SYSTEM FUNCTIONS (SYSV)
65//
66//=================================================================================================
67
68//*************************************************************************************************
71template< typename MT, bool SO, typename VT, bool TF >
72void sysv( DenseMatrix<MT,SO>& A, DenseVector<VT,TF>& b, char uplo, blas_int_t* ipiv );
73
74template< typename MT1, bool SO1, typename MT2, bool SO2 >
75void sysv( DenseMatrix<MT1,SO1>& A, DenseMatrix<MT2,SO2>& B, char uplo, blas_int_t* ipiv );
77//*************************************************************************************************
78
79
80//*************************************************************************************************
140template< typename MT // Type of the system matrix
141 , bool SO // Storage order of the system matrix
142 , typename VT // Type of the right-hand side vector
143 , bool TF > // Transpose flag of the right-hand side vector
144inline void sysv( DenseMatrix<MT,SO>& A, DenseVector<VT,TF>& b, char uplo, blas_int_t* ipiv )
145{
151
156
157 using ET = ElementType_t<MT>;
158
159 if( !isSquare( *A ) ) {
160 BLAZE_THROW_INVALID_ARGUMENT( "Invalid non-square matrix provided" );
161 }
162
163 if( (*b).size() != (*A).rows() ) {
164 BLAZE_THROW_INVALID_ARGUMENT( "Invalid right-hand side vector provided" );
165 }
166
167 if( uplo != 'L' && uplo != 'U' ) {
168 BLAZE_THROW_INVALID_ARGUMENT( "Invalid uplo argument provided" );
169 }
170
171 blas_int_t n ( numeric_cast<blas_int_t>( (*A).rows() ) );
172 blas_int_t nrhs( 1 );
173 blas_int_t lda ( numeric_cast<blas_int_t>( (*A).spacing() ) );
174 blas_int_t ldb ( numeric_cast<blas_int_t>( (*b).size() ) );
175 blas_int_t info( 0 );
176
177 if( n == 0 ) {
178 return;
179 }
180
181 if( IsRowMajorMatrix_v<MT> ) {
182 ( uplo == 'L' )?( uplo = 'U' ):( uplo = 'L' );
183 }
184
185 blas_int_t lwork( n*lda );
186 const std::unique_ptr<ET[]> work( new ET[lwork] );
187
188 sysv( uplo, n, nrhs, (*A).data(), lda, ipiv, (*b).data(), ldb, work.get(), lwork, &info );
189
190 BLAZE_INTERNAL_ASSERT( info >= 0, "Invalid function argument" );
191
192 if( info > 0 ) {
193 BLAZE_THROW_LAPACK_ERROR( "Inversion of singular matrix failed" );
194 }
195}
196//*************************************************************************************************
197
198
199//*************************************************************************************************
262template< typename MT1 // Type of the system matrix
263 , bool SO1 // Storage order of the system matrix
264 , typename MT2 // Type of the right-hand side matrix
265 , bool SO2 > // Storage order of the right-hand side matrix
266inline void sysv( DenseMatrix<MT1,SO1>& A, DenseMatrix<MT2,SO2>& B, char uplo, blas_int_t* ipiv )
267{
273
279
280 using ET = ElementType_t<MT1>;
281
282 if( !isSquare( *A ) ) {
283 BLAZE_THROW_INVALID_ARGUMENT( "Invalid non-square matrix provided" );
284 }
285
286 if( uplo != 'L' && uplo != 'U' ) {
287 BLAZE_THROW_INVALID_ARGUMENT( "Invalid uplo argument provided" );
288 }
289
290 blas_int_t n ( numeric_cast<blas_int_t>( (*A).rows() ) );
291 blas_int_t mrhs( numeric_cast<blas_int_t>( SO2 ? (*B).rows() : (*B).columns() ) );
292 blas_int_t nrhs( numeric_cast<blas_int_t>( SO2 ? (*B).columns() : (*B).rows() ) );
293 blas_int_t lda ( numeric_cast<blas_int_t>( (*A).spacing() ) );
294 blas_int_t ldb ( numeric_cast<blas_int_t>( (*B).spacing() ) );
295 blas_int_t info( 0 );
296
297 if( n != mrhs ) {
298 BLAZE_THROW_INVALID_ARGUMENT( "Invalid right-hand side matrix provided" );
299 }
300
301 if( n == 0 ) {
302 return;
303 }
304
305 if( IsRowMajorMatrix_v<MT1> ) {
306 ( uplo == 'L' )?( uplo = 'U' ):( uplo = 'L' );
307 }
308
309 blas_int_t lwork( n*lda );
310 const std::unique_ptr<ET[]> work( new ET[lwork] );
311
312 sysv( uplo, n, nrhs, (*A).data(), lda, ipiv, (*B).data(), ldb, work.get(), lwork, &info );
313
314 BLAZE_INTERNAL_ASSERT( info >= 0, "Invalid function argument" );
315
316 if( info > 0 ) {
317 BLAZE_THROW_RUNTIME_ERROR( "Inversion of singular matrix failed" );
318 }
319}
320//*************************************************************************************************
321
322} // namespace blaze
323
324#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 sysv 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 sysv(DenseMatrix< MT1, SO1 > &A, DenseMatrix< MT2, SO2 > &B, char uplo, blas_int_t *ipiv)
LAPACK kernel for solving a symmetric indefinite linear system of equations ( ).
Definition: sysv.h:266
#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_RUNTIME_ERROR(MESSAGE)
Macro for the emission of a std::runtime_error exception.
Definition: Exception.h:379
#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.