xref: /petsc/src/tao/linesearch/impls/owarmijo/owarmijo.h (revision aaa7dc30da3270cff6cb10b1db605b2ca746f216)
1a7e14dcfSSatish Balay #ifndef __TAOLINESEARCH_OWARMIJO_H
2a7e14dcfSSatish Balay #define __TAOLINESEARCH_OWARMIJO_H
3a7e14dcfSSatish Balay 
4e9f9aeaeSSatish Balay /* Context for an Armijo (nonmonotone) linesearch for orthant wise unconstrained
5e9f9aeaeSSatish Balay  minimization.
6e9f9aeaeSSatish Balay 
7e9f9aeaeSSatish Balay  Given a function f, the current iterate x, and a descent direction d:
8e9f9aeaeSSatish Balay  Find the smallest i in 0, 1, 2, ..., such that:
9e9f9aeaeSSatish Balay 
10e9f9aeaeSSatish Balay     f(x + (beta**i)d) <= f(x) + (sigma*beta**i)<grad f(x),d>
11e9f9aeaeSSatish Balay 
12e9f9aeaeSSatish Balay  The nonmonotone modification of this linesearch replaces the f(x) term
13e9f9aeaeSSatish Balay  with a reference value, R, and seeks to find the smallest i such that:
14e9f9aeaeSSatish Balay 
15e9f9aeaeSSatish Balay     f(x + (beta**i)d) <= R + (sigma*beta**i)<grad f(x),d>
16e9f9aeaeSSatish Balay 
17e9f9aeaeSSatish Balay  This modification does effect neither the convergence nor rate of
18e9f9aeaeSSatish Balay  convergence of an algorithm when R is chosen appropriately.  Essentially,
19e9f9aeaeSSatish Balay  R must decrease on average in some sense.  The benefit of a nonmonotone
20e9f9aeaeSSatish Balay  linesearch is that local minimizers can be avoided (by allowing increase
21e9f9aeaeSSatish Balay  in function value), and typically, fewer iterations are performed in
22e9f9aeaeSSatish Balay  the main code.
23e9f9aeaeSSatish Balay 
24e9f9aeaeSSatish Balay  The reference value is chosen based upon some historical information
25e9f9aeaeSSatish Balay  consisting of function values for previous iterates.  The amount of
26e9f9aeaeSSatish Balay  historical information used is determined by the memory size where the
27e9f9aeaeSSatish Balay  memory is used to store the previous function values.  The memory is
28e9f9aeaeSSatish Balay  initialized to alpha*f(x^0) for some alpha >= 1, with alpha=1 signifying
29e9f9aeaeSSatish Balay  that we always force decrease from the initial point.
30e9f9aeaeSSatish Balay 
31e9f9aeaeSSatish Balay  The reference value can be the maximum value in the memory or can be
32e9f9aeaeSSatish Balay  chosen to provide some mean descent.  Elements are removed from the
33e9f9aeaeSSatish Balay  memory with a replacement policy that either removes the oldest
34e9f9aeaeSSatish Balay  value in the memory (FIFO), or the largest value in the memory (MRU).
35e9f9aeaeSSatish Balay 
36e9f9aeaeSSatish Balay  Additionally, we can add a watchdog strategy to the search, which
37e9f9aeaeSSatish Balay  essentially accepts small directions and only checks the nonmonotonic
38e9f9aeaeSSatish Balay  descent criteria every m-steps.  This strategy is NOT implemented in
39e9f9aeaeSSatish Balay  the code.
40e9f9aeaeSSatish Balay 
41e9f9aeaeSSatish Balay  Finally, care must be taken when steepest descent directions are used.
42e9f9aeaeSSatish Balay  For example, when the Newton direction is not not satisfy a sufficient
43e9f9aeaeSSatish Balay  descent criteria.  The code will apply the same test regardless of
44e9f9aeaeSSatish Balay  the direction.  This type of search may not be appropriate for all
45e9f9aeaeSSatish Balay  algorithms.  For example, when a gradient direction is used, we may
46e9f9aeaeSSatish Balay  want to revert to the best point found and reset the memory so that
47e9f9aeaeSSatish Balay  we stay in an appropriate level set after using a gradient steps.
48e9f9aeaeSSatish Balay  This type of search is currently NOT supported by the code.
49e9f9aeaeSSatish Balay 
50e9f9aeaeSSatish Balay  References:
51e9f9aeaeSSatish Balay   Armijo, "Minimization of Functions Having Lipschitz Continuous
52e9f9aeaeSSatish Balay     First-Partial Derivatives," Pacific Journal of Mathematics, volume 16,
53e9f9aeaeSSatish Balay     pages 1-3, 1966.
54e9f9aeaeSSatish Balay   Ferris and Lucidi, "Nonmonotone Stabilization Methods for Nonlinear
55e9f9aeaeSSatish Balay     Equations," Journal of Optimization Theory and Applications, volume 81,
56e9f9aeaeSSatish Balay     pages 53-71, 1994.
57e9f9aeaeSSatish Balay   Grippo, Lampariello, and Lucidi, "A Nonmonotone Line Search Technique
58e9f9aeaeSSatish Balay     for Newton's Method," SIAM Journal on Numerical Analysis, volume 23,
59e9f9aeaeSSatish Balay     pages 707-716, 1986.
60e9f9aeaeSSatish Balay   Grippo, Lampariello, and Lucidi, "A Class of Nonmonotone Stabilization
61e9f9aeaeSSatish Balay     Methods in Unconstrained Optimization," Numerische Mathematik, volume 59,
62e9f9aeaeSSatish Balay   pages 779-805, 1991. */
63*aaa7dc30SBarry Smith #include <petsc-private/taolinesearchimpl.h>
64a7e14dcfSSatish Balay typedef struct {
65a7e14dcfSSatish Balay   PetscReal *memory;
66a7e14dcfSSatish Balay 
67e9f9aeaeSSatish Balay   PetscReal alpha;                      /* Initial reference factor >= 1 */
68e9f9aeaeSSatish Balay   PetscReal beta;                       /* Steplength determination < 1 */
69e9f9aeaeSSatish Balay   PetscReal beta_inf;                   /* Steplength determination < 1 */
70e9f9aeaeSSatish Balay   PetscReal sigma;                      /* Acceptance criteria < 1) */
71e9f9aeaeSSatish Balay   PetscReal minimumStep;                /* Minimum step size */
72e9f9aeaeSSatish Balay   PetscReal lastReference;              /* Reference value of last iteration */
73a7e14dcfSSatish Balay 
74e9f9aeaeSSatish Balay   PetscInt memorySize;                  /* Number of functions kept in memory */
75e9f9aeaeSSatish Balay   PetscInt current;                     /* Current element for FIFO */
76e9f9aeaeSSatish Balay   PetscInt referencePolicy;             /* Integer for reference calculation rule */
77e9f9aeaeSSatish Balay   PetscInt replacementPolicy;           /* Policy for replacing values in memory */
78a7e14dcfSSatish Balay 
79a7e14dcfSSatish Balay   PetscBool nondescending;
80a7e14dcfSSatish Balay   PetscBool memorySetup;
81a7e14dcfSSatish Balay 
82e9f9aeaeSSatish Balay   Vec x;        /* Maintain reference to variable vector to check for changes */
83a7e14dcfSSatish Balay   Vec work;
84a7e14dcfSSatish Balay } TAOLINESEARCH_OWARMIJO_CTX;
85a7e14dcfSSatish Balay 
86a7e14dcfSSatish Balay static PetscErrorCode ProjWork_OWLQN(Vec w,Vec x,Vec gv,PetscReal *gdx);
87a7e14dcfSSatish Balay 
88a7e14dcfSSatish Balay #endif
89