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