32#ifndef BERTINI_EXPLICIT_PREDICTORS_HPP
33#define BERTINI_EXPLICIT_PREDICTORS_HPP
41#include <boost/type_index.hpp>
87 switch (predictor_choice)
111 throw std::runtime_error(
"incompatible predictor choice in Order");
124 switch (predictor_choice)
148 throw std::runtime_error(
"incompatible predictor choice in HasErrorEstimate");
224 crefd.resize(s_); crefd(0) = 0;
225 arefd.resize(s_,s_); arefd(0,0) = 0;
226 brefd.resize(s_); brefd(0) = 0;
230 crefmp.resize(s_); crefmp(0) = 0;
231 arefmp.resize(s_,s_); arefmp(0,0) = 0;
232 brefmp.resize(s_); brefmp(0) = 0;
233 uses_embedded_ =
false;
243 crefd.resize(s_); crefd(0) =
static_cast<double>(cEuler_(0));
244 arefd.resize(s_,s_); arefd(0,0) =
static_cast<double>(aEuler_(0,0));
245 brefd.resize(s_); brefd(0) =
static_cast<double>(bEuler_(0));
249 crefmp.resize(s_); crefmp(0) =
static_cast<real_mp>(cEuler_(0));
250 arefmp.resize(s_,s_); arefmp(0,0) =
static_cast<real_mp>(aEuler_(0,0));
251 brefmp.resize(s_); brefmp(0) =
static_cast<real_mp>(bEuler_(0));
252 uses_embedded_ =
false;
259 FillButcherTable<double>(
static_cast<int>(s_),aHeunEuler_, bHeunEuler_, b_minus_bstarHeunEuler_, cHeunEuler_);
260 FillButcherTable<real_mp>(
static_cast<int>(s_),aHeunEuler_, bHeunEuler_, b_minus_bstarHeunEuler_, cHeunEuler_);
268 FillButcherTable<double>(
static_cast<int>(s_),aRK4_, bRK4_, cRK4_);
269 FillButcherTable<real_mp>(
static_cast<int>(s_),aRK4_, bRK4_, cRK4_);
278 FillButcherTable<double>(
static_cast<int>(s_),aRKF45_, bRKF45_, b_minus_bstarRKF45_, cRKF45_);
279 FillButcherTable<real_mp>(
static_cast<int>(s_),aRKF45_, bRKF45_, b_minus_bstarRKF45_, cRKF45_);
288 FillButcherTable<double>(
static_cast<int>(s_),aRKCK45_, bRKCK45_, b_minus_bstarRKCK45_, cRKCK45_);
289 FillButcherTable<real_mp>(
static_cast<int>(s_),aRKCK45_, bRKCK45_, b_minus_bstarRKCK45_, cRKCK45_);
298 FillButcherTable<double>(
static_cast<int>(s_),aRKDP56_, bRKDP56_, b_minus_bstarRKDP56_, cRKDP56_);
299 FillButcherTable<real_mp>(
static_cast<int>(s_),aRKDP56_, bRKDP56_, b_minus_bstarRKDP56_, cRKDP56_);
308 FillButcherTable<double>(
static_cast<int>(s_),aRKV67_, bRKV67_, b_minus_bstarRKV67_, cRKV67_);
309 FillButcherTable<real_mp>(
static_cast<int>(s_),aRKV67_, bRKV67_, b_minus_bstarRKV67_, cRKV67_);
316 throw std::runtime_error(
"incompatible predictor choice in ExplicitPredict");
334 numVariables_ =
static_cast<unsigned>(S.
NumVariables());
336 std::get< Mat<complex_dbl> >(dh_dx_0_).resize(numTotalFunctions_, numVariables_);
337 std::get< Mat<complex_mp> >(dh_dx_0_).resize(numTotalFunctions_, numVariables_);
338 std::get< Mat<complex_dbl> >(dh_dx_temp_).resize(numTotalFunctions_, numVariables_);
339 std::get< Mat<complex_mp> >(dh_dx_temp_).resize(numTotalFunctions_, numVariables_);
340 std::get< Vec<complex_dbl> >(dh_dt_temp_).resize(numTotalFunctions_);
341 std::get< Vec<complex_mp> >(dh_dt_temp_).resize(numTotalFunctions_);
342 std::get< Vec<complex_dbl> >(step_temp_).resize(numTotalFunctions_);
343 std::get< Vec<complex_mp> >(step_temp_).resize(numTotalFunctions_);
346 std::get< Vec<complex_mp> >(rand_temp_) = probe_as_drawn_;
347 std::get< Vec<complex_dbl> >(solve_temp_).resize(numVariables_);
348 std::get< Vec<complex_mp> >(solve_temp_).resize(numVariables_);
350 std::get< Vec<complex_dbl> >(stage_pt_temp_).resize(numVariables_);
351 std::get< Vec<complex_mp> >(stage_pt_temp_).resize(numVariables_);
352 std::get< Vec<complex_dbl> >(err_temp_).resize(numTotalFunctions_);
353 std::get< Vec<complex_mp> >(err_temp_).resize(numTotalFunctions_);
362 std::get< Mat<complex_dbl> >(K_).resize(numTotalFunctions_, s_);
363 std::get< Mat<complex_mp> >(K_).resize(numTotalFunctions_, s_);
365 std::get< linalg::PartialPivLU<complex_dbl> >(LU_).ChangeSize(numVariables_);
366 std::get< linalg::PartialPivLU<complex_mp> >(LU_).ChangeSize(numVariables_);
380 std::get< Vec<complex_dbl> >(rand_temp_) = std::get<
Vec<complex_dbl> >(probe);
381 probe_as_drawn_ = std::get< Vec<complex_mp> >(probe);
382 std::get< Vec<complex_mp> >(rand_temp_) = probe_as_drawn_;
391 return current_precision_;
411 auto& probe = std::get< Vec<complex_mp> >(rand_temp_);
412 probe = probe_as_drawn_;
418 std::get< linalg::PartialPivLU<complex_mp> >(LU_).
ChangePrecision(new_precision);
427 current_precision_ = new_precision;
446 Vec<real_mp>& bstar = std::get< Vec<real_mp> >(b_minus_bstar_);
451 assert(
Precision(dhdttemp)==current_precision_);
452 assert(
Precision(dhdx0)==current_precision_);
453 assert(
Precision(dhdxtemp)==current_precision_);
455 assert(
Precision(a)==current_precision_);
456 assert(
Precision(b)==current_precision_);
458 assert(
Precision(bstar)==current_precision_);
459 assert(
Precision(c)==current_precision_);
481 template<
typename ComplexT>
486 ComplexT
const& delta_t,
487 unsigned & num_steps_since_last_condition_number_computation,
488 unsigned frequency_of_CN_estimation,
492 auto step_success =
FullStep(next_space, S, current_space, current_time, delta_t);
497 num_steps_since_last_condition_number_computation, frequency_of_CN_estimation);
500 if (AMP_config ==
nullptr)
587 template<
typename ComplexT>
590 Vec<ComplexT> const& current_space, ComplexT
const& current_time,
591 ComplexT
const& delta_t)
597 next_space = current_space;
601 using RealT =
typename Eigen::NumTraits<ComplexT>::Real;
604 Mat<RealT>& aref = std::get< Mat<RealT> >(a_);
605 Vec<RealT>& bref = std::get< Vec<RealT> >(b_);
606 Vec<RealT>& cref = std::get< Vec<RealT> >(c_);
607 Kref.fill(ComplexT(0));
615 Vec<ComplexT>& stage_pt = std::get< Vec<ComplexT> >(stage_pt_temp_);
616 for(
unsigned ii = 1; ii < s_; ++ii)
619 for(
unsigned jj = 0; jj < ii; ++jj)
620 temp += aref(ii,jj)*Kref.col(jj);
625 stage_pt.noalias() = current_space + delta_t*temp;
632 for(
unsigned ii = 0; ii < s_; ++ii)
633 temp += bref(ii)*Kref.col(ii);
637 next_space.noalias() = current_space + delta_t*temp;
650 template<
typename ComplexT>
655 Mat<ComplexT>& dhdxref = std::get< Mat<ComplexT> >(dh_dx_0_);
657 Vec<ComplexT> const& randy = std::get< Vec<ComplexT> >(rand_temp_);
658 Vec<ComplexT>& solve_ref = std::get< Vec<ComplexT> >(solve_temp_);
659 LUref.
Solve(randy, solve_ref);
662 norm_J_inverse =
NumErrorT(solve_ref.norm());
665 if (num_steps_since_last_condition_number_computation >= frequency_of_CN_estimation)
667 condition_number_estimate =
NumErrorT(norm_J * norm_J_inverse);
668 num_steps_since_last_condition_number_computation = 1;
671 num_steps_since_last_condition_number_computation++;
685 template<
typename ComplexT>
688 using RealT =
typename Eigen::NumTraits<ComplexT>::Real;
691 Vec<RealT>& b_minus_bstar_ref = std::get< Vec<RealT> >(b_minus_bstar_);
696 for(
unsigned ii = 0; ii < s_; ++ii)
698 err += (b_minus_bstar_ref(ii))*Kref.col(ii);
723 template<
typename ComplexT>
732 size_proportion = err_est/
NumErrorT(
pow(abs(delta_t), p_+1));
751 size_proportion =
NumErrorT(Kref.array().abs().maxCoeff());
770 template<
typename ComplexT>
776 if (std::is_same<ComplexT, complex_mp>::value)
782 Mat<ComplexT>& dhdxref = std::get< Mat<ComplexT> >(dh_dx_0_);
784 if (!std::is_same<ComplexT,complex_dbl>::value)
788 assert(
Precision(space)==current_precision_);
789 assert(
Precision(time)==current_precision_);
790 assert(
Precision(dhdxref)==current_precision_);
791 assert(
Precision(K)==current_precision_);
796 auto lu_code = LUref.
Factor(dhdxref);
797 if (!std::is_same<ComplexT,complex_dbl>::value)
799 assert(
Precision(dhdxref)==current_precision_);
806 Vec<ComplexT>& dhdtref = std::get< Vec<ComplexT> >(dh_dt_temp_);
809 LUref.
Solve(dhdtref, K.col(stage));
818 Mat<ComplexT>& dhdxtempref = std::get< Mat<ComplexT> >(dh_dx_temp_);
825 Vec<ComplexT>& dhdtref = std::get< Vec<ComplexT> >(dh_dt_temp_);
828 LU_temp.
Solve(dhdtref, K.col(stage));
861 template<
typename RealT>
867 Mat<RealT>& aref = std::get< Mat<RealT> >(a_);
868 aref.resize(stages, stages);
869 for(
int ii = 0; ii < stages; ++ii)
871 for(
unsigned jj = 0; jj < s_; ++jj)
873 aref(ii,jj) =
static_cast<RealT
>(a(ii,jj));
877 Vec<RealT>& bref = std::get< Vec<RealT> >(b_);
879 for(
int ii = 0; ii < stages; ++ii)
881 bref(ii) =
static_cast<RealT
>(b(ii));
884 Vec<RealT>& b_minus_bstar_ref = std::get< Vec<RealT> >(b_minus_bstar_);
885 b_minus_bstar_ref.resize(stages);
886 for(
int ii = 0; ii < stages; ++ii)
888 b_minus_bstar_ref(ii) =
static_cast<RealT
>(b_minus_bstar(ii));
891 Vec<RealT>& cref = std::get< Vec<RealT> >(c_);
893 for(
int ii = 0; ii < stages; ++ii)
895 cref(ii) =
static_cast<RealT
>(c(ii));
898 uses_embedded_ =
true;
915 template<
typename RealT>
920 Mat<RealT>& aref = std::get< Mat<RealT> >(a_);
921 aref.resize(stages, stages);
922 for(
int ii = 0; ii < stages; ++ii)
924 for(
unsigned jj = 0; jj < s_; ++jj)
926 aref(ii,jj) =
static_cast<RealT
>(a(ii,jj));
930 Vec<RealT>& bref = std::get< Vec<RealT> >(b_);
932 for(
int ii = 0; ii < stages; ++ii)
934 bref(ii) =
static_cast<RealT
>(b(ii));
937 Vec<RealT>& cref = std::get< Vec<RealT> >(c_);
939 for(
int ii = 0; ii < stages; ++ii)
941 cref(ii) =
static_cast<RealT
>(c(ii));
944 uses_embedded_ =
false;
958 unsigned numTotalFunctions_;
959 unsigned numVariables_;
968 mutable std::tuple< linalg::PartialPivLU<complex_dbl>, linalg::PartialPivLU<complex_mp> > LU_;
974 mutable std::tuple< Vec<complex_dbl>,
Vec<complex_mp> > stage_pt_temp_;
982 mutable std::tuple< Vec<double>,
Vec<real_mp> > b_minus_bstar_;
985 mutable bool uses_embedded_;
986 mutable unsigned current_precision_;
999 inline static const Eigen::Matrix<mpq_rational,1,1> aEuler_ = Eigen::Matrix<mpq_rational,1,1>(aEulerPtr_);
1001 inline static const Eigen::Matrix<mpq_rational,1,1> bEuler_ = Eigen::Matrix<mpq_rational,1,1>(bEulerPtr_);
1003 inline static const Eigen::Matrix<mpq_rational,1,1> cEuler_ = Eigen::Matrix<mpq_rational,1,1>(cEulerPtr_);
1007 inline static const Eigen::Matrix<mpq_rational,2,2> aHeunEuler_ = Eigen::Matrix<mpq_rational,2,2>(aHeunEulerPtr_);
1009 inline static const Eigen::Matrix<mpq_rational,2,1> bHeunEuler_ = Eigen::Matrix<mpq_rational,2,1>(bHeunEulerPtr_);
1011 inline static const Eigen::Matrix<mpq_rational,2,1> b_minus_bstarHeunEuler_ = Eigen::Matrix<mpq_rational,2,1>(b_minus_bstarHeunEulerPtr_);
1013 inline static const Eigen::Matrix<mpq_rational,2,1> cHeunEuler_ = Eigen::Matrix<mpq_rational,2,1>(cHeunEulerPtr_);
1016 inline static const mpq_rational aRK4Ptr_[] = {
mpq_rational(0,1),
mpq_rational(1,2),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(1,2),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(1,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1)};
1017 inline static const Eigen::Matrix<mpq_rational,4,4> aRK4_ = Eigen::Matrix<mpq_rational,4,4>(aRK4Ptr_);
1019 inline static const Eigen::Matrix<mpq_rational,4,1> bRK4_ = Eigen::Matrix<mpq_rational,4,1>(bRK4Ptr_);
1021 inline static const Eigen::Matrix<mpq_rational,4,1> cRK4_ = Eigen::Matrix<mpq_rational,4,1>(cRK4Ptr_);
1024 inline static const mpq_rational aRKF45Ptr_[] = {
mpq_rational(0,1),
mpq_rational(1,4),
mpq_rational(3,32),
mpq_rational(1932,2197),
mpq_rational(439,216),
mpq_rational(-8,27),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(9,32),
mpq_rational(-7200,2197),
mpq_rational(-8,1),
mpq_rational(2,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(7296,2197),
mpq_rational(3680,513),
mpq_rational(-3544,2565),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(-845,4104),
mpq_rational(1859,4104),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(-11,40),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1)};
1025 inline static const Eigen::Matrix<mpq_rational,6,6> aRKF45_ = Eigen::Matrix<mpq_rational,6,6>(aRKF45Ptr_);
1026 inline static const mpq_rational bRKF45Ptr_[] = {
mpq_rational(16,135),
mpq_rational(0,1),
mpq_rational(6656,12825),
mpq_rational(28561,56430),
mpq_rational(-9,50),
mpq_rational(2,55)};
1027 inline static const Eigen::Matrix<mpq_rational,6,1> bRKF45_ = Eigen::Matrix<mpq_rational,6,1>(bRKF45Ptr_);
1028 inline static const mpq_rational b_minus_bstarRKF45Ptr_[] = {
mpq_rational(1,360),
mpq_rational(0,1),
mpq_rational(-128,4275),
mpq_rational(-2197,75240),
mpq_rational(1,50),
mpq_rational(2,55)};
1029 inline static const Eigen::Matrix<mpq_rational,6,1> b_minus_bstarRKF45_ = Eigen::Matrix<mpq_rational,6,1>(b_minus_bstarRKF45Ptr_);
1030 inline static const mpq_rational cRKF45Ptr_[] = {
mpq_rational(0,1),
mpq_rational(1,4),
mpq_rational(3,8),
mpq_rational(12,13),
mpq_rational(1,1),
mpq_rational(1,2)};
1031 inline static const Eigen::Matrix<mpq_rational,6,1> cRKF45_ = Eigen::Matrix<mpq_rational,6,1>(cRKF45Ptr_);
1034 inline static const mpq_rational aRKCK45Ptr_[] = {
mpq_rational(0,1),
mpq_rational(1,5),
mpq_rational(3,40),
mpq_rational(3,10),
mpq_rational(-11,54),
mpq_rational(1631,55296),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(9,40),
mpq_rational(-9,10),
mpq_rational(5,2),
mpq_rational(175,512),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(6,5),
mpq_rational(-70,27),
mpq_rational(575,13824),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(35,27),
mpq_rational(44275,110592),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(253,4096),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1)};
1035 inline static const Eigen::Matrix<mpq_rational,6,6> aRKCK45_ = Eigen::Matrix<mpq_rational,6,6>(aRKCK45Ptr_);
1036 inline static const mpq_rational bRKCK45Ptr_[] = {
mpq_rational(37,378),
mpq_rational(0,1),
mpq_rational(250,621),
mpq_rational(125,594),
mpq_rational(0,1),
mpq_rational(512,1771)};
1037 inline static const Eigen::Matrix<mpq_rational,6,1> bRKCK45_ = Eigen::Matrix<mpq_rational,6,1>(bRKCK45Ptr_);
1038 inline static const mpq_rational b_minus_bstarRKCK45Ptr_[] = {
mpq_rational(-277,64512),
mpq_rational(0,1),
mpq_rational(6925,370944),
mpq_rational(-6925,202752),
mpq_rational(-277,14336),
mpq_rational(277,7084)};
1039 inline static const Eigen::Matrix<mpq_rational,6,1> b_minus_bstarRKCK45_ = Eigen::Matrix<mpq_rational,6,1>(b_minus_bstarRKCK45Ptr_);
1040 inline static const mpq_rational cRKCK45Ptr_[] = {
mpq_rational(0,1),
mpq_rational(1,5),
mpq_rational(3,10),
mpq_rational(3,5),
mpq_rational(1,1),
mpq_rational(7,8)};
1041 inline static const Eigen::Matrix<mpq_rational,6,1> cRKCK45_ = Eigen::Matrix<mpq_rational,6,1>(cRKCK45Ptr_);
1044 inline static const mpq_rational aRKDP56Ptr_[] = {
mpq_rational(0,1),
mpq_rational(1,10),
mpq_rational(-2,81),
mpq_rational(615,1372),
mpq_rational(3243,5500),
mpq_rational(-26492,37125),
mpq_rational(5561,2376),
mpq_rational(465467,266112),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(20,81),
mpq_rational(-270,343),
mpq_rational(-54,55),
mpq_rational(72,55),
mpq_rational(-35,11),
mpq_rational(-2945,1232),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(1053,1372),
mpq_rational(50949,71500),
mpq_rational(2808,23375),
mpq_rational(-24117,31603),
mpq_rational(-5610201,14158144),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(4998,17875),
mpq_rational(-24206,37125),
mpq_rational(899983,200772),
mpq_rational(10513573,3212352),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(338,459),
mpq_rational(-5225,1836),
mpq_rational(-424325,205632),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(3925,4056),
mpq_rational(376225,454272),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1)};
1045 inline static const Eigen::Matrix<mpq_rational,8,8> aRKDP56_ = Eigen::Matrix<mpq_rational,8,8>(aRKDP56Ptr_);
1046 inline static const mpq_rational bRKDP56Ptr_[] = {
mpq_rational(821,10800),
mpq_rational(0,1),
mpq_rational(19683,71825),
mpq_rational(175273,912600),
mpq_rational(395,3672),
mpq_rational(785,2704),
mpq_rational(3,50),
mpq_rational(0,1)};
1047 inline static const Eigen::Matrix<mpq_rational,8,1> bRKDP56_ = Eigen::Matrix<mpq_rational,8,1>(bRKDP56Ptr_);
1048 inline static const mpq_rational b_minus_bstarRKDP56Ptr_[] = {
mpq_rational(13,2400),
mpq_rational(0,1),
mpq_rational(-19683,618800),
mpq_rational(2401,31200),
mpq_rational(-65,816),
mpq_rational(15,416),
mpq_rational(521,5600),
mpq_rational(-1,10)};
1049 inline static const Eigen::Matrix<mpq_rational,8,1> b_minus_bstarRKDP56_ = Eigen::Matrix<mpq_rational,8,1>(b_minus_bstarRKDP56Ptr_);
1050 inline static const mpq_rational cRKDP56Ptr_[] = {
mpq_rational(0,1),
mpq_rational(1,10),
mpq_rational(2,9),
mpq_rational(3,7),
mpq_rational(3,5),
mpq_rational(4,5),
mpq_rational(1,1),
mpq_rational(1,1)};
1051 inline static const Eigen::Matrix<mpq_rational,8,1> cRKDP56_ = Eigen::Matrix<mpq_rational,8,1>(cRKDP56Ptr_);
1054 inline static const mpq_rational aRKV67Ptr_[] = {
mpq_rational(0,1),
mpq_rational(1,12),
mpq_rational(0,1),
mpq_rational(1,16),
mpq_rational(21,16),
mpq_rational(1344688,250563),
mpq_rational(-559,384),
mpq_rational(-625,224),
mpq_rational(-12253,99144),
mpq_rational(30517,2512),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(1,6),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(3,16),
mpq_rational(-81,16),
mpq_rational(-1709184,83521),
mpq_rational(6,1),
mpq_rational(12,1),
mpq_rational(16,27),
mpq_rational(-7296,157),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(9,2),
mpq_rational(1365632,83521),
mpq_rational(-204,47),
mpq_rational(-456,47),
mpq_rational(16,459),
mpq_rational(268728,7379),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(-78208,250563),
mpq_rational(14,39),
mpq_rational(48,91),
mpq_rational(29072,161109),
mpq_rational(2472,2041),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(-4913,78208),
mpq_rational(14739,136864),
mpq_rational(-2023,75816),
mpq_rational(-3522621,10743824),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(6,7),
mpq_rational(112,12393),
mpq_rational(132,157),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(-12393,4396),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(0,1)};
1055 inline static const Eigen::Matrix<mpq_rational,10,10> aRKV67_ = Eigen::Matrix<mpq_rational,10,10>(aRKV67Ptr_);
1056 inline static const mpq_rational bRKV67Ptr_[] = {
mpq_rational(2881,40320),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(1216,2961),
mpq_rational(-2624,4095),
mpq_rational(24137569,57482880),
mpq_rational(-4,21),
mpq_rational(0,1),
mpq_rational(4131,3920),
mpq_rational(-157,1260)};
1057 inline static const Eigen::Matrix<mpq_rational,10,1> bRKV67_ = Eigen::Matrix<mpq_rational,10,1>(bRKV67Ptr_);
1058 inline static const mpq_rational b_minus_bstarRKV67Ptr_[] = {
mpq_rational(-17,2688),
mpq_rational(0,1),
mpq_rational(0,1),
mpq_rational(272,4935),
mpq_rational(-272,273),
mpq_rational(24137569,57482880),
mpq_rational(-34,105),
mpq_rational(-7,90),
mpq_rational(4131,3920),
mpq_rational(-157,1260)};
1059 inline static const Eigen::Matrix<mpq_rational,10,1> b_minus_bstarRKV67_ = Eigen::Matrix<mpq_rational,10,1>(b_minus_bstarRKV67Ptr_);
1060 inline static const mpq_rational cRKV67Ptr_[] = {
mpq_rational(0,1),
mpq_rational(1,12),
mpq_rational(1,6),
mpq_rational(1,4),
mpq_rational(3,4),
mpq_rational(16,17),
mpq_rational(1,2),
mpq_rational(1,1),
mpq_rational(2,3),
mpq_rational(1,1)};
1061 inline static const Eigen::Matrix<mpq_rational,10,1> cRKV67_ = Eigen::Matrix<mpq_rational,10,1>(cRKV67Ptr_);
1081 unsigned&,
unsigned,
NumErrorT const&, AdaptiveMultiplePrecisionConfig
const*);
1084 unsigned&,
unsigned,
NumErrorT const&, AdaptiveMultiplePrecisionConfig
const*);
1092 double&,
double&,
double&,
unsigned&,
unsigned);
1094 double&,
double&,
double&,
unsigned&,
unsigned);
1107 extern template void ExplicitRKPredictor::FillButcherTable<double>(
1110 extern template void ExplicitRKPredictor::FillButcherTable<real_mp>(
1114 extern template void ExplicitRKPredictor::FillButcherTable<double>(
1116 extern template void ExplicitRKPredictor::FillButcherTable<real_mp>(
Provides the Adaptive Multiple Precision criteria functions.
The fundamental polynomial system class for Bertini2.
Definition system.hpp:106
void TimeDerivativeInPlace(Vec< T > &ds_dt, const Eigen::MatrixBase< Derived > &variable_values, const T &path_variable_value) const
Compute the time-derivative of a system.
Definition system.hpp:601
void SetAndReset(Vec< T > const &new_space, T const &new_time) const
Stage the system's current point (variables and path value) for a subsequent Eval/Jacobian.
Definition system.hpp:964
void JacobianInPlace(Mat< T > &J) const
Evaluate the Jacobian matrix of the system, using the previous space and time values,...
Definition system.hpp:413
size_t NumVariables() const
Get the total number of variables in this system, including homogenizing variables.
size_t NumTotalFunctions() const
Get the total number of functions, including patches.
Stateful partial-pivot LU factor/solve with preallocated, precision-adjustable banks.
Definition lu_solver.hpp:58
MatrixSuccessCode FactorDestructive(Mat< NumT > &A)
Factor A destructively (no copy): on return A holds the L\U factors.
Definition lu_solver.hpp:99
MatrixSuccessCode Factor(Mat< NumT > const &A)
Factor a copy of A with partial pivoting; A is preserved.
Definition lu_solver.hpp:90
Mat< NumT > const & Factors() const
The factored matrix (L below the diagonal, U on and above), for the caller's LUPartialPivotDecomposit...
Definition lu_solver.hpp:147
void Solve(Vec< NumT > const &b, Eigen::MatrixBase< OutDerived > const &x_out) const
Solve A x = b using the stored factors.
Definition lu_solver.hpp:111
SuccessCode FullStep(Vec< ComplexT > &next_space, System const &S, Vec< ComplexT > const ¤t_space, ComplexT const ¤t_time, ComplexT const &delta_t)
Performs a full prediction step from current_time to current_time + delta_t.
Definition explicit_predictors.hpp:588
SuccessCode EvalRHS(System const &S, const Vec< ComplexT > &space, const ComplexT &time, Mat< ComplexT > &K, unsigned stage)
Evaluates the RHS of the Davidenko differential equation at a particular time and space.
Definition explicit_predictors.hpp:771
void ChangePrecision(unsigned new_precision)
/brief Change the precision of the predictor variables and reassign the Butcher table variables.
Definition explicit_predictors.hpp:400
unsigned precision() const
get the current precision of the predictor
Definition explicit_predictors.hpp:389
Predictor PredictorMethod()
Get the currently used prediction method.
Definition explicit_predictors.hpp:530
bool HasErrorEstimate()
Get whether the current prediction method provides an error estimate.
Definition explicit_predictors.hpp:556
SuccessCode SetErrorEstimate(NumErrorT &error_estimate, ComplexT const &delta_t)
Computes the error estimate of this prediction step.
Definition explicit_predictors.hpp:686
ExplicitRKPredictor(Predictor method, const System &S)
Constructor for a particular predictor method.
Definition explicit_predictors.hpp:198
void PrecisionSanityCheck() const
Assert (in debug builds) that the predictor's state is all at the expected precision.
Definition explicit_predictors.hpp:433
SuccessCode Predict(Vec< ComplexT > &next_space, StepMetadata &meta, System const &S, const Vec< ComplexT > ¤t_space, ComplexT current_time, ComplexT const &delta_t, unsigned &num_steps_since_last_condition_number_computation, unsigned frequency_of_CN_estimation, NumErrorT const &tracking_tolerance, AdaptiveMultiplePrecisionConfig const *AMP_config=nullptr)
Perform a generic predictor step.
Definition explicit_predictors.hpp:482
unsigned Order()
Get the order of the currently used prediction method.
Definition explicit_predictors.hpp:546
void SetConditionProbe(std::tuple< Vec< complex_dbl >, Vec< complex_mp > > const &probe)
Adopt an externally-owned condition-number probe direction (both precisions).
Definition explicit_predictors.hpp:378
ExplicitRKPredictor(const System &S)
Construct a predictor to work on a system.
Definition explicit_predictors.hpp:186
void ResizeK()
Resize the internal Runge-Kutta stage matrix K to match the current system and stage count.
Definition explicit_predictors.hpp:360
void PredictorMethod(Predictor method)
/brief Sets the local variables to correspond to a particular predictor method
Definition explicit_predictors.hpp:212
void SetNormsCond(NumErrorT &norm_J, NumErrorT &norm_J_inverse, NumErrorT &condition_number_estimate, unsigned &num_steps_since_last_condition_number_computation, unsigned frequency_of_CN_estimation)
Compute and (when due) refresh the Jacobian norms and condition-number estimate.
Definition explicit_predictors.hpp:651
SuccessCode SetSizeProportion(NumErrorT &size_proportion, ComplexT const &delta_t)
Compute the size proportion variable for AMP computation.
Definition explicit_predictors.hpp:724
void ChangeSystem(const System &S)
Change the system (number of total functions) that the predictor uses.
Definition explicit_predictors.hpp:331
Bertini extensions of the Eigen linear algebra library.
A stateful partial-pivot LU solver that owns precision-adjustable temporary banks.
Extensions to the Boost.Multiprecision library.
bool CriterionA(double const &norm_J, double const &norm_J_inverse, AdaptiveMultiplePrecisionConfig const &_config)
Check AMP Criterion A.
Definition amp_criteria.hpp:67
bool CriterionC(double const &norm_J_inverse, const Eigen::MatrixBase< Derived > &z, NumErrorT tracking_tolerance, AdaptiveMultiplePrecisionConfig const &_config)
Check AMP Criterion C.
Definition amp_criteria.hpp:202
Definition explicit_predictors.hpp:48
bool HasErrorEstimate(Predictor predictor_choice)
Ask whether a predictor method provides an error estimate.
Definition explicit_predictors.hpp:122
Predictor DefaultPredictor()
Get the Bertini2 default predictor.
Definition explicit_predictors.hpp:70
unsigned Order(Predictor predictor_choice)
The order of the predictor.
Definition explicit_predictors.hpp:85
Definition adaptive_precision_utilities.hpp:35
Predictor
The predictor (ODE integration) method used during path tracking.
Definition config.hpp:55
@ RKCashKarp45
Definition config.hpp:63
@ Euler
Definition config.hpp:57
@ RKNorsett34
Definition config.hpp:61
@ RKDormandPrince56
Definition config.hpp:64
@ RKVerner67
Definition config.hpp:65
@ RKF45
Definition config.hpp:62
@ HeunEuler
Definition config.hpp:60
@ Constant
Definition config.hpp:56
@ Heun
Definition config.hpp:58
@ RK4
Definition config.hpp:59
Definition algorithm_builder.hpp:36
@ Success
The decomposition looks healthy.
Definition eigen_extensions.hpp:465
std::complex< double > complex_dbl
The double-precision complex number type.
Definition double_extensions.hpp:47
Eigen::Matrix< NumT, Eigen::Dynamic, 1 > Vec
A dynamically-sized column vector of NumT.
Definition eigen_extensions.hpp:296
Mat< NumberType > RandomOfUnits(unsigned int rows, unsigned int cols)
Make a random matrix of units (numbers with norm 1).
Definition eigen_extensions.hpp:565
complex_dbl pow(const complex_dbl &z, int power)
Compute +,- integral powers of a std::complex<double> number.
Definition double_extensions.hpp:92
Eigen::Matrix< NumT, Eigen::Dynamic, Eigen::Dynamic > Mat
A dynamically-sized matrix of NumT.
Definition eigen_extensions.hpp:298
double NumErrorT
The numeric type used to hold error/tolerance magnitudes throughout Bertini2 – tracking tolerances,...
Definition num_traits.hpp:48
bmp::number< mpc_complex_backend< 0 >, bmp::et_on > complex_mp
The arbitrary-precision complex number type.
Definition mpfr_complex.hpp:58
auto DefaultPrecision()
Get the global default precision (digits) for multiprecision numbers.
Definition mpfr_complex.hpp:135
SuccessCode
Definition config.hpp:42
@ MatrixSolveFailureFirstPartOfPrediction
Definition config.hpp:57
@ Success
Definition config.hpp:51
@ MatrixSolveFailure
Definition config.hpp:56
@ HigherPrecisionNecessary
Definition config.hpp:52
boost::multiprecision::number< boost::multiprecision::mpfr_float_backend< 0 >, boost::multiprecision::et_on > real_mp
The arbitrary-precision real number type.
Definition mpfr_extensions.hpp:53
unsigned ThreadPrecision()
Get the current thread's precision (digits).
Definition mpfr_complex.hpp:183
boost::multiprecision::number< boost::multiprecision::backends::gmp_rational, boost::multiprecision::et_on > mpq_rational
The exact rational number type.
Definition mpfr_extensions.hpp:55
unsigned Precision(Eigen::MatrixBase< Derived > const &v)
Get the precision of an Eigen object.
Definition eigen_extensions.hpp:339
Holds the program parameters with respect to Adaptive Multiple Precision.
Definition config.hpp:214
Provides the bertini::System class.