add py module

This commit is contained in:
2026-05-19 14:17:14 +02:00
parent 16334e4834
commit 8b62881ae8
10 changed files with 114295 additions and 29 deletions
+18 -11
View File
@@ -9,10 +9,10 @@ namespace autoopt {
template <typename T>
struct btls_parameters {
T step_decrease = T{0.5};
T step_increase = T{1.5};
T step_increase = T{1.2};
T sufficient_decrease = T{1e-2};
T tolerance = T{1e-9};
size_t max_iters = 1000;
T tolerance = T{1e-10};
size_t max_iters = 2000;
};
template <typename T>
@@ -24,20 +24,27 @@ void btls(optimization_problem<T>& problem,
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<T> grad = problem.gradient(x);
Eigen::VectorX<T> grad = -problem.gradient(x);
Eigen::MatrixX<T> hess = problem.hessian(x);
Eigen::VectorX<T> step_dir = -hess.ldlt().solve(grad).normalized();
Eigen::VectorX<T> step_dir = grad.normalized();
while (problem.objective(x + step_size * step_dir) >
obj_value +
params.sufficient_decrease * step_size * grad.dot(step_dir)) {
// Eigen::VectorX<T> step_dir = -grad.normalized();
auto decrease_condition = [&] {
T new_obj = problem.objective(x + step_size * step_dir);
return std::isnan(new_obj) ||
(new_obj > obj_value - std::abs(params.sufficient_decrease *
step_size * grad.dot(step_dir)));
};
while (decrease_condition()) {
step_size *= params.step_decrease;
}
x += step_size * step_dir;
step_size = step_size * params.step_increase;
if (step_size < params.tolerance) {
break;
}