@@ -423,16 +423,17 @@ function lazy_afw_step(x, gradient, lmo, active_set, phi, epsilon, d; use_extra_
423423 # compute new vertex with normal or weak oracle
424424 if weak_separation
425425 lazy_threshold = fast_dot (gradient, x) - phi / lazy_tolerance
426- (v, _ ) = compute_weak_separation_point (lmo, gradient, lazy_threshold)
427- tt = weaksep
426+ (v, gap ) = compute_weak_separation_point (lmo, gradient, lazy_threshold)
427+ tt = gap == 0.0 ? regular : weaksep
428428 else
429429 v = compute_extreme_point (lmo, gradient)
430+ gap = zero (eltype (v))
430431 tt = regular
431432 end
432433 end
433- # Real dual gap promises enough progress.
434434 grad_dot_fw_vertex = fast_dot (v, gradient)
435435 dual_gap = grad_dot_x - grad_dot_fw_vertex
436+ # Real dual gap promises enough progress.
436437 if dual_gap >= phi / lazy_tolerance
437438 gamma_max = one (a_lambda)
438439 d = muladd_memory_mode (memory_mode, d, x, v)
@@ -441,6 +442,7 @@ function lazy_afw_step(x, gradient, lmo, active_set, phi, epsilon, d; use_extra_
441442 fw_step_taken = true
442443 index = - 1
443444 else # lower our expectation for progress.
445+ @assert tt != weaksep
444446 tt = dualstep
445447 phi = min (dual_gap, phi / 2.0 )
446448 gamma_max = zero (a_lambda)
@@ -460,15 +462,15 @@ function afw_step(x, gradient, lmo, active_set, epsilon, d; memory_mode::MemoryE
460462 away_gap = fast_dot (a, gradient) - grad_dot_x
461463 (v, gap) = if weak_separation
462464 # Condition for taking a FW step
463- # ⟨∇f, x-v⟩ ≥ gₐ
465+ # ⟨∇f, x-v⟩ ≥ gₐ <=>
464466 # ⟨∇f, v⟩ ≤ ⟨∇f, x⟩ - gₐ
465- # We ask for a bit more on the FW step
467+ # We ask for a bit more progress on the FW step
466468 # to promote away steps when we can (and therefore sparsity)
467469 # ⟨∇f, v⟩ ≤ ⟨∇f, x⟩ - K gₐ
468470 lazy_threshold = grad_dot_x - lazy_tolerance * away_gap
469471 compute_weak_separation_point (lmo, gradient, lazy_threshold)
470472 else
471- (compute_extreme_point (lmo, gradient), 0.0 )
473+ (compute_extreme_point (lmo, gradient), zero (away_gap) )
472474 end
473475 dual_gap = grad_dot_x - fast_dot (v, gradient)
474476 if dual_gap > away_gap && dual_gap >= epsilon
0 commit comments