70 hist_residual.clear();
74 const auto ref_magnitude = norm(x);
79 const auto residual = func.evaluate_residual(x);
81 if(0u == counter) ninja = solve(func.evaluate_jacobian(x), residual);
85 alpha.reserve(hist_ninja.size());
87 hist_residual.back() += residual;
89 hist_factor.emplace_back(dot(hist_ninja.back(), hist_residual.back()));
95 for(
auto J =
static_cast<int>(hist_factor.size()) - 1; J >= 0; --J) ninja -= alpha.emplace_back(dot(hist_ninja[J], ninja)) / hist_factor[J] * hist_residual[J];
97 ninja *= dot(hist_residual.back(), hist_ninja.back()) / dot(hist_residual.back(), hist_residual.back());
99 for(
size_t I = 0, J = hist_factor.size() - 1; I < hist_factor.size(); ++I, --J) ninja += (alpha[J] - dot(hist_residual[I], ninja)) / hist_factor[I] * hist_ninja[I];
103 hist_ninja.emplace_back(-ninja);
104 hist_residual.emplace_back(-residual);
106 const auto error = norm(ninja);
107 const auto ref_error = error / ref_magnitude;
108 suanpan_debug(
"Local iteration error: {:.5E}.\n", ref_error);
113 if(counter > max_hist) {
114 hist_ninja.pop_front();
115 hist_residual.pop_front();
116 hist_factor.pop_front();