//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