Skip to content

Commit a434feb

Browse files
Update callback behavior in solvers to return false on user exit request
1 parent 350cfd6 commit a434feb

File tree

9 files changed

+55
-37
lines changed

9 files changed

+55
-37
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Manifest.toml

src/LMTR_alg.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ function SolverCore.solve!(
188188
solver::LMTRSolver{T, G, V},
189189
reg_nls::AbstractRegularizedNLPModel{T, V},
190190
stats::GenericExecutionStats{T, V};
191-
callback = (args...) -> nothing,
191+
callback = (args...) -> false,
192192
x::V = reg_nls.model.meta.x0,
193193
atol::T = eps(T),
194194
sub_atol::T = atol,
@@ -310,12 +310,15 @@ function SolverCore.solve!(
310310
atol += rtol * sqrt_ξ1_νInv # make stopping test absolute and relative
311311
sub_atol += rtol * sqrt_ξ1_νInv
312312

313+
user_requested_exit = callback(nls, solver, stats) :: Bool
314+
313315
set_status!(
314316
stats,
315317
get_status(
316318
reg_nls,
317319
elapsed_time = stats.elapsed_time,
318320
iter = stats.iter,
321+
user_requested_exit = user_requested_exit,
319322
optimal = solved,
320323
improper = improper,
321324
max_eval = max_eval,
@@ -324,8 +327,6 @@ function SolverCore.solve!(
324327
),
325328
)
326329

327-
callback(nls, solver, stats)
328-
329330
done = stats.status != :unknown
330331

331332
while !done
@@ -459,12 +460,15 @@ function SolverCore.solve!(
459460
(ξ1 < 0 && sqrt_ξ1_νInv > neg_tol) &&
460461
error("LM: prox-gradient step should produce a decrease but ξ1 = $(ξ1)")
461462

463+
user_requested_exit = callback(nls, solver, stats) :: Bool
464+
462465
set_status!(
463466
stats,
464467
get_status(
465468
reg_nls,
466469
elapsed_time = stats.elapsed_time,
467470
iter = stats.iter,
471+
user_requested_exit = user_requested_exit,
468472
optimal = solved,
469473
improper = improper,
470474
max_eval = max_eval,
@@ -473,8 +477,6 @@ function SolverCore.solve!(
473477
),
474478
)
475479

476-
callback(nls, solver, stats)
477-
478480
done = stats.status != :unknown
479481
end
480482

src/LM_alg.jl

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ function SolverCore.solve!(
187187
solver::LMSolver{T, G, V},
188188
reg_nls::AbstractRegularizedNLPModel{T, V},
189189
stats::GenericExecutionStats{T, V};
190-
callback = (args...) -> nothing,
190+
callback = (args...) -> false,
191191
x::V = reg_nls.model.meta.x0,
192192
nonlinear::Bool = true,
193193
atol::T = eps(T),
@@ -313,12 +313,15 @@ function SolverCore.solve!(
313313
error("LM: prox-gradient step should produce a decrease but ξ1 = $(ξ1)")
314314
atol += rtol * sqrt_ξ1_νInv # make stopping test absolute and relative
315315

316+
user_requested_exit = callback(nls, solver, stats) :: Bool
317+
316318
set_status!(
317319
stats,
318320
get_status(
319321
reg_nls,
320322
elapsed_time = stats.elapsed_time,
321323
iter = stats.iter,
324+
user_requested_exit = user_requested_exit,
322325
optimal = solved,
323326
improper = improper,
324327
max_eval = max_eval,
@@ -327,8 +330,6 @@ function SolverCore.solve!(
327330
),
328331
)
329332

330-
callback(nls, solver, stats)
331-
332333
done = stats.status != :unknown
333334

334335
while !done
@@ -449,22 +450,22 @@ function SolverCore.solve!(
449450
(ξ1 < 0 && sqrt_ξ1_νInv > neg_tol) &&
450451
error("LM: prox-gradient step should produce a decrease but ξ1 = $(ξ1)")
451452

453+
user_requested_exit = callback(nls, solver, stats) :: Bool
454+
452455
set_status!(
453456
stats,
454457
get_status(
455458
reg_nls,
456459
elapsed_time = stats.elapsed_time,
457460
iter = stats.iter,
461+
user_requested_exit = user_requested_exit,
458462
optimal = solved,
459463
improper = improper,
460464
max_eval = max_eval,
461465
max_time = max_time,
462466
max_iter = max_iter,
463467
),
464468
)
465-
466-
callback(nls, solver, stats)
467-
468469
done = stats.status != :unknown
469470
end
470471

src/R2DH.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ function SolverCore.solve!(
213213
solver::R2DHSolver{T},
214214
reg_nlp::AbstractRegularizedNLPModel{T, V},
215215
stats::GenericExecutionStats{T, V};
216-
callback = (args...) -> nothing,
216+
callback = (args...) -> false,
217217
x::V = reg_nlp.model.meta.x0,
218218
atol::T = eps(T),
219219
rtol::T = eps(T),
@@ -338,12 +338,15 @@ function SolverCore.solve!(
338338
error("R2DH: prox-gradient step should produce a decrease but ξ = $(ξ)")
339339
atol += rtol * sqrt_ξ_νInv # make stopping test absolute and relative
340340

341+
user_requested_exit = callback(nlp, solver, stats) :: Bool
342+
341343
set_status!(
342344
stats,
343345
get_status(
344346
reg_nlp,
345347
elapsed_time = stats.elapsed_time,
346348
iter = stats.iter,
349+
user_requested_exit = user_requested_exit,
347350
optimal = solved,
348351
improper = improper,
349352
max_eval = max_eval,
@@ -352,8 +355,6 @@ function SolverCore.solve!(
352355
),
353356
)
354357

355-
callback(nlp, solver, stats)
356-
357358
done = stats.status != :unknown
358359

359360
while !done
@@ -433,12 +434,15 @@ function SolverCore.solve!(
433434
< 0 && sqrt_ξ_νInv > neg_tol) &&
434435
error("R2DH: prox-gradient step should produce a decrease but ξ = $(ξ)")
435436

437+
user_requested_exit = callback(nlp, solver, stats) :: Bool
438+
436439
set_status!(
437440
stats,
438441
get_status(
439442
reg_nlp,
440443
elapsed_time = stats.elapsed_time,
441444
iter = stats.iter,
445+
user_requested_exit = user_requested_exit,
442446
optimal = solved,
443447
improper = improper,
444448
max_eval = max_eval,
@@ -447,8 +451,6 @@ function SolverCore.solve!(
447451
),
448452
)
449453

450-
callback(nlp, solver, stats)
451-
452454
done = stats.status != :unknown
453455
end
454456

src/R2N.jl

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ function SolverCore.solve!(
199199
solver::R2NSolver{T, G, V},
200200
reg_nlp::AbstractRegularizedNLPModel{T, V},
201201
stats::GenericExecutionStats{T, V};
202-
callback = (args...) -> nothing,
202+
callback = (args...) -> false,
203203
qn_update_y!::Function = _qn_grad_update_y!,
204204
qn_copy!::Function = _qn_grad_copy!,
205205
x::V = reg_nlp.model.meta.x0,
@@ -340,12 +340,16 @@ function SolverCore.solve!(
340340
error("R2N: prox-gradient step should produce a decrease but ξ1 = $(ξ1)")
341341
atol += rtol * sqrt_ξ1_νInv # make stopping test absolute and relative
342342

343+
344+
user_requested_exit = callback(nlp, solver, stats) :: Bool
345+
343346
set_status!(
344347
stats,
345348
get_status(
346349
reg_nlp,
347350
elapsed_time = stats.elapsed_time,
348351
iter = stats.iter,
352+
user_requested_exit = user_requested_exit,
349353
optimal = solved,
350354
improper = improper,
351355
max_eval = max_eval,
@@ -354,8 +358,6 @@ function SolverCore.solve!(
354358
),
355359
)
356360

357-
callback(nlp, solver, stats)
358-
359361
done = stats.status != :unknown
360362

361363
while !done
@@ -486,12 +488,16 @@ function SolverCore.solve!(
486488

487489
(ξ1 < 0 && sqrt_ξ1_νInv > neg_tol) &&
488490
error("R2N: prox-gradient step should produce a decrease but ξ1 = $(ξ1)")
491+
492+
user_requested_exit = callback(nlp, solver, stats) :: Bool
493+
489494
set_status!(
490495
stats,
491496
get_status(
492497
reg_nlp,
493498
elapsed_time = stats.elapsed_time,
494499
iter = stats.iter,
500+
user_requested_exit = user_requested_exit,
495501
optimal = solved,
496502
improper = improper,
497503
max_eval = max_eval,
@@ -500,8 +506,6 @@ function SolverCore.solve!(
500506
),
501507
)
502508

503-
callback(nlp, solver, stats)
504-
505509
done = stats.status != :unknown
506510
end
507511

src/R2_alg.jl

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ function R2(reg_nlp::AbstractRegularizedNLPModel; kwargs...)
296296
solver.Fobj_hist[stats.iter + 1] = stats.solver_specific[:smooth_obj]
297297
solver.Hobj_hist[stats.iter + 1] = stats.solver_specific[:nonsmooth_obj]
298298
solver.Complex_hist[stats.iter + 1] += 1
299+
return false
299300
end,
300301
)
301302
solve!(solver, reg_nlp, stats; callback = cb, max_iter = max_iter, kwargs...)
@@ -309,7 +310,7 @@ function SolverCore.solve!(
309310
solver::R2Solver{T},
310311
reg_nlp::AbstractRegularizedNLPModel{T, V},
311312
stats::GenericExecutionStats{T, V};
312-
callback = (args...) -> nothing,
313+
callback = (args...) -> false,
313314
x::V = reg_nlp.model.meta.x0,
314315
atol::T = eps(T),
315316
rtol::T = eps(T),
@@ -413,12 +414,15 @@ function SolverCore.solve!(
413414
< 0 && sqrt_ξ_νInv > neg_tol) &&
414415
error("R2: prox-gradient step should produce a decrease but ξ = $(ξ)")
415416

417+
user_requested_exit = callback(nlp, solver, stats) :: Bool
418+
416419
set_status!(
417420
stats,
418421
get_status(
419422
reg_nlp,
420423
elapsed_time = stats.elapsed_time,
421424
iter = stats.iter,
425+
user_requested_exit = user_requested_exit,
422426
optimal = solved,
423427
improper = improper,
424428
max_eval = max_eval,
@@ -427,8 +431,6 @@ function SolverCore.solve!(
427431
),
428432
)
429433

430-
callback(nlp, solver, stats)
431-
432434
done = stats.status != :unknown
433435

434436
while !done
@@ -497,12 +499,15 @@ function SolverCore.solve!(
497499
< 0 && sqrt_ξ_νInv > neg_tol) &&
498500
error("R2: prox-gradient step should produce a decrease but ξ = $(ξ)")
499501

502+
user_requested_exit = callback(nlp, solver, stats) :: Bool
503+
500504
set_status!(
501505
stats,
502506
get_status(
503507
reg_nlp,
504508
elapsed_time = stats.elapsed_time,
505509
iter = stats.iter,
510+
user_requested_exit = user_requested_exit,
506511
optimal = solved,
507512
improper = improper,
508513
max_eval = max_eval,
@@ -511,8 +516,6 @@ function SolverCore.solve!(
511516
),
512517
)
513518

514-
callback(nlp, solver, stats)
515-
516519
done = stats.status != :unknown
517520
end
518521

src/TRDH_alg.jl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ function SolverCore.solve!(
227227
solver::TRDHSolver{T, G, V},
228228
reg_nlp::AbstractRegularizedNLPModel{T, V},
229229
stats::GenericExecutionStats{T, V};
230-
callback = (args...) -> nothing,
230+
callback = (args...) -> false,
231231
x::V = reg_nlp.model.meta.x0,
232232
atol::T = eps(T),
233233
rtol::T = eps(T),
@@ -390,12 +390,15 @@ function SolverCore.solve!(
390390
atol += rtol * sqrt_ξ_νInv # make stopping test absolute and relative #TODO : this is redundant code with the other case of the test.
391391
end
392392

393+
user_requested_exit = callback(nlp, solver, stats) :: Bool
394+
393395
set_status!(
394396
stats,
395397
get_status(
396398
reg_nlp,
397399
elapsed_time = stats.elapsed_time,
398400
iter = stats.iter,
401+
user_requested_exit = user_requested_exit,
399402
optimal = solved,
400403
improper = improper,
401404
max_eval = max_eval,
@@ -404,8 +407,6 @@ function SolverCore.solve!(
404407
),
405408
)
406409

407-
callback(nlp, solver, stats)
408-
409410
done = stats.status != :unknown
410411

411412
while !done
@@ -496,12 +497,15 @@ function SolverCore.solve!(
496497
error("TRDH: prox-gradient step should produce a decrease but ξ = $(ξ)")
497498
end
498499

500+
user_requested_exit = callback(nlp, solver, stats) :: Bool
501+
499502
set_status!(
500503
stats,
501504
get_status(
502505
reg_nlp,
503506
elapsed_time = stats.elapsed_time,
504507
iter = stats.iter,
508+
user_requested_exit = user_requested_exit,
505509
optimal = solved,
506510
improper = improper,
507511
max_eval = max_eval,
@@ -510,8 +514,6 @@ function SolverCore.solve!(
510514
),
511515
)
512516

513-
callback(nlp, solver, stats)
514-
515517
done = stats.status != :unknown
516518
end
517519

0 commit comments

Comments
 (0)