30#ifndef BERTINI_AMP_TRACKER_HPP
31#define BERTINI_AMP_TRACKER_HPP
117 return 101.47 + 1.59 * precision;
135 template<
typename RealT>
138 unsigned num_newton_iterations,
139 unsigned predictor_order = 0)
141 return pow(RealT(10), -(
static_cast<int>(digits_B) -
static_cast<int>(precision))
142 *
static_cast<int>(num_newton_iterations) / (predictor_order+1.0));
158 return (ceil(log_of_stepsize) + ceil(log10(abs(time_to_go))) + safety_digits).convert_to<
unsigned>();
207 if (digits_required <
static_cast<int>(current_digits))
209 digits_required +=
static_cast<int>(extra);
210 if (digits_required >
static_cast<int>(current_digits))
211 digits_required =
static_cast<int>(current_digits);
236 template<
typename RealT>
238 unsigned min_precision, RealT
const& min_stepsize,
239 unsigned max_precision, RealT
const& max_stepsize,
241 unsigned num_newton_iterations,
242 unsigned predictor_order = 0)
244 double min_cost = Eigen::NumTraits<double>::highest();
246 unsigned minimizing_precision = 0;
249 double min_stepsize_lowprec =
static_cast<double>(min_stepsize);
250 double max_stepsize_lowprec =
static_cast<double>(max_stepsize);
252 auto minimizer_routine =
253 [&min_cost, &minimizing_precision, digits_B, num_newton_iterations, predictor_order, min_stepsize_lowprec, max_stepsize_lowprec](
unsigned p)
256 if (criterion_b_stepsize < min_stepsize_lowprec)
258 double candidate_stepsize = min(criterion_b_stepsize, max_stepsize_lowprec);
260 double current_cost =
ArithmeticCost(p) / abs(candidate_stepsize);
262 if (current_cost < min_cost)
264 min_cost = current_cost;
265 minimizing_precision = p;
269 unsigned lowest_mp_precision_to_test = min_precision;
286 for (
unsigned p = lowest_mp_precision_to_test; p <= max_precision; p+=
PrecisionIncrement())
287 minimizer_routine(p);
289 if (minimizing_precision==0){
290 throw std::runtime_error(
"MinimizeTrackingCost failed to find a suitable stepsize and precision");
293 new_precision = minimizing_precision;
452 return current_precision_;
463 preserve_precision_ = should_preseve_precision;
474 override_start_precision_ = p;
486 const auto& curr_vector = std::get<Vec<complex_dbl>>(this->
current_space_);
515 initial_precision_ = override_start_precision_.value_or(
Precision(start_point(0)));
517 #ifndef BERTINI_DISABLE_ASSERTS
519 (!preserve_precision_
522 &&
"when tracking a path, either preservation of precision must be turned off (so precision can be higher at the end of tracking), or the initial precision must be high enough to support the resulting points to the desired tolerance"
534 endtime_highest_precision_ = end_time;
535 endtime_highest_precision_.precision(initial_precision_);
538 endtime_.precision(initial_precision_);
558 MultipleToDouble(start_point);
560 MultipleToMultiple(initial_precision_, start_point);
566 auto initial_refinement_code = InitialRefinement();
568 #ifndef BERTINI_DISABLE_ASSERTS
570 PrecisionSanityCheck<complex_dbl>();
573 PrecisionSanityCheck<complex_mp>();
577 return initial_refinement_code;
587 num_precision_decreases_ = 0;
589 num_successful_steps_since_precision_decrease_ = 0;
601 SuccessCode initial_refinement_code = RefineStoredPoint();
652 if (preserve_precision_)
664 void CopySolution(
Vec<complex_mp> & solution_at_endtime)
const override
671 solution_at_endtime.resize(num_vars);
672 for (
unsigned ii=0; ii<num_vars; ii++)
678 solution_at_endtime.resize(num_vars);
679 for (
unsigned ii=0; ii<num_vars; ii++)
681 solution_at_endtime(ii) = std::get<Vec<complex_mp> >(
current_space_)(ii);
682 solution_at_endtime(ii).precision(current_precision_);
700 return TrackerIteration<complex_dbl>();
702 return TrackerIteration<complex_mp>();
713 template <
typename ComplexT>
717 using RealT =
typename Eigen::NumTraits<ComplexT>::Real;
719 #ifndef BERTINI_DISABLE_ASSERTS
720 assert(PrecisionSanityCheck<ComplexT>() &&
"precision sanity check failed. some internal variable is not in correct precision");
728 ComplexT delta_t = ComplexT(
delta_t_);
730 #ifndef BERTINI_DISABLE_ASSERTS
731 PrecisionSanityCheck<ComplexT>();
734 SuccessCode predictor_code = Predict<ComplexT, RealT>(predicted_space, current_space, current_time, delta_t);
737 NotifyObservers(FirstStepPredictorMatrixSolveFailure<EmitterType>(*
this));
738 InitialMatrixSolveError();
739 return predictor_code;
744 NewtonConvergenceError();
745 return predictor_code;
749 NotifyObservers(PredictorHigherPrecisionNecessary<EmitterType>(*
this));
750 auto adj_code = AMPCriterionError<ComplexT>();
753 return predictor_code;
757 NotifyObservers(SuccessfulPredict<AMPTracker, ComplexT>(*
this, predicted_space));
761 ComplexT tentative_next_time = current_time + delta_t;
763 SuccessCode corrector_code = Correct<ComplexT, RealT>(tentative_next_space,
765 tentative_next_time);
767 #ifndef BERTINI_DISABLE_ASSERTS
768 assert(PrecisionSanityCheck<ComplexT>() &&
"precision sanity check failed. some internal variable is not in correct precision");
774 NewtonConvergenceError();
775 return corrector_code;
779 NotifyObservers(CorrectorHigherPrecisionNecessary<EmitterType>(*
this));
780 auto adj_code = AMPCriterionError<ComplexT>();
783 return corrector_code;
788 return corrector_code;
791 NotifyObservers(SuccessfulCorrect<AMPTracker, ComplexT>(*
this, tentative_next_space));
794 current_space = tentative_next_space;
795 return AdjustAMPStepSuccess<ComplexT>();
817 template <UpsampleRefinementOption refine_if_necessary = upsample_refine_off>
864 template <
typename ComplexT>
882 const unsigned steps_for_increase =
Get<Stepping>().consecutive_successful_steps_before_stepsize_increase;
888 const unsigned curr_digits = current_precision_;
892 int digits_B =
static_cast<int>(ceil(
double(B_RHS<ComplexT>())
894 int digits_C =
static_cast<int>(DigitsC<ComplexT>());
904 digits_B, digits_C, digits_stepsize,
906 unsigned min_precision =
static_cast<unsigned>(min_digits);
910 const bool decrease_allowed =
911 (num_successful_steps_since_precision_decrease_ >= steps_for_increase)
913 (num_precision_decreases_ <
Get<PrecConf>().max_num_precision_decreases);
914 if (!decrease_allowed)
915 min_precision =
max(min_precision, current_precision_);
921 min_precision, min_stepsize,
922 max_precision, max_stepsize,
926 }
catch (std::runtime_error
const&) {
935 if (next_precision_ < current_precision_)
937 ++num_precision_decreases_;
938 num_successful_steps_since_precision_decrease_ = 0;
941 ++num_successful_steps_since_precision_decrease_;
943 return UpdatePrecisionAndStepsize();
948 void InitialMatrixSolveError()
const
957 UpdatePrecisionAndStepsize();
971 void NewtonConvergenceError()
const
973 next_precision_ = current_precision_;
984 UpdatePrecisionAndStepsize();
1002 template<
typename ComplexT>
1006 unsigned min_next_precision;
1016 if (min_stepsize > max_stepsize)
1019 next_precision_ = min_next_precision;
1025 unsigned digits_B = DigitsB<ComplexT>();
1032 int digits_B_credited =
static_cast<int>(ceil(
double(digits_B)
1034 if (digits_B_credited < 0)
1035 digits_B_credited = 0;
1037 unsigned min_precision =
max(min_next_precision,
1038 static_cast<unsigned>(digits_B_credited),
1039 DigitsC<ComplexT>(),
1046 min_precision, min_stepsize,
1051 }
catch (std::runtime_error
const&) {
1057 UpdatePrecisionAndStepsize();
1068 template<
typename ComplexT>
1072 this->last_step_.norm_J_inverse,
1074 this->TrackingTolerance(),
1075 this->last_step_.norm_delta_z,
1097 template<
typename ComplexT>
1098 unsigned DigitsB()
const
1100 unsigned d = unsigned(B_RHS<ComplexT>());
1111 template<
typename ComplexT>
1135 template<
typename ComplexT>
1136 unsigned DigitsC()
const
1138 return unsigned(C_RHS<ComplexT>());
1176 num_successful_steps_since_precision_decrease_ = 0;
1213 template<
typename ComplexT,
typename RealT>
1216 ComplexT
const& current_time, ComplexT
const& delta_t)
const
1222 static_assert(std::is_same< typename Eigen::NumTraits<RealT>::Real,
1223 typename Eigen::NumTraits<ComplexT>::Real>::value,
1224 "underlying complex type and the type for comparisons must match");
1230 current_space, current_time,
1254 template<
typename ComplexT,
typename RealT>
1257 ComplexT
const& current_time)
const
1259 static_assert(std::is_same< typename Eigen::NumTraits<RealT>::Real,
1260 typename Eigen::NumTraits<ComplexT>::Real>::value,
1261 "underlying complex type and the type for comparisons must match");
1320 template <
typename ComplexT>
1322 Vec<ComplexT> const& start_point, ComplexT
const& current_time)
const
1324 using RealT =
typename Eigen::NumTraits<ComplexT>::Real;
1326 static_assert(std::is_same< typename Eigen::NumTraits<RealT>::Real,
1327 typename Eigen::NumTraits<ComplexT>::Real>::value,
1328 "underlying complex type and the type for comparisons must match");
1330 auto target_precision =
Precision(current_time);
1331 assert(
Precision(start_point)==target_precision);
1369 template <
typename ComplexT>
1371 Vec<ComplexT> const& start_point, ComplexT
const& current_time,
1372 NumErrorT const& tolerance,
unsigned max_iterations)
const
1374 auto target_precision =
Precision(current_time);
1375 assert(
Precision(start_point)==target_precision);
1418 template <UpsampleRefinementOption refine_if_necessary = upsample_refine_off>
1421 if (new_precision==current_precision_)
1428 bool upsampling_needed = new_precision > current_precision_;
1440 DoubleToMultiple(new_precision);
1441 #ifndef BERTINI_DISABLE_ASSERTS
1442 assert(PrecisionSanityCheck<complex_mp>() &&
"precision sanity check failed. some internal variable is not in correct precision");
1447 MultipleToMultiple(new_precision);
1448 #ifndef BERTINI_DISABLE_ASSERTS
1449 assert(PrecisionSanityCheck<complex_mp>() &&
"precision sanity check failed. some internal variable is not in correct precision");
1453 if (refine_if_necessary && upsampling_needed)
1454 return RefineStoredPoint();
1474 #ifndef BERTINI_DISABLE_ASSERTS
1475 assert(source_point.size() ==
GetSystem().
NumVariables() &&
"source point for converting to multiple precision is not the same size as the number of variables in the system being solved.");
1490 void DoubleToDouble()
const
1506 #ifndef BERTINI_DISABLE_ASSERTS
1507 assert(source_point.size() ==
GetSystem().
NumVariables() &&
"source point for converting to multiple precision is not the same size as the number of variables in the system being solved.");
1515 std::get<Vec<complex_dbl> >(
current_space_).resize(source_point.size());
1517 for (
unsigned ii=0; ii<source_point.size(); ii++)
1533 void MultipleToDouble()
const
1550 void DoubleToMultiple(
unsigned new_precision,
Vec<complex_dbl> const& source_point)
const
1552 #ifndef BERTINI_DISABLE_ASSERTS
1553 assert(source_point.size() ==
GetSystem().
NumVariables() &&
"source point for converting to multiple precision is not the same size as the number of variables in the system being solved.");
1554 assert(new_precision >
DoublePrecision() &&
"must convert to precision higher than DoublePrecision when converting to multiple precision");
1557 AdjustCurrentPrecision(new_precision);
1558 CopyToCurrentSpace(source_point);
1559 AdjustInternalsPrecision(new_precision);
1560 AdjustTemporariesPrecision(new_precision);
1562 #ifndef BERTINI_DISABLE_ASSERTS
1563 PrecisionSanityCheck<complex_mp>();
1576 void DoubleToMultiple(
unsigned new_precision)
const
1594 void MultipleToMultiple(
unsigned new_precision,
Vec<complex_mp> const& source_point)
const
1596 #ifndef BERTINI_DISABLE_ASSERTS
1597 assert(source_point.size() ==
GetSystem().
NumVariables() &&
"source point for converting to multiple precision is not the same size as the number of variables in the system being solved.");
1598 assert(new_precision >
DoublePrecision() &&
"must convert to precision higher than DoublePrecision when converting to multiple precision");
1601 AdjustCurrentPrecision(new_precision);
1602 CopyToCurrentSpace(source_point);
1603 AdjustInternalsPrecision(new_precision);
1604 AdjustTemporariesPrecision(new_precision);
1606 #ifndef BERTINI_DISABLE_ASSERTS
1607 PrecisionSanityCheck<complex_mp>();
1619 void MultipleToMultiple(
unsigned new_precision)
const
1628 void AdjustCurrentPrecision(
unsigned new_precision)
const
1630 previous_precision_ = current_precision_;
1631 current_precision_ = new_precision;
1639 if (space.size()!=source_point.size())
1640 space.resize(source_point.size());
1641 for (
unsigned ii=0; ii<source_point.size(); ii++)
1648 if (space.size()!=source_point.size())
1649 space.resize(source_point.size());
1650 space = source_point;
1653 void AdjustInternalsPrecision(
unsigned new_precision)
const
1658 endtime_ = endtime_highest_precision_;
1675 void AdjustTemporariesPrecision(
unsigned new_precision)
const
1680 std::get<Vec<complex_mp> >(
tentative_space_).resize(
static_cast<Eigen::Index
>(num_vars));
1683 std::get<Vec<complex_mp> >(
temporary_space_).resize(
static_cast<Eigen::Index
>(num_vars));
1695 template<
typename ComplexT>
1696 bool PrecisionSanityCheck()
const
1699 if constexpr (std::is_same<ComplexT, complex_dbl>::value){
1703 if constexpr (std::is_same<ComplexT, complex_mp>::value){
1704 assert(
ThreadPrecision()==current_precision_ &&
"current precision differs from the thread-local default precision");
1705 assert(
GetSystem().precision() == current_precision_ &&
"tracked system is out of precision");
1711 assert(
Precision(
delta_t_) == current_precision_ &&
"delta_t_ out of precision");
1712 assert(
Precision(
endtime_) == current_precision_ &&
"endtime_ out of precision");
1714 assert(current_precision_ <=
MaxPrecisionAllowed() &&
"current_precision_ exceeds max precision");
1715 assert(
predictor_.precision() == current_precision_ &&
"predictor_ out of precision");
1739 bool preserve_precision_ =
false;
1740 std::optional<unsigned> override_start_precision_;
1742 mutable unsigned previous_precision_;
1743 mutable unsigned current_precision_;
1744 mutable unsigned next_precision_;
1745 mutable unsigned num_precision_decreases_;
1746 mutable unsigned initial_precision_;
1747 mutable unsigned num_successful_steps_since_precision_decrease_;
1749 mutable complex_mp endtime_highest_precision_;
1756 return current_precision_;
Contains the abstract base Tracker type, from which all other Trackers inherit.
void NotifyObservers(AnyEvent const &e) const
Definition observable.hpp:185
The fundamental polynomial system class for Bertini2.
Definition system.hpp:106
bool IsPolynomial() const
Checks whether a system is polynomial, overall.
size_t NumVariables() const
Get the total number of variables in this system, including homogenizing variables.
UpsampleRefinementOption
Whether to refine after upsampling precision.
Definition amp_tracker.hpp:418
@ upsample_refine_on
Refine after upsampling.
Definition amp_tracker.hpp:420
@ upsample_refine_off
Do not refine after upsampling.
Definition amp_tracker.hpp:419
unsigned CurrentPrecision() const override
Get the current working precision of the tracker.
Definition amp_tracker.hpp:1754
TrackerTraits< AMPTracker >::EventEmitterType EmitterType
The event-emitter type.
Definition amp_tracker.hpp:414
void SetStartPrecision(std::optional< unsigned > p=std::nullopt)
Override the precision at which tracking starts.
Definition amp_tracker.hpp:472
unsigned GetCurrentPrecision() const
Get the current working precision of the adaptive tracker.
Definition amp_tracker.hpp:450
Vec< complex_mp > CurrentPoint() const override
Get the current space point, returned in multiprecision regardless of the working type.
Definition amp_tracker.hpp:482
void PrecisionSetup(AdaptiveMultiplePrecisionConfig const &_config)
Special additional setup call for the AMPTracker, selecting the config for adaptive precision.
Definition amp_tracker.hpp:443
Tracker< AMPTracker > Base
The base tracker type.
Definition amp_tracker.hpp:413
void PrecisionPreservation(bool should_preseve_precision)
Switch preservation of precision after tracking on / off.
Definition amp_tracker.hpp:461
SuccessCode ChangePrecision(unsigned new_precision) const
Change precision of tracker to next_precision.
Definition amp_tracker.hpp:1419
AMPTracker(class System const &sys)
Construct an Adaptive Precision tracker, associating to it a System.
Definition amp_tracker.hpp:427
virtual ~AMPTracker()=default
TrackPath is initializing the tracker.
Definition events.hpp:295
Event emitted when the tracker's working precision changes.
Definition events.hpp:139
predict::ExplicitRKPredictor predictor_
Definition base_tracker.hpp:815
ComplexT delta_t_
Definition base_tracker.hpp:826
unsigned predictor_order_
Definition base_tracker.hpp:816
Tracker(System const &sys)
Definition base_tracker.hpp:181
virtual void PostTrackCleanup() const
Definition base_tracker.hpp:712
const System & GetSystem() const
Definition base_tracker.hpp:507
unsigned num_successful_steps_since_stepsize_increase_
Definition base_tracker.hpp:837
virtual void OnInfiniteTruncation() const=0
unsigned digits_final_
Definition base_tracker.hpp:822
correct::NewtonCorrector corrector_
Definition base_tracker.hpp:818
ComplexT endtime_
Definition base_tracker.hpp:824
unsigned NumTotalStepsTaken() const
Definition base_tracker.hpp:517
virtual void OnStepFail() const=0
virtual void ResetCounters() const=0
TupOfVec current_space_
Definition base_tracker.hpp:842
RealT current_stepsize_
Definition base_tracker.hpp:827
virtual void OnStepSuccess() const=0
unsigned num_steps_since_last_condition_number_computation_
Definition base_tracker.hpp:836
bool reinitialize_stepsize_
Definition base_tracker.hpp:790
TupOfVec temporary_space_
Definition base_tracker.hpp:844
void IncrementBaseCountersFail() const
Increment and reset counters after a failed TrackerIteration().
Definition base_tracker.hpp:761
TupOfVec tentative_space_
Definition base_tracker.hpp:843
auto TrackingTolerance() const
Definition base_tracker.hpp:614
RealT next_stepsize_
Definition base_tracker.hpp:831
unsigned NumVariables() const
Definition base_tracker.hpp:891
std::reference_wrapper< const System > tracked_system_
Definition base_tracker.hpp:787
StepMetadata last_step_
Definition base_tracker.hpp:850
unsigned num_consecutive_failed_steps_
Definition base_tracker.hpp:799
void ResetCountersBase() const
Reset the base-class step counters (successes, failures, consecutive runs, total) to zero.
Definition base_tracker.hpp:727
void SetStepSize(RealT const &new_stepsize) const
Definition base_tracker.hpp:595
unsigned DigitsTrackingTolerance() const
Definition base_tracker.hpp:622
void IncrementBaseCountersSuccess() const
Increment and reset counters after a successful TrackerIteration().
Definition base_tracker.hpp:742
ComplexT current_time_
Definition base_tracker.hpp:825
SuccessCode CheckGoingToInfinity() const
Definition base_tracker.hpp:698
double CriterionCRHS(double const &norm_J_inverse, double const &norm_z, NumErrorT const &tracking_tolerance, AdaptiveMultiplePrecisionConfig const &_config)
Evaluate the right hand side of Criterion C.
Definition amp_criteria.hpp:155
double CriterionBRHS(double const &norm_J, double const &norm_J_inverse, unsigned num_newton_iterations_remaining, NumErrorT const &tracking_tolerance, double const &norm_of_latest_newton_residual, AdaptiveMultiplePrecisionConfig const &_config)
Evaluate the right hand side of the inequality of Criterion B.
Definition amp_criteria.hpp:104
Definition adaptive_precision_utilities.hpp:35
RealT StepsizeSatisfyingCriterionB(unsigned precision, unsigned digits_B, unsigned num_newton_iterations, unsigned predictor_order=0)
Compute a stepsize satisfying AMP Criterion B with a given precision.
Definition amp_tracker.hpp:136
void ApplyPrecisionDecreaseMargin(int &digits_required, unsigned current_digits, unsigned extra)
Apply B1's precision-decrease hysteresis to one digits requirement (B1 AMP2_update).
Definition amp_tracker.hpp:205
unsigned MinDigitsForLogOfStepsize(real_mp const &log_of_stepsize, real_mp const &time_to_go, unsigned safety_digits=3)
The minimum number of digits based on a log10 of a stepsize.
Definition amp_tracker.hpp:156
unsigned MinDigitsForStepsizeInterval(real_mp const &min_stepsize, real_mp const &max_stepsize, real_mp const &time_to_go)
For a given range of stepsizes under consideration, gives the minimum number of digits.
Definition amp_tracker.hpp:172
void MinimizeTrackingCost(unsigned &new_precision, RealT &new_stepsize, unsigned min_precision, RealT const &min_stepsize, unsigned max_precision, RealT const &max_stepsize, unsigned digits_B, unsigned num_newton_iterations, unsigned predictor_order=0)
Compute precision and stepsize minimizing the ArithmeticCost() of tracking.
Definition amp_tracker.hpp:237
real_mp MinStepSizeForPrecision(unsigned precision, real_mp const &time_to_go, int safety_digits=3)
Just another name for MinTimeForCurrentPrecision.
Definition amp_tracker.hpp:83
double ArithmeticCost(unsigned precision)
Compute the cost function for arithmetic versus precision.
Definition amp_tracker.hpp:112
unsigned ExtraDigitsBeforePrecisionDecrease(unsigned current_precision)
Bertini 1's precision-decrease hysteresis margin (from B1's AMP2_update).
Definition amp_tracker.hpp:190
static AdaptiveMultiplePrecisionConfig AMPConfigFrom(System const &sys)
Construct a ready-to-go set of AMP settings from a system.
Definition config.hpp:366
T max(T const &a, T const &b, T const &c)
Three-argument form of max.
Definition mpfr_extensions.hpp:96
real_mp MinTimeForCurrentPrecision(unsigned precision, real_mp const &time_to_go, int safety_digits=3)
The minimum time that can be represented effectively using a given precision.
Definition amp_tracker.hpp:64
Definition algorithm_builder.hpp:36
constexpr unsigned DoublePrecision()
The number of digits considered "double precision" (16).
Definition num_traits.hpp:152
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
unsigned PrecisionIncrement()
The number of digits by which adaptive precision is increased at each step.
Definition num_traits.hpp:145
complex_dbl pow(const complex_dbl &z, int power)
Compute +,- integral powers of a std::complex<double> number.
Definition double_extensions.hpp:92
void SetThreadPrecision(unsigned prec)
Set the precision (digits) for the current thread only (does not touch the global default).
Definition mpfr_complex.hpp:176
double NumErrorT
The numeric type used to hold error/tolerance magnitudes throughout Bertini2 – tracking tolerances,...
Definition num_traits.hpp:48
constexpr unsigned MaxPrecisionAllowed()
The maximum precision (digits) the library will escalate to.
Definition num_traits.hpp:166
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
@ MinStepSizeReached
Definition config.hpp:60
@ FailedToConverge
Definition config.hpp:55
@ MatrixSolveFailureFirstPartOfPrediction
Definition config.hpp:57
@ FailedToSelectPrecisionAndStepsize
Definition config.hpp:67
@ Success
Definition config.hpp:51
@ MaxNumStepsTaken
Definition config.hpp:58
@ GoingToInfinity
Definition config.hpp:54
@ MatrixSolveFailure
Definition config.hpp:56
@ MaxPrecisionReached
Definition config.hpp:59
@ HigherPrecisionNecessary
Definition config.hpp:52
@ SingularStartPoint
Definition config.hpp:62
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
constexpr unsigned LowestMultiplePrecision()
The lowest multiple-precision digit count used (20).
Definition num_traits.hpp:159
unsigned ThreadPrecision()
Get the current thread's precision (digits).
Definition mpfr_complex.hpp:183
unsigned Precision(Eigen::MatrixBase< Derived > const &v)
Get the precision of an Eigen object.
Definition eigen_extensions.hpp:339
T max(T const &a, T const &b, T const &c)
Three-argument form of max.
Definition mpfr_extensions.hpp:96
Holds the program parameters with respect to Adaptive Multiple Precision.
Definition config.hpp:214
Trait lookup mapping a tracker type to its numeric types, event-emitter type, precision config,...
Definition config.hpp:387