5#ifndef GKO_PUBLIC_CORE_LOG_LOGGER_HPP_
6#define GKO_PUBLIC_CORE_LOG_LOGGER_HPP_
15#include <ginkgo/core/base/types.hpp>
16#include <ginkgo/core/base/utils_helper.hpp>
24template <
typename ValueType>
29class PolymorphicObject;
38class BatchLinOpFactory;
40template <
typename ValueType>
112#define GKO_LOGGER_REGISTER_EVENT(_id, _event_name, ...) \
114 virtual void on_##_event_name(__VA_ARGS__) const {} \
117 template <size_type Event, typename... Params> \
118 std::enable_if_t<Event == _id && (_id < event_count_max)> on( \
119 Params&&... params) const \
121 if (enabled_events_ & (mask_type{1} << _id)) { \
122 this->on_##_event_name(std::forward<Params>(params)...); \
125 static constexpr size_type _event_name{_id}; \
126 static constexpr mask_type _event_name##_mask{mask_type{1} << _id};
134 GKO_LOGGER_REGISTER_EVENT(0, allocation_started,
const Executor* exec,
144 GKO_LOGGER_REGISTER_EVENT(1, allocation_completed,
const Executor* exec,
154 GKO_LOGGER_REGISTER_EVENT(2, free_started,
const Executor* exec,
163 GKO_LOGGER_REGISTER_EVENT(3, free_completed,
const Executor* exec,
175 GKO_LOGGER_REGISTER_EVENT(4, copy_started,
const Executor* exec_from,
188 GKO_LOGGER_REGISTER_EVENT(5, copy_completed,
const Executor* exec_from,
198 GKO_LOGGER_REGISTER_EVENT(6, operation_launched,
const Executor* exec,
212 GKO_LOGGER_REGISTER_EVENT(7, operation_completed,
const Executor* exec,
221 GKO_LOGGER_REGISTER_EVENT(8, polymorphic_object_create_started,
231 GKO_LOGGER_REGISTER_EVENT(9, polymorphic_object_create_completed,
243 GKO_LOGGER_REGISTER_EVENT(10, polymorphic_object_copy_started,
255 GKO_LOGGER_REGISTER_EVENT(11, polymorphic_object_copy_completed,
266 GKO_LOGGER_REGISTER_EVENT(12, polymorphic_object_deleted,
276 GKO_LOGGER_REGISTER_EVENT(13, linop_apply_started,
const LinOp* A,
286 GKO_LOGGER_REGISTER_EVENT(14, linop_apply_completed,
const LinOp* A,
298 GKO_LOGGER_REGISTER_EVENT(15, linop_advanced_apply_started,
const LinOp* A,
311 GKO_LOGGER_REGISTER_EVENT(16, linop_advanced_apply_completed,
322 GKO_LOGGER_REGISTER_EVENT(17, linop_factory_generate_started,
333 GKO_LOGGER_REGISTER_EVENT(18, linop_factory_generate_completed,
348 GKO_LOGGER_REGISTER_EVENT(19, criterion_check_started,
352 const uint8& stopping_id,
353 const bool& set_finalized)
375 GKO_LOGGER_REGISTER_EVENT(
378 const uint8& stopping_id,
const bool& set_finalized,
380 const bool& all_converged)
402 const uint8& stopping_id,
const bool& set_finalized,
404 const bool& all_converged)
const
407 stopping_id, set_finalized, status,
408 one_changed, all_converged);
412 static constexpr size_type iteration_complete{21};
413 static constexpr mask_type iteration_complete_mask{mask_type{1} << 21};
415 template <size_type Event,
typename... Params>
417 Params&&... params)
const
419 if (enabled_events_ & (mask_type{1} << 21)) {
438 "Please use the version with the additional stopping "
442 const
LinOp* tau =
nullptr)
const
459 "Please use the version with the additional stopping "
464 const
LinOp* implicit_tau_sq)
const
466 GKO_BEGIN_DISABLE_DEPRECATION_WARNINGS
468 GKO_END_DISABLE_DEPRECATION_WARNINGS
489 const LinOp* implicit_tau_sq,
493 GKO_BEGIN_DISABLE_DEPRECATION_WARNINGS
495 GKO_END_DISABLE_DEPRECATION_WARNINGS
506 GKO_LOGGER_REGISTER_EVENT(22, polymorphic_object_move_started,
518 GKO_LOGGER_REGISTER_EVENT(23, polymorphic_object_move_completed,
530 GKO_LOGGER_REGISTER_EVENT(24, batch_linop_factory_generate_started,
542 GKO_LOGGER_REGISTER_EVENT(25, batch_linop_factory_generate_completed,
548 static constexpr size_type batch_solver_completed{26};
549 static constexpr mask_type batch_solver_completed_mask{mask_type{1} << 26};
551 template <size_type Event,
typename... Params>
553 Params&&... params)
const
555 if (enabled_events_ & batch_solver_completed_mask) {
595#undef GKO_LOGGER_REGISTER_EVENT
601 allocation_started_mask | allocation_completed_mask |
602 free_started_mask | free_completed_mask | copy_started_mask |
609 operation_launched_mask | operation_completed_mask;
615 polymorphic_object_create_started_mask |
616 polymorphic_object_create_completed_mask |
617 polymorphic_object_copy_started_mask |
618 polymorphic_object_copy_completed_mask |
619 polymorphic_object_move_started_mask |
620 polymorphic_object_move_completed_mask |
621 polymorphic_object_deleted_mask;
627 linop_apply_started_mask | linop_apply_completed_mask |
628 linop_advanced_apply_started_mask | linop_advanced_apply_completed_mask;
634 linop_factory_generate_started_mask |
635 linop_factory_generate_completed_mask;
641 batch_linop_factory_generate_started_mask |
642 batch_linop_factory_generate_completed_mask;
648 criterion_check_started_mask | criterion_check_completed_mask;
673 GKO_DEPRECATED(
"use single-parameter constructor")
694 : enabled_events_{enabled_events}
698 mask_type enabled_events_;
716 virtual void add_logger(std::shared_ptr<const Logger> logger) = 0;
739 virtual const std::vector<std::shared_ptr<const Logger>>&
get_loggers()
759template <
typename ConcreteLoggable,
typename PolymorphicBase = Loggable>
762 void add_logger(std::shared_ptr<const Logger> logger)
override
764 loggers_.push_back(logger);
770 find_if(begin(loggers_), end(loggers_),
771 [&logger](
const auto& l) {
return l.get() == logger; });
772 if (idx != end(loggers_)) {
801 template <
size_type Event,
typename ConcreteLoggableT,
typename =
void>
802 struct propagate_log_helper {
803 template <
typename... Args>
804 static void propagate_log(
const ConcreteLoggableT*, Args&&...)
808 template <
size_type Event,
typename ConcreteLoggableT>
809 struct propagate_log_helper<
810 Event, ConcreteLoggableT,
812 decltype(std::declval<ConcreteLoggableT>().get_executor())>> {
813 template <
typename... Args>
814 static void propagate_log(
const ConcreteLoggableT* loggable,
817 const auto exec = loggable->get_executor();
818 if (exec->should_propagate_log()) {
820 if (logger->needs_propagation()) {
821 logger->template on<Event>(std::forward<Args>(args)...);
829 template <size_type Event,
typename... Params>
830 void log(Params&&... params)
const
832 propagate_log_helper<Event, ConcreteLoggable>::propagate_log(
833 static_cast<const ConcreteLoggable*
>(
this),
834 std::forward<Params>(params)...);
835 for (
auto& logger : loggers_) {
836 logger->template on<Event>(std::forward<Params>(params)...);
840 std::vector<std::shared_ptr<const Logger>> loggers_;
Definition executor.hpp:615
Definition lin_op.hpp:385
Definition lin_op.hpp:117
Definition executor.hpp:258
Definition exception.hpp:558
Definition polymorphic_object.hpp:52
Definition batch_lin_op.hpp:195
Definition batch_lin_op.hpp:59
Definition logger.hpp:760
void clear_loggers() override
Definition logger.hpp:791
const std::vector< std::shared_ptr< const Logger > > & get_loggers() const override
Definition logger.hpp:785
void add_logger(std::shared_ptr< const Logger > logger) override
Definition logger.hpp:762
void remove_logger(const Logger *logger) override
Definition logger.hpp:767
Definition logger.hpp:707
virtual const std::vector< std::shared_ptr< const Logger > > & get_loggers() const =0
virtual void clear_loggers()=0
virtual void remove_logger(const Logger *logger)=0
virtual void add_logger(std::shared_ptr< const Logger > logger)=0
static constexpr mask_type all_events_mask
Definition logger.hpp:89
virtual void on_batch_solver_completed(const array< int > &iters, const array< float > &residual_norms) const
Definition logger.hpp:579
virtual void on_iteration_complete(const LinOp *solver, const LinOp *b, const LinOp *x, const size_type &it, const LinOp *r, const LinOp *tau, const LinOp *implicit_tau_sq, const array< stopping_status > *status, bool stopped) const
Definition logger.hpp:486
static constexpr mask_type operation_events_mask
Definition logger.hpp:608
static constexpr mask_type batch_linop_factory_events_mask
Definition logger.hpp:640
static constexpr mask_type linop_events_mask
Definition logger.hpp:626
virtual void on_criterion_check_completed(const stop::Criterion *criterion, const size_type &it, const LinOp *r, const LinOp *tau, const LinOp *implicit_tau_sq, const LinOp *x, const uint8 &stopping_id, const bool &set_finalized, const array< stopping_status > *status, const bool &one_changed, const bool &all_converged) const
Definition logger.hpp:399
Logger(const mask_type &enabled_events=all_events_mask)
Definition logger.hpp:693
static constexpr mask_type polymorphic_object_events_mask
Definition logger.hpp:614
virtual bool needs_propagation() const
Definition logger.hpp:654
virtual void on_batch_solver_completed(const array< int > &iters, const array< double > &residual_norms) const
Definition logger.hpp:568
static constexpr mask_type criterion_events_mask
Definition logger.hpp:647
static constexpr size_type event_count_max
Definition logger.hpp:84
virtual void on_criterion_check_completed(const stop::Criterion *criterion, const size_type &it, const LinOp *r, const LinOp *tau, const LinOp *x, const uint8 &stopping_id, const bool &set_finalized, const array< stopping_status > *status, const bool &one_changed, const bool &all_converged) const
Definition logger.hpp:380
virtual void on_iteration_complete(const LinOp *solver, const size_type &it, const LinOp *r, const LinOp *x=nullptr, const LinOp *tau=nullptr) const
Definition logger.hpp:440
static constexpr mask_type linop_factory_events_mask
Definition logger.hpp:633
virtual void on_batch_solver_completed(const array< int > &iters, const array< gko::half > &residual_norms) const
Definition logger.hpp:590
static constexpr mask_type executor_events_mask
Definition logger.hpp:600
Definition utils_helper.hpp:41
T * get() const
Definition utils_helper.hpp:75
Definition criterion.hpp:36
The Ginkgo namespace.
Definition abstract_factory.hpp:20
std::uintptr_t uintptr
Definition types.hpp:141
std::uint8_t uint8
Definition types.hpp:118
std::size_t size_type
Definition types.hpp:89
constexpr size_type byte_size
Definition types.hpp:177
std::uint64_t uint64
Definition types.hpp:135