1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2010 Manuel Yguel <manuel.yguel@gmail.com>
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "main.h"
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <unsupported/Eigen/Polynomials>
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <iostream>
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <algorithm>
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathusing namespace std;
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Size>
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct increment_if_fixed_size
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  enum {
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ret = (Size == Dynamic) ? Dynamic : Size+1
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  };
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath};
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Deg, typename POLYNOMIAL, typename SOLVER>
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathbool aux_evalSolver( const POLYNOMIAL& pols, SOLVER& psolve )
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename POLYNOMIAL::Index Index;
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename POLYNOMIAL::Scalar Scalar;
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename SOLVER::RootsType    RootsType;
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<Scalar,Deg,1>          EvalRootsType;
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const Index deg = pols.size()-1;
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  psolve.compute( pols );
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  const RootsType& roots( psolve.roots() );
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EvalRootsType evr( deg );
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for( int i=0; i<roots.size(); ++i ){
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    evr[i] = std::abs( poly_eval( pols, roots[i] ) ); }
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  bool evalToZero = evr.isZero( test_precision<Scalar>() );
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if( !evalToZero )
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cerr << "WRONG root: " << endl;
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cerr << "Polynomial: " << pols.transpose() << endl;
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cerr << "Roots found: " << roots.transpose() << endl;
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cerr << "Abs value of the polynomial at the roots: " << evr.transpose() << endl;
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    cerr << endl;
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::vector<Scalar> rootModuli( roots.size() );
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Map< EvalRootsType > aux( &rootModuli[0], roots.size() );
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  aux = roots.array().abs();
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::sort( rootModuli.begin(), rootModuli.end() );
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  bool distinctModuli=true;
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for( size_t i=1; i<rootModuli.size() && distinctModuli; ++i )
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if( internal::isApprox( rootModuli[i], rootModuli[i-1] ) ){
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      distinctModuli = false; }
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY( evalToZero || !distinctModuli );
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  return distinctModuli;
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<int Deg, typename POLYNOMIAL>
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid evalSolver( const POLYNOMIAL& pols )
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename POLYNOMIAL::Scalar Scalar;
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef PolynomialSolver<Scalar, Deg >              PolynomialSolverType;
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  PolynomialSolverType psolve;
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  aux_evalSolver<Deg, POLYNOMIAL, PolynomialSolverType>( pols, psolve );
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate< int Deg, typename POLYNOMIAL, typename ROOTS, typename REAL_ROOTS >
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid evalSolverSugarFunction( const POLYNOMIAL& pols, const ROOTS& roots, const REAL_ROOTS& real_roots )
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
957faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez  using std::sqrt;
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename POLYNOMIAL::Scalar Scalar;
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef PolynomialSolver<Scalar, Deg >              PolynomialSolverType;
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  PolynomialSolverType psolve;
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  if( aux_evalSolver<Deg, POLYNOMIAL, PolynomialSolverType>( pols, psolve ) )
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //It is supposed that
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // 1) the roots found are correct
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    // 2) the roots have distinct moduli
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename POLYNOMIAL::Scalar                 Scalar;
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef typename REAL_ROOTS::Scalar                 Real;
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    typedef PolynomialSolver<Scalar, Deg >              PolynomialSolverType;
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //Test realRoots
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    std::vector< Real > calc_realRoots;
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    psolve.realRoots( calc_realRoots );
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY( calc_realRoots.size() == (size_t)real_roots.size() );
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
1167faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    const Scalar psPrec = sqrt( test_precision<Scalar>() );
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    for( size_t i=0; i<calc_realRoots.size(); ++i )
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    {
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      bool found = false;
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      for( size_t j=0; j<calc_realRoots.size()&& !found; ++j )
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      {
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath        if( internal::isApprox( calc_realRoots[i], real_roots[j] ), psPrec ){
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath          found = true; }
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      }
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      VERIFY( found );
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    }
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //Test greatestRoot
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY( internal::isApprox( roots.array().abs().maxCoeff(),
1317faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez          abs( psolve.greatestRoot() ), psPrec ) );
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //Test smallestRoot
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY( internal::isApprox( roots.array().abs().minCoeff(),
1357faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez          abs( psolve.smallestRoot() ), psPrec ) );
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    bool hasRealRoot;
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //Test absGreatestRealRoot
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    Real r = psolve.absGreatestRealRoot( hasRealRoot );
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY( hasRealRoot == (real_roots.size() > 0 ) );
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if( hasRealRoot ){
1427faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      VERIFY( internal::isApprox( real_roots.array().abs().maxCoeff(), abs(r), psPrec ) );  }
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //Test absSmallestRealRoot
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    r = psolve.absSmallestRealRoot( hasRealRoot );
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY( hasRealRoot == (real_roots.size() > 0 ) );
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if( hasRealRoot ){
1487faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez      VERIFY( internal::isApprox( real_roots.array().abs().minCoeff(), abs( r ), psPrec ) ); }
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //Test greatestRealRoot
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    r = psolve.greatestRealRoot( hasRealRoot );
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY( hasRealRoot == (real_roots.size() > 0 ) );
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if( hasRealRoot ){
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      VERIFY( internal::isApprox( real_roots.array().maxCoeff(), r, psPrec ) ); }
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    //Test smallestRealRoot
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    r = psolve.smallestRealRoot( hasRealRoot );
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY( hasRealRoot == (real_roots.size() > 0 ) );
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    if( hasRealRoot ){
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY( internal::isApprox( real_roots.array().minCoeff(), r, psPrec ) ); }
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Deg>
166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid polynomialsolver(int deg)
167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef internal::increment_if_fixed_size<_Deg>            Dim;
169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<_Scalar,Dim::ret,1>                  PolynomialType;
170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef Matrix<_Scalar,_Deg,1>                      EvalRootsType;
171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  cout << "Standard cases" << endl;
173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  PolynomialType pols = PolynomialType::Random(deg+1);
174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  evalSolver<_Deg,PolynomialType>( pols );
175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  cout << "Hard cases" << endl;
177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  _Scalar multipleRoot = internal::random<_Scalar>();
178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EvalRootsType allRoots = EvalRootsType::Constant(deg,multipleRoot);
179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  roots_to_monicPolynomial( allRoots, pols );
180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  evalSolver<_Deg,PolynomialType>( pols );
181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  cout << "Test sugar" << endl;
183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  EvalRootsType realRoots = EvalRootsType::Random(deg);
184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  roots_to_monicPolynomial( realRoots, pols );
185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  evalSolverSugarFunction<_Deg>(
186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      pols,
187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      realRoots.template cast <
188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    std::complex<
189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                         typename NumTraits<_Scalar>::Real
190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                         >
191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath                    >(),
192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath      realRoots );
193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_polynomialsolver()
196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < g_repeat; i++)
198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_1( (polynomialsolver<float,1>(1)) );
200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_2( (polynomialsolver<double,2>(2)) );
201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_3( (polynomialsolver<double,3>(3)) );
202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_4( (polynomialsolver<float,4>(4)) );
203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_5( (polynomialsolver<double,5>(5)) );
204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_6( (polynomialsolver<float,6>(6)) );
205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_7( (polynomialsolver<float,7>(7)) );
206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_8( (polynomialsolver<double,8>(8)) );
207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_9( (polynomialsolver<float,Dynamic>(
209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            internal::random<int>(9,13)
210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            )) );
211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    CALL_SUBTEST_10((polynomialsolver<double,Dynamic>(
212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            internal::random<int>(9,13)
213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath            )) );
214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
216