Stephan,

    The Tao author has kindly fixed the bug in the code you found in 
https://gitlab.com/petsc/petsc/-/merge_requests/5890  Please let us know if 
this works and resolves your problem.

   Thanks

   Barry


> On Nov 22, 2022, at 4:03 AM, Stephan Köhler 
> <stephan.koeh...@math.tu-freiberg.de> wrote:
> 
> Yeah, I also read this.  But for me as a reader "highly recommended" does not 
> mean that Armijo does not work correct with ALMM :).
> 
> And I think that Armijo is easier than trust-region in the sense that if 
> Armijo does not work, than I did something wrong in the Hessian or the 
> gradient.  In trust-region methods, there are more parameters and maybe I set 
> one of them wrong or something like that.
> At least, this is my view.  But I'm also not an expert on trust-region 
> methods.
> 
> On 12.11.22 06:00, Barry Smith wrote:
>> 
>>   I noticed this in the TAOALMM manual page.
>> 
>> It is also highly recommended that the subsolver chosen by the user utilize 
>> a trust-region
>> strategy for globalization (default: TAOBQNKTR) especially if the outer 
>> problem features bound constraints.
>> 
>> I am far from an expert on these topics.
>> 
>>> On Nov 4, 2022, at 7:43 AM, Stephan Köhler 
>>> <stephan.koeh...@math.tu-freiberg.de> 
>>> <mailto:stephan.koeh...@math.tu-freiberg.de> wrote:
>>> 
>>> Barry,
>>> 
>>> this is a nonartificial code.  This is a problem in the ALMM subsolver.  I 
>>> want to solve a problem with a TaoALMM solver what then happens is:
>>> 
>>> TaoSolve(tao)    /* TaoALMM solver */
>>>    |
>>>    |
>>>    |-------->   This calls the TaoALMM subsolver routine
>>>                   
>>>                  TaoSolve(subsolver)
>>>                        |
>>>                        |
>>>                        |----------->   The subsolver does not correctly 
>>> work, at least with an Armijo line search, since the solution is 
>>> overwritten within the line search.  
>>>                                        In my case, the subsolver does not 
>>> make any progress although it is possible.
>>> 
>>> To get to my real problem you can simply change line 268 to if(0)  (from 
>>> if(1) -----> if(0)) and line 317 from // ierr = TaoSolve(tao); 
>>> CHKERRQ(ierr);  -------> ierr = TaoSolve(tao); CHKERRQ(ierr);
>>> What you can see is that the solver does not make any progress, but it 
>>> should make progress.
>>> 
>>> To be honest, I do not really know why the option 
>>> -tao_almm_subsolver_tao_ls_monitor has know effect if the ALMM solver is 
>>> called and not the subsolver. I also do not know why 
>>> -tao_almm_subsolver_tao_view prints as termination reason for the subsolver 
>>> 
>>>      Solution converged:    ||g(X)|| <= gatol
>>> 
>>> This is obviously not the case.  I set the tolerance        
>>> -tao_almm_subsolver_tao_gatol 1e-8 \
>>> -tao_almm_subsolver_tao_grtol 1e-8 \
>>>  
>>> I encountered this and then I looked into the ALMM class and therefore I 
>>> tried to call the subsolver (previous example).
>>> 
>>> I attach the updated programm and also the options.
>>> 
>>> Stephan
>>> 
>>> 
>>> 
>>> 
>>> 
>>> On 03.11.22 22:15, Barry Smith wrote:
>>>> 
>>>>   Thanks for your response and the code. I understand the potential 
>>>> problem and how your code demonstrates a bug if the 
>>>> TaoALMMSubsolverObjective() is used in the manner you use in the example 
>>>> where you directly call TaoComputeObjective() multiple times line a line 
>>>> search code might.
>>>> 
>>>>   What I don't have or understand is how to reproduce the problem in a 
>>>> real code that uses Tao. That is where the Tao Armijo line search code has 
>>>> a problem when it is used (somehow) in a Tao solver with ALMM. You suggest 
>>>> "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."  I 
>>>> don't see how to do this if I use -tao_type almm I cannot use -tao_ls_type 
>>>> armijo; that is the option -tao_ls_type doesn't seem to me to be usable in 
>>>> the context of almm (since almm internally does directly its own trust 
>>>> region approach for globalization). If we remove the if (1) code from your 
>>>> example, is there some Tao options I can use to get the bug to appear 
>>>> inside the Tao solve?
>>>> 
>>>> I'll try to explain again, I agree that the fact that the Tao solution is 
>>>> aliased (within the ALMM solver) is a problem with repeated calls to 
>>>> TaoComputeObjective() but I cannot see how these repeated calls could ever 
>>>> happen in the use of TaoSolve() with the ALMM solver. That is when is this 
>>>> "design problem" a true problem as opposed to just a potential problem 
>>>> that can be demonstrated in artificial code?
>>>> 
>>>> The reason I need to understand the non-artificial situation it breaks 
>>>> things is to come up with an appropriate correction for the current code.
>>>> 
>>>>   Barry
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>> 
>>>>> On Nov 3, 2022, at 12:46 PM, Stephan Köhler 
>>>>> <stephan.koeh...@math.tu-freiberg.de> 
>>>>> <mailto:stephan.koeh...@math.tu-freiberg.de> wrote:
>>>>> 
>>>>> Barry,
>>>>> 
>>>>> 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. 
>>>>> 
>>>>> 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.  
>>>>> It is also possible that, by luck, it will cause no problems, if the 
>>>>> "excessive" step brings a reduction of the objective
>>>>> 
>>>>> 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.
>>>>> The import part begins at line 292 in test_tao_neohooke.cpp
>>>>> 
>>>>> Stephan
>>>>> 
>>>>> On 02.11.22 19:04, Barry Smith wrote:
>>>>>>   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
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>>> On Oct 28, 2022, at 4:27 AM, Stephan Köhler 
>>>>>>> <stephan.koeh...@math.tu-freiberg.de> 
>>>>>>> <mailto:stephan.koeh...@math.tu-freiberg.de> 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>
>>>>> 
>>>>> -- 
>>>>> 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)
>>>>> <Minimal_example_without_vtk_2.tar.gz><OpenPGP_0xC9BF2C20DFE9F713.asc>
>>>> 
>>> 
>>> -- 
>>> 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)
>>> <run_test_tao_neohooke.sh><test_tao_neohooke.cpp><OpenPGP_0xC9BF2C20DFE9F713.asc>
>> 
> 
> -- 
> 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>

Reply via email to