xref: /petsc/src/tao/unconstrained/impls/nls/nlsimpl.h (revision 9dd11ecf0918283bb567d8b33a92f53ac4ea7840)
1 /*
2 Context for a Newton line search method (unconstrained minimization)
3 */
4 
5 #pragma once
6 #include <petsc/private/taoimpl.h>
7 
8 typedef struct {
9   Mat M;
10   PC  bfgs_pre;
11 
12   Vec D;
13   Vec W;
14 
15   Vec Xold;
16   Vec Gold;
17 
18   /* Parameters when updating the perturbation added to the Hessian matrix
19      according to the following scheme:
20 
21      pert = sval;
22 
23      do until convergence
24        shift Hessian by pert
25        solve Newton system
26 
27        if (linear solver failed or did not compute a descent direction)
28          use steepest descent direction and increase perturbation
29 
30          if (0 == pert)
31            initialize perturbation
32            pert = min(imax, max(imin, imfac * norm(G)))
33          else
34            increase perturbation
35            pert = min(pmax, max(pgfac * pert, pmgfac * norm(G)))
36          fi
37        else
38          use linear solver direction and decrease perturbation
39 
40          pert = min(psfac * pert, pmsfac * norm(G))
41          if (pert < pmin)
42            pert = 0
43          fi
44        fi
45 
46        perform line search
47        function and gradient evaluation
48        check convergence
49      od
50   */
51   PetscReal sval; /*  Starting perturbation value, default zero */
52 
53   PetscReal imin;  /*  Minimum perturbation added during initialization  */
54   PetscReal imax;  /*  Maximum perturbation added during initialization */
55   PetscReal imfac; /*  Merit function factor during initialization */
56 
57   PetscReal pmin;   /*  Minimum perturbation value */
58   PetscReal pmax;   /*  Maximum perturbation value */
59   PetscReal pgfac;  /*  Perturbation growth factor */
60   PetscReal psfac;  /*  Perturbation shrink factor */
61   PetscReal pmgfac; /*  Merit function growth factor */
62   PetscReal pmsfac; /*  Merit function shrink factor */
63 
64   /* Parameters when updating the trust-region radius based on steplength
65      if   step < nu1            (very bad step)
66        radius = omega1 * min(norm(d), radius)
67      elif step < nu2            (bad step)
68        radius = omega2 * min(norm(d), radius)
69      elif step < nu3            (okay step)
70        radius = omega3 * radius;
71      elif step < nu4            (good step)
72        radius = max(omega4 * norm(d), radius)
73      else                       (very good step)
74        radius = max(omega5 * norm(d), radius)
75      fi
76   */
77   PetscReal nu1; /*  used to compute trust-region radius */
78   PetscReal nu2; /*  used to compute trust-region radius */
79   PetscReal nu3; /*  used to compute trust-region radius */
80   PetscReal nu4; /*  used to compute trust-region radius */
81 
82   PetscReal omega1; /*  factor used for trust-region update */
83   PetscReal omega2; /*  factor used for trust-region update */
84   PetscReal omega3; /*  factor used for trust-region update */
85   PetscReal omega4; /*  factor used for trust-region update */
86   PetscReal omega5; /*  factor used for trust-region update */
87 
88   /* Parameters when updating the trust-region radius based on reduction
89 
90      kappa = ared / pred
91      if   kappa < eta1          (very bad step)
92        radius = alpha1 * min(norm(d), radius)
93      elif kappa < eta2          (bad step)
94        radius = alpha2 * min(norm(d), radius)
95      elif kappa < eta3          (okay step)
96        radius = alpha3 * radius;
97      elif kappa < eta4          (good step)
98        radius = max(alpha4 * norm(d), radius)
99      else                       (very good step)
100        radius = max(alpha5 * norm(d), radius)
101      fi
102   */
103   PetscReal eta1; /*  used to compute trust-region radius */
104   PetscReal eta2; /*  used to compute trust-region radius */
105   PetscReal eta3; /*  used to compute trust-region radius */
106   PetscReal eta4; /*  used to compute trust-region radius */
107 
108   PetscReal alpha1; /*  factor used for trust-region update */
109   PetscReal alpha2; /*  factor used for trust-region update */
110   PetscReal alpha3; /*  factor used for trust-region update */
111   PetscReal alpha4; /*  factor used for trust-region update */
112   PetscReal alpha5; /*  factor used for trust-region update */
113 
114   /* Parameters when updating the trust-region radius based on interpolation
115 
116      kappa = ared / pred
117      if   kappa >= 1.0 - mu1    (very good step)
118        choose tau in [gamma3, gamma4]
119        radius = max(tau * norm(d), radius)
120      elif kappa >= 1.0 - mu2    (good step)
121        choose tau in [gamma2, gamma3]
122        if (tau >= 1.0)
123          radius = max(tau * norm(d), radius)
124        else
125          radius = tau * min(norm(d), radius)
126        fi
127      else                       (bad step)
128        choose tau in [gamma1, 1.0]
129        radius = tau * min(norm(d), radius)
130      fi
131   */
132   PetscReal mu1; /*  used for model agreement in interpolation */
133   PetscReal mu2; /*  used for model agreement in interpolation */
134 
135   PetscReal gamma1; /*  factor used for interpolation */
136   PetscReal gamma2; /*  factor used for interpolation */
137   PetscReal gamma3; /*  factor used for interpolation */
138   PetscReal gamma4; /*  factor used for interpolation */
139 
140   PetscReal theta; /*  factor used for interpolation */
141 
142   /*  Parameters when initializing trust-region radius based on interpolation */
143   PetscReal mu1_i; /*  used for model agreement in interpolation */
144   PetscReal mu2_i; /*  used for model agreement in interpolation */
145 
146   PetscReal gamma1_i; /*  factor used for interpolation */
147   PetscReal gamma2_i; /*  factor used for interpolation */
148   PetscReal gamma3_i; /*  factor used for interpolation */
149   PetscReal gamma4_i; /*  factor used for interpolation */
150 
151   PetscReal theta_i; /*  factor used for interpolation */
152 
153   /*  Other parameters */
154   PetscReal min_radius; /*  lower bound on initial radius value */
155   PetscReal max_radius; /*  upper bound on trust region radius */
156   PetscReal epsilon;    /*  tolerance used when computing ared/pred */
157 
158   PetscInt newt; /*  Newton directions attempted */
159   PetscInt bfgs; /*  BFGS directions attempted */
160   PetscInt grad; /*  Gradient directions attempted */
161 
162   PetscInt init_type;   /*  Trust-region initialization method */
163   PetscInt update_type; /*  Trust-region update method */
164 
165   PetscInt ksp_atol;
166   PetscInt ksp_rtol;
167   PetscInt ksp_ctol;
168   PetscInt ksp_negc;
169   PetscInt ksp_dtol;
170   PetscInt ksp_iter;
171   PetscInt ksp_othr;
172 } TAO_NLS;
173