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