#pragma once #include #include "autoopt/optimization_problem.hpp" namespace autoopt { template struct btls_parameters { T step_decrease = T{0.5}; T step_increase = T{1.5}; T sufficient_decrease = T{1e-2}; T tolerance = T{1e-9}; size_t max_iters = 1000; }; template void btls(optimization_problem& problem, const btls_parameters& params = btls_parameters()) { Eigen::VectorX& x = problem.x(); T step_size = T{1.0}; for (size_t iter = 0; iter < params.max_iters; ++iter) { T obj_value = problem.objective(x); std::cout << "Iter " << iter << ": obj = " << obj_value << ", x = " << x.transpose() << ", step_size = " << step_size << std::endl; Eigen::VectorX grad = -problem.gradient(x); Eigen::VectorX step_dir = grad.normalized(); while (problem.objective(x + step_size * step_dir) > obj_value + params.sufficient_decrease * step_size * grad.dot(step_dir)) { step_size *= params.step_decrease; } x += step_size * step_dir; if (step_size < params.tolerance) { break; } } problem.x() = x; } } // namespace autoopt