<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <font face="monospace">Barry,<br>
      <br>
      so far, I have not experimented with trust-region methods, but I
      can imagine that this "design feature" causes no problem for
      trust-region methods, if the old point is saved and after the
      trust-region check fails the old point is copied to the actual
      point.  But the implementation of the Armijo line search method
      does not work that way.  Here, the actual point will always be
      overwritten.  Only if the line search fails, then the old point is
      restored, but then the TaoSolve method ends with a line search
      failure. <br>
      <br>
      If you have an example for your own, you can switch the Armijo
      line search by the option -tao_ls_type armijo.  The thing is that
      it will cause no problems if the line search accepts the steps
      with step length one.  <br>
      It is also possible that, by luck, it will cause no problems, if
      the </font><font face="monospace"><var title="adjective">"excessive"</var>
      step brings a reduction of the objective<br>
      <br>
      Otherwise, I attach my example, which is not minimal, but here you
      can see that it causes problems.  You need to set the paths to the
      PETSc library in the makefile.  You find the options for this
      problem in the run_test_tao_neohooke.sh script.<br>
      The import part begins at line 292 in test_tao_neohooke.cpp<br>
      <br>
      Stephan<br>
    </font><br>
    <div class="moz-cite-prefix">On 02.11.22 19:04, Barry Smith wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:AB01B851-54B1-4878-B08D-0D15CB3EA825@petsc.dev">
      <pre class="moz-quote-pre" wrap="">
  Stephan,

    I have located the troublesome line in TaoSetUp_ALMM() it has the line

  auglag->Px = tao->solution;

and in alma.h it has 

Vec  Px, LgradX, Ce, Ci, G;         /* aliased vectors (do not destroy!) */

Now auglag->P in some situations alias auglag->P  and in some cases auglag->Px serves to hold a portion of auglag->P. So then in TaoALMMSubsolverObjective_Private()
the lines

PetscCall(VecCopy(P, auglag->P));
 PetscCall((*auglag->sub_obj)(auglag->parent));

causes, just as you said, tao->solution to be overwritten by the P at which the objective function is being computed. In other words, the solution of the outer Tao is aliased with the solution of the inner Tao, by design. 

You are definitely correct, the use of TaoALMMSubsolverObjective_Private and TaoALMMSubsolverObjectiveAndGradient_Private  in a line search would be problematic. 

I am not an expert at these methods or their implementations. Could you point to an actual use case within Tao that triggers the problem. Is there a set of command line options or code calls to Tao that fail due to this "design feature". Within the standard use of ALMM I do not see how the objective function would be used within a line search. The TaoSolve_ALMM() code is self-correcting in that if a trust region check fails it automatically rolls back the solution.

  Barry




</pre>
      <blockquote type="cite">
        <pre class="moz-quote-pre" wrap="">On Oct 28, 2022, at 4:27 AM, Stephan Köhler <a class="moz-txt-link-rfc2396E" href="mailto:stephan.koehler@math.tu-freiberg.de"><stephan.koehler@math.tu-freiberg.de></a> 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., <a class="moz-txt-link-freetext" href="https://petsc.org/release/src/tao/constrained/impls/almm/almm.c.html">https://petsc.org/release/src/tao/constrained/impls/almm/almm.c.html</a> 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., <a class="moz-txt-link-freetext" href="https://petsc.org/release/src/tao/linesearch/impls/armijo/armijo.c.html">https://petsc.org/release/src/tao/linesearch/impls/armijo/armijo.c.html</a> 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>
</pre>
      </blockquote>
      <pre class="moz-quote-pre" wrap="">
</pre>
    </blockquote>
    <br>
    <pre class="moz-signature" cols="72">-- 
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)</pre>
  </body>
</html>