//This file is part of Bertini 2. // //function_tree_test.cpp is free software: you can redistribute it and/or modify //it under the terms of the GNU General Public License as published by //the Free Software Foundation, either version 3 of the License, or //(at your option) any later version. // //function_tree_test.cpp is distributed in the hope that it will be useful, //but WITHOUT ANY WARRANTY; without even the implied warranty of //MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the //GNU General Public License for more details. // //You should have received a copy of the GNU General Public License //along with function_tree_test.cpp. If not, see . // // Copyright(C) 2015 - 2021 by Bertini2 Development Team // // See for a copy of the license, // as well as COPYING. Bertini2 is provided with permitted // additional terms in the b2/licenses/ directory. // individual authors of this file include: // silviana amethyst, university of wisconsin eau claire // Created by Collins, James B. on 4/30/15. // Copyright (c) 2015 West Texas A&M University. All rights reserved. #include #include #include #include "bertini2/function_tree.hpp" #include #include #include "externs.hpp" BOOST_AUTO_TEST_SUITE(function_tree_class) using mpq_rational = bertini::mpq_rational; using Variable = bertini::node::Variable; using Node = bertini::node::Node; using Float = bertini::node::Float; using dbl = bertini::dbl; using mpfr = bertini::mpfr_complex; template using Mat = bertini::Mat; using namespace bertini; /////////// Basic Operations Alone /////////////////// BOOST_AUTO_TEST_CASE(manual_construction_num_squared){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr a = Float::Make(astr_real, astr_imag); dbl exact_dbl = anum_dbl*anum_dbl; mpfr exact_mpfr{anum_mpfr*anum_mpfr}; std::shared_ptr N = a; N *= N; BOOST_CHECK_EQUAL(N->Degree(),0); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag()) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_squared){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); dbl exact_dbl = xnum_dbl*xnum_dbl; mpfr exact_mpfr{xnum_mpfr*xnum_mpfr}; std::shared_ptr N = x; N *= N; x->set_current_value(std::complex(xnum_dbl)); x->set_current_value(bertini::mpfr_complex(xnum_mpfr)); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag()) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),2); } BOOST_AUTO_TEST_CASE(default_constructed_variable_is_not_nan){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); using std::isnan; using bertini::isnan; BOOST_CHECK(!isnan(x->Eval())); BOOST_CHECK(!isnan(x->Eval())); } BOOST_AUTO_TEST_CASE(default_constructed_variable_is_not_zero){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); BOOST_CHECK(x->Eval()!=dbl(0,0)); BOOST_CHECK(x->Eval()!=mpfr(0,0)); } BOOST_AUTO_TEST_CASE(default_constructed_variable_is_not_one){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); BOOST_CHECK(x->Eval()!=dbl(1,0)); BOOST_CHECK(x->Eval()!=mpfr(1,0)); } BOOST_AUTO_TEST_CASE(self_multiplication){ auto rat_coeff = [](){return bertini::node::Rational::Make(bertini::node::Rational::Rand());}; std::shared_ptr v = rat_coeff(); std::shared_ptr N = v*v; } BOOST_AUTO_TEST_CASE(rational_node_eval_sane_precision_random_rat){ DefaultPrecision(16); std::shared_ptr frac = bertini::node::Rational::Make(bertini::node::Rational::Rand()); mpfr_complex result = frac->Eval(); BOOST_CHECK_EQUAL(Precision(result),16); } BOOST_AUTO_TEST_CASE(rational_node_eval_sane_precision_one_half){ DefaultPrecision(16); std::shared_ptr frac = bertini::node::Rational::Make(mpq_rational(1,2)); mpfr_complex result = frac->Eval(); BOOST_CHECK_EQUAL(Precision(result),16); } BOOST_AUTO_TEST_CASE(manual_construction_sqrt_x){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); dbl exact_dbl = sqrt(xnum_dbl); mpfr exact_mpfr{sqrt(xnum_mpfr)}; std::shared_ptr N = pow(x, mpq_rational(1,2)); x->set_current_value(std::complex(xnum_dbl)); x->set_current_value(bertini::mpfr_complex(xnum_mpfr)); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag()) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_plus_y_plus_number){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = xnum_dbl+ynum_dbl+anum_dbl; mpfr exact_mpfr{xnum_mpfr+ynum_mpfr+anum_mpfr}; dbl temp_d; mpfr temp_mp; std::shared_ptr N = x+y+a; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag()) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = a+x+y; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag()) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = y+a+x; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag()) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = y+x+a; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); N->EvalInPlace(temp_d); N->EvalInPlace(temp_mp); BOOST_CHECK(fabs(temp_d.real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_d.imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_mp.real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(temp_mp.imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); N = x+a+y; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = a+y+x; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag()) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_minus_y_minus_number){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = xnum_dbl-ynum_dbl-anum_dbl; mpfr exact_mpfr{xnum_mpfr-ynum_mpfr-anum_mpfr}; dbl temp_d; mpfr temp_mp; std::shared_ptr N = x-y-a; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(N->IsPolynomial()); N->EvalInPlace(temp_d); N->EvalInPlace(temp_mp); BOOST_CHECK(fabs(temp_d.real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_d.imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_mp.real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(temp_mp.imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); N = x-a-y; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = -a-y+x; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); N->EvalInPlace(temp_d); N->EvalInPlace(temp_mp); BOOST_CHECK(fabs(temp_d.real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_d.imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_mp.real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(temp_mp.imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); N = -a+x-y; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = -y-a+x; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = -y+x-a; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_times_y_times_number){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = xnum_dbl*ynum_dbl*anum_dbl; mpfr exact_mpfr{xnum_mpfr*ynum_mpfr*anum_mpfr}; dbl temp_d; mpfr temp_mp; std::shared_ptr N = x*y*a; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(N->IsPolynomial()); N->EvalInPlace(temp_d); N->EvalInPlace(temp_mp); BOOST_CHECK(fabs(temp_d.real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_d.imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_mp.real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(temp_mp.imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); N = a*x*y; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); N = y*a*x; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); N = y*x*a; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); N = x*a*y; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); N = a*y*x; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_divide_y){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = xnum_dbl/ynum_dbl; mpfr exact_mpfr{xnum_mpfr/ynum_mpfr}; std::shared_ptr N = x/y; BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); exact_dbl = ynum_dbl/xnum_dbl; exact_mpfr = ynum_mpfr/xnum_mpfr; N = y/x; BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_negate_x){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = -xnum_dbl; mpfr exact_mpfr{-xnum_mpfr}; std::shared_ptr N = -x; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } /////////// Basic Operations Combined /////////////////// BOOST_AUTO_TEST_CASE(manual_construction_lx_plus_y_plus_num1l_pow_num2){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = pow(xnum_dbl+ynum_dbl+anum_dbl,pnum_dbl); mpfr exact_mpfr{pow(xnum_mpfr+ynum_mpfr+anum_mpfr,pnum_mpfr)}; dbl temp_d; mpfr temp_mp; std::shared_ptr N = pow(x+y+a,p); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N->EvalInPlace(temp_d); N->EvalInPlace(temp_mp); BOOST_CHECK(fabs(temp_d.real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_d.imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_mp.real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(temp_mp.imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_lx_minus_y_minus_num1l_pow_num2){ using mpfr_float = bertini::mpfr_float; std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = pow(xnum_dbl-ynum_dbl-anum_dbl,pnum_dbl); mpfr exact_mpfr{pow(xnum_mpfr-ynum_mpfr-anum_mpfr,pnum_mpfr)}; std::shared_ptr N = pow(x-y-a,p); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_lx_times_y_times_num1l_pow_num2){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = pow(xnum_dbl*ynum_dbl*anum_dbl,pnum_dbl); mpfr exact_mpfr{pow(xnum_mpfr*ynum_mpfr*anum_mpfr,pnum_mpfr)}; dbl temp_d; mpfr temp_mp; std::shared_ptr N = pow(x*y*a,p); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag()) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = pow(x,p)*pow(y,p)*pow(a,p); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK_EQUAL(N->Degree(y),-1); exact_dbl = pow(xnum_dbl,pnum_dbl)*pow(ynum_dbl,pnum_dbl)*pow(anum_dbl,pnum_dbl); exact_mpfr = pow(xnum_mpfr,pnum_mpfr)*pow(ynum_mpfr,pnum_mpfr)*pow(anum_mpfr,pnum_mpfr); N->EvalInPlace(temp_d); N->EvalInPlace(temp_mp); BOOST_CHECK(fabs(temp_d.real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_d.imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_mp.real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(temp_mp.imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_lx_over_yl_pow_num2){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = pow(xnum_dbl/ynum_dbl,pnum_dbl); mpfr exact_mpfr{pow(xnum_mpfr/ynum_mpfr,pnum_mpfr)}; std::shared_ptr N = pow(x/y,p); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = pow(x,p)/pow(y,p); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_lnegative_xl_pow_num2){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = pow(-xnum_dbl,pnum_dbl); mpfr exact_mpfr{pow(-xnum_mpfr,pnum_mpfr)}; std::shared_ptr N = -x; N = pow(N,p); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_negate_x_plus_y_plus_num1){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = -(xnum_dbl+ynum_dbl+anum_dbl); mpfr exact_mpfr{-(xnum_mpfr+ynum_mpfr+anum_mpfr)}; std::shared_ptr N = -(x+y+a); BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = -x-y-a; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_negate_x_minus_y_minus_num1){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = -(xnum_dbl-ynum_dbl-anum_dbl); mpfr exact_mpfr{-(xnum_mpfr-ynum_mpfr-anum_mpfr)}; std::shared_ptr N = -(x-y-a); BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = -x+y+a; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_negate_x_times_y_times_num1){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = -(xnum_dbl*ynum_dbl*anum_dbl); mpfr exact_mpfr{-(xnum_mpfr*ynum_mpfr*anum_mpfr)}; std::shared_ptr N = -(x*y*a); BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = (-x)*y*a; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = x*(-y)*a; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = x*y*(-a); BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_negate_x_over_y){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = -(xnum_dbl/ynum_dbl); mpfr exact_mpfr{-(xnum_mpfr/ynum_mpfr)}; std::shared_ptr N = -(x/y); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = -x/y; BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = x/(-y); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); ; } BOOST_AUTO_TEST_CASE(manual_construction_negate_x_pow_num2){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = -pow(xnum_dbl,pnum_dbl); mpfr exact_mpfr{-pow(xnum_mpfr,pnum_mpfr)}; std::shared_ptr N = pow(x,p); N = -N; BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } /////////// Order of Operations /////////////////// BOOST_AUTO_TEST_CASE(manual_construction_x_times_y_over_num){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = xnum_dbl*ynum_dbl/anum_dbl; mpfr exact_mpfr{xnum_mpfr*ynum_mpfr/anum_mpfr}; std::shared_ptr N = x*y/a; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = (x*y)/a; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = x/a*y; BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK_SMALL(N->Eval().real()/exact_dbl.real()-1.0, threshold_clearance_d); BOOST_CHECK_SMALL(N->Eval().imag()/exact_dbl.imag()-1.0, threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_lx_plus_num1l_times_ly_plus_num2l){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr b = Float::Make(bstr_real, bstr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = (xnum_dbl+anum_dbl)*(ynum_dbl+bnum_dbl); mpfr exact_mpfr{(xnum_mpfr+anum_mpfr)*(ynum_mpfr+bnum_mpfr)}; std::shared_ptr N = (x+a)*(y+b); BOOST_CHECK_EQUAL(N->Degree(),2); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_plus_num1_times_y_plus_num2){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr b = Float::Make(bstr_real, bstr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = xnum_dbl+anum_dbl*ynum_dbl+bnum_dbl; mpfr exact_mpfr{xnum_mpfr+anum_mpfr*ynum_mpfr+bnum_mpfr}; std::shared_ptr N = x+a*y+b; BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_lx_plus_num1l_over_ly_plus_num2l){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr b = Float::Make(bstr_real, bstr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = (xnum_dbl+anum_dbl)/(ynum_dbl+bnum_dbl); mpfr exact_mpfr{(xnum_mpfr+anum_mpfr)/(ynum_mpfr+bnum_mpfr)}; std::shared_ptr N = (x+a)/(y+b); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_plus_num1_over_y_plus_num2){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr b = Float::Make(bstr_real, bstr_imag); x->set_current_value(xnum_dbl); y->set_current_value(ynum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); y->set_current_value(bertini::mpfr_complex(ystr_real,ystr_imag)); dbl exact_dbl = xnum_dbl+anum_dbl/ynum_dbl+bnum_dbl; mpfr exact_mpfr{xnum_mpfr+anum_mpfr/ynum_mpfr+bnum_mpfr}; std::shared_ptr N = x+a/y+b; BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK_EQUAL(N->Degree(y),-1); BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_lx_pow_num2l_plus_num1){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = pow(xnum_dbl,pnum_dbl)+anum_dbl; mpfr exact_mpfr{pow(xnum_mpfr,pnum_mpfr)+anum_mpfr}; std::shared_ptr N = pow(x,p)+a; BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_plus_lnum1_pow_num2l){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = pow(anum_dbl,pnum_dbl)+xnum_dbl; mpfr exact_mpfr{pow(anum_mpfr,pnum_mpfr)+xnum_mpfr}; std::shared_ptr N = x+pow(a,p); BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_times_lnum1_pow_num2l){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = pow(anum_dbl,pnum_dbl)*xnum_dbl; mpfr exact_mpfr{pow(anum_mpfr,pnum_mpfr)*xnum_mpfr}; std::shared_ptr N = x*pow(a,p); BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_lx_pow_num2l_times_num1){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = pow(xnum_dbl,pnum_dbl)*anum_dbl; mpfr exact_mpfr{pow(xnum_mpfr,pnum_mpfr)*anum_mpfr}; std::shared_ptr N = pow(x,p)*a; BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_lx_pow_num2l_over_num1){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = pow(xnum_dbl,pnum_dbl)/anum_dbl; mpfr exact_mpfr{pow(xnum_mpfr,pnum_mpfr)/anum_mpfr}; std::shared_ptr N = pow(x,p)/a; BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(! N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_pow_lsqrt_xl_num) { bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); auto exact_dbl = pow(sqrt(xnum_dbl),anum_dbl); bertini::mpfr_complex exact_mpfr = pow(sqrt(xnum_mpfr),anum_mpfr); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); x->set_current_value(xnum_mpfr); std::shared_ptr N = pow(sqrt(x),a); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = pow(x,mpq_rational(1,2)); // N = sqrt(x) BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); N = pow(N,a); // N = sqrt(x)^a BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK_SMALL(N->Eval().real() / exact_dbl.real() -1, threshold_clearance_d); BOOST_CHECK_SMALL(N->Eval().imag() - exact_dbl.imag(), 10*threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_over_lnum1_pow_num2l){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = xnum_dbl/pow(anum_dbl,pnum_dbl); mpfr exact_mpfr{xnum_mpfr/pow(anum_mpfr,pnum_mpfr)}; std::shared_ptr N = x/pow(a,p); BOOST_CHECK_EQUAL(N->Degree(),1); BOOST_CHECK_EQUAL(N->Degree(x),1); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_pow_lnum1_plus_num2l){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = pow(xnum_dbl,anum_dbl+pnum_dbl); mpfr exact_mpfr{pow(xnum_mpfr,anum_mpfr+pnum_mpfr)}; std::shared_ptr N = pow(x,a+p); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_pow_lnum1_times_num2l){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = pow(xnum_dbl,anum_dbl*pnum_dbl); mpfr exact_mpfr{pow(xnum_mpfr,anum_mpfr*pnum_mpfr)}; std::shared_ptr N = pow(x,a*p); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_x_pow_lnum1_over_num2l){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); std::shared_ptr p = Float::Make(pstr_real, pstr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = pow(xnum_dbl,pnum_dbl/anum_dbl); mpfr exact_mpfr{pow(xnum_mpfr,pnum_mpfr/anum_mpfr)}; std::shared_ptr N = pow(x,p/a); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } ///////////// Special Functions /////////////////// BOOST_AUTO_TEST_CASE(manual_construction_sin_num){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr a = Float::Make(astr_real, astr_imag); dbl exact_dbl = sin(anum_dbl); mpfr exact_mpfr{sin(anum_mpfr)}; dbl temp_d; mpfr temp_mp; std::shared_ptr N = sin(a); BOOST_CHECK_EQUAL(N->Degree(),0); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N->EvalInPlace(temp_d); N->EvalInPlace(temp_mp); BOOST_CHECK(fabs(temp_d.real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_d.imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_mp.real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(temp_mp.imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_cos_num){ using mpfr_float = bertini::mpfr_float; std::shared_ptr a = Float::Make(astr_real, astr_imag); dbl exact_dbl = cos(anum_dbl); mpfr exact_mpfr{cos(anum_mpfr)}; std::shared_ptr N = cos(a); BOOST_CHECK_EQUAL(N->Degree(),0); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_tan_num){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr a = Float::Make(astr_real, astr_imag); dbl exact_dbl = tan(anum_dbl); mpfr exact_mpfr{tan(anum_mpfr)}; std::shared_ptr N = tan(a); BOOST_CHECK_EQUAL(N->Degree(),0); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_exp_num){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr a = Float::Make(astr_real, astr_imag); dbl exact_dbl = exp(anum_dbl); mpfr exact_mpfr{exp(anum_mpfr)}; dbl temp_d; mpfr temp_mp; std::shared_ptr N = exp(a); BOOST_CHECK_EQUAL(N->Degree(),0); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N->EvalInPlace(temp_d); N->EvalInPlace(temp_mp); BOOST_CHECK(fabs(temp_d.real() / exact_dbl.real() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_d.imag() / exact_dbl.imag() -1) < threshold_clearance_d); BOOST_CHECK(fabs(temp_mp.real() / exact_mpfr.real() -1) < threshold_clearance_mp); BOOST_CHECK(fabs(temp_mp.imag() / exact_mpfr.imag() -1) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_sqrt_num){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr a = Float::Make(astr_real, astr_imag); dbl exact_dbl = sqrt(anum_dbl); mpfr exact_mpfr{sqrt(anum_mpfr)}; std::shared_ptr N = sqrt(a); BOOST_CHECK_EQUAL(N->Degree(),0); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_sin_of_lx_plus_numl){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = sin(xnum_dbl+anum_dbl); mpfr exact_mpfr{sin(xnum_mpfr+anum_mpfr)}; std::shared_ptr N = sin(x+a); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_cos_of_lx_times_numl){ using mpfr_float = bertini::mpfr_float; std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = cos(xnum_dbl*anum_dbl); mpfr exact_mpfr{cos(xnum_mpfr*anum_mpfr)}; std::shared_ptr N = cos(x*a); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_tan_of_lx_over_numl){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = tan(xnum_dbl/anum_dbl); mpfr exact_mpfr{tan(xnum_mpfr/anum_mpfr)}; std::shared_ptr N = tan(x/a); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_exp_of_negative_num){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr a = Float::Make(astr_real, astr_imag); dbl exact_dbl = exp(-anum_dbl); mpfr exact_mpfr{exp(-anum_mpfr)}; std::shared_ptr N = exp(-a); BOOST_CHECK_EQUAL(N->Degree(),0); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(manual_construction_sqrt_of_lx_pow_numl){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); std::shared_ptr x = Variable::Make("x"); std::shared_ptr a = Float::Make(astr_real, astr_imag); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = sqrt(pow(xnum_dbl,anum_dbl)); mpfr exact_mpfr{sqrt(pow(xnum_mpfr,anum_mpfr))}; std::shared_ptr N = sqrt(pow(x,a)); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(!N->IsPolynomial()); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); N = pow(x,a); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); N = pow(N,mpq_rational(1,2)); BOOST_CHECK_EQUAL(N->Degree(),-1); BOOST_CHECK_EQUAL(N->Degree(x),-1); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(arcsine_evaluate) { std::shared_ptr x = Variable::Make("x"); auto N = asin(pow(x,2)+1); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = asin(pow(xnum_dbl,2)+1.0); mpfr exact_mpfr{asin(pow(xnum_mpfr,2)+bertini::mpfr_complex(1.0))}; BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); BOOST_CHECK(!N->IsPolynomial()); } BOOST_AUTO_TEST_CASE(arccosine_evaluate) { std::shared_ptr x = Variable::Make("x"); auto N = acos(pow(x,2)+1); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = acos(pow(xnum_dbl,2)+1.0); mpfr exact_mpfr{acos(pow(xnum_mpfr,2)+bertini::mpfr_complex(1.0))}; BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); BOOST_CHECK(!N->IsPolynomial()); } BOOST_AUTO_TEST_CASE(arctangent_evaluate) { std::shared_ptr x = Variable::Make("x"); auto N = atan(pow(x,2)+1); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = atan(pow(xnum_dbl,2)+1.0); mpfr exact_mpfr{atan(pow(xnum_mpfr,2)+bertini::mpfr_complex(1.0))}; BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); BOOST_CHECK(!N->IsPolynomial()); } BOOST_AUTO_TEST_CASE(log_evaluate) { std::shared_ptr x = Variable::Make("x"); auto N = log(pow(x,2)+1); x->set_current_value(xnum_dbl); x->set_current_value(bertini::mpfr_complex(xstr_real,xstr_imag)); dbl exact_dbl = log(pow(xnum_dbl,2)+1.0); mpfr exact_mpfr{log(pow(xnum_mpfr,2)+bertini::mpfr_complex(1.0))}; BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().imag() - exact_dbl.imag() ) < threshold_clearance_d); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(fabs(N->Eval().imag() - exact_mpfr.imag() ) < threshold_clearance_mp); BOOST_CHECK(!N->IsPolynomial()); } ///////////// Special Numbers /////////////////// BOOST_AUTO_TEST_CASE(manual_construction_pi){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); using std::atan; dbl exact_dbl(4*atan(1.0),0); mpfr exact_mpfr{mpfr_float("4.0")*atan(mpfr_float("1.0"))}; auto N = bertini::node::Pi(); BOOST_CHECK_EQUAL(N->Degree(),0); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK_EQUAL(N->Eval().imag(),0.0); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK_EQUAL(N->Eval().imag(),0.0); BOOST_CHECK(N->IsPolynomial()); } BOOST_AUTO_TEST_CASE(manual_construction_e){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); dbl exact_dbl(exp(1.0),0); mpfr exact_mpfr{exp(mpfr_float("1.0"))}; auto N = bertini::node::E(); BOOST_CHECK_EQUAL(N->Degree(),0); BOOST_CHECK(fabs(N->Eval().real() - exact_dbl.real() ) < threshold_clearance_d); BOOST_CHECK(N->Eval().imag() == 0.0); BOOST_CHECK(fabs(N->Eval().real() - exact_mpfr.real() ) < threshold_clearance_mp); BOOST_CHECK(N->Eval().imag() - exact_mpfr.imag() == 0.0); } BOOST_AUTO_TEST_CASE(manual_construction_i){ using mpfr_float = bertini::mpfr_float; bertini::DefaultPrecision(CLASS_TEST_MPFR_DEFAULT_DIGITS); dbl exact_dbl(0.0,1.0); mpfr exact_mpfr{mpfr("0.0","1.0")}; auto N = bertini::node::I(); BOOST_CHECK_EQUAL(N->Degree(),0); BOOST_CHECK(N->IsPolynomial()); BOOST_CHECK(N->Eval().real() == 0.0); BOOST_CHECK(N->Eval().imag() == 1.0); BOOST_CHECK(N->Eval().real() == 0.0); BOOST_CHECK(N->Eval().imag() == 1.0); } BOOST_AUTO_TEST_CASE(function_tree_combine_product_of_two_integer_powers) { std::shared_ptr x = Variable::Make("x"); std::shared_ptr N,M,P; N = pow(x,5); M = pow(x,2); P = N*M; BOOST_CHECK_EQUAL(P->Degree(), 7); BOOST_CHECK(std::dynamic_pointer_cast(P)); P = N/M; BOOST_CHECK(!std::dynamic_pointer_cast(P)); BOOST_CHECK_EQUAL(P->Degree(), -1); N = pow(x,3); M = pow(x,-1); P = N/M; BOOST_CHECK(!std::dynamic_pointer_cast(P)); BOOST_CHECK_EQUAL(P->Degree(), -1); } BOOST_AUTO_TEST_CASE(long_arithmetic_chain) { std::vector> polytypes(9); auto rat_coeff = [](){return bertini::node::Rational::Make(bertini::node::Rational::Rand());}; for (unsigned int ii=0; ii<9; ++ii) polytypes[ii] = rat_coeff(); std::shared_ptr v = rat_coeff(); std::shared_ptr m12_2 = rat_coeff(); std::shared_ptr cosb = rat_coeff(); std::shared_ptr sinb = rat_coeff(); std::shared_ptr sin2b = rat_coeff(); std::shared_ptr N = 2*m12_2/sin2b - v*v * polytypes[9-1] / 16; } BOOST_AUTO_TEST_CASE(make_linear_product) { using namespace bertini::node; bertini::VariableGroup vargp; std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr z = Variable::Make("z"); std::shared_ptr U = Variable::Make("U"); vargp.push_back(x); vargp.push_back(y); vargp.push_back(z); // Make with automatically genearted coefficients std::shared_ptr linprod = LinearProduct::Make(vargp,4); // Make with user defined coefficients Mat coeff_mpfr(3,4); for(int ii = 0; ii < 3; ++ii) { for(int jj = 0; jj < 4; ++jj) { coeff_mpfr(ii,jj) = mpfr(ii+1, jj+1); } } std::shared_ptr linprod2 = LinearProduct::Make(vargp, coeff_mpfr); } BOOST_AUTO_TEST_CASE(eval_linear_product) { using namespace bertini::node; auto x = Variable::Make("x"); auto y = Variable::Make("y"); auto z = Variable::Make("z"); auto w = Variable::Make("w"); VariableGroup v0{x,z,y}; VariableGroup v1{w}; Mat coeff_dbl(3,4); Mat coeff_mpfr(3,4); for(int ii = 0; ii < 3; ++ii) { for(int jj = 0; jj < 4; ++jj) { coeff_dbl(ii,jj) = dbl(ii+1, jj+1); coeff_mpfr(ii,jj) = mpfr(ii+1, jj+1); } } std::shared_ptr linprod1 = bertini::node::LinearProduct::Make(v0, coeff_mpfr); coeff_dbl = Mat(1,2); coeff_mpfr = Mat(1,2); for(int ii = 0; ii < 1; ++ii) { for(int jj = 0; jj < 2; ++jj) { coeff_dbl(ii,jj) = dbl(ii+3, jj+3); coeff_mpfr(ii,jj) = mpfr(ii+3, jj+3); } } std::shared_ptr linprod2 = bertini::node::LinearProduct::Make(v1, coeff_mpfr); std::shared_ptr linprod_node = (mpfr(1,1)*x + mpfr(1,2)*z + mpfr(1,3)*y+ mpfr(1,4)) * (mpfr(2,1)*x + mpfr(2,2)*z + mpfr(2,3)*y+ mpfr(2,4))*(mpfr(3,1)*x + mpfr(3,2)*z + mpfr(3,3)*y+ mpfr(3,4))* (mpfr(3,3)*w + mpfr(3,4)); std::shared_ptr linprod = linprod1*linprod2; dbl xval_d = dbl(.5,1); dbl yval_d = dbl(.6,1); dbl zval_d = dbl(.7,1); dbl wval_d = dbl(2.1, -.03); mpfr xval_mp = mpfr(".5", "1"); mpfr yval_mp = mpfr(".6", "1"); mpfr zval_mp = mpfr(".7", "1"); mpfr wval_mp = mpfr(".22", "1.11"); v0[0]->set_current_value(xval_d); v0[1]->set_current_value(zval_d); v0[2]->set_current_value(yval_d); v0[0]->set_current_value(xval_mp); v0[1]->set_current_value(zval_mp); v0[2]->set_current_value(yval_mp); v1[0]->set_current_value(wval_d); v1[0]->set_current_value(wval_mp); dbl eval_d = linprod->Eval(); dbl exact_d = linprod_node->Eval(); mpfr eval_mp = linprod->Eval(); mpfr exact_mp = linprod_node->Eval(); BOOST_CHECK(fabs(eval_d.real()/exact_d.real() - 1) < threshold_clearance_d); BOOST_CHECK(fabs(eval_d.imag()/exact_d.imag() - 1) < threshold_clearance_d); BOOST_CHECK(fabs(eval_mp.real()/exact_mp.real() - 1) < threshold_clearance_mp); BOOST_CHECK(fabs(eval_mp.imag()/exact_mp.imag() - 1) < threshold_clearance_mp); } BOOST_AUTO_TEST_CASE(linear_product_degree) { using namespace bertini::node; bertini::VariableGroup vargp, vargp2, vargp3; std::shared_ptr x = Variable::Make("x"); std::shared_ptr y = Variable::Make("y"); std::shared_ptr z = Variable::Make("z"); std::shared_ptr w = Variable::Make("w"); vargp.push_back(x); vargp.push_back(y); vargp.push_back(z); vargp2.push_back(x); vargp2.push_back(z); vargp2.push_back(w); vargp3.push_back(w); // Make with automatically genearted coefficients std::shared_ptr linprod = LinearProduct::Make(vargp,4); BOOST_CHECK_EQUAL(linprod->Degree(x), 4); BOOST_CHECK_EQUAL(linprod->Degree(y), 4); BOOST_CHECK_EQUAL(linprod->Degree(z), 4); BOOST_CHECK_EQUAL(linprod->Degree(w), 0); BOOST_CHECK_EQUAL(linprod->Degree(vargp), 4); BOOST_CHECK_EQUAL(linprod->Degree(vargp2), 4); BOOST_CHECK_EQUAL(linprod->Degree(vargp3), 0); BOOST_CHECK_EQUAL(linprod->MultiDegree(vargp)[0], 4); BOOST_CHECK_EQUAL(linprod->MultiDegree(vargp)[1], 4); BOOST_CHECK_EQUAL(linprod->MultiDegree(vargp)[2], 4); BOOST_CHECK_EQUAL(linprod->MultiDegree(vargp2)[0], 4); BOOST_CHECK_EQUAL(linprod->MultiDegree(vargp2)[2], 0); BOOST_CHECK_EQUAL(linprod->MultiDegree(vargp3)[0], 0); } BOOST_AUTO_TEST_CASE(linear_prod_get_linears) { using namespace bertini::node; auto x = Variable::Make("x"); auto y = Variable::Make("y"); auto z = Variable::Make("z"); auto w = Variable::Make("w"); int num_vars = 3; VariableGroup v0{x,z,y}; VariableGroup v1{w}; Mat coeff_dbl(3,4); Mat coeff_mpfr(3,4); for(int ii = 0; ii < 3; ++ii) { for(int jj = 0; jj < 4; ++jj) { coeff_dbl(ii,jj) = dbl(ii+1, jj+1); coeff_mpfr(ii,jj) = mpfr(ii+1, jj+1); } } std::shared_ptr linprod = bertini::node::LinearProduct::Make(v0, coeff_mpfr); std::shared_ptr linprod_node1 = (mpfr(1,1)*x + mpfr(1,2)*z + mpfr(1,3)*y+ mpfr(1,4)); std::shared_ptr linprod_node2 = (mpfr(2,1)*x + mpfr(2,2)*z + mpfr(2,3)*y+ mpfr(2,4)); std::shared_ptr linprod_node3 = (mpfr(3,1)*x + mpfr(3,2)*z + mpfr(3,3)*y+ mpfr(3,4)); std::shared_ptr linprod_node12 = linprod_node1 * linprod_node3; std::shared_ptr linprod_node = linprod_node1 * linprod_node2 * linprod_node3; dbl xval_d = dbl(.5,1); dbl yval_d = dbl(.6,1); dbl zval_d = dbl(.7,1); dbl wval_d = dbl(2.1, -.03); mpfr xval_mp = mpfr(".5", "1"); mpfr yval_mp = mpfr(".6", "1"); mpfr zval_mp = mpfr(".7", "1"); mpfr wval_mp = mpfr(".22", "1.11"); v0[0]->set_current_value(xval_d); v0[1]->set_current_value(zval_d); v0[2]->set_current_value(yval_d); v0[0]->set_current_value(xval_mp); v0[1]->set_current_value(zval_mp); v0[2]->set_current_value(yval_mp); v1[0]->set_current_value(wval_d); v1[0]->set_current_value(wval_mp); bertini::Vec coeff_d = linprod->GetCoeffs(1); bertini::Vec coeff_mp = linprod->GetCoeffs(2); for(int ii = 0; ii < num_vars+1; ++ii) { BOOST_CHECK(fabs(coeff_d[ii].real()/coeff_dbl(1,ii).real() - 1) < threshold_clearance_d); BOOST_CHECK(fabs(coeff_d[ii].imag()/coeff_dbl(1,ii).imag() - 1) < threshold_clearance_d); BOOST_CHECK(fabs(coeff_mp[ii].real()/coeff_mpfr(2,ii).real() - 1) < threshold_clearance_mp); BOOST_CHECK(fabs(coeff_mp[ii].imag()/coeff_mpfr(2,ii).imag() - 1) < threshold_clearance_mp); } std::vector ind{0,2}; // std::shared_ptr linprod12 = linprod->GetLinears(ind); // std::shared_ptr linprod2 = linprod->GetLinears(1); // std::shared_ptr linprod3 = linprod->GetLinears(2); // // // dbl evalx_d = linprod12->Eval(); // dbl exactx_d = linprod_node12->Eval(); // mpfr evalx_mp = linprod12->Eval(); // mpfr exactx_mp = linprod_node12->Eval(); // // BOOST_CHECK(fabs(evalx_d.real()/exactx_d.real() - 1) < threshold_clearance_d); // BOOST_CHECK(fabs(evalx_d.imag()/exactx_d.imag() - 1) < threshold_clearance_d); // BOOST_CHECK(fabs(evalx_mp.real()/exactx_mp.real() - 1) < threshold_clearance_mp); // BOOST_CHECK(fabs(evalx_mp.imag()/exactx_mp.imag() - 1) < threshold_clearance_mp); // // evalx_d = linprod2->Eval(); // exactx_d = linprod_node2->Eval(); // evalx_mp = linprod2->Eval(); // exactx_mp = linprod_node2->Eval(); // // BOOST_CHECK(fabs(evalx_d.real()/exactx_d.real() - 1) < threshold_clearance_d); // BOOST_CHECK(fabs(evalx_d.imag()/exactx_d.imag() - 1) < threshold_clearance_d); // BOOST_CHECK(fabs(evalx_mp.real()/exactx_mp.real() - 1) < threshold_clearance_mp); // BOOST_CHECK(fabs(evalx_mp.imag()/exactx_mp.imag() - 1) < threshold_clearance_mp); // // evalx_d = linprod3->Eval(); // exactx_d = linprod_node3->Eval(); // evalx_mp = linprod3->Eval(); // exactx_mp = linprod_node3->Eval(); // // BOOST_CHECK(fabs(evalx_d.real()/exactx_d.real() - 1) < threshold_clearance_d); // BOOST_CHECK(fabs(evalx_d.imag()/exactx_d.imag() - 1) < threshold_clearance_d); // BOOST_CHECK(fabs(evalx_mp.real()/exactx_mp.real() - 1) < threshold_clearance_mp); // BOOST_CHECK(fabs(evalx_mp.imag()/exactx_mp.imag() - 1) < threshold_clearance_mp); } BOOST_AUTO_TEST_SUITE_END()