33#ifndef GKO_PUBLIC_CORE_LOG_RECORD_HPP_
34#define GKO_PUBLIC_CORE_LOG_RECORD_HPP_
41#include <ginkgo/core/log/logger.hpp>
42#include <ginkgo/core/matrix/dense.hpp>
43#include <ginkgo/core/stop/criterion.hpp>
60 std::unique_ptr<const LinOp> solver;
61 std::unique_ptr<const LinOp> right_hand_side;
62 std::unique_ptr<const LinOp> solution;
64 std::unique_ptr<const LinOp> residual;
65 std::unique_ptr<const LinOp> residual_norm;
66 std::unique_ptr<const LinOp> implicit_sq_residual_norm;
71 const LinOp* solution,
73 const LinOp* residual =
nullptr,
74 const LinOp* residual_norm =
nullptr,
75 const LinOp* implicit_sq_residual_norm =
nullptr,
77 bool all_stopped =
false)
78 : num_iterations{num_iterations}, all_stopped(all_stopped)
80 this->solver =
solver->clone();
81 this->solution = solution->clone();
82 if (right_hand_side !=
nullptr) {
83 this->right_hand_side = right_hand_side->clone();
85 if (residual !=
nullptr) {
86 this->residual = residual->clone();
88 if (residual_norm !=
nullptr) {
89 this->residual_norm = residual_norm->clone();
91 if (implicit_sq_residual_norm !=
nullptr) {
92 this->implicit_sq_residual_norm =
93 implicit_sq_residual_norm->clone();
95 if (status !=
nullptr) {
96 this->status = *status;
126 std::unique_ptr<const PolymorphicObject> input;
127 std::unique_ptr<const PolymorphicObject> output;
134 this->input = input->clone();
135 if (output !=
nullptr) {
136 this->output = output->clone();
146 std::unique_ptr<const LinOp> A;
147 std::unique_ptr<const LinOp> alpha;
148 std::unique_ptr<const LinOp> b;
149 std::unique_ptr<const LinOp> beta;
150 std::unique_ptr<const LinOp> x;
155 this->A = A->clone();
156 if (alpha !=
nullptr) {
157 this->alpha = alpha->clone();
159 this->b = b->clone();
160 if (beta !=
nullptr) {
161 this->beta = beta->clone();
163 this->x = x->clone();
173 std::unique_ptr<const LinOp> input;
174 std::unique_ptr<const LinOp> output;
180 this->input = input->clone();
181 if (output !=
nullptr) {
182 this->output = output->clone();
194 std::unique_ptr<const LinOp> residual;
195 std::unique_ptr<const LinOp> residual_norm;
196 std::unique_ptr<const LinOp> solution;
197 const uint8 stopping_id;
198 const bool set_finalized;
200 const bool oneChanged;
201 const bool converged;
205 const LinOp* residual_norm,
const LinOp* solution,
206 const uint8 stopping_id,
const bool set_finalized,
208 const bool oneChanged =
false,
const bool converged =
false)
210 num_iterations{num_iterations},
212 residual_norm{
nullptr},
214 stopping_id{stopping_id},
215 set_finalized{set_finalized},
217 oneChanged{oneChanged},
220 if (residual !=
nullptr) {
221 this->residual = std::unique_ptr<const LinOp>(residual->clone());
223 if (residual_norm !=
nullptr) {
224 this->residual_norm =
225 std::unique_ptr<const LinOp>(residual_norm->clone());
227 if (solution !=
nullptr) {
228 this->solution = std::unique_ptr<const LinOp>(solution->clone());
250 std::deque<std::unique_ptr<executor_data>> allocation_started;
251 std::deque<std::unique_ptr<executor_data>> allocation_completed;
252 std::deque<std::unique_ptr<executor_data>> free_started;
253 std::deque<std::unique_ptr<executor_data>> free_completed;
254 std::deque<std::unique_ptr<std::tuple<executor_data, executor_data>>>
256 std::deque<std::unique_ptr<std::tuple<executor_data, executor_data>>>
259 std::deque<std::unique_ptr<operation_data>> operation_launched;
260 std::deque<std::unique_ptr<operation_data>> operation_completed;
262 std::deque<std::unique_ptr<polymorphic_object_data>>
263 polymorphic_object_create_started;
264 std::deque<std::unique_ptr<polymorphic_object_data>>
265 polymorphic_object_create_completed;
266 std::deque<std::unique_ptr<polymorphic_object_data>>
267 polymorphic_object_copy_started;
268 std::deque<std::unique_ptr<polymorphic_object_data>>
269 polymorphic_object_copy_completed;
270 std::deque<std::unique_ptr<polymorphic_object_data>>
271 polymorphic_object_move_started;
272 std::deque<std::unique_ptr<polymorphic_object_data>>
273 polymorphic_object_move_completed;
274 std::deque<std::unique_ptr<polymorphic_object_data>>
275 polymorphic_object_deleted;
277 std::deque<std::unique_ptr<linop_data>> linop_apply_started;
278 std::deque<std::unique_ptr<linop_data>> linop_apply_completed;
279 std::deque<std::unique_ptr<linop_data>> linop_advanced_apply_started;
280 std::deque<std::unique_ptr<linop_data>> linop_advanced_apply_completed;
281 std::deque<std::unique_ptr<linop_factory_data>>
282 linop_factory_generate_started;
283 std::deque<std::unique_ptr<linop_factory_data>>
284 linop_factory_generate_completed;
286 std::deque<std::unique_ptr<criterion_data>> criterion_check_started;
287 std::deque<std::unique_ptr<criterion_data>> criterion_check_completed;
289 std::deque<std::unique_ptr<iteration_complete_data>>
295 const size_type& num_bytes)
const override;
299 const uintptr& location)
const override;
302 const uintptr& location)
const override;
305 const uintptr& location)
const override;
310 const size_type& num_bytes)
const override;
315 const size_type& num_bytes)
const override;
353 const LinOp* x)
const override;
356 const LinOp* x)
const override;
360 const LinOp* x)
const override;
364 const LinOp* x)
const override;
368 const LinOp* input)
const override;
372 const LinOp* output)
const override;
377 const LinOp* residual,
378 const LinOp* residual_norm,
379 const LinOp* solution,
380 const uint8& stopping_id,
381 const bool& set_finalized)
const override;
385 const LinOp* residual,
const LinOp* residual_norm,
387 const uint8& stopping_id,
const bool& set_finalized,
393 const LinOp* residual,
const LinOp* residual_norm,
394 const LinOp* solution,
const uint8& stopping_id,
406 "Please use the version with the additional stopping "
498 GKO_DEPRECATED(
"use two-parameter constructor")
528 template <
typename deque_type>
529 void append_deque(std::deque<deque_type>& deque,
deque_type object)
const
531 if (this->max_storage_ && deque.size() ==
this->max_storage_) {
534 deque.push_back(std::move(
object));
538 mutable logged_data data_{};
The first step in using the Ginkgo library consists of creating an executor.
Definition executor.hpp:644
A LinOpFactory represents a higher order mapping which transforms one linear operator into another.
Definition lin_op.hpp:414
Definition lin_op.hpp:146
Operations can be used to define functionalities whose implementations differ among devices.
Definition executor.hpp:287
A PolymorphicObject is the abstract base for all "heavy" objects in Ginkgo that behave polymorphicall...
Definition polymorphic_object.hpp:72
An array is a container which encapsulates fixed-sized arrays, stored on the Executor tied to the arr...
Definition array.hpp:187
Definition logger.hpp:104
static constexpr mask_type all_events_mask
Bitset Mask which activates all events.
Definition logger.hpp:117
Record is a Logger which logs every event to an object.
Definition record.hpp:244
void on_polymorphic_object_deleted(const Executor *exec, const PolymorphicObject *po) const override
PolymorphicObject's deleted event.
void on_linop_advanced_apply_completed(const LinOp *A, const LinOp *alpha, const LinOp *b, const LinOp *beta, const LinOp *x) const override
LinOp's advanced apply completed event.
void on_allocation_completed(const Executor *exec, const size_type &num_bytes, const uintptr &location) const override
Executor's allocation completed event.
void on_polymorphic_object_move_started(const Executor *exec, const PolymorphicObject *from, const PolymorphicObject *to) const override
PolymorphicObject's move started event.
void on_copy_completed(const Executor *from, const Executor *to, const uintptr &location_from, const uintptr &location_to, const size_type &num_bytes) const override
Executor's copy completed event.
void on_linop_advanced_apply_started(const LinOp *A, const LinOp *alpha, const LinOp *b, const LinOp *beta, const LinOp *x) const override
LinOp's advanced apply started event.
void on_polymorphic_object_create_started(const Executor *exec, const PolymorphicObject *po) const override
PolymorphicObject's create started event.
void on_copy_started(const Executor *from, const Executor *to, const uintptr &location_from, const uintptr &location_to, const size_type &num_bytes) const override
Executor's copy started event.
void on_criterion_check_completed(const stop::Criterion *criterion, const size_type &num_iterations, const LinOp *residual, const LinOp *residual_norm, const LinOp *implicit_residual_norm_sq, const LinOp *solution, const uint8 &stopping_id, const bool &set_finalized, const array< stopping_status > *status, const bool &one_changed, const bool &all_converged) const override
stop::Criterion's check completed event.
void on_linop_apply_completed(const LinOp *A, const LinOp *b, const LinOp *x) const override
LinOp's apply completed event.
void on_polymorphic_object_copy_completed(const Executor *exec, const PolymorphicObject *from, const PolymorphicObject *to) const override
PolymorphicObject's copy completed event.
void on_linop_factory_generate_completed(const LinOpFactory *factory, const LinOp *input, const LinOp *output) const override
LinOp Factory's generate completed event.
static std::unique_ptr< Record > create(const mask_type &enabled_events=Logger::all_events_mask, size_type max_storage=1)
Creates a Record logger.
Definition record.hpp:467
void on_polymorphic_object_copy_started(const Executor *exec, const PolymorphicObject *from, const PolymorphicObject *to) const override
PolymorphicObject's copy started event.
void on_polymorphic_object_move_completed(const Executor *exec, const PolymorphicObject *from, const PolymorphicObject *to) const override
PolymorphicObject's move completed event.
void on_free_started(const Executor *exec, const uintptr &location) const override
Executor's free started event.
logged_data & get() noexcept
Definition record.hpp:484
void on_linop_apply_started(const LinOp *A, const LinOp *b, const LinOp *x) const override
LinOp's apply started event.
void on_criterion_check_started(const stop::Criterion *criterion, const size_type &num_iterations, const LinOp *residual, const LinOp *residual_norm, const LinOp *solution, const uint8 &stopping_id, const bool &set_finalized) const override
stop::Criterion's check started event.
const logged_data & get() const noexcept
Returns the logged data.
Definition record.hpp:479
static std::unique_ptr< Record > create(std::shared_ptr< const Executor > exec, const mask_type &enabled_events=Logger::all_events_mask, size_type max_storage=1)
Creates a Record logger.
Definition record.hpp:441
void on_polymorphic_object_create_completed(const Executor *exec, const PolymorphicObject *input, const PolymorphicObject *output) const override
PolymorphicObject's create completed event.
void on_criterion_check_completed(const stop::Criterion *criterion, const size_type &num_iterations, const LinOp *residual, const LinOp *residual_norm, const LinOp *solution, const uint8 &stopping_id, const bool &set_finalized, const array< stopping_status > *status, const bool &one_changed, const bool &all_converged) const override
stop::Criterion's check completed event.
void on_iteration_complete(const LinOp *solver, const LinOp *right_hand_side, const LinOp *x, const size_type &num_iterations, const LinOp *residual, const LinOp *residual_norm, const LinOp *implicit_resnorm_sq, const array< stopping_status > *status, bool stopped) const override
Register the iteration_complete event which logs every completed iterations.
void on_free_completed(const Executor *exec, const uintptr &location) const override
Executor's free completed event.
void on_operation_launched(const Executor *exec, const Operation *operation) const override
Executor's operation launched event (method run).
void on_linop_factory_generate_started(const LinOpFactory *factory, const LinOp *input) const override
LinOp Factory's generate started event.
void on_allocation_started(const Executor *exec, const size_type &num_bytes) const override
Executor's allocation started event.
void on_operation_completed(const Executor *exec, const Operation *operation) const override
Executor's operation completed event (method run).
The Criterion class is a base class for all stopping criteria.
Definition criterion.hpp:64
@ criterion
Stopping criterion events.
@ factory
LinOpFactory events.
@ operation
Kernel execution and data movement.
The Ginkgo namespace.
Definition abstract_factory.hpp:48
constexpr T one()
Returns the multiplicative identity for T.
Definition math.hpp:803
std::uint8_t uint8
8-bit unsigned integral type.
Definition types.hpp:149
std::uintptr_t uintptr
Unsigned integer type capable of holding a pointer to void.
Definition types.hpp:172
std::size_t size_type
Integral type used for allocation quantities.
Definition types.hpp:120
Struct storing the actually logged data.
Definition record.hpp:249
Struct representing Criterion related data.
Definition record.hpp:191
Struct representing Executor related data.
Definition record.hpp:105
Struct representing iteration complete related data.
Definition record.hpp:59
Struct representing LinOp related data.
Definition record.hpp:145
Struct representing LinOp factory related data.
Definition record.hpp:171
Struct representing Operator related data.
Definition record.hpp:115
Struct representing PolymorphicObject related data.
Definition record.hpp:124
This structure is used to represent versions of various Ginkgo modules.
Definition version.hpp:54