40#include <boost/type_index.hpp>
47 template<
class TrackerT>
48 class FirstPrecisionRecorder :
public Observer<TrackerT>
49 { BOOST_TYPE_INDEX_REGISTER_CLASS
51 using EmitterT =
typename TrackerTraits<TrackerT>::EventEmitterType;
53 virtual void Observe(AnyEvent
const& e)
override
55 if(
auto p =
dynamic_cast<const TrackingStarted<EmitterT>*
>(&e))
57 precision_increased_ =
false;
58 starting_precision_ = p->Get().CurrentPrecision();
60 else if (
auto p =
dynamic_cast<const PrecisionChanged<EmitterT>*
>(&e))
63 auto next = p->Next();
64 if (next > p->Previous())
66 precision_increased_ =
true;
67 next_precision_ = next;
68 time_of_first_increase_ = t.CurrentTime();
69 t.RemoveObserver(*
this);
80 unsigned StartPrecision()
const
82 return starting_precision_;
85 unsigned NextPrecision()
const
87 return next_precision_;
90 bool DidPrecisionIncrease()
const
92 return precision_increased_;
95 typename TrackerTraits<TrackerT>::BaseComplexType TimeOfIncrease()
const
97 return time_of_first_increase_;
100 virtual ~FirstPrecisionRecorder() =
default;
104 unsigned starting_precision_;
105 unsigned next_precision_;
106 bool precision_increased_;
107 typename TrackerTraits<TrackerT>::BaseComplexType time_of_first_increase_;
111 template<
class TrackerT>
112 class MinMaxPrecisionRecorder :
public Observer<TrackerT>
113 { BOOST_TYPE_INDEX_REGISTER_CLASS
115 using EmitterT =
typename TrackerTraits<TrackerT>::EventEmitterType;
117 virtual void Observe(AnyEvent
const& e)
override
119 if (
auto p =
dynamic_cast<const PrecisionChanged<EmitterT>*
>(&e))
121 auto next_precision = p->Next();
122 if (next_precision < min_precision_)
123 min_precision_ = next_precision;
124 if (next_precision > max_precision_)
125 max_precision_ = next_precision;
127 else if(
auto p =
dynamic_cast<const TrackingStarted<EmitterT>*
>(&e))
129 min_precision_ = p->Get().CurrentPrecision();
130 max_precision_ = p->Get().CurrentPrecision();
139 unsigned MinPrecision()
const
141 return min_precision_;
144 unsigned MaxPrecision()
const
146 return max_precision_;
149 void MinPrecision(
unsigned m)
150 { min_precision_ = m;}
152 void MaxPrecision(
unsigned m)
153 { max_precision_ = m;}
155 virtual ~MinMaxPrecisionRecorder() =
default;
159 unsigned min_precision_ = std::numeric_limits<unsigned>::max();
160 unsigned max_precision_ = 0;
164 template<
class TrackerT>
165 class PrecisionAccumulator :
public Observer<TrackerT>
166 { BOOST_TYPE_INDEX_REGISTER_CLASS
168 using EmitterT =
typename TrackerTraits<TrackerT>::EventEmitterType;
170 virtual void Observe(AnyEvent
const& e)
override
172 const TrackingEvent<EmitterT>* p =
dynamic_cast<const TrackingEvent<EmitterT>*
>(&e);
175 precisions_.push_back(p->Get().CurrentPrecision());
181 const std::vector<unsigned>& Precisions()
const
186 virtual ~PrecisionAccumulator() =
default;
189 std::vector<unsigned> precisions_;
196 template<
class TrackerT,
template<
class>
class EventT = SuccessfulStep>
198 { BOOST_TYPE_INDEX_REGISTER_CLASS
200 using EmitterT =
typename TrackerTraits<TrackerT>::EventEmitterType;
202 virtual void Observe(
AnyEvent const& e)
override
204 const EventT<EmitterT>* p =
dynamic_cast<const EventT<EmitterT>*
>(&e);
207 path_.push_back(p->Get().CurrentPoint());
213 const std::vector<Vec<mpfr_complex> >& Path()
const
221 std::vector<Vec<mpfr_complex> > path_;
226 template<
class TrackerT>
227 class GoryDetailLogger :
public Observer<TrackerT>
228 { BOOST_TYPE_INDEX_REGISTER_CLASS
231 using EmitterT =
typename TrackerTraits<TrackerT>::EventEmitterType;
233 virtual ~GoryDetailLogger() =
default;
235 virtual void Observe(
AnyEvent const& e)
override
241 BOOST_LOG_TRIVIAL(severity_level::debug) << std::setprecision(p->Get().GetSystem().precision())
242 <<
"initializing in double, tracking path\nfrom\tt = "
243 << p->StartTime() <<
"\nto\tt = " << p->EndTime()
244 <<
"\n from\tx = \n" << p->StartPoint()
245 <<
"\n tracking system " << p->Get().GetSystem() <<
"\n\n";
247 else if (
auto p =
dynamic_cast<const Initializing<EmitterT,mpfr_complex>*
>(&e))
249 BOOST_LOG_TRIVIAL(severity_level::debug) << std::setprecision(p->Get().GetSystem().precision())
250 <<
"initializing in multiprecision, tracking path\nfrom\tt = " << p->StartTime() <<
"\nto\tt = " << p->EndTime() <<
"\n from\tx = \n" << p->StartPoint()
251 <<
"\n tracking system " << p->Get().GetSystem() <<
"\n\n";
254 else if(
auto p =
dynamic_cast<const TrackingEnded<EmitterT>*
>(&e))
255 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"tracking ended";
257 else if (
auto p =
dynamic_cast<const NewStep<EmitterT>*
>(&e))
260 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"Tracker iteration " << t.NumTotalStepsTaken() <<
"\ncurrent precision: " << t.CurrentPrecision();
263 BOOST_LOG_TRIVIAL(severity_level::trace) << std::setprecision(t.CurrentPrecision())
264 <<
"t = " << t.CurrentTime()
265 <<
"\ncurrent stepsize: " << t.CurrentStepsize()
266 <<
"\ndelta_t = " << t.DeltaT()
267 <<
"\ncurrent x size = " << t.CurrentPoint().size()
268 <<
"\ncurrent x = " << t.CurrentPoint();
273 else if (
auto p =
dynamic_cast<const SingularStartPoint<EmitterT>*
>(&e))
274 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"singular start point";
275 else if (
auto p =
dynamic_cast<const InfinitePathTruncation<EmitterT>*
>(&e))
276 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"tracker iteration indicated going to infinity, truncated path";
281 else if (
auto p =
dynamic_cast<const SuccessfulStep<EmitterT>*
>(&e))
283 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"tracker iteration successful\n\n\n";
286 else if (
auto p =
dynamic_cast<const FailedStep<EmitterT>*
>(&e))
288 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"tracker iteration unsuccessful\n\n\n";
296 else if (
auto p =
dynamic_cast<const SuccessfulPredict<EmitterT,mpfr_complex>*
>(&e))
298 BOOST_LOG_TRIVIAL(severity_level::trace) << std::setprecision(
Precision(p->ResultingPoint())) <<
"prediction successful (mpfr_complex), result:\n" << p->ResultingPoint();
300 else if (
auto p =
dynamic_cast<const SuccessfulPredict<EmitterT,dbl>*
>(&e))
302 BOOST_LOG_TRIVIAL(severity_level::trace) << std::setprecision(
Precision(p->ResultingPoint())) <<
"prediction successful (dbl), result:\n" << p->ResultingPoint();
305 else if (
auto p =
dynamic_cast<const SuccessfulCorrect<EmitterT,mpfr_complex>*
>(&e))
307 BOOST_LOG_TRIVIAL(severity_level::trace) << std::setprecision(
Precision(p->ResultingPoint())) <<
"correction successful (mpfr_complex), result:\n" << p->ResultingPoint();
309 else if (
auto p =
dynamic_cast<const SuccessfulCorrect<EmitterT,dbl>*
>(&e))
311 BOOST_LOG_TRIVIAL(severity_level::trace) << std::setprecision(
Precision(p->ResultingPoint())) <<
"correction successful (dbl), result:\n" << p->ResultingPoint();
315 else if (
auto p =
dynamic_cast<const PredictorHigherPrecisionNecessary<EmitterT>*
>(&e))
316 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"Predictor, higher precision necessary";
317 else if (
auto p =
dynamic_cast<const CorrectorHigherPrecisionNecessary<EmitterT>*
>(&e))
318 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"corrector, higher precision necessary";
322 else if (
auto p =
dynamic_cast<const CorrectorMatrixSolveFailure<EmitterT>*
>(&e))
323 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"corrector, matrix solve failure or failure to converge";
324 else if (
auto p =
dynamic_cast<const PredictorMatrixSolveFailure<EmitterT>*
>(&e))
325 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"predictor, matrix solve failure or failure to converge";
326 else if (
auto p =
dynamic_cast<const FirstStepPredictorMatrixSolveFailure<EmitterT>*
>(&e))
327 BOOST_LOG_TRIVIAL(severity_level::trace) <<
"Predictor, matrix solve failure in initial solve of prediction";
330 else if (
auto p =
dynamic_cast<const PrecisionChanged<EmitterT>*
>(&e))
331 BOOST_LOG_TRIVIAL(severity_level::debug) <<
"changing precision from " << p->Previous() <<
" to " << p->Next();
334 BOOST_LOG_TRIVIAL(severity_level::debug) <<
"unlogged event, of type: " << boost::typeindex::type_id_runtime(e).pretty_name();
341 template<
class TrackerT>
342 class StepFailScreenPrinter :
public Observer<TrackerT>
343 { BOOST_TYPE_INDEX_REGISTER_CLASS
346 using EmitterT =
typename TrackerTraits<TrackerT>::EventEmitterType;
348 virtual void Observe(AnyEvent
const& e)
override
350 if (
auto p =
dynamic_cast<const FailedStep<EmitterT>*
>(&e))
351 std::cout <<
"observed step failure" << std::endl;
354 virtual ~StepFailScreenPrinter() =
default;
Contains the abstract base Tracker type, from which all other Trackers inherit.
Strawman Event type, enabling polymorphism.
Definition detail/events.hpp:47
Actual observer type, which you should derive from to extract custom information from observable type...
Definition observer.hpp:82
Definition trackers/observers.hpp:198
TrackPath is initializing the tracker.
Definition trackers/events.hpp:298
unsigned Precision(Eigen::MatrixBase< Derived > const &v)
Get the precision of an Eigen object. If the object is empty, it's the precision of a default-constru...
Definition eigen_extensions.hpp:292
Logging in Bertini using Boost.Log.
Contains the observer base types.
Contains the tracker/events base types.