|
Go to the documentation of this file.
30#include <Eigen/Eigenvalues>
31#include <unsupported/Eigen/MatrixFunctions>
35#define MAX_(i, j) (((i) > (j)) ? (i) : (j))
36#define MIN_(i, j) (((i) < (j)) ? (i) : (j))
38template< class Real, class Scalar, int M, int N>
40( const Eigen::Matrix<Scalar, M, N>& m,
42 Eigen::Matrix<Scalar, M, M> *u,
43 Eigen::Matrix<Scalar, N, N> *vh)
45 Eigen::JacobiSVD<Eigen::Matrix<Scalar, M, N> >
46 svd(m, (u ? Eigen::ComputeFullU : 0) | (vh ? Eigen::ComputeFullV : 0));
47 s = svd.singularValues();
48 if (u) { *u = svd.matrixU(); }
49 if (vh) { *vh = svd.matrixV().adjoint(); }
52template< class Real, class Scalar, int N>
54( const Eigen::Matrix<Scalar, N, N>& m,
55 Eigen::Array<Real, N, 1>& w,
56 Eigen::Matrix<Scalar, N, N> *z)
58 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<Scalar,N,N> >
59 es(m, z ? Eigen::ComputeEigenvectors : Eigen::EigenvaluesOnly);
61 if (z) { *z = es.eigenvectors(); }
67template< int M, int N, class Real>
81 bool DECR, EIGEN, INCR, LEFT, RIGHT, SINGUL;
83 Real ANORM, EPS, NEWGAP, OLDGAP, SAFMIN, THRESH;
88 EIGEN = std::toupper(JOB) == 'E';
89 LEFT = std::toupper(JOB) == 'L';
90 RIGHT = std::toupper(JOB) == 'R';
91 SINGUL = LEFT || RIGHT;
97 if (!EIGEN && !SINGUL) {
106 for (I = 0; I < K - 1; I++) {
108 INCR = INCR && D(I) <= D(I+1);
111 DECR = DECR && D(I) >= D(I+1);
114 if (SINGUL && K > 0) {
116 INCR = INCR && ZERO <= D(0);
119 DECR = DECR && D(K-1) >= ZERO;
122 if (!(INCR || DECR)) {
140 SEP(0) = std::numeric_limits<Real>::max();
142 OLDGAP = std::fabs(D(1) - D(0));
144 for (I = 1; I < K - 1; I++) {
145 NEWGAP = std::fabs(D(I+1) - D(I));
146 SEP(I) = std::min(OLDGAP, NEWGAP);
152 if ((LEFT && M > N) || (RIGHT && M < N)) {
154 SEP( 0 ) = std::min(SEP( 0 ), D( 0 ));
157 SEP(K-1) = std::min(SEP(K-1), D(K-1));
168 EPS = std::numeric_limits<Real>::epsilon();
169 SAFMIN = std::numeric_limits<Real>::min();
170 ANORM = std::max(std::fabs(D(0)), std::fabs(D(K-1)));
174 THRESH = std::max(EPS*ANORM, SAFMIN);
176 for (I = 0; I < K; I++) {
177 SEP(I) = std::max(SEP(I), THRESH);
182template< class Real, class Scalar, int M, int N>
184( const Eigen::Matrix<Scalar, M, N>& m,
186 Eigen::Matrix<Scalar, M, M> *u,
187 Eigen::Matrix<Scalar, N, N> *vh)
192template< class Real, class Scalar, int M, int N>
194( const Eigen::Matrix<Scalar, M, N>& m,
196 Eigen::Matrix<Scalar, M, M> *u = 0,
197 Eigen::Matrix<Scalar, N, N> *vh = 0,
199 Eigen::Array< Real, MIN_( M, N), 1> *u_errbd = 0,
200 Eigen::Array< Real, MIN_( M, N), 1> *v_errbd = 0)
205 if (!s_errbd) { return; }
206 const Real EPSMCH = std::numeric_limits<Real>::epsilon();
207 *s_errbd = EPSMCH * s[0];
212 disna<M, N>( 'L', s, RCOND, INFO);
213 u_errbd->fill(*s_errbd);
217 disna<M, N>( 'R', s, RCOND, INFO);
218 v_errbd->fill(*s_errbd);
245template< class Real, class Scalar, int M, int N>
247( const Eigen::Matrix<Scalar, M, N>& m,
249 Eigen::Matrix<Scalar, M, M>& u,
250 Eigen::Matrix<Scalar, N, N>& vh)
265template< class Real, class Scalar, int M, int N>
267( const Eigen::Matrix<Scalar, M, N>& m,
269 Eigen::Matrix<Scalar, M, M>& u,
270 Eigen::Matrix<Scalar, N, N>& vh,
288template< class Real, class Scalar, int M, int N>
290( const Eigen::Matrix<Scalar, M, N>& m,
292 Eigen::Matrix<Scalar, M, M>& u,
293 Eigen::Matrix<Scalar, N, N>& vh,
295 Eigen::Array< Real, MIN_( M, N), 1>& u_errbd,
296 Eigen::Array< Real, MIN_( M, N), 1>& v_errbd)
298 svd_errbd(m, s, &u, &vh, &s_errbd, &u_errbd, &v_errbd);
312template< class Real, class Scalar, int M, int N>
314( const Eigen::Matrix<Scalar, M, N>& m,
330template< class Real, class Scalar, int M, int N>
332( const Eigen::Matrix<Scalar, M, N>& m,
341template< class Real, class Scalar, int N>
343( const Eigen::Matrix<Scalar, N, N>& m,
344 Eigen::Array<Real, N, 1>& w,
345 Eigen::Matrix<Scalar, N, N> *z)
350template< class Real, class Scalar, int N>
352( const Eigen::Matrix<Scalar, N, N>& m,
353 Eigen::Array<Real, N, 1>& w,
354 Eigen::Matrix<Scalar, N, N> *z = 0,
356 Eigen::Array<Real, N, 1> *z_errbd = 0)
361 if (!w_errbd) { return; }
362 const Real EPSMCH = std::numeric_limits<Real>::epsilon();
363 Real mnorm = std::max(std::abs(w[0]), std::abs(w[N-1]));
364 *w_errbd = EPSMCH * mnorm;
366 if (!z_errbd) { return; }
367 Eigen::Array<Real, N, 1> RCONDZ;
369 disna<N, N>( 'E', w, RCONDZ, INFO);
370 z_errbd->fill(*w_errbd);
388template< class Real, class Scalar, int N>
390( const Eigen::Matrix<Scalar, N, N>& m,
391 Eigen::Array<Real, N, 1>& w,
392 Eigen::Matrix<Scalar, N, N>& z)
408template< class Real, class Scalar, int N>
410( const Eigen::Matrix<Scalar, N, N>& m,
411 Eigen::Array<Real, N, 1>& w,
412 Eigen::Matrix<Scalar, N, N>& z,
429template< class Real, class Scalar, int N>
431( const Eigen::Matrix<Scalar, N, N>& m,
432 Eigen::Array<Real, N, 1>& w,
433 Eigen::Matrix<Scalar, N, N>& z,
435 Eigen::Array<Real, N, 1>& z_errbd)
450template< class Real, class Scalar, int N>
452( const Eigen::Matrix<Scalar, N, N>& m,
453 Eigen::Array<Real, N, 1>& w)
469template< class Real, class Scalar, int N>
471( const Eigen::Matrix<Scalar, N, N>& m,
472 Eigen::Array<Real, N, 1>& w,
478template< class Real, int N>
480( const Eigen::Matrix<std::complex<Real>, N, N>& m,
481 Eigen::Array<Real, N, 1>& s,
482 Eigen::Matrix<std::complex<Real>, N, N> *u = 0,
484 Eigen::Array<Real, N, 1> *u_errbd = 0)
490 Eigen::Matrix<std::complex<Real>, N, N> vh;
491 svd_errbd(m, s, u, &vh, s_errbd, u_errbd);
493 Eigen::Matrix<std::complex<Real>, N, N> const Z = u->adjoint() * vh.transpose();
494 Eigen::Matrix<std::complex<Real>, N, N> Zsqrt = Z.sqrt().eval();
495 if (!Zsqrt.isUnitary()) {
501 [](std::complex<Real> x, int n) {
502 static constexpr Real Pi = 3.141592653589793238462643383279503L;
503 return std::sqrt( Pi*x)/(2*std::tgamma( static_cast<Real>(1.5)-n)*std::pow(x, n));
505 Zsqrt = Z.matrixFunction(sqrtfn).eval();
506 if (!Zsqrt.isUnitary()) {
507 std::runtime_error( "Zsqrt matrix must be unitary");
526template< class Real, int N>
528( const Eigen::Matrix<std::complex<Real>, N, N>& m,
529 Eigen::Array<Real, N, 1>& s,
530 Eigen::Matrix<std::complex<Real>, N, N>& u)
546template< class Real, int N>
548( const Eigen::Matrix<std::complex<Real>, N, N>& m,
549 Eigen::Array<Real, N, 1>& s,
550 Eigen::Matrix<std::complex<Real>, N, N>& u,
567template< class Real, int N>
569( const Eigen::Matrix<std::complex<Real>, N, N>& m,
570 Eigen::Array<Real, N, 1>& s,
571 Eigen::Matrix<std::complex<Real>, N, N>& u,
573 Eigen::Array<Real, N, 1>& u_errbd)
587template< class Real, int N>
589( const Eigen::Matrix<std::complex<Real>, N, N>& m,
590 Eigen::Array<Real, N, 1>& s)
606template< class Real, int N>
608( const Eigen::Matrix<std::complex<Real>, N, N>& m,
609 Eigen::Array<Real, N, 1>& s,
617 std::complex<Real> operator() ( const std::complex<Real>& z) const {
618 return z.real() < 0 ? std::complex<Real>(0,1) :
619 std::complex<Real>(1,0);
623template< class Real, int N>
625( const Eigen::Matrix<Real, N, N>& m,
626 Eigen::Array<Real, N, 1>& s,
627 Eigen::Matrix<std::complex<Real>, N, N> *u = 0,
629 Eigen::Array<Real, N, 1> *u_errbd = 0)
631 Eigen::Matrix<Real, N, N> z;
635 *u = z * s.template cast<std::complex<Real>>()
658template< class Real, int N>
660( const Eigen::Matrix<Real, N, N>& m,
661 Eigen::Array<Real, N, 1>& s,
662 Eigen::Matrix<std::complex<Real>, N, N>& u)
678template< class Real, int N>
680( const Eigen::Matrix<Real, N, N>& m,
681 Eigen::Array<Real, N, 1>& s,
682 Eigen::Matrix<std::complex<Real>, N, N>& u,
699template< class Real, int N>
701( const Eigen::Matrix<Real, N, N>& m,
702 Eigen::Array<Real, N, 1>& s,
703 Eigen::Matrix<std::complex<Real>, N, N>& u,
705 Eigen::Array<Real, N, 1>& u_errbd)
722template< class Real, int N>
724( const Eigen::Matrix<Real, N, N>& m,
725 Eigen::Array<Real, N, 1>& s)
741template< class Real, int N>
743( const Eigen::Matrix<Real, N, N>& m,
744 Eigen::Array<Real, N, 1>& s,
750template< class Real, class Scalar, int M, int N>
752( const Eigen::Matrix<Scalar, M, N>& m,
754 Eigen::Matrix<Scalar, M, M> *u = 0,
755 Eigen::Matrix<Scalar, N, N> *vh = 0,
757 Eigen::Array< Real, MIN_( M, N), 1> *u_errbd = 0,
758 Eigen::Array< Real, MIN_( M, N), 1> *v_errbd = 0)
760 svd_errbd(m, s, u, vh, s_errbd, u_errbd, v_errbd);
763 Eigen::PermutationMatrix<M> p;
765 p.indices().template segment<MIN_(M, N)>(0).reverseInPlace();
769 Eigen::PermutationMatrix<N> p;
771 p.indices().template segment<MIN_(M, N)>(0).reverseInPlace();
772 vh->transpose() *= p;
774 if (u_errbd) { u_errbd->reverseInPlace(); }
775 if (v_errbd) { v_errbd->reverseInPlace(); }
800template< class Real, class Scalar, int M, int N>
802( const Eigen::Matrix<Scalar, M, N>& m,
804 Eigen::Matrix<Scalar, M, M>& u,
805 Eigen::Matrix<Scalar, N, N>& vh)
821template< class Real, class Scalar, int M, int N>
823( const Eigen::Matrix<Scalar, M, N>& m,
825 Eigen::Matrix<Scalar, M, M>& u,
826 Eigen::Matrix<Scalar, N, N>& vh,
844template< class Real, class Scalar, int M, int N>
846( const Eigen::Matrix<Scalar, M, N>& m,
848 Eigen::Matrix<Scalar, M, M>& u,
849 Eigen::Matrix<Scalar, N, N>& vh,
851 Eigen::Array< Real, MIN_( M, N), 1>& u_errbd,
852 Eigen::Array< Real, MIN_( M, N), 1>& v_errbd)
868template< class Real, class Scalar, int M, int N>
870( const Eigen::Matrix<Scalar, M, N>& m,
887template< class Real, class Scalar, int M, int N>
889( const Eigen::Matrix<Scalar, M, N>& m,
896template< class Real, int N>
898( const Eigen::Matrix<std::complex<Real>, N, N>& m,
899 Eigen::Array<Real, N, 1>& s,
900 Eigen::Matrix<std::complex<Real>, N, N> *u = 0,
902 Eigen::Array<Real, N, 1> *u_errbd = 0)
906 if (u) { *u = u->rowwise().reverse().eval(); }
907 if (u_errbd) { u_errbd->reverseInPlace(); }
910template< class Real, int N>
912( const Eigen::Matrix<Real, N, N>& m,
913 Eigen::Array<Real, N, 1>& s,
914 Eigen::Matrix<std::complex<Real>, N, N> *u = 0,
916 Eigen::Array<Real, N, 1> *u_errbd = 0)
919 Eigen::PermutationMatrix<N> p;
921 std::sort(p.indices().data(), p.indices().data() + p.indices().size(),
922 [&s] ( int i, int j) { return s[i] < s[j]; });
923#if EIGEN_VERSION_AT_LEAST(3,1,4)
924 s.matrix().transpose() *= p;
925 if (u_errbd) { u_errbd->matrix().transpose() *= p; }
927 Eigen::Map<Eigen::Matrix<Real, N, 1> >(s.data()).transpose() *= p;
929 Eigen::Map<Eigen::Matrix<Real, N, 1>>(u_errbd->data()).transpose() *= p;
949template< class Real, class Scalar, int N>
951( const Eigen::Matrix<Scalar, N, N>& m,
952 Eigen::Array<Real, N, 1>& s,
953 Eigen::Matrix<std::complex<Real>, N, N>& u)
969template< class Real, class Scalar, int N>
971( const Eigen::Matrix<Scalar, N, N>& m,
972 Eigen::Array<Real, N, 1>& s,
973 Eigen::Matrix<std::complex<Real>, N, N>& u,
990template< class Real, class Scalar, int N>
992( const Eigen::Matrix<Scalar, N, N>& m,
993 Eigen::Array<Real, N, 1>& s,
994 Eigen::Matrix<std::complex<Real>, N, N>& u,
996 Eigen::Array<Real, N, 1>& u_errbd)
1011template< class Real, class Scalar, int N>
1013( const Eigen::Matrix<Scalar, N, N>& m,
1014 Eigen::Array<Real, N, 1>& s)
1030template< class Real, class Scalar, int N>
1032( const Eigen::Matrix<Scalar, N, N>& m,
1033 Eigen::Array<Real, N, 1>& s,
1039template< class Real, class Scalar, int M, int N>
1041( const Eigen::Matrix<Scalar, M, N>& m,
1043 Eigen::Matrix<Scalar, M, M> *u = 0,
1044 Eigen::Matrix<Scalar, N, N> *v = 0,
1046 Eigen::Array< Real, MIN_( M, N), 1> *u_errbd = 0,
1047 Eigen::Array< Real, MIN_( M, N), 1> *v_errbd = 0)
1050 if (u) { u->transposeInPlace(); }
1076template< class Real, class Scalar, int M, int N>
1078( const Eigen::Matrix<Scalar, M, N>& m,
1080 Eigen::Matrix<Scalar, M, M>& u,
1081 Eigen::Matrix<Scalar, N, N>& v)
1097template< class Real, class Scalar, int M, int N>
1099( const Eigen::Matrix<Scalar, M, N>& m,
1101 Eigen::Matrix<Scalar, M, M>& u,
1102 Eigen::Matrix<Scalar, N, N>& v,
1120template< class Real, class Scalar, int M, int N>
1122( const Eigen::Matrix<Scalar, M, N>& m,
1124 Eigen::Matrix<Scalar, M, M>& u,
1125 Eigen::Matrix<Scalar, N, N>& v,
1127 Eigen::Array< Real, MIN_( M, N), 1>& u_errbd,
1128 Eigen::Array< Real, MIN_( M, N), 1>& v_errbd)
1130 fs_svd_errbd(m, s, &u, &v, &s_errbd, &u_errbd, &v_errbd);
1144template< class Real, class Scalar, int M, int N>
1146( const Eigen::Matrix<Scalar, M, N>& m,
1162template< class Real, class Scalar, int M, int N>
1164( const Eigen::Matrix<Scalar, M, N>& m,
1197template< class Real, int M, int N>
1199( const Eigen::Matrix<Real, M, N>& m,
1201 Eigen::Matrix<std::complex<Real>, M, M>& u,
1202 Eigen::Matrix<std::complex<Real>, N, N>& v)
1204 fs_svd(m.template cast<std::complex<Real> >().eval(), s, u, v);
1218template< class Real, int M, int N>
1220( const Eigen::Matrix<Real, M, N>& m,
1222 Eigen::Matrix<std::complex<Real>, M, M>& u,
1223 Eigen::Matrix<std::complex<Real>, N, N>& v,
1226 fs_svd(m.template cast<std::complex<Real> >().eval(), s, u, v, s_errbd);
1241template< class Real, int M, int N>
1243( const Eigen::Matrix<Real, M, N>& m,
1245 Eigen::Matrix<std::complex<Real>, M, M>& u,
1246 Eigen::Matrix<std::complex<Real>, N, N>& v,
1248 Eigen::Array< Real, MIN_( M, N), 1>& u_errbd,
1249 Eigen::Array< Real, MIN_( M, N), 1>& v_errbd)
1251 fs_svd(m.template cast<std::complex<Real> >().eval(), s, u, v,
1252 s_errbd, u_errbd, v_errbd);
1255template< class Real, class Scalar, int N>
1257( const Eigen::Matrix<Scalar, N, N>& m,
1258 Eigen::Array<Real, N, 1>& s,
1259 Eigen::Matrix<std::complex<Real>, N, N> *u = 0,
1261 Eigen::Array<Real, N, 1> *u_errbd = 0)
1264 if (u) { u->transposeInPlace(); }
1282template< class Real, class Scalar, int N>
1284( const Eigen::Matrix<Scalar, N, N>& m,
1285 Eigen::Array<Real, N, 1>& s,
1286 Eigen::Matrix<std::complex<Real>, N, N>& u)
1302template< class Real, class Scalar, int N>
1304( const Eigen::Matrix<Scalar, N, N>& m,
1305 Eigen::Array<Real, N, 1>& s,
1306 Eigen::Matrix<std::complex<Real>, N, N>& u,
1323template< class Real, class Scalar, int N>
1325( const Eigen::Matrix<Scalar, N, N>& m,
1326 Eigen::Array<Real, N, 1>& s,
1327 Eigen::Matrix<std::complex<Real>, N, N>& u,
1329 Eigen::Array<Real, N, 1>& u_errbd)
1344template< class Real, class Scalar, int N>
1346( const Eigen::Matrix<Scalar, N, N>& m,
1347 Eigen::Array<Real, N, 1>& s)
1363template< class Real, class Scalar, int N>
1365( const Eigen::Matrix<Scalar, N, N>& m,
1366 Eigen::Array<Real, N, 1>& s,
1372template< class Real, class Scalar, int N>
1374( const Eigen::Matrix<Scalar, N, N>& m,
1375 Eigen::Array<Real, N, 1>& w,
1376 Eigen::Matrix<Scalar, N, N> *z = 0,
1378 Eigen::Array<Real, N, 1> *z_errbd = 0)
1381 Eigen::PermutationMatrix<N> p;
1383 std::sort(p.indices().data(), p.indices().data() + p.indices().size(),
1384 [&w] ( int i, int j) { return std::abs(w[i]) < std::abs(w[j]); });
1385#if EIGEN_VERSION_AT_LEAST(3,1,4)
1386 w.matrix().transpose() *= p;
1387 if (z_errbd) { z_errbd->matrix().transpose() *= p; }
1389 Eigen::Map<Eigen::Matrix<Real, N, 1> >(w.data()).transpose() *= p;
1391 Eigen::Map<Eigen::Matrix<Real, N, 1>>(z_errbd->data()).transpose() *= p;
1394 if (z) { *z = (*z * p).adjoint().eval(); }
1411template< class Real, class Scalar, int N>
1413( const Eigen::Matrix<Scalar, N, N>& m,
1414 Eigen::Array<Real, N, 1>& w,
1415 Eigen::Matrix<Scalar, N, N>& z)
1431template< class Real, class Scalar, int N>
1433( const Eigen::Matrix<Scalar, N, N>& m,
1434 Eigen::Array<Real, N, 1>& w,
1435 Eigen::Matrix<Scalar, N, N>& z,
1452template< class Real, class Scalar, int N>
1454( const Eigen::Matrix<Scalar, N, N>& m,
1455 Eigen::Array<Real, N, 1>& w,
1456 Eigen::Matrix<Scalar, N, N>& z,
1458 Eigen::Array<Real, N, 1>& z_errbd)
1473template< class Real, class Scalar, int N>
1475( const Eigen::Matrix<Scalar, N, N>& m,
1476 Eigen::Array<Real, N, 1>& w)
1492template< class Real, class Scalar, int N>
1494( const Eigen::Matrix<Scalar, N, N>& m,
1495 Eigen::Array<Real, N, 1>& w,
1508template < typename T>
1511 return std::abs(value);
1527template < typename T>
1530 phase = std::polar(1., 0.5 * std::arg(std::complex<double>(value)));
1531 return std::abs(value);
1547template < typename T>
1550 phase = std::polar(1., std::arg(std::complex<double>(value)));
1551 return std::abs(value);
void reorder_diagonalize_symmetric(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > &u)
double calculate_majorana_singlet_mass(T value, std::complex< double > &phase)
void reorder_diagonalize_symmetric_errbd(const Eigen::Matrix< std::complex< Real >, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > *u=0, Real *s_errbd=0, Eigen::Array< Real, N, 1 > *u_errbd=0)
void diagonalize_hermitian_internal(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > *z)
void reorder_svd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > &u, Eigen::Matrix< Scalar, N, N > &vh)
void diagonalize_hermitian_errbd(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > *z=0, Real *w_errbd=0, Eigen::Array< Real, N, 1 > *z_errbd=0)
void fs_svd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > &u, Eigen::Matrix< Scalar, N, N > &v)
void svd_eigen(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u, Eigen::Matrix< Scalar, N, N > *vh)
void fs_diagonalize_symmetric_errbd(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > *u=0, Real *s_errbd=0, Eigen::Array< Real, N, 1 > *u_errbd=0)
void disna(const char &JOB, const Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &D, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &SEP, int &INFO)
void svd_internal(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u, Eigen::Matrix< Scalar, N, N > *vh)
void fs_diagonalize_hermitian(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > &z)
void diagonalize_hermitian(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > &z)
void diagonalize_symmetric_errbd(const Eigen::Matrix< std::complex< Real >, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > *u=0, Real *s_errbd=0, Eigen::Array< Real, N, 1 > *u_errbd=0)
double calculate_dirac_singlet_mass(T value, std::complex< double > &phase)
double calculate_singlet_mass(T value) noexcept
void svd_errbd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u=0, Eigen::Matrix< Scalar, N, N > *vh=0, Real *s_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *u_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *v_errbd=0)
void fs_svd_errbd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u=0, Eigen::Matrix< Scalar, N, N > *v=0, Real *s_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *u_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *v_errbd=0)
void fs_diagonalize_hermitian_errbd(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > *z=0, Real *w_errbd=0, Eigen::Array< Real, N, 1 > *z_errbd=0)
void svd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > &u, Eigen::Matrix< Scalar, N, N > &vh)
void reorder_svd_errbd(const Eigen::Matrix< Scalar, M, N > &m, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > &s, Eigen::Matrix< Scalar, M, M > *u=0, Eigen::Matrix< Scalar, N, N > *vh=0, Real *s_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *u_errbd=0, Eigen::Array< Real,(((M)<(N)) ?(M) :(N)), 1 > *v_errbd=0)
static constexpr double Pi
void diagonalize_symmetric(const Eigen::Matrix< std::complex< Real >, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > &u)
void fs_diagonalize_symmetric(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &s, Eigen::Matrix< std::complex< Real >, N, N > &u)
void hermitian_eigen(const Eigen::Matrix< Scalar, N, N > &m, Eigen::Array< Real, N, 1 > &w, Eigen::Matrix< Scalar, N, N > *z)
std::complex< Real > operator()(const std::complex< Real > &z) const
|