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