Stephan,
Thanks for your detailed report.
Do you have a reproducing example?
I am having trouble following the logic you indicate below.
It is copying the P into auglag->P. Is auglag->P the "the current solution"
you are referring to?
Is it because of the line PetscCall(TaoSetSolution(auglag->subsolver,
auglag->P))? So I am assuming that you mean the current solution of the
auglag->subsolver Tao?
This means that TaoALMMSubsolverObjective_Private() always sets the
subsolver Tao current solution to the input P. Are you saying this is flawed
logic in the implementation of the entire ALMM solver?
Since the auglag->P gets overwritten for every
TaoALMMSubsolverObjective_Private() with the new P passed in I don't see where
((xk + dxk) + alpha * dxk) would occur. Would it first have xk + dxk passed in
for P and then the next time have xk + alpha * dxk passed in?
Barry
PetscErrorCode TaoALMMSubsolverObjective_Private(Tao tao, Vec P, PetscReal
*Lval, void *ctx)
{
TAO_ALMM *auglag = (TAO_ALMM *)ctx;
PetscFunctionBegin;
PetscCall(VecCopy(P, auglag->P));
PetscCall((*auglag->sub_obj)(auglag->parent));
*Lval = auglag->Lval;
PetscFunctionReturn(0);
}
> On Oct 28, 2022, at 4:27 AM, Stephan Köhler
> <[email protected]> wrote:
>
> Dear PETSc/Tao team,
>
> it seems to be that there is a bug in the TaoALMM class:
>
> In the methods TaoALMMSubsolverObjective_Private and
> TaoALMMSubsolverObjectiveAndGradient_Private the vector where the function
> value for the augmented Lagrangian is evaluate
> is copied into the current solution, see, e.g.,
> https://petsc.org/release/src/tao/constrained/impls/almm/almm.c.html line 672
> or 682. This causes subsolver routine to not converge if the line search for
> the subsolver rejects the step length 1. for some
> update. In detail:
>
> Suppose the current iterate is xk and the current update is dxk. The line
> search evaluates the augmented Lagrangian now at (xk + dxk). This causes
> that the value (xk + dxk) is copied in the current solution. If the point
> (xk + dxk) is rejected, the line search should
> try the point (xk + alpha * dxk), where alpha < 1. But due to the copying,
> what happens is that the point ((xk + dxk) + alpha * dxk) is evaluated, see,
> e.g., https://petsc.org/release/src/tao/linesearch/impls/armijo/armijo.c.html
> line 191.
>
> Best regards
> Stephan Köhler
>
> --
> Stephan Köhler
> TU Bergakademie Freiberg
> Institut für numerische Mathematik und Optimierung
>
> Akademiestraße 6
> 09599 Freiberg
> Gebäudeteil Mittelbau, Zimmer 2.07
>
> Telefon: +49 (0)3731 39-3173 (Büro)
>
> <OpenPGP_0xC9BF2C20DFE9F713.asc>