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 );
83 inline void throw_if(
bool cond,
const char* condstr,
const char* func,
const char* format, ... )
84 __attribute__((format( printf, 4, 5 )));
86 inline
void throw_if(
bool cond, const
char* condstr, const
char* func, const
char* format, ... )
91 va_start( va, format );
92 vsnprintf( buf,
sizeof(buf), format, va );
93 throw Error( buf, func );
101 inline void abort_if(
bool cond,
const char* func,
const char* format, ... )
102 __attribute__((format( printf, 3, 4 )));
104 inline
void abort_if(
bool cond, const
char* func, const
char* format, ... )
109 va_start( va, format );
110 vsnprintf( buf,
sizeof(buf), format, va );
112 fprintf( stderr,
"Error: %s, in function %s\n", buf, func );
121 #if defined(LAPACK_ERROR_NDEBUG) || (defined(LAPACK_ERROR_ASSERT) && defined(NDEBUG))
125 #define lapack_error_if( cond ) \
128 #define lapack_error_if_msg( cond, ... ) \
131 #elif defined(LAPACK_ERROR_ASSERT)
134 #define lapack_error_if( cond ) \
135 lapack::internal::abort_if( cond, __func__, "%s", #cond )
137 #define lapack_error_if_msg( cond, ... ) \
138 lapack::internal::abort_if( cond, __func__, __VA_ARGS__ )
145 #define lapack_error_if( cond ) \
146 lapack::internal::throw_if( cond, #cond, __func__ )
151 #define lapack_error_if_msg( cond, ... ) \
152 lapack::internal::throw_if( cond, #cond, __func__, __VA_ARGS__ )
161 typedef lapack_logical (*lapack_s_select2) (
float const* omega_real,
float const* omega_imag );
162 typedef lapack_logical (*lapack_s_select3) (
float const* alpha_real,
float const* alpha_imag,
float const* beta );
164 typedef lapack_logical (*lapack_d_select2) (
double const* omega_real,
double const* omega_imag );
165 typedef lapack_logical (*lapack_d_select3) (
double const* alpha_real,
double const* alpha_imag,
double const* beta );
167 typedef lapack_logical (*lapack_c_select1) ( std::complex<float>
const* omega );
168 typedef lapack_logical (*lapack_c_select2) ( std::complex<float>
const* alpha, std::complex<float>
const* beta );
170 typedef lapack_logical (*lapack_z_select1) ( std::complex<double>
const* omega );
171 typedef lapack_logical (*lapack_z_select2) ( std::complex<double>
const* alpha, std::complex<double>
const* beta );
174 typedef blas::Layout Layout;
176 typedef blas::Uplo Uplo;
177 typedef blas::Diag Diag;
178 typedef blas::Side Side;
182 enum class Sides : char {
184 Right =
'R', R =
'R',
188 inline char sides2char( Sides sides )
193 inline const char* sides2str( Sides sides )
196 case Sides::Left:
return "left";
197 case Sides::Right:
return "right";
198 case Sides::Both:
return "both";
203 inline Sides char2sides(
char sides )
205 sides = (char) toupper( sides );
206 assert( sides ==
'L' || sides ==
'R' || sides ==
'B' );
207 return Sides( sides );
219 inline char norm2char( lapack::Norm norm )
224 inline lapack::Norm char2norm(
char norm )
226 norm = char( toupper( norm ));
229 else if (norm ==
'E')
231 lapack_error_if( norm !=
'1' && norm !=
'2' && norm !=
'I' &&
232 norm !=
'F' && norm !=
'M' );
233 return lapack::Norm( norm );
236 inline const char* norm2str( lapack::Norm norm )
239 case Norm::One:
return "1";
240 case Norm::Two:
return "2";
241 case Norm::Inf:
return "inf";
242 case Norm::Fro:
return "fro";
243 case Norm::Max:
return "max";
266 inline char job2char( lapack::Job job )
273 inline char job_csd2char( lapack::Job job )
276 case lapack::Job::Vec:
return 'Y';
277 case lapack::Job::UpdateVec:
return 'Y';
278 default:
return char( job );
283 inline char job_comp2char( lapack::Job job )
286 case lapack::Job::Vec:
return 'I';
287 case lapack::Job::UpdateVec:
return 'V';
288 default:
return char( job );
293 inline char job_compu2char( lapack::Job job )
296 case lapack::Job::Vec:
return 'I';
297 case lapack::Job::UpdateVec:
return 'U';
298 default:
return char( job );
303 inline char job_compq2char( lapack::Job job )
306 case lapack::Job::Vec:
return 'I';
307 case lapack::Job::UpdateVec:
return 'Q';
308 default:
return char( job );
313 inline char jobu2char( lapack::Job job )
316 case lapack::Job::Vec:
return 'U';
317 default:
return char( job );
322 inline char jobq2char( lapack::Job job )
325 case lapack::Job::Vec:
return 'Q';
326 default:
return char( job );
331 inline char jobu_gejsv2char( lapack::Job job )
334 case lapack::Job::SomeVec:
return 'U';
335 case lapack::Job::AllVec:
return 'F';
336 default:
return char( job );
341 inline char job_gesvj2char( lapack::Job job )
344 case lapack::Job::SomeVec:
return 'U';
345 case lapack::Job::SomeVecTol:
return 'C';
346 case lapack::Job::UpdateVec:
return 'U';
347 default:
return char( job );
351 inline lapack::Job char2job(
char job )
353 job = char( toupper( job ));
354 lapack_error_if( job !=
'N' && job !=
'V' && job !=
'U' &&
355 job !=
'A' && job !=
'S' && job !=
'O' &&
356 job !=
'P' && job !=
'C' && job !=
'J' &&
358 return lapack::Job( job );
361 inline const char* job2str( lapack::Job job )
364 case lapack::Job::NoVec:
return "novec";
365 case lapack::Job::Vec:
return "vec";
366 case lapack::Job::UpdateVec:
return "update";
368 case lapack::Job::AllVec:
return "all";
369 case lapack::Job::SomeVec:
return "some";
370 case lapack::Job::OverwriteVec:
return "overwrite";
372 case lapack::Job::CompactVec:
return "compact";
373 case lapack::Job::SomeVecTol:
return "sometol";
374 case lapack::Job::VecJacobi:
return "jacobi";
375 case lapack::Job::Workspace:
return "work";
382 enum class JobSchur {
387 inline char jobschur2char( lapack::JobSchur jobschur )
389 return char( jobschur );
392 inline lapack::JobSchur char2jobschur(
char jobschur )
394 jobschur = char( toupper( jobschur ));
395 lapack_error_if( jobschur !=
'E' && jobschur !=
'S' );
396 return lapack::JobSchur( jobschur );
399 inline const char* jobschur2str( lapack::JobSchur jobschur )
402 case lapack::JobSchur::Eigenvalues:
return "eigval";
403 case lapack::JobSchur::Schur:
return "schur";
416 inline char sort2char( lapack::Sort sort )
421 inline lapack::Sort char2sort(
char sort )
423 sort = char( toupper( sort ));
424 lapack_error_if( sort !=
'N' && sort !=
'S' );
425 return lapack::Sort( sort );
428 inline const char* sort2str( lapack::Sort sort )
431 case lapack::Sort::NotSorted:
return "not-sorted";
432 case lapack::Sort::Sorted:
return "sorted";
445 inline char range2char( lapack::Range range )
447 return char( range );
450 inline lapack::Range char2range(
char range )
452 range = char( toupper( range ));
453 lapack_error_if( range !=
'A' && range !=
'V' && range !=
'I' );
454 return lapack::Range( range );
457 inline const char* range2str( lapack::Range range )
460 case lapack::Range::All:
return "all";
461 case lapack::Range::Value:
return "value";
462 case lapack::Range::Index:
return "index";
475 inline char vect2char( lapack::Vect vect )
480 inline lapack::Vect char2vect(
char vect )
482 vect = char( toupper( vect ));
483 lapack_error_if( vect !=
'Q' && vect !=
'P' && vect !=
'N' && vect !=
'B' );
484 return lapack::Vect( vect );
487 inline const char* vect2str( lapack::Vect vect )
490 case lapack::Vect::P:
return "p";
491 case lapack::Vect::Q:
return "q";
492 case lapack::Vect::None:
return "none";
493 case lapack::Vect::Both:
return "both";
500 enum class Direction {
505 inline char direction2char( lapack::Direction direction )
507 return char( direction );
510 inline lapack::Direction char2direction(
char direction )
512 direction = char( toupper( direction ));
513 lapack_error_if( direction !=
'F' && direction !=
'B' );
514 return lapack::Direction( direction );
517 inline const char* direction2str( lapack::Direction direction )
520 case lapack::Direction::Forward:
return "forward";
521 case lapack::Direction::Backward:
return "backward";
527 LAPACK_DEPRECATED(
"Direct replaced with Direction")
528 typedef Direction Direct;
530 LAPACK_DEPRECATED("direct2char replaced with direction2char")
531 inline
char direct2char( lapack::Direction direction )
533 return direction2char( direction );
536 LAPACK_DEPRECATED(
"direct2str replaced with direction2str")
537 inline const
char* direct2str( lapack::Direction direction )
539 return direction2str( direction );
542 LAPACK_DEPRECATED(
"char2direct replaced with char2direction")
543 inline lapack::Direction char2direct(
char direction )
545 return char2direction( direction );
555 inline char storev2char( lapack::StoreV storev )
557 return char( storev );
560 inline lapack::StoreV char2storev(
char storev )
562 storev = char( toupper( storev ));
563 lapack_error_if( storev !=
'C' && storev !=
'R' );
564 return lapack::StoreV( storev );
567 inline const char* storev2str( lapack::StoreV storev )
570 case lapack::StoreV::Columnwise:
return "columnwise";
571 case lapack::StoreV::Rowwise:
return "rowwise";
578 enum class MatrixType {
588 inline char matrixtype2char( lapack::MatrixType type )
593 inline lapack::MatrixType char2matrixtype(
char type )
595 type = char( toupper( type ));
596 lapack_error_if( type !=
'G' && type !=
'L' && type !=
'U' &&
597 type !=
'H' && type !=
'B' && type !=
'Q' && type !=
'Z' );
598 return lapack::MatrixType( type );
601 inline const char* matrixtype2str( lapack::MatrixType type )
604 case lapack::MatrixType::General:
return "general";
605 case lapack::MatrixType::Lower:
return "lower";
606 case lapack::MatrixType::Upper:
return "upper";
607 case lapack::MatrixType::Hessenberg:
return "hessenberg";
608 case lapack::MatrixType::LowerBand:
return "band-lower";
609 case lapack::MatrixType::UpperBand:
return "q-band-upper";
610 case lapack::MatrixType::Band:
return "z-band";
623 inline char howmany2char( lapack::HowMany howmany )
625 return char( howmany );
628 inline lapack::HowMany char2howmany(
char howmany )
630 howmany = char( toupper( howmany ));
631 lapack_error_if( howmany !=
'A' && howmany !=
'B' && howmany !=
'S' );
632 return lapack::HowMany( howmany );
635 inline const char* howmany2str( lapack::HowMany howmany )
638 case lapack::HowMany::All:
return "all";
639 case lapack::HowMany::Backtransform:
return "backtransform";
640 case lapack::HowMany::Select:
return "select";
655 inline char equed2char( lapack::Equed equed )
657 return char( equed );
660 inline lapack::Equed char2equed(
char equed )
662 equed = char( toupper( equed ));
663 lapack_error_if( equed !=
'N' && equed !=
'R' && equed !=
'C' &&
664 equed !=
'B' && equed !=
'Y' );
665 return lapack::Equed( equed );
668 inline const char* equed2str( lapack::Equed equed )
671 case lapack::Equed::None:
return "none";
672 case lapack::Equed::Row:
return "row";
673 case lapack::Equed::Col:
return "col";
674 case lapack::Equed::Both:
return "both";
675 case lapack::Equed::Yes:
return "yes";
683 enum class Factored {
689 inline char factored2char( lapack::Factored factored )
691 return char( factored );
694 inline lapack::Factored char2factored(
char factored )
696 factored = char( toupper( factored ));
697 lapack_error_if( factored !=
'F' && factored !=
'N' && factored !=
'E' );
698 return lapack::Factored( factored );
701 inline const char* factored2str( lapack::Factored factored )
704 case lapack::Factored::Factored:
return "factored";
705 case lapack::Factored::NotFactored:
return "notfactored";
706 case lapack::Factored::Equilibrate:
return "equilibrate";
720 inline char sense2char( lapack::Sense sense )
722 return char( sense );
725 inline lapack::Sense char2sense(
char sense )
727 sense = char( toupper( sense ));
728 lapack_error_if( sense !=
'N' && sense !=
'E' && sense !=
'V' &&
730 return lapack::Sense( sense );
733 inline const char* sense2str( lapack::Sense sense )
736 case lapack::Sense::None:
return "none";
737 case lapack::Sense::Eigenvalues:
return "eigval";
738 case lapack::Sense::Subspace:
return "subspace";
739 case lapack::Sense::Both:
return "both";
748 LeftSingularVec =
'L',
749 RightSingularVec =
'R',
752 inline char jobcond2char( lapack::JobCond jobcond )
754 return char( jobcond );
757 inline lapack::JobCond char2jobcond(
char jobcond )
759 jobcond = char( toupper( jobcond ));
760 lapack_error_if( jobcond !=
'N' && jobcond !=
'E' && jobcond !=
'V' &&
762 return lapack::JobCond( jobcond );
765 inline const char* jobcond2str( lapack::JobCond jobcond )
768 case lapack::JobCond::EigenVec:
return "eigvec";
769 case lapack::JobCond::LeftSingularVec:
return "left";
770 case lapack::JobCond::RightSingularVec:
return "right";
784 inline char balance2char( lapack::Balance balance )
786 return char( balance );
789 inline lapack::Balance char2balance(
char balance )
791 balance = char( toupper( balance ));
792 lapack_error_if( balance !=
'N' && balance !=
'P' && balance !=
'S' &&
794 return lapack::Balance( balance );
797 inline const char* balance2str( lapack::Balance balance )
800 case lapack::Balance::None:
return "none";
801 case lapack::Balance::Permute:
return "permute";
802 case lapack::Balance::Scale:
return "scale";
803 case lapack::Balance::Both:
return "both";
815 inline char order2char( lapack::Order order )
817 return char( order );
820 inline lapack::Order char2order(
char order )
822 order = char( toupper( order ));
823 lapack_error_if( order !=
'B' && order !=
'E' );
824 return lapack::Order( order );
827 inline const char* order2str( lapack::Order order )
830 case lapack::Order::Block:
return "block";
831 case lapack::Order::Entire:
return "entire";
843 inline char rowcol2char( lapack::RowCol rowcol )
845 return char( rowcol );
848 inline lapack::RowCol char2rowcol(
char rowcol )
850 rowcol = char( toupper( rowcol ));
851 lapack_error_if( rowcol !=
'C' && rowcol !=
'R' );
852 return lapack::RowCol( rowcol );
855 inline const char* rowcol2str( lapack::RowCol rowcol )
858 case lapack::RowCol::Col:
return "col";
859 case lapack::RowCol::Row:
return "row";
866 #endif // LAPACK_UTIL_HH