18 #include "lapack/config.h"
20 #if __cplusplus >= 201402 // C++14
22 #define LAPACK_DEPRECATED(msg) [[deprecated(msg)]]
23 #elif defined(_MSC_VER)
25 #define LAPACK_DEPRECATED(msg) __declspec(deprecated(msg))
26 #elif defined(__GNUC__)
28 #define LAPACK_DEPRECATED(msg) __attribute__((deprecated(msg)))
31 #define LAPACK_DEPRECATED(msg)
38 class Error:
public std::exception {
46 Error( std::string
const& msg ):
52 Error(
const char* msg,
const char* func ):
54 msg_( std::string(msg) +
", in function " + func )
58 virtual const char*
what() const noexcept
override
59 {
return msg_.c_str(); }
71 inline void throw_if(
bool cond,
const char* condstr,
const char* func )
74 throw Error( condstr, func );
79 #define LAPACKPP_ATTR_FORMAT(I, F)
81 #define LAPACKPP_ATTR_FORMAT(I, F) __attribute__((format( printf, I, F )))
89 inline void throw_if(
bool cond,
const char* condstr,
const char* func,
const char* format, ... )
90 LAPACKPP_ATTR_FORMAT(4, 5);
92 inline
void throw_if(
bool cond, const
char* condstr, const
char* func, const
char* format, ... )
97 va_start( va, format );
98 vsnprintf( buf,
sizeof(buf), format, va );
99 throw Error( buf, func );
107 inline void abort_if(
bool cond,
const char* func,
const char* format, ... )
108 LAPACKPP_ATTR_FORMAT(3, 4);
110 inline
void abort_if(
bool cond, const
char* func, const
char* format, ... )
115 va_start( va, format );
116 vsnprintf( buf,
sizeof(buf), format, va );
118 fprintf( stderr,
"Error: %s, in function %s\n", buf, func );
123 #undef LAPACKPP_ATTR_FORMAT
129 #if defined(LAPACK_ERROR_NDEBUG) || (defined(LAPACK_ERROR_ASSERT) && defined(NDEBUG))
133 #define lapack_error_if( cond ) \
136 #define lapack_error_if_msg( cond, ... ) \
139 #elif defined(LAPACK_ERROR_ASSERT)
142 #define lapack_error_if( cond ) \
143 lapack::internal::abort_if( cond, __func__, "%s", #cond )
145 #define lapack_error_if_msg( cond, ... ) \
146 lapack::internal::abort_if( cond, __func__, __VA_ARGS__ )
153 #define lapack_error_if( cond ) \
154 lapack::internal::throw_if( cond, #cond, __func__ )
159 #define lapack_error_if_msg( cond, ... ) \
160 lapack::internal::throw_if( cond, #cond, __func__, __VA_ARGS__ )
169 typedef lapack_logical (*lapack_s_select2) (
float const* omega_real,
float const* omega_imag );
170 typedef lapack_logical (*lapack_s_select3) (
float const* alpha_real,
float const* alpha_imag,
float const* beta );
172 typedef lapack_logical (*lapack_d_select2) (
double const* omega_real,
double const* omega_imag );
173 typedef lapack_logical (*lapack_d_select3) (
double const* alpha_real,
double const* alpha_imag,
double const* beta );
175 typedef lapack_logical (*lapack_c_select1) ( std::complex<float>
const* omega );
176 typedef lapack_logical (*lapack_c_select2) ( std::complex<float>
const* alpha, std::complex<float>
const* beta );
178 typedef lapack_logical (*lapack_z_select1) ( std::complex<double>
const* omega );
179 typedef lapack_logical (*lapack_z_select2) ( std::complex<double>
const* alpha, std::complex<double>
const* beta );
182 typedef blas::Layout Layout;
184 typedef blas::Uplo Uplo;
185 typedef blas::Diag Diag;
186 typedef blas::Side Side;
190 enum class Sides : char {
192 Right =
'R', R =
'R',
196 inline char sides2char( Sides sides )
201 inline const char* sides2str( Sides sides )
204 case Sides::Left:
return "left";
205 case Sides::Right:
return "right";
206 case Sides::Both:
return "both";
211 inline Sides char2sides(
char sides )
213 sides = (char) toupper( sides );
214 assert( sides ==
'L' || sides ==
'R' || sides ==
'B' );
215 return Sides( sides );
227 inline char norm2char( lapack::Norm norm )
232 inline lapack::Norm char2norm(
char norm )
234 norm = char( toupper( norm ));
237 else if (norm ==
'E')
239 lapack_error_if( norm !=
'1' && norm !=
'2' && norm !=
'I' &&
240 norm !=
'F' && norm !=
'M' );
241 return lapack::Norm( norm );
244 inline const char* norm2str( lapack::Norm norm )
247 case Norm::One:
return "1";
248 case Norm::Two:
return "2";
249 case Norm::Inf:
return "inf";
250 case Norm::Fro:
return "fro";
251 case Norm::Max:
return "max";
274 inline char job2char( lapack::Job job )
281 inline char job_csd2char( lapack::Job job )
284 case lapack::Job::Vec:
return 'Y';
285 case lapack::Job::UpdateVec:
return 'Y';
286 default:
return char( job );
291 inline char job_comp2char( lapack::Job job )
294 case lapack::Job::Vec:
return 'I';
295 case lapack::Job::UpdateVec:
return 'V';
296 default:
return char( job );
301 inline char job_compu2char( lapack::Job job )
304 case lapack::Job::Vec:
return 'I';
305 case lapack::Job::UpdateVec:
return 'U';
306 default:
return char( job );
311 inline char job_compq2char( lapack::Job job )
314 case lapack::Job::Vec:
return 'I';
315 case lapack::Job::UpdateVec:
return 'Q';
316 default:
return char( job );
321 inline char jobu2char( lapack::Job job )
324 case lapack::Job::Vec:
return 'U';
325 default:
return char( job );
330 inline char jobq2char( lapack::Job job )
333 case lapack::Job::Vec:
return 'Q';
334 default:
return char( job );
339 inline char jobu_gejsv2char( lapack::Job job )
342 case lapack::Job::SomeVec:
return 'U';
343 case lapack::Job::AllVec:
return 'F';
344 default:
return char( job );
349 inline char job_gesvj2char( lapack::Job job )
352 case lapack::Job::SomeVec:
return 'U';
353 case lapack::Job::SomeVecTol:
return 'C';
354 case lapack::Job::UpdateVec:
return 'U';
355 default:
return char( job );
359 inline lapack::Job char2job(
char job )
361 job = char( toupper( job ));
362 lapack_error_if( job !=
'N' && job !=
'V' && job !=
'U' &&
363 job !=
'A' && job !=
'S' && job !=
'O' &&
364 job !=
'P' && job !=
'C' && job !=
'J' &&
366 return lapack::Job( job );
369 inline const char* job2str( lapack::Job job )
372 case lapack::Job::NoVec:
return "novec";
373 case lapack::Job::Vec:
return "vec";
374 case lapack::Job::UpdateVec:
return "update";
376 case lapack::Job::AllVec:
return "all";
377 case lapack::Job::SomeVec:
return "some";
378 case lapack::Job::OverwriteVec:
return "overwrite";
380 case lapack::Job::CompactVec:
return "compact";
381 case lapack::Job::SomeVecTol:
return "sometol";
382 case lapack::Job::VecJacobi:
return "jacobi";
383 case lapack::Job::Workspace:
return "work";
390 enum class JobSchur {
395 inline char jobschur2char( lapack::JobSchur jobschur )
397 return char( jobschur );
400 inline lapack::JobSchur char2jobschur(
char jobschur )
402 jobschur = char( toupper( jobschur ));
403 lapack_error_if( jobschur !=
'E' && jobschur !=
'S' );
404 return lapack::JobSchur( jobschur );
407 inline const char* jobschur2str( lapack::JobSchur jobschur )
410 case lapack::JobSchur::Eigenvalues:
return "eigval";
411 case lapack::JobSchur::Schur:
return "schur";
424 inline char sort2char( lapack::Sort sort )
429 inline lapack::Sort char2sort(
char sort )
431 sort = char( toupper( sort ));
432 lapack_error_if( sort !=
'N' && sort !=
'S' );
433 return lapack::Sort( sort );
436 inline const char* sort2str( lapack::Sort sort )
439 case lapack::Sort::NotSorted:
return "not-sorted";
440 case lapack::Sort::Sorted:
return "sorted";
453 inline char range2char( lapack::Range range )
455 return char( range );
458 inline lapack::Range char2range(
char range )
460 range = char( toupper( range ));
461 lapack_error_if( range !=
'A' && range !=
'V' && range !=
'I' );
462 return lapack::Range( range );
465 inline const char* range2str( lapack::Range range )
468 case lapack::Range::All:
return "all";
469 case lapack::Range::Value:
return "value";
470 case lapack::Range::Index:
return "index";
483 inline char vect2char( lapack::Vect vect )
488 inline lapack::Vect char2vect(
char vect )
490 vect = char( toupper( vect ));
491 lapack_error_if( vect !=
'Q' && vect !=
'P' && vect !=
'N' && vect !=
'B' );
492 return lapack::Vect( vect );
495 inline const char* vect2str( lapack::Vect vect )
498 case lapack::Vect::P:
return "p";
499 case lapack::Vect::Q:
return "q";
500 case lapack::Vect::None:
return "none";
501 case lapack::Vect::Both:
return "both";
508 enum class Direction {
513 inline char direction2char( lapack::Direction direction )
515 return char( direction );
518 inline lapack::Direction char2direction(
char direction )
520 direction = char( toupper( direction ));
521 lapack_error_if( direction !=
'F' && direction !=
'B' );
522 return lapack::Direction( direction );
525 inline const char* direction2str( lapack::Direction direction )
528 case lapack::Direction::Forward:
return "forward";
529 case lapack::Direction::Backward:
return "backward";
535 LAPACK_DEPRECATED(
"Direct replaced with Direction")
536 typedef Direction Direct;
538 LAPACK_DEPRECATED("direct2char replaced with direction2char")
539 inline
char direct2char( lapack::Direction direction )
541 return direction2char( direction );
544 LAPACK_DEPRECATED(
"direct2str replaced with direction2str")
545 inline const
char* direct2str( lapack::Direction direction )
547 return direction2str( direction );
550 LAPACK_DEPRECATED(
"char2direct replaced with char2direction")
551 inline lapack::Direction char2direct(
char direction )
553 return char2direction( direction );
563 inline char storev2char( lapack::StoreV storev )
565 return char( storev );
568 inline lapack::StoreV char2storev(
char storev )
570 storev = char( toupper( storev ));
571 lapack_error_if( storev !=
'C' && storev !=
'R' );
572 return lapack::StoreV( storev );
575 inline const char* storev2str( lapack::StoreV storev )
578 case lapack::StoreV::Columnwise:
return "colwise";
579 case lapack::StoreV::Rowwise:
return "rowwise";
586 enum class MatrixType {
596 inline char matrixtype2char( lapack::MatrixType type )
601 inline lapack::MatrixType char2matrixtype(
char type )
603 type = char( toupper( type ));
604 lapack_error_if( type !=
'G' && type !=
'L' && type !=
'U' &&
605 type !=
'H' && type !=
'B' && type !=
'Q' && type !=
'Z' );
606 return lapack::MatrixType( type );
609 inline const char* matrixtype2str( lapack::MatrixType type )
612 case lapack::MatrixType::General:
return "general";
613 case lapack::MatrixType::Lower:
return "lower";
614 case lapack::MatrixType::Upper:
return "upper";
615 case lapack::MatrixType::Hessenberg:
return "hessenberg";
616 case lapack::MatrixType::LowerBand:
return "band-lower";
617 case lapack::MatrixType::UpperBand:
return "q-band-upper";
618 case lapack::MatrixType::Band:
return "z-band";
631 inline char howmany2char( lapack::HowMany howmany )
633 return char( howmany );
636 inline lapack::HowMany char2howmany(
char howmany )
638 howmany = char( toupper( howmany ));
639 lapack_error_if( howmany !=
'A' && howmany !=
'B' && howmany !=
'S' );
640 return lapack::HowMany( howmany );
643 inline const char* howmany2str( lapack::HowMany howmany )
646 case lapack::HowMany::All:
return "all";
647 case lapack::HowMany::Backtransform:
return "backtransform";
648 case lapack::HowMany::Select:
return "select";
663 inline char equed2char( lapack::Equed equed )
665 return char( equed );
668 inline lapack::Equed char2equed(
char equed )
670 equed = char( toupper( equed ));
671 lapack_error_if( equed !=
'N' && equed !=
'R' && equed !=
'C' &&
672 equed !=
'B' && equed !=
'Y' );
673 return lapack::Equed( equed );
676 inline const char* equed2str( lapack::Equed equed )
679 case lapack::Equed::None:
return "none";
680 case lapack::Equed::Row:
return "row";
681 case lapack::Equed::Col:
return "col";
682 case lapack::Equed::Both:
return "both";
683 case lapack::Equed::Yes:
return "yes";
691 enum class Factored {
697 inline char factored2char( lapack::Factored factored )
699 return char( factored );
702 inline lapack::Factored char2factored(
char factored )
704 factored = char( toupper( factored ));
705 lapack_error_if( factored !=
'F' && factored !=
'N' && factored !=
'E' );
706 return lapack::Factored( factored );
709 inline const char* factored2str( lapack::Factored factored )
712 case lapack::Factored::Factored:
return "factored";
713 case lapack::Factored::NotFactored:
return "notfactored";
714 case lapack::Factored::Equilibrate:
return "equilibrate";
728 inline char sense2char( lapack::Sense sense )
730 return char( sense );
733 inline lapack::Sense char2sense(
char sense )
735 sense = char( toupper( sense ));
736 lapack_error_if( sense !=
'N' && sense !=
'E' && sense !=
'V' &&
738 return lapack::Sense( sense );
741 inline const char* sense2str( lapack::Sense sense )
744 case lapack::Sense::None:
return "none";
745 case lapack::Sense::Eigenvalues:
return "eigval";
746 case lapack::Sense::Subspace:
return "subspace";
747 case lapack::Sense::Both:
return "both";
756 LeftSingularVec =
'L',
757 RightSingularVec =
'R',
760 inline char jobcond2char( lapack::JobCond jobcond )
762 return char( jobcond );
765 inline lapack::JobCond char2jobcond(
char jobcond )
767 jobcond = char( toupper( jobcond ));
768 lapack_error_if( jobcond !=
'N' && jobcond !=
'E' && jobcond !=
'V' &&
770 return lapack::JobCond( jobcond );
773 inline const char* jobcond2str( lapack::JobCond jobcond )
776 case lapack::JobCond::EigenVec:
return "eigvec";
777 case lapack::JobCond::LeftSingularVec:
return "left";
778 case lapack::JobCond::RightSingularVec:
return "right";
792 inline char balance2char( lapack::Balance balance )
794 return char( balance );
797 inline lapack::Balance char2balance(
char balance )
799 balance = char( toupper( balance ));
800 lapack_error_if( balance !=
'N' && balance !=
'P' && balance !=
'S' &&
802 return lapack::Balance( balance );
805 inline const char* balance2str( lapack::Balance balance )
808 case lapack::Balance::None:
return "none";
809 case lapack::Balance::Permute:
return "permute";
810 case lapack::Balance::Scale:
return "scale";
811 case lapack::Balance::Both:
return "both";
823 inline char order2char( lapack::Order order )
825 return char( order );
828 inline lapack::Order char2order(
char order )
830 order = char( toupper( order ));
831 lapack_error_if( order !=
'B' && order !=
'E' );
832 return lapack::Order( order );
835 inline const char* order2str( lapack::Order order )
838 case lapack::Order::Block:
return "block";
839 case lapack::Order::Entire:
return "entire";
851 inline char rowcol2char( lapack::RowCol rowcol )
853 return char( rowcol );
856 inline lapack::RowCol char2rowcol(
char rowcol )
858 rowcol = char( toupper( rowcol ));
859 lapack_error_if( rowcol !=
'C' && rowcol !=
'R' );
860 return lapack::RowCol( rowcol );
863 inline const char* rowcol2str( lapack::RowCol rowcol )
866 case lapack::RowCol::Col:
return "col";
867 case lapack::RowCol::Row:
return "row";
874 #endif // LAPACK_UTIL_HH