Automatically switch between EigenSolver and ComplexEigenSolver, and fix a few Real versus Scalar issues.

(grafted from 56e5ec07c6846585a8d808cab15a0aa5f6cd0cc8
)
This commit is contained in:
Gael Guennebaud 2016-11-23 16:05:10 +01:00
parent 4415d4e2d4
commit 222ce4b49d

View File

@ -99,7 +99,7 @@ class PolynomialSolverBase
*/ */
inline const RootType& greatestRoot() const inline const RootType& greatestRoot() const
{ {
std::greater<Scalar> greater; std::greater<RealScalar> greater;
return selectComplexRoot_withRespectToNorm( greater ); return selectComplexRoot_withRespectToNorm( greater );
} }
@ -108,7 +108,7 @@ class PolynomialSolverBase
*/ */
inline const RootType& smallestRoot() const inline const RootType& smallestRoot() const
{ {
std::less<Scalar> less; std::less<RealScalar> less;
return selectComplexRoot_withRespectToNorm( less ); return selectComplexRoot_withRespectToNorm( less );
} }
@ -213,7 +213,7 @@ class PolynomialSolverBase
bool& hasArealRoot, bool& hasArealRoot,
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
{ {
std::greater<Scalar> greater; std::greater<RealScalar> greater;
return selectRealRoot_withRespectToAbsRealPart( greater, hasArealRoot, absImaginaryThreshold ); return selectRealRoot_withRespectToAbsRealPart( greater, hasArealRoot, absImaginaryThreshold );
} }
@ -236,7 +236,7 @@ class PolynomialSolverBase
bool& hasArealRoot, bool& hasArealRoot,
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
{ {
std::less<Scalar> less; std::less<RealScalar> less;
return selectRealRoot_withRespectToAbsRealPart( less, hasArealRoot, absImaginaryThreshold ); return selectRealRoot_withRespectToAbsRealPart( less, hasArealRoot, absImaginaryThreshold );
} }
@ -259,7 +259,7 @@ class PolynomialSolverBase
bool& hasArealRoot, bool& hasArealRoot,
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
{ {
std::greater<Scalar> greater; std::greater<RealScalar> greater;
return selectRealRoot_withRespectToRealPart( greater, hasArealRoot, absImaginaryThreshold ); return selectRealRoot_withRespectToRealPart( greater, hasArealRoot, absImaginaryThreshold );
} }
@ -282,7 +282,7 @@ class PolynomialSolverBase
bool& hasArealRoot, bool& hasArealRoot,
const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const const RealScalar& absImaginaryThreshold = NumTraits<Scalar>::dummy_precision() ) const
{ {
std::less<Scalar> less; std::less<RealScalar> less;
return selectRealRoot_withRespectToRealPart( less, hasArealRoot, absImaginaryThreshold ); return selectRealRoot_withRespectToRealPart( less, hasArealRoot, absImaginaryThreshold );
} }
@ -327,7 +327,7 @@ class PolynomialSolverBase
* However, almost always, correct accuracy is reached even in these cases for 64bit * However, almost always, correct accuracy is reached even in these cases for 64bit
* (double) floating types and small polynomial degree (<20). * (double) floating types and small polynomial degree (<20).
*/ */
template< typename _Scalar, int _Deg , typename EigenSolverType = EigenSolver<Matrix<_Scalar,_Deg,_Deg> > > template<typename _Scalar, int _Deg>
class PolynomialSolver : public PolynomialSolverBase<_Scalar,_Deg> class PolynomialSolver : public PolynomialSolverBase<_Scalar,_Deg>
{ {
public: public:
@ -337,7 +337,9 @@ class PolynomialSolver : public PolynomialSolverBase<_Scalar,_Deg>
EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( PS_Base ) EIGEN_POLYNOMIAL_SOLVER_BASE_INHERITED_TYPES( PS_Base )
typedef Matrix<Scalar,_Deg,_Deg> CompanionMatrixType; typedef Matrix<Scalar,_Deg,_Deg> CompanionMatrixType;
//typedef EigenSolver<CompanionMatrixType> EigenSolverType; typedef typename internal::conditional<NumTraits<Scalar>::IsComplex,
ComplexEigenSolver<CompanionMatrixType>,
EigenSolver<CompanionMatrixType> >::type EigenSolverType;
public: public:
/** Computes the complex roots of a new polynomial. */ /** Computes the complex roots of a new polynomial. */