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