52 lapack::gesv(SYSTEM::size, 1, jacobien, SYSTEM::size, ipiv, y, SYSTEM::size, info);
69 f_line_search_t(g_t& g_, x_t& xv_, x_t& dv_) : g(g_), xv(xv_), dv(dv_) {}
74 return line_search<f_line_search_t>(*
this, f0, der0, rho, sigma, min_f, max_iter);
134 max_iter_line_search = 10;
137 template <
typename g_t,
typename x_t>
138 bool solve(g_t& g, x_t& xk) {
139 typedef typename g_t::r_type g_x_t;
147 double f_xk = 0.5 * g_xk * g_xk;
148 for (
int iter = 0;; ++iter) {
150 double norm_g_xk = std::sqrt(2 * f_xk);
151 logger <<
logging::debug <<
"iteration " << iter + 1 <<
", norm = " << norm_g_xk
152 <<
", termination = " << conv_epsilon << logging::LOGFLUSH;
153 if (norm_g_xk < conv_epsilon) {
break; }
155 bool inv_h = g.nd(xk, g_xk, d1);
160 double f_xk1 = 0.5 * (g_xk1 * g_xk1);
161 if (f_xk1 <= alpha * f_xk) {
169 logger <<
logging::debug <<
"need line search procedure" << logging::LOGFLUSH;
172 double d1d1 = d1 * d1;
173 double d2d2 = d2 * d2;
174 double d1d2 = d1 * d2;
175 if (d1d2 < epsilon * std::sqrt(d1d1 * d2d2)) {
176 double beta = get_beta(d1d1, d1d2, d2d2);
185 f_line_search_t<g_t>(g, xk, d1).search(wp_rho, wp_sigma, 0, max_iter_line_search);
186 if (lambda == 0) {
return false; }
189 f_xk = 0.5 * g_xk * g_xk;
195 double get_beta(
double d1d1,
double d1d2,
double d2d2) {
196 const double a[2] = {d2d2 - d1d2, d1d2};
197 const double b[3] = {
198 d2d2 * (d2d2 - 2 * d1d2 + d1d1), d2d2 * 2 * (d1d2 - d1d1), d2d2 * d1d1};
200 while (r < 1 && (a[0] * r + a[1]) / std::sqrt(b[0] * r * r + b[1] * r + b[2]) < epsilon) {
204 return std::min(r, 1.0);
213 int max_iter_line_search;
230 template <
typename g_t,
typename x_t>
231 bool solve(g_t& g, x_t& xk) {
232 typedef typename g_t::r_type g_x_t;
241 std::vector<double> f_xl(n, std::numeric_limits<double>::max());
243 double f_xk = 0.5 * g_xk * g_xk;
244 for (
int iter = 0;; ++iter) {
247 size_t s = g_xk.size();
248 b2linalg::Interval a(0, s / 2);
249 b2linalg::Interval b(s / 2, s - 1);
250 std::cout <<
"rrrrr " << g_xk(b2linalg::Interval(0, s / 2)).norm2() <<
" "
251 << g_xk(b2linalg::Interval(s / 2, s - 1)).norm2() <<
" "
252 << g_xk[s - 1] << std::endl;
254 double norm_g_xk = std::sqrt(2 * f_xk);
255 logger <<
logging::debug <<
"iteration " << iter + 1 <<
", norm = " << norm_g_xk
256 <<
", termination = " << conv_epsilon << logging::LOGFLUSH;
257 if (norm_g_xk < conv_epsilon) {
break; }
260 for (
size_t i = n - 1; i > 0; --i) {
261 f_xl[i] = f_xl[i - 1];
262 f_min = std::min(f_xl[i], f_min);
265 bool inv_h = g.nd(xk, g_xk, d1);
270 double f_xk1 = 0.5 * (g_xk1 * g_xk1);
271 if (f_xk1 <= alpha * (omega == 0 ? f_min : f_xk)) {
276 if (f_xk <= alpha * omega) { omega = 0; }
279 if (omega == 0 && flag < n && f_xk1 <= (1 + nu) * f_xk) {
288 logger <<
logging::debug <<
"need line search procedure" << logging::LOGFLUSH;
292 }
else if (flag > 0) {
299 double d1d1 = d1 * d1;
300 double d2d2 = d2 * d2;
301 double d1d2 = d1 * d2;
302 if (d1d2 < epsilon * std::sqrt(d1d1 * d2d2)) {
303 double beta = get_beta(d1d1, d1d2, d2d2);
313 f_line_search_t<g_t>(g, xk, d1).search(wp_rho, wp_sigma, 0, max_iter_line_search);
314 std::cout <<
"lambda = " << lambda << std::endl;
315 if (lambda == 0) { lambda = 0.1; }
318 f_xk = 0.5 * g_xk * g_xk;
342 gamma1 = gamma2 = 10000;
343 max_iter_line_search = 10;
352 template <
typename g_t,
typename x_t>
353 bool next(
const g_t& g,
int k, x_t& xk) {
355 typedef typename g_t::r_type g_x_t;
357 double delta = delta0;
358 double Delta = Delta0;
368 const bool has_h = g(xk, d2, norm_g_xk, epsilon, d1);
369 std::cout << k <<
" " << xk[0] <<
" " << norm_g_xk << std::endl;
370 if (norm_g_xk < epsilon) {
return true; }
372 double f_xk = 0.5 * norm_g_xk * norm_g_xk;
373 const double f_xk_1 = norm_g_xk_1 < 0 ? f_xk : 0.5 * norm_g_xk_1 * norm_g_xk_1;
378 if (!has_h) {
goto l8; }
381 if (std::abs(f_xk - f_xk_1) > gamma1 && norm_g_xk > gamma2) {
382 delta = beta2 * delta0;
387 if (k == 1 || norm_g_xk < norm_g_xk_1) {
393 double norm_g_xbar = g_xbar.norm2();
394 double f_xbar = 0.5 * g_xbar * g_xbar;
395 if (f_xbar < f_xk && norm_g_xbar <= nu * norm_g_xk) { delta = beta1 * delta0; }
399 if (d1 * d2 >= 0) {
goto l9; }
402 alphak = f_line_search_t<g_t>(g, xk, d2).search(rho, sigma, 0, max_iter_line_search);
407 double xi = 1 / (Delta + std::abs(f_xk - f_xk_1));
408 d_xi = (1 - xi) * d2;
412 if (d_xi * d2 < delta * d_xi.norm2() * d2.norm2()) {
413 Delta = beta3 * Delta;
420 alphak = f_line_search_t<g_t>(g, xk, d2).search(rho, sigma, 0, max_iter_line_search);
421 if (alphak * d2.norm2() < Tau * d1.norm2()) {
422 sk = (alphak * (1 - xi)) * d2 + xi * d1;
426 double norm_g_xk_sk = g_xk_sk.norm2();
427 if (0.5 * norm_g_xk_sk * norm_g_xk_sk <= f_xk - tau * sk.norm2()) {
433 alphak = f_line_search_t<g_t>(g, xk, d_xi).search(rho, sigma, 0, max_iter_line_search);
445 template <
typename g_t,
typename x_t>
446 void solve(
const g_t& g, x_t& x0) {
447 for (
int k = 1; !next(g, k, x0); ++k) { ; }
456 int max_iter_line_search;