41#ifndef BERTINI_OPERATOR_ARITHMETIC_HPP
42#define BERTINI_OPERATOR_ARITHMETIC_HPP
79 class SumOperator :
public virtual NaryOperator,
public virtual EnableSharedFromThisVirtual<SumOperator>
82 BERTINI_DEFAULT_VISITABLE()
84 virtual ~SumOperator() =
default;
89 unsigned ReduceSubSums();
90 unsigned ReduceSubMults();
92 template<
typename... Ts>
94 std::shared_ptr<SumOperator> Make(Ts&& ...ts){
95 return std::shared_ptr<SumOperator>(
new SumOperator(ts...) );
99 SumOperator(
const std::shared_ptr<Node> & s,
bool add_or_sub)
104 SumOperator(
const std::shared_ptr<Node> & left,
const std::shared_ptr<Node> & right)
111 SumOperator(
const std::shared_ptr<Node> & left,
bool add_or_sub_left,
const std::shared_ptr<Node> & right,
bool add_or_sub_right)
119 SumOperator& operator+=(
const std::shared_ptr<Node> & rhs)
125 SumOperator& operator-=(
const std::shared_ptr<Node> & rhs)
140 NaryOperator::AddOperand(std::move(child));
141 signs_.push_back(
true);
150 NaryOperator::AddOperand(std::move(child));
151 signs_.push_back(sign);
158 void print(std::ostream & target)
const override;
166 std::shared_ptr<Node>
Differentiate(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
171 int Degree(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
174 int Degree(VariableGroup
const& vars)
const override;
179 std::vector<int>
MultiDegree(VariableGroup
const& vars)
const override;
182 const auto& GetSigns()
const{
return this-> signs_;}
189 void Homogenize(VariableGroup
const& vars, std::shared_ptr<Variable>
const& homvar)
override;
191 bool IsHomogeneous(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
196 bool IsHomogeneous(VariableGroup
const& vars)
const override;
208 dbl
FreshEval_d(std::shared_ptr<Variable>
const& diff_variable)
const override;
214 void FreshEval_d(dbl& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
221 mpfr_complex
FreshEval_mp(std::shared_ptr<Variable>
const& diff_variable)
const override;
227 void FreshEval_mp(mpfr_complex& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
235 std::vector<bool> signs_;
241 friend class boost::serialization::access;
243 template <
typename Archive>
244 void serialize(Archive& ar,
const unsigned version) {
245 ar & boost::serialization::base_object<NaryOperator>(*
this);
250 void PrecisionChangeSpecific(
unsigned prec)
const override
252 temp_mp_.precision(prec);
255 mutable mpfr_complex temp_mp_;
280 class NegateOperator :
public virtual UnaryOperator,
public virtual EnableSharedFromThisVirtual<NegateOperator>
283 BERTINI_DEFAULT_VISITABLE()
285 template<
typename... Ts>
287 std::shared_ptr<NegateOperator> Make(Ts&& ...ts){
288 return std::shared_ptr<NegateOperator>(
new NegateOperator(ts...) );
293 NegateOperator(
const std::shared_ptr<Node> & N) : UnaryOperator(N)
304 void print(std::ostream & target)
const override;
310 std::shared_ptr<Node>
Differentiate(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
312 bool IsHomogeneous(std::shared_ptr<Variable>
const& v =
nullptr)
const override
314 return operand_->IsHomogeneous(v);
322 return operand_->IsHomogeneous(vars);
330 dbl
FreshEval_d(std::shared_ptr<Variable>
const& diff_variable)
const override;
331 void FreshEval_d(dbl& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
333 mpfr_complex
FreshEval_mp(std::shared_ptr<Variable>
const& diff_variable)
const override;
334 void FreshEval_mp(mpfr_complex& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
341 friend class boost::serialization::access;
343 template <
typename Archive>
344 void serialize(Archive& ar,
const unsigned version) {
345 ar & boost::serialization::base_object<UnaryOperator>(*
this);
350 inline std::shared_ptr<Node> operator-(
const std::shared_ptr<Node> & rhs)
352 return NegateOperator::Make(rhs);
371 class MultOperator :
public virtual NaryOperator,
public virtual EnableSharedFromThisVirtual<MultOperator>
374 BERTINI_DEFAULT_VISITABLE()
379 unsigned ReduceSubSums();
380 unsigned ReduceSubMults();
383 template<
typename... Ts>
385 std::shared_ptr<MultOperator> Make(Ts&& ...ts){
386 return std::shared_ptr<MultOperator>(
new MultOperator(ts...) );
395 MultOperator(std::shared_ptr<Node>
const& s)
400 MultOperator(std::shared_ptr<Node>
const& left, std::shared_ptr<Node>
const& right)
407 MultOperator(
const std::shared_ptr<Node> & left,
bool mult_or_div_left,
const std::shared_ptr<Node> & right,
bool mult_or_div_right)
409 AddOperand(left, mult_or_div_left);
410 AddOperand(right, mult_or_div_right);
415 virtual ~MultOperator() =
default;
421 void AddOperand(std::shared_ptr<Node> child)
override
423 NaryOperator::AddOperand(std::move(child));
424 mult_or_div_.push_back(
true);
430 void AddOperand(std::shared_ptr<Node> child,
bool mult)
432 NaryOperator::AddOperand(std::move(child));
433 mult_or_div_.push_back(mult);
440 void print(std::ostream & target)
const override;
445 std::shared_ptr<Node>
Differentiate(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
450 int Degree(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
453 int Degree(VariableGroup
const& vars)
const override;
458 std::vector<int>
MultiDegree(VariableGroup
const& vars)
const override;
461 void Homogenize(VariableGroup
const& vars, std::shared_ptr<Variable>
const& homvar)
override;
463 bool IsHomogeneous(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
468 bool IsHomogeneous(VariableGroup
const& vars)
const override;
482 dbl
FreshEval_d(std::shared_ptr<Variable>
const& diff_variable)
const override;
483 void FreshEval_d(dbl& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
485 mpfr_complex
FreshEval_mp(std::shared_ptr<Variable>
const& diff_variable)
const override;
486 void FreshEval_mp(mpfr_complex& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
502 std::vector<bool> mult_or_div_;
507 friend class boost::serialization::access;
509 template <
typename Archive>
510 void serialize(Archive& ar,
const unsigned version) {
511 ar & boost::serialization::base_object<NaryOperator>(*
this);
515 void PrecisionChangeSpecific(
unsigned prec)
const override
517 temp_mp_.precision(prec);
520 mutable mpfr_complex temp_mp_;
538 class PowerOperator :
public virtual Operator,
public virtual EnableSharedFromThisVirtual<PowerOperator>
542 BERTINI_DEFAULT_VISITABLE()
547 template<
typename... Ts>
549 std::shared_ptr<PowerOperator> Make(Ts&& ...ts){
550 return std::shared_ptr<PowerOperator>(
new PowerOperator(ts...) );
555 PowerOperator(
const std::shared_ptr<Node> & new_base,
const std::shared_ptr<Node> & new_exponent) : base_(new_base), exponent_(new_exponent)
563 void SetBase(std::shared_ptr<Node> new_base)
568 void SetExponent(std::shared_ptr<Node> new_exponent)
570 exponent_ = new_exponent;
573 std::shared_ptr<Node> GetBase()
const
578 std::shared_ptr<Node> GetExponent()
const
583 void Reset()
const override;
587 void print(std::ostream & target)
const override;
594 std::shared_ptr<Node>
Differentiate(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
599 int Degree(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
601 int Degree(VariableGroup
const& vars)
const override;
606 std::vector<int>
MultiDegree(VariableGroup
const& vars)
const override;
610 void Homogenize(VariableGroup
const& vars, std::shared_ptr<Variable>
const& homvar)
override;
612 bool IsHomogeneous(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
617 bool IsHomogeneous(VariableGroup
const& vars)
const override;
619 virtual ~PowerOperator() =
default;
626 virtual void precision(
unsigned int prec)
const override
628 auto& val_pair = std::get< std::pair<mpfr_complex,bool> >(current_value_);
629 val_pair.first.precision(prec);
631 base_->precision(prec);
632 exponent_->precision(prec);
639 dbl
FreshEval_d(std::shared_ptr<Variable>
const& diff_variable)
const override;
640 void FreshEval_d(dbl& evaulation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
642 mpfr_complex
FreshEval_mp(std::shared_ptr<Variable>
const& diff_variable)
const override;
643 void FreshEval_mp(mpfr_complex& evaulation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
649 std::shared_ptr<Node> base_;
650 std::shared_ptr<Node> exponent_;
656 friend class boost::serialization::access;
659 template <
typename Archive>
660 void serialize(Archive& ar,
const unsigned version) {
661 ar & boost::serialization::base_object<Operator>(*
this);
689 class IntegerPowerOperator :
public virtual UnaryOperator,
public virtual EnableSharedFromThisVirtual<IntegerPowerOperator>
692 BERTINI_DEFAULT_VISITABLE()
700 void print(std::ostream & target)
const override;
724 std::shared_ptr<Node>
Differentiate(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
729 int Degree(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
732 bool IsHomogeneous(std::shared_ptr<Variable>
const& v =
nullptr)
const override
734 return operand_->IsHomogeneous(v);
743 return operand_->IsHomogeneous(vars);
750 template<
typename... Ts>
752 std::shared_ptr<IntegerPowerOperator> Make(Ts&& ...ts){
769 dbl
FreshEval_d(std::shared_ptr<Variable>
const& diff_variable)
const override
771 return pow(operand_->Eval<dbl>(diff_variable), exponent_);
774 void FreshEval_d(dbl& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override
776 operand_->EvalInPlace<dbl>(evaluation_value, diff_variable);
777 evaluation_value = pow(evaluation_value, exponent_);
781 mpfr_complex
FreshEval_mp(std::shared_ptr<Variable>
const& diff_variable)
const override
783 return pow(operand_->Eval<mpfr_complex>(diff_variable),exponent_);
786 void FreshEval_mp(mpfr_complex& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override
788 operand_->EvalInPlace<mpfr_complex>(evaluation_value, diff_variable);
789 evaluation_value = pow(evaluation_value, exponent_);
799 friend class boost::serialization::access;
801 template <
typename Archive>
802 void serialize(Archive& ar,
const unsigned version) {
803 ar & boost::serialization::base_object<UnaryOperator>(*
this);
834 class SqrtOperator :
public virtual UnaryOperator,
public virtual EnableSharedFromThisVirtual<SqrtOperator>
837 BERTINI_DEFAULT_VISITABLE()
839 template<
typename... Ts>
841 std::shared_ptr<SqrtOperator> Make(Ts&& ...ts){
842 return std::shared_ptr<SqrtOperator>(
new SqrtOperator(ts...) );
846 SqrtOperator(
const std::shared_ptr<Node> & N) : UnaryOperator(N)
854 void print(std::ostream & target)
const override;
860 std::shared_ptr<Node>
Differentiate(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
867 int Degree(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
870 virtual ~SqrtOperator() =
default;
875 dbl
FreshEval_d(std::shared_ptr<Variable>
const& diff_variable)
const override;
876 void FreshEval_d(dbl& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
878 mpfr_complex
FreshEval_mp(std::shared_ptr<Variable>
const& diff_variable)
const override;
879 void FreshEval_mp(mpfr_complex& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
884 SqrtOperator() =
default;
886 friend class boost::serialization::access;
888 template <
typename Archive>
889 void serialize(Archive& ar,
const unsigned version) {
890 ar & boost::serialization::base_object<UnaryOperator>(*
this);
896 inline std::shared_ptr<Node> sqrt(
const std::shared_ptr<Node> & N)
898 return SqrtOperator::Make(N);
910 class ExpOperator :
public virtual UnaryOperator,
public virtual EnableSharedFromThisVirtual<ExpOperator>
913 BERTINI_DEFAULT_VISITABLE()
918 template<
typename... Ts>
920 std::shared_ptr<ExpOperator> Make(Ts&& ...ts){
921 return std::shared_ptr<ExpOperator>(
new ExpOperator(ts...) );
925 ExpOperator(
const std::shared_ptr<Node> & N) : UnaryOperator(N)
933 void print(std::ostream & target)
const override;
939 std::shared_ptr<Node>
Differentiate(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
946 int Degree(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
949 virtual ~ExpOperator() =
default;
954 dbl
FreshEval_d(std::shared_ptr<Variable>
const& diff_variable)
const override;
955 void FreshEval_d(dbl& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
957 mpfr_complex
FreshEval_mp(std::shared_ptr<Variable>
const& diff_variable)
const override;
958 void FreshEval_mp(mpfr_complex& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
961 ExpOperator() =
default;
962 friend class boost::serialization::access;
964 template <
typename Archive>
965 void serialize(Archive& ar,
const unsigned version) {
966 ar & boost::serialization::base_object<UnaryOperator>(*
this);
976 class LogOperator :
public virtual UnaryOperator,
public virtual EnableSharedFromThisVirtual<LogOperator>
979 BERTINI_DEFAULT_VISITABLE()
984 template<
typename... Ts>
986 std::shared_ptr<LogOperator> Make(Ts&& ...ts){
987 return std::shared_ptr<LogOperator>(
new LogOperator(ts...) );
991 LogOperator(
const std::shared_ptr<Node> & N) : UnaryOperator(N)
999 void print(std::ostream & target)
const override;
1005 std::shared_ptr<Node>
Differentiate(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
1012 int Degree(std::shared_ptr<Variable>
const& v =
nullptr)
const override;
1015 virtual ~LogOperator() =
default;
1020 dbl
FreshEval_d(std::shared_ptr<Variable>
const& diff_variable)
const override;
1021 void FreshEval_d(dbl& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
1023 mpfr_complex
FreshEval_mp(std::shared_ptr<Variable>
const& diff_variable)
const override;
1024 void FreshEval_mp(mpfr_complex& evaluation_value, std::shared_ptr<Variable>
const& diff_variable)
const override;
1027 LogOperator() =
default;
1028 friend class boost::serialization::access;
1030 template <
typename Archive>
1031 void serialize(Archive& ar,
const unsigned version) {
1032 ar & boost::serialization::base_object<UnaryOperator>(*
this);
1041 inline std::shared_ptr<Node> exp(
const std::shared_ptr<Node> & N)
1043 return ExpOperator::Make(N);
1046 inline std::shared_ptr<Node> log(
const std::shared_ptr<Node> & N)
1048 return LogOperator::Make(N);
1051 inline std::shared_ptr<Node> pow(
const std::shared_ptr<Node> & N,
const std::shared_ptr<Node> & p)
1053 return PowerOperator::Make(N,p);
1056 inline std::shared_ptr<Node> pow(std::shared_ptr<Node>
const& base,
int power)
1058 return IntegerPowerOperator::Make(base,power);
1061 std::shared_ptr<Node> pow(
const std::shared_ptr<Node> & N,
double p) =
delete;
1063 std::shared_ptr<Node> pow(
const std::shared_ptr<Node> & N, dbl p) =
delete;
1065 inline std::shared_ptr<Node> pow(
const std::shared_ptr<Node> & N, mpfr_float p)
1067 return PowerOperator::Make(N,Float::Make(p));
1070 inline std::shared_ptr<Node> pow(
const std::shared_ptr<Node> & N, mpfr_complex p)
1072 return PowerOperator::Make(N,Float::Make(p));
1075 inline std::shared_ptr<Node> pow(
const std::shared_ptr<Node> & N, mpq_rational
const& p)
1077 return PowerOperator::Make(N,Rational::Make(p,0));
1100 inline std::shared_ptr<Node>& operator+=(std::shared_ptr<Node> & lhs,
const std::shared_ptr<Node> & rhs)
1102 std::shared_ptr<Node> temp = SumOperator::Make(lhs,rhs);
1111 inline std::shared_ptr<Node> operator+(std::shared_ptr<Node> lhs,
const std::shared_ptr<Node> & rhs)
1113 return SumOperator::Make(lhs,rhs);
1116 inline std::shared_ptr<Node> operator+(std::shared_ptr<Node> lhs, mpfr_float
const& rhs)
1118 return SumOperator::Make(lhs,Float::Make(rhs));
1121 inline std::shared_ptr<Node> operator+(std::shared_ptr<Node> lhs, mpfr_complex
const& rhs)
1123 return SumOperator::Make(lhs,Float::Make(rhs));
1126 inline std::shared_ptr<Node> operator+(mpfr_float
const& lhs, std::shared_ptr<Node> rhs)
1128 return SumOperator::Make(Float::Make(lhs), rhs);
1131 inline std::shared_ptr<Node> operator+(mpfr_complex
const& lhs, std::shared_ptr<Node> rhs)
1133 return SumOperator::Make(Float::Make(lhs), rhs);
1136 inline std::shared_ptr<Node> operator+(std::shared_ptr<Node> lhs,
int rhs)
1138 return SumOperator::Make(lhs,Integer::Make(rhs));
1141 inline std::shared_ptr<Node> operator+(
int lhs, std::shared_ptr<Node> rhs)
1143 return SumOperator::Make(Integer::Make(lhs), rhs);
1146 inline std::shared_ptr<Node> operator+(std::shared_ptr<Node> lhs, mpz_int
const& rhs)
1148 return SumOperator::Make(lhs,Integer::Make(rhs));
1151 inline std::shared_ptr<Node> operator+(mpz_int
const& lhs, std::shared_ptr<Node> rhs)
1153 return SumOperator::Make(Integer::Make(lhs), rhs);
1156 inline std::shared_ptr<Node> operator+(std::shared_ptr<Node> lhs, mpq_rational
const& rhs)
1158 return SumOperator::Make(lhs,Rational::Make(rhs,0));
1161 inline std::shared_ptr<Node> operator+(mpq_rational
const& lhs, std::shared_ptr<Node> rhs)
1163 return SumOperator::Make(Rational::Make(lhs,0), rhs);
1175 inline std::shared_ptr<Node>& operator-=(std::shared_ptr<Node> & lhs,
const std::shared_ptr<Node> & rhs)
1177 std::shared_ptr<Node> temp = SumOperator::Make(lhs,
true,rhs,
false);
1183 inline std::shared_ptr<Node> operator-(std::shared_ptr<Node> lhs,
const std::shared_ptr<Node> & rhs)
1185 return SumOperator::Make(lhs,
true,rhs,
false);
1188 inline std::shared_ptr<Node> operator-(std::shared_ptr<Node> lhs, mpfr_float rhs)
1190 return SumOperator::Make(lhs,
true, Float::Make(rhs),
false);
1193 inline std::shared_ptr<Node> operator-(mpfr_float lhs, std::shared_ptr<Node> rhs)
1195 return SumOperator::Make(Float::Make(lhs),
true, rhs,
false);
1198 inline std::shared_ptr<Node> operator-(std::shared_ptr<Node> lhs, mpfr_complex rhs)
1200 return SumOperator::Make(lhs,
true, Float::Make(rhs),
false);
1203 inline std::shared_ptr<Node> operator-(mpfr_complex lhs, std::shared_ptr<Node> rhs)
1205 return SumOperator::Make(Float::Make(lhs),
true, rhs,
false);
1208 inline std::shared_ptr<Node> operator-(std::shared_ptr<Node> lhs,
int rhs)
1210 return SumOperator::Make(lhs,
true, Integer::Make(rhs),
false);
1213 inline std::shared_ptr<Node> operator-(
int lhs, std::shared_ptr<Node> rhs)
1215 return SumOperator::Make(Integer::Make(lhs),
true, rhs,
false);
1218 inline std::shared_ptr<Node> operator-(std::shared_ptr<Node> lhs, mpz_int
const& rhs)
1220 return SumOperator::Make(lhs,
true, Integer::Make(rhs),
false);
1223 inline std::shared_ptr<Node> operator-(mpz_int
const& lhs, std::shared_ptr<Node> rhs)
1225 return SumOperator::Make(Integer::Make(lhs),
true, rhs,
false);
1228 inline std::shared_ptr<Node> operator-(std::shared_ptr<Node> lhs, mpq_rational
const& rhs)
1230 return SumOperator::Make(lhs,
true, Rational::Make(rhs,0),
false);
1233 inline std::shared_ptr<Node> operator-(mpq_rational
const& lhs, std::shared_ptr<Node> rhs)
1235 return SumOperator::Make(Rational::Make(lhs,0),
true, rhs,
false);
1243 inline std::shared_ptr<Node> operator*=(std::shared_ptr<MultOperator> & lhs,
const std::shared_ptr<Node> & rhs)
1245 lhs->AddOperand(rhs);
1250 inline std::shared_ptr<Node> operator*(std::shared_ptr<Node> lhs, mpfr_float rhs)
1252 return MultOperator::Make(lhs,Float::Make(rhs));
1255 inline std::shared_ptr<Node> operator*(std::shared_ptr<Node> lhs, mpfr_complex rhs)
1257 return MultOperator::Make(lhs,Float::Make(rhs));
1260 inline std::shared_ptr<Node> operator*(mpfr_float lhs, std::shared_ptr<Node> rhs)
1262 return MultOperator::Make(Float::Make(lhs), rhs);
1265 inline std::shared_ptr<Node> operator*(mpfr_complex lhs, std::shared_ptr<Node> rhs)
1267 return MultOperator::Make(Float::Make(lhs), rhs);
1270 inline std::shared_ptr<Node> operator*(std::shared_ptr<Node> lhs,
int rhs)
1272 return MultOperator::Make(lhs,Integer::Make(rhs));
1275 inline std::shared_ptr<Node> operator*(
int lhs, std::shared_ptr<Node> rhs)
1277 return MultOperator::Make(Integer::Make(lhs), rhs);
1280 inline std::shared_ptr<Node> operator*(std::shared_ptr<Node> lhs, mpz_int
const& rhs)
1282 return MultOperator::Make(lhs,Integer::Make(rhs));
1285 inline std::shared_ptr<Node> operator*(mpz_int
const& lhs, std::shared_ptr<Node> rhs)
1287 return MultOperator::Make(Integer::Make(lhs), rhs);
1290 inline std::shared_ptr<Node> operator*(std::shared_ptr<Node> lhs, mpq_rational
const& rhs)
1292 return MultOperator::Make(lhs,Rational::Make(rhs,0));
1295 inline std::shared_ptr<Node> operator*(mpq_rational
const& lhs, std::shared_ptr<Node> rhs)
1297 return MultOperator::Make(Rational::Make(lhs,0), rhs);
1302 inline std::shared_ptr<Node>& operator*=(std::shared_ptr<Node> & lhs,
const std::shared_ptr<Node> & rhs)
1307 if (std::dynamic_pointer_cast<IntegerPowerOperator>(lhs) && std::dynamic_pointer_cast<IntegerPowerOperator>(rhs))
1310 auto lhs_as_intpow = std::dynamic_pointer_cast<IntegerPowerOperator>(lhs);
1311 auto rhs_as_intpow = std::dynamic_pointer_cast<IntegerPowerOperator>(rhs);
1313 if (lhs_as_intpow->Operand()==rhs_as_intpow->Operand())
1315 if (lhs_as_intpow->exponent()>=0 && rhs_as_intpow->exponent()>=0)
1317 std::shared_ptr<Node> temp = pow(lhs_as_intpow->Operand(),lhs_as_intpow->exponent() + rhs_as_intpow->exponent());
1324 std::shared_ptr<Node> temp = MultOperator::Make(lhs,rhs);
1330 inline std::shared_ptr<Node> operator*(std::shared_ptr<Node> lhs,
const std::shared_ptr<Node> & rhs)
1345 inline std::shared_ptr<Node>& operator/=(std::shared_ptr<Node> & lhs,
const std::shared_ptr<Node> & rhs)
1362 std::shared_ptr<Node> temp = MultOperator::Make(lhs,
true,rhs,
false);
1367 inline std::shared_ptr<Node> operator/=(std::shared_ptr<MultOperator> & lhs,
const std::shared_ptr<Node> & rhs)
1369 lhs->AddOperand(rhs,
false);
1375 inline std::shared_ptr<Node> operator/(std::shared_ptr<Node> lhs,
const std::shared_ptr<Node> & rhs)
1380 inline std::shared_ptr<Node> operator/(std::shared_ptr<Node> lhs, mpfr_float rhs)
1382 return MultOperator::Make(lhs,
true, Float::Make(rhs),
false);
1385 inline std::shared_ptr<Node> operator/(std::shared_ptr<Node> lhs, mpfr_complex rhs)
1387 return MultOperator::Make(lhs,
true, Float::Make(rhs),
false);
1390 inline std::shared_ptr<Node> operator/(mpfr_float lhs, std::shared_ptr<Node> rhs)
1392 return MultOperator::Make(Float::Make(lhs),
true, rhs,
false);
1395 inline std::shared_ptr<Node> operator/(mpfr_complex lhs, std::shared_ptr<Node> rhs)
1397 return MultOperator::Make(Float::Make(lhs),
true, rhs,
false);
1400 inline std::shared_ptr<Node> operator/(std::shared_ptr<Node> lhs,
int rhs)
1402 return MultOperator::Make(lhs,
true, Integer::Make(rhs),
false);
1405 inline std::shared_ptr<Node> operator/(
int lhs, std::shared_ptr<Node> rhs)
1407 return MultOperator::Make(Integer::Make(lhs),
true, rhs,
false);
1410 inline std::shared_ptr<Node> operator/(std::shared_ptr<Node> lhs, mpz_int
const& rhs)
1412 return MultOperator::Make(lhs,
true, Integer::Make(rhs),
false);
1415 inline std::shared_ptr<Node> operator/(mpz_int
const& lhs, std::shared_ptr<Node> rhs)
1417 return MultOperator::Make(Integer::Make(lhs),
true, rhs,
false);
1420 inline std::shared_ptr<Node> operator/(std::shared_ptr<Node> lhs, mpq_rational
const& rhs)
1422 return MultOperator::Make(lhs,
true, Rational::Make(rhs,0),
false);
1425 inline std::shared_ptr<Node> operator/(mpq_rational
const& lhs, std::shared_ptr<Node> rhs)
1427 return MultOperator::Make(Rational::Make(lhs,0),
true, rhs,
false);
unsigned EliminateOnes() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:1279
int Degree(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:1300
mpfr_complex FreshEval_mp(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:1324
void print(std::ostream &target) const override
Definition arithmetic.cpp:1284
dbl FreshEval_d(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:1312
std::shared_ptr< Node > Differentiate(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:1294
This class represents the exponentiation Operator.
Definition arithmetic.hpp:690
bool IsHomogeneous(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.hpp:732
bool IsHomogeneous(VariableGroup const &vars) const override
Definition arithmetic.hpp:741
void print(std::ostream &target) const override
Definition arithmetic.cpp:1137
int Degree(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:1166
void FreshEval_d(dbl &evaluation_value, std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.hpp:774
std::shared_ptr< Node > Differentiate(std::shared_ptr< Variable > const &v=nullptr) const override
Differentiate.
Definition arithmetic.cpp:1146
int exponent() const
Definition arithmetic.hpp:715
void FreshEval_mp(mpfr_complex &evaluation_value, std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.hpp:786
mpfr_complex FreshEval_mp(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.hpp:781
void set_exponent(int exp)
Definition arithmetic.hpp:706
dbl FreshEval_d(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.hpp:769
unsigned EliminateOnes() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:1132
std::shared_ptr< Node > Differentiate(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:1369
mpfr_complex FreshEval_mp(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:1399
void print(std::ostream &target) const override
Definition arithmetic.cpp:1360
dbl FreshEval_d(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:1387
unsigned EliminateOnes() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:1355
int Degree(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:1375
Multiplication and division Operator.
Definition arithmetic.hpp:372
const auto & GetMultOrDiv() const
Definition arithmetic.hpp:476
void print(std::ostream &target) const override
Definition arithmetic.cpp:692
void Homogenize(VariableGroup const &vars, std::shared_ptr< Variable > const &homvar) override
Definition arithmetic.cpp:832
mpfr_complex FreshEval_mp(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:894
int Degree(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:763
std::vector< int > MultiDegree(VariableGroup const &vars) const override
Definition arithmetic.cpp:815
std::shared_ptr< Node > Differentiate(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:716
unsigned ReduceDepth() override
A mutating function which finds ways to reduce the depth of the tree.
Definition arithmetic.cpp:680
unsigned EliminateOnes() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:567
dbl FreshEval_d(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:867
bool IsHomogeneous(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:841
The negation Operator.
Definition arithmetic.hpp:281
bool IsHomogeneous(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.hpp:312
unsigned EliminateOnes() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:462
dbl FreshEval_d(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:479
bool IsHomogeneous(VariableGroup const &vars) const override
Definition arithmetic.hpp:320
std::shared_ptr< Node > Differentiate(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:474
void print(std::ostream &target) const override
Definition arithmetic.cpp:467
unsigned EliminateZeros() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:458
mpfr_complex FreshEval_mp(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:491
virtual unsigned EliminateZeros()=0
A transform function, which eliminates nodes from the tree.
Abstract Node type from which all Operators inherit.
Definition operator.hpp:58
Operator for power functions with arbitrary expressions in the exponent and base.
Definition arithmetic.hpp:539
bool IsHomogeneous(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:1049
void Reset() const override
Definition arithmetic.cpp:941
dbl FreshEval_d(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:1078
std::vector< int > MultiDegree(VariableGroup const &vars) const override
Definition arithmetic.cpp:1025
virtual void precision(unsigned int prec) const override
Definition arithmetic.hpp:626
void Homogenize(VariableGroup const &vars, std::shared_ptr< Variable > const &homvar) override
Definition arithmetic.cpp:1037
mpfr_complex FreshEval_mp(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:1093
int Degree(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:965
std::shared_ptr< Node > Differentiate(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:954
void print(std::ostream &target) const override
Definition arithmetic.cpp:948
unsigned EliminateOnes() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:935
unsigned EliminateOnes() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:1197
std::shared_ptr< Node > Differentiate(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:1211
mpfr_complex FreshEval_mp(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:1244
int Degree(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:1219
dbl FreshEval_d(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:1232
void print(std::ostream &target) const override
Definition arithmetic.cpp:1202
unsigned EliminateZeros() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:1193
Represents summation and difference Operator.
Definition arithmetic.hpp:80
mpfr_complex FreshEval_mp(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:402
std::shared_ptr< Node > Differentiate(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:190
bool IsHomogeneous(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:317
std::vector< int > MultiDegree(VariableGroup const &vars) const override
Definition arithmetic.cpp:249
void AddOperand(std::shared_ptr< Node > child, bool sign)
Definition arithmetic.hpp:148
unsigned ReduceDepth() override
A mutating function which finds ways to reduce the depth of the tree.
Definition arithmetic.cpp:157
void AddOperand(std::shared_ptr< Node > child) override
Definition arithmetic.hpp:138
void Homogenize(VariableGroup const &vars, std::shared_ptr< Variable > const &homvar) override
Definition arithmetic.cpp:264
unsigned EliminateOnes() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:88
int Degree(std::shared_ptr< Variable > const &v=nullptr) const override
Definition arithmetic.cpp:217
unsigned EliminateZeros() override
A transform function, which eliminates nodes from the tree.
Definition arithmetic.cpp:42
void print(std::ostream &target) const override
Definition arithmetic.cpp:167
dbl FreshEval_d(std::shared_ptr< Variable > const &diff_variable) const override
Definition arithmetic.cpp:374
Interface for all unary Operator types.
Definition operator.hpp:84
Provides the differential Node class.
Forward declarations for types in the node:: namespace.
Defines the abstract Node base class.
Provides the Number Node types, including Rational, Float, and Integer.
Provides the abstract Operator Node type.
Provides the special numbers , , 1, 2, 0, as Nodes.
Provides the Variable Node class.