13 #ifndef poly_root_test_suite_hpp
14 #define poly_root_test_suite_hpp
27 template<
typename data__>
86 coef << 2, -10, -20, 0, 5, 1;
101 coef << -1, -1, 0, 1, 1;
112 data__ roots[7] = {-6, -4, -2, 2, 4, 6, 8};
123 data__ roots[5] = {-2, -2, -4, 2, 5};
134 data__ roots[6] = {-2, -2, -2, -4, 2, 5};
145 data__ roots[7] = {-2, -2, -2, 2, 2, -4, 5};
156 data__ roots[7] = {-2, -2, 2, 2, 5, -4, 2};
173 coef << 2, -10, -20, 0, 5, 1;
176 std::vector< eli::mutil::poly::polynomial<data__> > p;
185 coef_ref << 2, -10, -20, 0, 5, 1;
186 p[0].get_coefficients(coef_out);
187 TEST_ASSERT(coef_out==coef_ref);
191 coef_ref << -2, -8, 0, 4, 1;
192 p[1].get_coefficients(coef_out);
193 TEST_ASSERT(coef_out==coef_ref);
197 coef_ref << -1, 0, 3, 1;
198 p[2].get_coefficients(coef_out);
199 TEST_ASSERT(coef_out==coef_ref);
204 p[3].get_coefficients(coef_out);
205 if ((
typeid(data__)==
typeid(
float)) || (
typeid(data__)==
typeid(
double)))
207 TEST_ASSERT((coef_out-coef_ref).norm()<5*std::numeric_limits<data__>::epsilon());
211 TEST_ASSERT(coef_out==coef_ref);
217 p[4].get_coefficients(coef_out);
218 TEST_ASSERT((coef_out-coef_ref).norm()<4986*std::numeric_limits<data__>::epsilon());
221 TEST_ASSERT(p[5].degree()==0);
222 TEST_ASSERT(p[5].f(0)>0);
246 coef << -1, -1, 0, 1, 1;
249 std::vector< eli::mutil::poly::polynomial<data__> > p;
257 coef_ref << -1, -1, 0, 1, 1;
258 p[0].get_coefficients(coef_out);
259 TEST_ASSERT(coef_out==coef_ref);
263 coef_ref << -1, 0, 3, 4;
264 p[1].get_coefficients(coef_out);
265 TEST_ASSERT(coef_out==coef_ref);
270 p[2].get_coefficients(coef_out);
271 TEST_ASSERT(coef_out==coef_ref);
276 p[3].get_coefficients(coef_out);
277 TEST_ASSERT(coef_out==coef_ref);
282 p[4].get_coefficients(coef_out);
283 TEST_ASSERT(coef_out==coef_ref);
300 data__ roots[7] = {-6, -4, -2, 2, 4, 6, 8};
302 std::vector< eli::mutil::poly::polynomial<data__> > p;
329 data__ roots[5] = {-2, -2, -4, 2, 5};
331 std::vector< eli::mutil::poly::polynomial<data__> > p;
355 data__ roots[6] = {-2, -2, -2, -4, 2, 5};
357 std::vector< eli::mutil::poly::polynomial<data__> > p;
381 data__ roots[7] = {-2, -2, -2, 2, 2, -4, 5};
383 std::vector< eli::mutil::poly::polynomial<data__> > p;
407 data__ roots[7] = {-2, -2, 2, 2, 5, -4, 2};
409 std::vector< eli::mutil::poly::polynomial<data__> > p;
438 std::vector<data__> root;
444 TEST_ASSERT(nroot==std::numeric_limits<int>::max());
445 TEST_ASSERT(root.size()==0);
451 TEST_ASSERT(nroot==0);
452 TEST_ASSERT(root.size()==0);
463 std::vector<data__> root;
472 TEST_ASSERT(nroot==0);
473 TEST_ASSERT(root.size()==0);
476 root_val=
static_cast<data__
>(0);
480 TEST_ASSERT(nroot==1);
481 TEST_ASSERT(root.size()==1);
484 TEST_ASSERT(root[0]==root_val);
493 TEST_ASSERT(nroot==1);
494 TEST_ASSERT(root.size()==1);
497 TEST_ASSERT(root[0]==root_val);
510 std::vector<data__> root;
519 TEST_ASSERT(nroot==1);
520 TEST_ASSERT(root.size()==1);
523 TEST_ASSERT(root[0]==0);
533 TEST_ASSERT(nroot==2);
534 TEST_ASSERT(root.size()==2);
537 TEST_ASSERT(root[0]==root_val[0]);
538 TEST_ASSERT(root[1]==root_val[1]);
548 TEST_ASSERT(nroot==2);
549 TEST_ASSERT(root.size()==2);
552 TEST_ASSERT(root[0]==root_val[0]);
553 TEST_ASSERT(root[1]==root_val[1]);
563 TEST_ASSERT(nroot==0);
564 TEST_ASSERT(root.size()==0);
576 std::vector<data__> root;
585 TEST_ASSERT(nroot==2);
586 TEST_ASSERT(root.size()==2);
589 TEST_ASSERT(root[0]==0);
590 TEST_ASSERT(root[1]==0);
603 TEST_ASSERT(nroot==3);
604 TEST_ASSERT(root.size()==3);
607 TEST_ASSERT(root[0]==root_val[0]);
608 TEST_ASSERT(root[1]==root_val[1]);
609 TEST_ASSERT(root[2]==root_val[2]);
620 TEST_ASSERT(nroot==3);
621 TEST_ASSERT(root.size()==3);
624 TEST_ASSERT(root[0]==root_val[0]);
625 TEST_ASSERT(root[1]==root_val[1]);
626 TEST_ASSERT(root[2]==root_val[2]);
637 TEST_ASSERT(nroot==3);
638 TEST_ASSERT(root.size()==3);
641 TEST_ASSERT(root[0]==root_val[0]);
642 TEST_ASSERT(root[1]==root_val[1]);
643 TEST_ASSERT(root[2]==root_val[2]);
654 TEST_ASSERT(nroot==3);
655 TEST_ASSERT(root.size()==3);
658 TEST_ASSERT_DELTA(root[0], root_val[0], 2*std::numeric_limits<data__>::epsilon());
659 TEST_ASSERT_DELTA(root[1], root_val[2], 2*std::numeric_limits<data__>::epsilon());
660 TEST_ASSERT_DELTA(root[2], root_val[1], 2*std::numeric_limits<data__>::epsilon());
671 TEST_ASSERT(nroot==1);
672 TEST_ASSERT(root.size()==1);
675 if (
typeid(data__)==
typeid(double))
677 TEST_ASSERT_DELTA(root[0], root_val[0], 2*std::numeric_limits<data__>::epsilon());
679 else if (
typeid(data__)==
typeid(
long double))
681 TEST_ASSERT_DELTA(root[0], root_val[0], 513*std::numeric_limits<data__>::epsilon());
685 TEST_ASSERT_DELTA(root[0], root_val[0], std::numeric_limits<data__>::epsilon());
699 std::vector<data__> root;
708 TEST_ASSERT(nroot==3);
709 TEST_ASSERT(root.size()==3);
710 TEST_ASSERT(root[0]==0);
711 TEST_ASSERT(root[1]==0);
712 TEST_ASSERT(root[2]==0);
725 TEST_ASSERT(nroot==4);
726 TEST_ASSERT(root.size()==4);
729 TEST_ASSERT_DELTA(root[0], root_val[0], 3*std::numeric_limits<data__>::epsilon());
730 TEST_ASSERT_DELTA(root[1], root_val[1], 3*std::numeric_limits<data__>::epsilon());
731 TEST_ASSERT_DELTA(root[2], root_val[2], 3*std::numeric_limits<data__>::epsilon());
732 TEST_ASSERT_DELTA(root[3], root_val[3], 3*std::numeric_limits<data__>::epsilon());
740 data__ one(1), two(2);
741 root_val[0]=-one-std::sqrt(two);
742 root_val[1]=-one+std::sqrt(two);
747 TEST_ASSERT(nroot==2);
748 TEST_ASSERT(root.size()==2);
751 if (
typeid(data__)==
typeid(
long double))
753 TEST_ASSERT_DELTA(root[0], root_val[0], 17*std::numeric_limits<data__>::epsilon());
754 TEST_ASSERT_DELTA(root[1], root_val[1], 17*std::numeric_limits<data__>::epsilon());
758 TEST_ASSERT(root[0]==root_val[0]);
759 TEST_ASSERT(root[1]==root_val[1]);
770 TEST_ASSERT(nroot==0);
771 TEST_ASSERT(root.size()==0);
781 TEST_ASSERT(nroot==4);
782 TEST_ASSERT(root.size()==4);
785 TEST_ASSERT(root[0]==root_val[0]);
786 TEST_ASSERT(root[1]==root_val[1]);
787 TEST_ASSERT(root[2]==root_val[2]);
788 TEST_ASSERT(root[3]==root_val[3]);
800 TEST_ASSERT(nroot==4);
801 TEST_ASSERT(root.size()==4);
804 TEST_ASSERT(root[0]==root_val[0]);
805 TEST_ASSERT(root[1]==root_val[1]);
806 TEST_ASSERT(root[2]==root_val[2]);
807 TEST_ASSERT(root[3]==root_val[3]);
819 TEST_ASSERT(nroot==4);
820 TEST_ASSERT(root.size()==4);
823 TEST_ASSERT(root[0]==root_val[0]);
824 TEST_ASSERT(root[1]==root_val[1]);
825 TEST_ASSERT(root[2]==root_val[2]);
826 TEST_ASSERT(root[3]==root_val[3]);
838 TEST_ASSERT(nroot==4);
839 TEST_ASSERT(root.size()==4);
842 if ((
typeid(data__)==
typeid(
float)) || (
typeid(data__)==
typeid(
double)) || (
typeid(data__)==
typeid(
long double)))
844 TEST_ASSERT(root[0]==root_val[0]);
845 TEST_ASSERT(root[1]==root_val[1]);
846 TEST_ASSERT_DELTA(root[2], root_val[2], std::numeric_limits<data__>::epsilon());
847 TEST_ASSERT(root[3]==root_val[3]);
851 TEST_ASSERT(root[0]==root_val[0]);
852 TEST_ASSERT(root[1]==root_val[1]);
853 TEST_ASSERT(root[2]==root_val[2]);
854 TEST_ASSERT(root[3]==root_val[3]);
867 TEST_ASSERT(nroot==4);
868 TEST_ASSERT(root.size()==4);
871 if ((
typeid(data__)==
typeid(
float)) || (
typeid(data__)==
typeid(
long double)))
873 TEST_ASSERT_DELTA(root[0], root_val[0], std::numeric_limits<data__>::epsilon());
874 TEST_ASSERT_DELTA(root[1], root_val[2], std::numeric_limits<data__>::epsilon());
875 TEST_ASSERT(root[2]==root_val[1]);
876 TEST_ASSERT(root[3]==root_val[3]);
880 TEST_ASSERT(root[0]==root_val[0]);
881 TEST_ASSERT(root[1]==root_val[2]);
882 TEST_ASSERT(root[2]==root_val[1]);
883 TEST_ASSERT(root[3]==root_val[3]);
892 a << root_val[0]*root_val[1],
893 root_val[0]*root_val[1]-root_val[0]-root_val[1],
894 root_val[0]*root_val[1]-root_val[0]-root_val[1]+1,
895 1-root_val[0]-root_val[1],
900 TEST_ASSERT(nroot==2);
901 TEST_ASSERT(root.size()==2);
904 TEST_ASSERT(root[0]==root_val[0]);
905 TEST_ASSERT(root[1]==root_val[1]);
913 a << root_val[0]*root_val[1],
914 root_val[0]*root_val[1]-root_val[0]-root_val[1],
915 root_val[0]*root_val[1]-root_val[0]-root_val[1]+1,
916 1-root_val[0]-root_val[1],
921 TEST_ASSERT(nroot==2);
922 TEST_ASSERT(root.size()==2);
925 TEST_ASSERT(root[0]==root_val[1]);
926 TEST_ASSERT(root[1]==root_val[0]);
936 TEST_ASSERT(nroot==0);
937 TEST_ASSERT(root.size()==0);
void AddTests(const double &)
Definition: poly_root_test_suite.hpp:43
~poly_root_test_suite()
Definition: poly_root_test_suite.hpp:73
poly_root_test_suite()
Definition: poly_root_test_suite.hpp:68
void closed_form_root_test_3()
Definition: poly_root_test_suite.hpp:569
Definition: poly_root_test_suite.hpp:28
void set_coefficients(const coefficient_type &ain)
Definition: polynomial.hpp:81
int descartes_rule(const polynomial< data__ > &f, bool positive)
Definition: descartes_rule.hpp:32
Definition: polynomial.hpp:31
Eigen::Matrix< data_type, Eigen::Dynamic, 1 > coefficient_type
Definition: polynomial.hpp:35
void set_roots(const data_type &root)
Definition: polynomial.hpp:118
int sturm_count(const std::vector< polynomial< data__ > > &sturm_fun, const data2__ &xmin, const data2__ &xmax)
Definition: sturm_count.hpp:82
void sturm_test()
Definition: poly_root_test_suite.hpp:165
void sturm_functions(std::vector< polynomial< data__ > > &sturm_fun, const polynomial< data__ > &f)
Definition: sturm_count.hpp:34
void get_coefficients(coefficient_type &aout) const
Definition: polynomial.hpp:86
int closed_form(std::vector< data__ > &root, const data__ a[], size_t degree)
Definition: closed_form.hpp:374
void AddTests(const long double &)
Definition: poly_root_test_suite.hpp:55
void closed_form_root_test_4()
Definition: poly_root_test_suite.hpp:692
void closed_form_root_test_0()
Definition: poly_root_test_suite.hpp:432
void descartes_test()
Definition: poly_root_test_suite.hpp:78
void AddTests(const float &)
Definition: poly_root_test_suite.hpp:31
void closed_form_root_test_2()
Definition: poly_root_test_suite.hpp:503
void closed_form_root_test_1()
Definition: poly_root_test_suite.hpp:456
void root_finder_test()
Definition: poly_root_test_suite.hpp:940