Use absl::time
Replace WallTimeInSeconds with absl::Now and use
absl::Time and absl::Duration objects instead of doubles.
wall_time.h/cc -> event_logger.h/cc
Change-Id: I41279961368840fbdf6bb3456ffdbdf2f9bfb85b
diff --git a/internal/ceres/CMakeLists.txt b/internal/ceres/CMakeLists.txt
index 98d74cf..921ea9e 100644
--- a/internal/ceres/CMakeLists.txt
+++ b/internal/ceres/CMakeLists.txt
@@ -36,6 +36,7 @@
set(Threads_DEPENDENCY "find_dependency (Threads)" PARENT_SCOPE)
list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES $<LINK_LIBRARY:WHOLE_ARCHIVE,absl::log_flags>)
list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES absl::strings)
+list(APPEND CERES_LIBRARY_PRIVATE_DEPENDENCIES absl::time)
list(APPEND CERES_LIBRARY_PUBLIC_DEPENDENCIES absl::log)
list(APPEND CERES_LIBRARY_PUBLIC_DEPENDENCIES absl::check)
@@ -169,6 +170,7 @@
eigensparse.cc
evaluation_callback.cc
evaluator.cc
+ event_logger.cc
fake_bundle_adjustment_jacobian.cc
file.cc
first_order_function.cc
@@ -227,7 +229,6 @@
trust_region_strategy.cc
visibility.cc
visibility_based_preconditioner.cc
- wall_time.cc
)
set(CERES_LIBRARY_SOURCE
diff --git a/internal/ceres/cgnr_solver.cc b/internal/ceres/cgnr_solver.cc
index 06c19d6..4746006 100644
--- a/internal/ceres/cgnr_solver.cc
+++ b/internal/ceres/cgnr_solver.cc
@@ -39,10 +39,10 @@
#include "ceres/conjugate_gradients_solver.h"
#include "ceres/cuda_sparse_matrix.h"
#include "ceres/cuda_vector.h"
+#include "ceres/event_logger.h"
#include "ceres/internal/eigen.h"
#include "ceres/linear_solver.h"
#include "ceres/subset_preconditioner.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
diff --git a/internal/ceres/context_impl.cc b/internal/ceres/context_impl.cc
index be4aa29..88f0859 100644
--- a/internal/ceres/context_impl.cc
+++ b/internal/ceres/context_impl.cc
@@ -35,8 +35,8 @@
#include "absl/log/check.h"
#include "absl/log/log.h"
#include "absl/strings/str_format.h"
+#include "ceres/event_logger.h"
#include "ceres/internal/config.h"
-#include "ceres/wall_time.h"
#ifndef CERES_NO_CUDA
#include "cublas_v2.h"
diff --git a/internal/ceres/covariance_impl.cc b/internal/ceres/covariance_impl.cc
index c9c292f..bdbb590 100644
--- a/internal/ceres/covariance_impl.cc
+++ b/internal/ceres/covariance_impl.cc
@@ -48,6 +48,7 @@
#include "ceres/compressed_row_sparse_matrix.h"
#include "ceres/covariance.h"
#include "ceres/crs_matrix.h"
+#include "ceres/event_logger.h"
#include "ceres/internal/eigen.h"
#include "ceres/map_util.h"
#include "ceres/parallel_for.h"
@@ -56,7 +57,6 @@
#include "ceres/problem_impl.h"
#include "ceres/residual_block.h"
#include "ceres/suitesparse.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
diff --git a/internal/ceres/cuda_sparse_matrix.cc b/internal/ceres/cuda_sparse_matrix.cc
index b55495b..9cb25d5 100644
--- a/internal/ceres/cuda_sparse_matrix.cc
+++ b/internal/ceres/cuda_sparse_matrix.cc
@@ -48,7 +48,6 @@
#include "ceres/crs_matrix.h"
#include "ceres/internal/export.h"
#include "ceres/types.h"
-#include "ceres/wall_time.h"
#ifndef CERES_NO_CUDA
diff --git a/internal/ceres/dense_normal_cholesky_solver.cc b/internal/ceres/dense_normal_cholesky_solver.cc
index f6d5e5a..f295910 100644
--- a/internal/ceres/dense_normal_cholesky_solver.cc
+++ b/internal/ceres/dense_normal_cholesky_solver.cc
@@ -34,10 +34,10 @@
#include "Eigen/Dense"
#include "ceres/dense_sparse_matrix.h"
+#include "ceres/event_logger.h"
#include "ceres/internal/eigen.h"
#include "ceres/linear_solver.h"
#include "ceres/types.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
diff --git a/internal/ceres/dense_qr_solver.cc b/internal/ceres/dense_qr_solver.cc
index 92652b4..9466689 100644
--- a/internal/ceres/dense_qr_solver.cc
+++ b/internal/ceres/dense_qr_solver.cc
@@ -35,10 +35,10 @@
#include "Eigen/Dense"
#include "ceres/dense_qr.h"
#include "ceres/dense_sparse_matrix.h"
+#include "ceres/event_logger.h"
#include "ceres/internal/eigen.h"
#include "ceres/linear_solver.h"
#include "ceres/types.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
diff --git a/internal/ceres/dynamic_sparse_normal_cholesky_solver.cc b/internal/ceres/dynamic_sparse_normal_cholesky_solver.cc
index 0d147c4..e66083f 100644
--- a/internal/ceres/dynamic_sparse_normal_cholesky_solver.cc
+++ b/internal/ceres/dynamic_sparse_normal_cholesky_solver.cc
@@ -40,13 +40,13 @@
#include "Eigen/SparseCore"
#include "absl/log/log.h"
#include "ceres/compressed_row_sparse_matrix.h"
+#include "ceres/event_logger.h"
#include "ceres/internal/config.h"
#include "ceres/internal/eigen.h"
#include "ceres/linear_solver.h"
#include "ceres/suitesparse.h"
#include "ceres/triplet_sparse_matrix.h"
#include "ceres/types.h"
-#include "ceres/wall_time.h"
#include "cuda_sparse_cholesky.h"
#ifdef CERES_USE_EIGEN_SPARSE
diff --git a/internal/ceres/wall_time.cc b/internal/ceres/event_logger.cc
similarity index 70%
rename from internal/ceres/wall_time.cc
rename to internal/ceres/event_logger.cc
index fa07470..5fd010b 100644
--- a/internal/ceres/wall_time.cc
+++ b/internal/ceres/event_logger.cc
@@ -1,5 +1,5 @@
// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2023 Google Inc. All rights reserved.
+// Copyright 2024 Google Inc. All rights reserved.
// http://ceres-solver.org/
//
// Redistribution and use in source and binary forms, with or without
@@ -28,43 +28,22 @@
//
// Author: strandmark@google.com (Petter Strandmark)
-#include "ceres/wall_time.h"
-
-#include <ctime>
+#include "ceres/event_logger.h"
#include "absl/log/log.h"
#include "absl/strings/str_format.h"
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
#include "ceres/internal/config.h"
-#ifdef _WIN32
-#include <windows.h>
-#else
-#include <sys/time.h>
-#endif
-
namespace ceres::internal {
-double WallTimeInSeconds() {
-#ifdef _WIN32
- LARGE_INTEGER count;
- LARGE_INTEGER frequency;
- QueryPerformanceCounter(&count);
- QueryPerformanceFrequency(&frequency);
- return static_cast<double>(count.QuadPart) /
- static_cast<double>(frequency.QuadPart);
-#else
- timeval time_val;
- gettimeofday(&time_val, nullptr);
- return (time_val.tv_sec + time_val.tv_usec * 1e-6);
-#endif
-}
-
-EventLogger::EventLogger(const std::string& logger_name) {
+EventLogger::EventLogger(const std::string& logger_name)
+ : start_time_(absl::Now()) {
if (!VLOG_IS_ON(3)) {
return;
}
- start_time_ = WallTimeInSeconds();
last_event_time_ = start_time_;
events_ = absl::StrFormat(
"\n%s\n Delta Cumulative\n",
@@ -84,16 +63,13 @@
return;
}
- const double current_time = WallTimeInSeconds();
- const double relative_time_delta = current_time - last_event_time_;
- const double absolute_time_delta = current_time - start_time_;
- last_event_time_ = current_time;
-
+ const absl::Time now = absl::Now();
absl::StrAppendFormat(&events_,
" %30s : %10.5f %10.5f\n",
event_name,
- relative_time_delta,
- absolute_time_delta);
+ absl::ToDoubleSeconds(now - last_event_time_),
+ absl::ToDoubleSeconds(now - start_time_));
+ last_event_time_ = now;
}
} // namespace ceres::internal
diff --git a/internal/ceres/wall_time.h b/internal/ceres/event_logger.h
similarity index 86%
rename from internal/ceres/wall_time.h
rename to internal/ceres/event_logger.h
index 8878f9b..d01119f 100644
--- a/internal/ceres/wall_time.h
+++ b/internal/ceres/event_logger.h
@@ -1,5 +1,5 @@
// Ceres Solver - A fast non-linear least squares minimizer
-// Copyright 2023 Google Inc. All rights reserved.
+// Copyright 2024 Google Inc. All rights reserved.
// http://ceres-solver.org/
//
// Redistribution and use in source and binary forms, with or without
@@ -28,21 +28,17 @@
//
// Author: strandmark@google.com (Petter Strandmark)
-#ifndef CERES_INTERNAL_WALL_TIME_H_
-#define CERES_INTERNAL_WALL_TIME_H_
+#ifndef CERES_INTERNAL_EVENT_LOGGER_H_
+#define CERES_INTERNAL_EVENT_LOGGER_H_
-#include <map>
#include <string>
+#include "absl/time/time.h"
#include "ceres/internal/disable_warnings.h"
#include "ceres/internal/export.h"
namespace ceres::internal {
-// Returns time, in seconds, from some arbitrary starting point. On unixes,
-// gettimeofday is used. The granularity is microseconds.
-CERES_NO_EXPORT double WallTimeInSeconds();
-
// Log a series of events, recording for each event the time elapsed
// since the last event and since the creation of the object.
//
@@ -74,8 +70,8 @@
void AddEvent(const std::string& event_name);
private:
- double start_time_;
- double last_event_time_;
+ const absl::Time start_time_;
+ absl::Time last_event_time_;
std::string events_;
};
@@ -83,4 +79,4 @@
#include "ceres/internal/reenable_warnings.h"
-#endif // CERES_INTERNAL_WALL_TIME_H_
+#endif // CERES_INTERNAL_EVENT_LOGGER_H_
diff --git a/internal/ceres/execution_summary.h b/internal/ceres/execution_summary.h
index accc5e4..15eb7b3 100644
--- a/internal/ceres/execution_summary.h
+++ b/internal/ceres/execution_summary.h
@@ -36,14 +36,15 @@
#include <string>
#include <utility>
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
#include "ceres/internal/export.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
struct CallStatistics {
CallStatistics() = default;
- double time{0.};
+ absl::Duration time = absl::ZeroDuration();
int calls{0};
};
@@ -51,10 +52,10 @@
// execution.
class ExecutionSummary {
public:
- void IncrementTimeBy(const std::string& name, const double value) {
+ void IncrementTimeBy(const std::string& name, absl::Duration delta) {
std::lock_guard<std::mutex> l(mutex_);
CallStatistics& call_stats = statistics_[name];
- call_stats.time += value;
+ call_stats.time += delta;
++call_stats.calls;
}
@@ -70,16 +71,14 @@
class ScopedExecutionTimer {
public:
ScopedExecutionTimer(std::string name, ExecutionSummary* summary)
- : start_time_(WallTimeInSeconds()),
- name_(std::move(name)),
- summary_(summary) {}
+ : start_time_(absl::Now()), name_(std::move(name)), summary_(summary) {}
~ScopedExecutionTimer() {
- summary_->IncrementTimeBy(name_, WallTimeInSeconds() - start_time_);
+ summary_->IncrementTimeBy(name_, absl::Now() - start_time_);
}
private:
- const double start_time_;
+ absl::Time start_time_;
const std::string name_;
ExecutionSummary* summary_;
};
diff --git a/internal/ceres/gradient_problem_evaluator.h b/internal/ceres/gradient_problem_evaluator.h
index 8b03015..d272f04 100644
--- a/internal/ceres/gradient_problem_evaluator.h
+++ b/internal/ceres/gradient_problem_evaluator.h
@@ -42,7 +42,6 @@
#include "ceres/internal/disable_warnings.h"
#include "ceres/internal/export.h"
#include "ceres/sparse_matrix.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
diff --git a/internal/ceres/gradient_problem_solver.cc b/internal/ceres/gradient_problem_solver.cc
index 535f4c2..02038da 100644
--- a/internal/ceres/gradient_problem_solver.cc
+++ b/internal/ceres/gradient_problem_solver.cc
@@ -38,6 +38,7 @@
#include "absl/log/log.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
+#include "absl/time/time.h"
#include "ceres/callbacks.h"
#include "ceres/gradient_problem.h"
#include "ceres/gradient_problem_evaluator.h"
@@ -48,7 +49,6 @@
#include "ceres/solver.h"
#include "ceres/solver_utils.h"
#include "ceres/types.h"
-#include "ceres/wall_time.h"
namespace ceres {
namespace {
@@ -105,9 +105,8 @@
using internal::LoggingCallback;
using internal::Minimizer;
using internal::SetSummaryFinalCost;
- using internal::WallTimeInSeconds;
- double start_time = WallTimeInSeconds();
+ const absl::Time start_time = absl::Now();
CHECK(summary != nullptr);
*summary = Summary();
@@ -186,18 +185,21 @@
{
const CallStatistics& call_stats = FindWithDefault(
evaluator_statistics, "Evaluator::Residual", CallStatistics());
- summary->cost_evaluation_time_in_seconds = call_stats.time;
+ summary->cost_evaluation_time_in_seconds =
+ absl::ToDoubleSeconds(call_stats.time);
summary->num_cost_evaluations = call_stats.calls;
}
{
const CallStatistics& call_stats = FindWithDefault(
evaluator_statistics, "Evaluator::Jacobian", CallStatistics());
- summary->gradient_evaluation_time_in_seconds = call_stats.time;
+ summary->gradient_evaluation_time_in_seconds =
+ absl::ToDoubleSeconds(call_stats.time);
summary->num_gradient_evaluations = call_stats.calls;
}
- summary->total_time_in_seconds = WallTimeInSeconds() - start_time;
+ summary->total_time_in_seconds =
+ absl::ToDoubleSeconds(absl::Now() - start_time);
}
bool GradientProblemSolver::Summary::IsSolutionUsable() const {
diff --git a/internal/ceres/graph_algorithms.h b/internal/ceres/graph_algorithms.h
index 3019f0b..60520d5 100644
--- a/internal/ceres/graph_algorithms.h
+++ b/internal/ceres/graph_algorithms.h
@@ -43,7 +43,6 @@
#include "absl/log/check.h"
#include "ceres/graph.h"
#include "ceres/internal/export.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
diff --git a/internal/ceres/iterative_schur_complement_solver.cc b/internal/ceres/iterative_schur_complement_solver.cc
index 23318bb..e467841 100644
--- a/internal/ceres/iterative_schur_complement_solver.cc
+++ b/internal/ceres/iterative_schur_complement_solver.cc
@@ -42,6 +42,7 @@
#include "ceres/block_structure.h"
#include "ceres/conjugate_gradients_solver.h"
#include "ceres/detect_structure.h"
+#include "ceres/event_logger.h"
#include "ceres/implicit_schur_complement.h"
#include "ceres/internal/eigen.h"
#include "ceres/linear_solver.h"
@@ -51,7 +52,6 @@
#include "ceres/triplet_sparse_matrix.h"
#include "ceres/types.h"
#include "ceres/visibility_based_preconditioner.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
diff --git a/internal/ceres/line_search.cc b/internal/ceres/line_search.cc
index 644e26e..9b6b71a 100644
--- a/internal/ceres/line_search.cc
+++ b/internal/ceres/line_search.cc
@@ -48,7 +48,6 @@
#include "ceres/internal/eigen.h"
#include "ceres/map_util.h"
#include "ceres/polynomial.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
@@ -91,9 +90,7 @@
: evaluator_(evaluator),
position_(evaluator->NumParameters()),
direction_(evaluator->NumEffectiveParameters()),
- scaled_direction_(evaluator->NumEffectiveParameters()),
- initial_evaluator_residual_time_in_seconds(0.0),
- initial_evaluator_jacobian_time_in_seconds(0.0) {}
+ scaled_direction_(evaluator->NumEffectiveParameters()) {}
void LineSearchFunction::Init(const Vector& position, const Vector& direction) {
position_ = position;
@@ -152,57 +149,56 @@
const std::map<std::string, CallStatistics> evaluator_statistics =
evaluator_->Statistics();
- initial_evaluator_residual_time_in_seconds =
+ initial_evaluator_residual_time =
FindWithDefault(
evaluator_statistics, "Evaluator::Residual", CallStatistics())
.time;
- initial_evaluator_jacobian_time_in_seconds =
+ initial_evaluator_jacobian_time =
FindWithDefault(
evaluator_statistics, "Evaluator::Jacobian", CallStatistics())
.time;
}
void LineSearchFunction::TimeStatistics(
- double* cost_evaluation_time_in_seconds,
- double* gradient_evaluation_time_in_seconds) const {
+ absl::Duration* cost_evaluation_time,
+ absl::Duration* gradient_evaluation_time) const {
const std::map<std::string, CallStatistics> evaluator_time_statistics =
evaluator_->Statistics();
- *cost_evaluation_time_in_seconds =
+ *cost_evaluation_time =
FindWithDefault(
evaluator_time_statistics, "Evaluator::Residual", CallStatistics())
.time -
- initial_evaluator_residual_time_in_seconds;
+ initial_evaluator_residual_time;
// Strictly speaking this will slightly underestimate the time spent
// evaluating the gradient of the line search univariate cost function as it
// does not count the time spent performing the dot product with the direction
// vector. However, this will typically be small by comparison, and also
// allows direct subtraction of the timing information from the totals for
// the evaluator returned in the solver summary.
- *gradient_evaluation_time_in_seconds =
+ *gradient_evaluation_time =
FindWithDefault(
evaluator_time_statistics, "Evaluator::Jacobian", CallStatistics())
.time -
- initial_evaluator_jacobian_time_in_seconds;
+ initial_evaluator_jacobian_time;
}
void LineSearch::Search(double step_size_estimate,
double initial_cost,
double initial_gradient,
Summary* summary) const {
- const double start_time = WallTimeInSeconds();
+ const absl::Time start_time = absl::Now();
CHECK(summary != nullptr);
*summary = LineSearch::Summary();
- summary->cost_evaluation_time_in_seconds = 0.0;
- summary->gradient_evaluation_time_in_seconds = 0.0;
- summary->polynomial_minimization_time_in_seconds = 0.0;
+ summary->cost_evaluation_time = absl::ZeroDuration();
+ summary->gradient_evaluation_time = absl::ZeroDuration();
+ summary->polynomial_minimization_time = absl::ZeroDuration();
options().function->ResetTimeStatistics();
this->DoSearch(step_size_estimate, initial_cost, initial_gradient, summary);
- options().function->TimeStatistics(
- &summary->cost_evaluation_time_in_seconds,
- &summary->gradient_evaluation_time_in_seconds);
+ options().function->TimeStatistics(&summary->cost_evaluation_time,
+ &summary->gradient_evaluation_time);
- summary->total_time_in_seconds = WallTimeInSeconds() - start_time;
+ summary->total_time = absl::Now() - start_time;
}
// Returns step_size \in [min_step_size, max_step_size] which minimizes the
@@ -329,7 +325,7 @@
return;
}
- const double polynomial_minimization_start_time = WallTimeInSeconds();
+ const absl::Time polynomial_minimization_start_time = absl::Now();
const double step_size = this->InterpolatingPolynomialMinimizingStepSize(
options().interpolation_type,
initial_position,
@@ -337,8 +333,8 @@
current,
(options().max_step_contraction * current.x),
(options().min_step_contraction * current.x));
- summary->polynomial_minimization_time_in_seconds +=
- (WallTimeInSeconds() - polynomial_minimization_start_time);
+ summary->polynomial_minimization_time +=
+ (absl::Now() - polynomial_minimization_start_time);
if (step_size * descent_direction_max_norm < options().min_step_size) {
summary->error = absl::StrFormat(
@@ -650,7 +646,7 @@
const FunctionSample unused_previous;
DCHECK(!unused_previous.value_is_valid);
// Contracts step size if f(current) is not valid.
- const double polynomial_minimization_start_time = WallTimeInSeconds();
+ const absl::Time polynomial_minimization_start_time = absl::Now();
const double step_size = this->InterpolatingPolynomialMinimizingStepSize(
options().interpolation_type,
previous,
@@ -658,8 +654,8 @@
current,
min_step_size,
max_step_size);
- summary->polynomial_minimization_time_in_seconds +=
- (WallTimeInSeconds() - polynomial_minimization_start_time);
+ summary->polynomial_minimization_time +=
+ (absl::Now() - polynomial_minimization_start_time);
if (step_size * descent_direction_max_norm < options().min_step_size) {
summary->error = absl::StrFormat(
"Line search failed: step_size too small: %.5e "
@@ -804,7 +800,7 @@
// value that will therefore be ignored.
const FunctionSample unused_previous;
DCHECK(!unused_previous.value_is_valid);
- const double polynomial_minimization_start_time = WallTimeInSeconds();
+ const absl::Time polynomial_minimization_start_time = absl::Now();
const double step_size = this->InterpolatingPolynomialMinimizingStepSize(
options().interpolation_type,
lower_bound_step,
@@ -812,8 +808,8 @@
upper_bound_step,
lower_bound_step.x,
upper_bound_step.x);
- summary->polynomial_minimization_time_in_seconds +=
- (WallTimeInSeconds() - polynomial_minimization_start_time);
+ summary->polynomial_minimization_time +=
+ (absl::Now() - polynomial_minimization_start_time);
// No check on magnitude of step size being too small here as it is
// lower-bounded by the initial bracket start point, which was valid.
//
diff --git a/internal/ceres/line_search.h b/internal/ceres/line_search.h
index acf85c0..cbe6396 100644
--- a/internal/ceres/line_search.h
+++ b/internal/ceres/line_search.h
@@ -37,6 +37,7 @@
#include <string>
#include <vector>
+#include "absl/time/time.h"
#include "ceres/function_sample.h"
#include "ceres/internal/eigen.h"
#include "ceres/internal/export.h"
@@ -149,14 +150,14 @@
int num_iterations = 0;
// Cumulative time spent evaluating the value of the cost function across
// all iterations.
- double cost_evaluation_time_in_seconds = 0.0;
+ absl::Duration cost_evaluation_time = absl::ZeroDuration();
// Cumulative time spent evaluating the gradient of the cost function across
// all iterations.
- double gradient_evaluation_time_in_seconds = 0.0;
+ absl::Duration gradient_evaluation_time = absl::ZeroDuration();
// Cumulative time spent minimizing the interpolating polynomial to compute
// the next candidate step size across all iterations.
- double polynomial_minimization_time_in_seconds = 0.0;
- double total_time_in_seconds = 0.0;
+ absl::Duration polynomial_minimization_time = absl::ZeroDuration();
+ absl::Duration total_time = absl::ZeroDuration();
std::string error;
};
@@ -232,8 +233,8 @@
// Resets to now, the start point for the results from TimeStatistics().
void ResetTimeStatistics();
- void TimeStatistics(double* cost_evaluation_time_in_seconds,
- double* gradient_evaluation_time_in_seconds) const;
+ void TimeStatistics(absl::Duration* cost_evaluation_time,
+ absl::Duration* gradient_evaluation_time) const;
const Vector& position() const { return position_; }
const Vector& direction() const { return direction_; }
@@ -249,8 +250,8 @@
// minimizer), hence we need to save the initial evaluation durations for the
// value & gradient to accurately determine the duration of the evaluations
// we invoked. These are reset by a call to ResetTimeStatistics().
- double initial_evaluator_residual_time_in_seconds;
- double initial_evaluator_jacobian_time_in_seconds;
+ absl::Duration initial_evaluator_residual_time = absl::ZeroDuration();
+ absl::Duration initial_evaluator_jacobian_time = absl::ZeroDuration();
};
// Backtracking and interpolation based Armijo line search. This
diff --git a/internal/ceres/line_search_minimizer.cc b/internal/ceres/line_search_minimizer.cc
index 97e5f3c..756a2ae 100644
--- a/internal/ceres/line_search_minimizer.cc
+++ b/internal/ceres/line_search_minimizer.cc
@@ -58,7 +58,6 @@
#include "ceres/line_search.h"
#include "ceres/line_search_direction.h"
#include "ceres/types.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
namespace {
@@ -87,8 +86,8 @@
double* parameters,
Solver::Summary* summary) {
const bool is_not_silent = !options.is_silent;
- double start_time = WallTimeInSeconds();
- double iteration_start_time = start_time;
+ const absl::Time start_time = absl::Now();
+ absl::Time iteration_start_time = start_time;
CHECK(options.evaluator != nullptr);
Evaluator* evaluator = options.evaluator.get();
@@ -157,10 +156,12 @@
return;
}
+ absl::Time now = absl::Now();
iteration_summary.iteration_time_in_seconds =
- WallTimeInSeconds() - iteration_start_time;
+ absl::ToDoubleSeconds(now - iteration_start_time);
iteration_summary.cumulative_time_in_seconds =
- WallTimeInSeconds() - start_time + summary->preprocessor_time_in_seconds;
+ absl::ToDoubleSeconds(now - start_time) +
+ summary->preprocessor_time_in_seconds;
summary->iterations.push_back(iteration_summary);
LineSearchDirection::Options line_search_direction_options;
@@ -213,7 +214,7 @@
break;
}
- iteration_start_time = WallTimeInSeconds();
+ iteration_start_time = absl::Now();
if (iteration_summary.iteration >= options.max_num_iterations) {
summary->message = "Maximum number of iterations reached.";
summary->termination_type = NO_CONVERGENCE;
@@ -223,8 +224,9 @@
break;
}
- const double total_solver_time = iteration_start_time - start_time +
- summary->preprocessor_time_in_seconds;
+ const double total_solver_time =
+ absl::ToDoubleSeconds(iteration_start_time - start_time) +
+ summary->preprocessor_time_in_seconds;
if (total_solver_time >= options.max_solver_time_in_seconds) {
summary->message = "Maximum solver time reached.";
summary->termination_type = NO_CONVERGENCE;
@@ -345,7 +347,7 @@
current_state.step_size = optimal_point.x;
previous_state = current_state;
iteration_summary.step_solver_time_in_seconds =
- WallTimeInSeconds() - iteration_start_time;
+ absl::ToDoubleSeconds(absl::Now() - iteration_start_time);
if (optimal_point.vector_gradient_is_valid) {
current_state.cost = optimal_point.value;
@@ -402,10 +404,11 @@
line_search_summary.num_gradient_evaluations;
iteration_summary.line_search_iterations =
line_search_summary.num_iterations;
+ const absl::Time now = absl::Now();
iteration_summary.iteration_time_in_seconds =
- WallTimeInSeconds() - iteration_start_time;
+ absl::ToDoubleSeconds(now - iteration_start_time);
iteration_summary.cumulative_time_in_seconds =
- WallTimeInSeconds() - start_time +
+ absl::ToDoubleSeconds(now - start_time) +
summary->preprocessor_time_in_seconds;
summary->iterations.push_back(iteration_summary);
@@ -417,13 +420,13 @@
// minimization.
summary->num_line_search_steps += line_search_summary.num_iterations;
summary->line_search_cost_evaluation_time_in_seconds +=
- line_search_summary.cost_evaluation_time_in_seconds;
+ absl::ToDoubleSeconds(line_search_summary.cost_evaluation_time);
summary->line_search_gradient_evaluation_time_in_seconds +=
- line_search_summary.gradient_evaluation_time_in_seconds;
+ absl::ToDoubleSeconds(line_search_summary.gradient_evaluation_time);
summary->line_search_polynomial_minimization_time_in_seconds +=
- line_search_summary.polynomial_minimization_time_in_seconds;
+ absl::ToDoubleSeconds(line_search_summary.polynomial_minimization_time);
summary->line_search_total_time_in_seconds +=
- line_search_summary.total_time_in_seconds;
+ absl::ToDoubleSeconds(line_search_summary.total_time);
++summary->num_successful_steps;
const double step_size_tolerance =
diff --git a/internal/ceres/line_search_preprocessor.cc b/internal/ceres/line_search_preprocessor.cc
index 1107f24..4ba3a9a 100644
--- a/internal/ceres/line_search_preprocessor.cc
+++ b/internal/ceres/line_search_preprocessor.cc
@@ -40,7 +40,6 @@
#include "ceres/minimizer.h"
#include "ceres/problem_impl.h"
#include "ceres/program.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
namespace {
diff --git a/internal/ceres/parameter_block_ordering.cc b/internal/ceres/parameter_block_ordering.cc
index 5bac2fd..68dfb05 100644
--- a/internal/ceres/parameter_block_ordering.cc
+++ b/internal/ceres/parameter_block_ordering.cc
@@ -37,13 +37,13 @@
#include <vector>
#include "absl/log/check.h"
+#include "ceres/event_logger.h"
#include "ceres/graph.h"
#include "ceres/graph_algorithms.h"
#include "ceres/map_util.h"
#include "ceres/parameter_block.h"
#include "ceres/program.h"
#include "ceres/residual_block.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
diff --git a/internal/ceres/schur_complement_solver.cc b/internal/ceres/schur_complement_solver.cc
index c62633c..ce0af45 100644
--- a/internal/ceres/schur_complement_solver.cc
+++ b/internal/ceres/schur_complement_solver.cc
@@ -47,12 +47,12 @@
#include "ceres/block_structure.h"
#include "ceres/conjugate_gradients_solver.h"
#include "ceres/detect_structure.h"
+#include "ceres/event_logger.h"
#include "ceres/internal/eigen.h"
#include "ceres/linear_solver.h"
#include "ceres/sparse_cholesky.h"
#include "ceres/triplet_sparse_matrix.h"
#include "ceres/types.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
namespace {
diff --git a/internal/ceres/solver.cc b/internal/ceres/solver.cc
index 9ebee82..bb82e6d 100644
--- a/internal/ceres/solver.cc
+++ b/internal/ceres/solver.cc
@@ -42,6 +42,8 @@
#include "absl/log/log.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
#include "ceres/casts.h"
#include "ceres/context.h"
#include "ceres/context_impl.h"
@@ -59,7 +61,6 @@
#include "ceres/solver_utils.h"
#include "ceres/suitesparse.h"
#include "ceres/types.h"
-#include "ceres/wall_time.h"
namespace ceres {
namespace {
@@ -612,14 +613,16 @@
const CallStatistics& call_stats = FindWithDefault(
evaluator_statistics, "Evaluator::Residual", CallStatistics());
- summary->residual_evaluation_time_in_seconds = call_stats.time;
+ summary->residual_evaluation_time_in_seconds =
+ absl::ToDoubleSeconds(call_stats.time);
summary->num_residual_evaluations = call_stats.calls;
}
{
const CallStatistics& call_stats = FindWithDefault(
evaluator_statistics, "Evaluator::Jacobian", CallStatistics());
- summary->jacobian_evaluation_time_in_seconds = call_stats.time;
+ summary->jacobian_evaluation_time_in_seconds =
+ absl::ToDoubleSeconds(call_stats.time);
summary->num_jacobian_evaluations = call_stats.calls;
}
}
@@ -633,7 +636,8 @@
const CallStatistics& call_stats = FindWithDefault(
linear_solver_statistics, "LinearSolver::Solve", CallStatistics());
summary->num_linear_solves = call_stats.calls;
- summary->linear_solver_time_in_seconds = call_stats.time;
+ summary->linear_solver_time_in_seconds =
+ absl::ToDoubleSeconds(call_stats.time);
}
}
@@ -732,12 +736,11 @@
using internal::Preprocessor;
using internal::ProblemImpl;
using internal::Program;
- using internal::WallTimeInSeconds;
CHECK(problem != nullptr);
CHECK(summary != nullptr);
- double start_time = WallTimeInSeconds();
+ const absl::Time start_time = absl::Now();
*summary = Summary();
if (!options.IsValid(&summary->message)) {
LOG(ERROR) << "Terminating: " << summary->message;
@@ -814,18 +817,19 @@
}
summary->fixed_cost = pp.fixed_cost;
- summary->preprocessor_time_in_seconds = WallTimeInSeconds() - start_time;
+ summary->preprocessor_time_in_seconds =
+ absl::ToDoubleSeconds(absl::Now() - start_time);
if (status) {
- const double minimizer_start_time = WallTimeInSeconds();
+ const absl::Time minimizer_start_time = absl::Now();
Minimize(&pp, summary);
summary->minimizer_time_in_seconds =
- WallTimeInSeconds() - minimizer_start_time;
+ absl::ToDoubleSeconds(absl::Now() - minimizer_start_time);
} else {
summary->message = pp.error;
}
- const double postprocessor_start_time = WallTimeInSeconds();
+ const absl::Time postprocessor_start_time = absl::Now();
problem_impl = problem->mutable_impl();
program = problem_impl->mutable_program();
// On exit, ensure that the parameter blocks again point at the user
@@ -835,7 +839,7 @@
program->SetParameterOffsetsAndIndex();
PostSolveSummarize(pp, summary);
summary->postprocessor_time_in_seconds =
- WallTimeInSeconds() - postprocessor_start_time;
+ absl::ToDoubleSeconds(absl::Now() - postprocessor_start_time);
// If the gradient checker reported an error, we want to report FAILURE
// instead of USER_FAILURE and provide the error log.
@@ -844,7 +848,8 @@
summary->message = gradient_checking_callback.error_log();
}
- summary->total_time_in_seconds = WallTimeInSeconds() - start_time;
+ summary->total_time_in_seconds =
+ absl::ToDoubleSeconds(absl::Now() - start_time);
}
void Solve(const Solver::Options& options,
diff --git a/internal/ceres/sparse_normal_cholesky_solver.cc b/internal/ceres/sparse_normal_cholesky_solver.cc
index 5746509..78e4a6b 100644
--- a/internal/ceres/sparse_normal_cholesky_solver.cc
+++ b/internal/ceres/sparse_normal_cholesky_solver.cc
@@ -36,6 +36,7 @@
#include <memory>
#include "ceres/block_sparse_matrix.h"
+#include "ceres/event_logger.h"
#include "ceres/inner_product_computer.h"
#include "ceres/internal/eigen.h"
#include "ceres/iterative_refiner.h"
@@ -43,7 +44,6 @@
#include "ceres/sparse_cholesky.h"
#include "ceres/triplet_sparse_matrix.h"
#include "ceres/types.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {
diff --git a/internal/ceres/trust_region_minimizer.cc b/internal/ceres/trust_region_minimizer.cc
index 971fc5b..3cbecbd 100644
--- a/internal/ceres/trust_region_minimizer.cc
+++ b/internal/ceres/trust_region_minimizer.cc
@@ -51,7 +51,6 @@
#include "ceres/line_search.h"
#include "ceres/parallel_for.h"
#include "ceres/types.h"
-#include "ceres/wall_time.h"
// Helper macro to simplify some of the control flow.
#define RETURN_IF_ERROR_AND_LOG(expr) \
@@ -67,8 +66,8 @@
void TrustRegionMinimizer::Minimize(const Minimizer::Options& options,
double* parameters,
Solver::Summary* solver_summary) {
- start_time_in_secs_ = WallTimeInSeconds();
- iteration_start_time_in_secs_ = start_time_in_secs_;
+ start_time_ = absl::Now();
+ iteration_start_time_ = start_time_;
Init(options, parameters, solver_summary);
RETURN_IF_ERROR_AND_LOG(IterationZero());
@@ -83,7 +82,7 @@
bool atleast_one_successful_step = false;
while (FinalizeIterationAndCheckIfMinimizerCanContinue()) {
- iteration_start_time_in_secs_ = WallTimeInSeconds();
+ iteration_start_time_ = absl::Now();
const double previous_gradient_norm = iteration_summary_.gradient_norm;
const double previous_gradient_max_norm =
@@ -327,10 +326,11 @@
}
iteration_summary_.trust_region_radius = strategy_->Radius();
+ const absl::Time now = absl::Now();
iteration_summary_.iteration_time_in_seconds =
- WallTimeInSeconds() - iteration_start_time_in_secs_;
+ absl::ToDoubleSeconds(now - iteration_start_time_);
iteration_summary_.cumulative_time_in_seconds =
- WallTimeInSeconds() - start_time_in_secs_ +
+ absl::ToDoubleSeconds(now - start_time_) +
solver_summary_->preprocessor_time_in_seconds;
solver_summary_->iterations.push_back(iteration_summary_);
@@ -377,7 +377,7 @@
// negative. In which case again, we set
// iteration_summary_.step_is_valid to false.
bool TrustRegionMinimizer::ComputeTrustRegionStep() {
- const double strategy_start_time = WallTimeInSeconds();
+ const absl::Time strategy_start_time = absl::Now();
iteration_summary_.step_is_valid = false;
TrustRegionStrategy::PerSolveOptions per_solve_options;
per_solve_options.eta = options_.eta;
@@ -409,7 +409,7 @@
}
iteration_summary_.step_solver_time_in_seconds =
- WallTimeInSeconds() - strategy_start_time;
+ absl::ToDoubleSeconds(absl::Now() - strategy_start_time);
iteration_summary_.linear_solver_iterations = strategy_summary.num_iterations;
if (strategy_summary.termination_type ==
@@ -511,7 +511,7 @@
return;
}
- double inner_iteration_start_time = WallTimeInSeconds();
+ const absl::Time inner_iteration_start_time = absl::Now();
++solver_summary_->num_inner_iteration_steps;
inner_iteration_x_ = candidate_x_;
Solver::Summary inner_iteration_summary;
@@ -575,7 +575,7 @@
candidate_cost_ = inner_iteration_cost;
solver_summary_->inner_iteration_time_in_seconds +=
- WallTimeInSeconds() - inner_iteration_start_time;
+ absl::ToDoubleSeconds(absl::Now() - inner_iteration_start_time);
}
// Perform a projected line search to improve the objective function
@@ -619,13 +619,13 @@
solver_summary_->num_line_search_steps += line_search_summary.num_iterations;
solver_summary_->line_search_cost_evaluation_time_in_seconds +=
- line_search_summary.cost_evaluation_time_in_seconds;
+ absl::ToDoubleSeconds(line_search_summary.cost_evaluation_time);
solver_summary_->line_search_gradient_evaluation_time_in_seconds +=
- line_search_summary.gradient_evaluation_time_in_seconds;
+ absl::ToDoubleSeconds(line_search_summary.gradient_evaluation_time);
solver_summary_->line_search_polynomial_minimization_time_in_seconds +=
- line_search_summary.polynomial_minimization_time_in_seconds;
+ absl::ToDoubleSeconds(line_search_summary.polynomial_minimization_time);
solver_summary_->line_search_total_time_in_seconds +=
- line_search_summary.total_time_in_seconds;
+ absl::ToDoubleSeconds(line_search_summary.total_time);
if (line_search_summary.success) {
*delta *= line_search_summary.optimal_point.x;
@@ -637,7 +637,7 @@
// Solver::Summary::message.
bool TrustRegionMinimizer::MaxSolverTimeReached() {
const double total_solver_time =
- WallTimeInSeconds() - start_time_in_secs_ +
+ absl::ToDoubleSeconds(absl::Now() - start_time_) +
solver_summary_->preprocessor_time_in_seconds;
if (total_solver_time < options_.max_solver_time_in_seconds) {
return false;
diff --git a/internal/ceres/trust_region_minimizer.h b/internal/ceres/trust_region_minimizer.h
index c9cdac7..91f9deb 100644
--- a/internal/ceres/trust_region_minimizer.h
+++ b/internal/ceres/trust_region_minimizer.h
@@ -33,6 +33,7 @@
#include <memory>
+#include "absl/time/time.h"
#include "ceres/internal/disable_warnings.h"
#include "ceres/internal/eigen.h"
#include "ceres/internal/export.h"
@@ -149,9 +150,9 @@
double candidate_cost_;
// Time at which the minimizer was started.
- double start_time_in_secs_;
+ absl::Time start_time_;
// Time at which the current iteration was started.
- double iteration_start_time_in_secs_;
+ absl::Time iteration_start_time_;
// Number of consecutive steps where the minimizer loop computed a
// numerically invalid step.
int num_consecutive_invalid_steps_;
diff --git a/internal/ceres/trust_region_preprocessor.cc b/internal/ceres/trust_region_preprocessor.cc
index 4d20f52..0ec94f4 100644
--- a/internal/ceres/trust_region_preprocessor.cc
+++ b/internal/ceres/trust_region_preprocessor.cc
@@ -50,7 +50,6 @@
#include "ceres/reorder_program.h"
#include "ceres/suitesparse.h"
#include "ceres/trust_region_strategy.h"
-#include "ceres/wall_time.h"
namespace ceres::internal {