xref: /petsc/src/tao/unconstrained/impls/ntl/ntlimpl.h (revision 5f309d014d30c8e30ef8d484fee079cd79b2cbfc)
1 /*
2   Context for a Newton trust-region, line-search method for unconstrained
3   minimization
4 */
5 
6 #if !defined(__TAO_NTL_H)
7 #define __TAO_NTL_H
8 #include <petsc/private/taoimpl.h>
9 
10 typedef struct {
11   Mat M;
12 
13   Vec W;
14   Vec Xold;
15   Vec Gold;
16   Vec Diag;
17 
18   /* Parameters when updating the trust-region radius based on steplength
19 
20      if   step < nu1            (very bad step)
21        radius = omega1 * min(norm(d), radius)
22      elif step < nu2            (bad step)
23        radius = omega2 * min(norm(d), radius)
24      elif step < nu3            (okay step)
25        radius = omega3 * radius;
26      elif step < nu4            (good step)
27        radius = max(omega4 * norm(d), radius)
28      else                       (very good step)
29        radius = max(omega5 * norm(d), radius)
30      fi
31   */
32 
33   PetscReal nu1;                /* used to compute trust-region radius */
34   PetscReal nu2;                /* used to compute trust-region radius */
35   PetscReal nu3;                /* used to compute trust-region radius */
36   PetscReal nu4;                /* used to compute trust-region radius */
37 
38   PetscReal omega1;             /* factor used for trust-region update */
39   PetscReal omega2;             /* factor used for trust-region update */
40   PetscReal omega3;             /* factor used for trust-region update */
41   PetscReal omega4;             /* factor used for trust-region update */
42   PetscReal omega5;             /* factor used for trust-region update */
43 
44   /* Parameters when updating the trust-region radius based on reduction
45 
46      kappa = ared / pred
47      if   kappa < eta1          (very bad step)
48        radius = alpha1 * min(norm(d), radius)
49      elif kappa < eta2          (bad step)
50        radius = alpha2 * min(norm(d), radius)
51      elif kappa < eta3          (okay step)
52        radius = alpha3 * radius;
53      elif kappa < eta4          (good step)
54        radius = max(alpha4 * norm(d), radius)
55      else                       (very good step)
56        radius = max(alpha5 * norm(d), radius)
57      fi
58   */
59 
60   PetscReal eta1;               /* used to compute trust-region radius */
61   PetscReal eta2;               /* used to compute trust-region radius */
62   PetscReal eta3;               /* used to compute trust-region radius */
63   PetscReal eta4;               /* used to compute trust-region radius */
64 
65   PetscReal alpha1;             /* factor used for trust-region update */
66   PetscReal alpha2;             /* factor used for trust-region update */
67   PetscReal alpha3;             /* factor used for trust-region update */
68   PetscReal alpha4;             /* factor used for trust-region update */
69   PetscReal alpha5;             /* factor used for trust-region update */
70 
71   /* Parameters when updating the trust-region radius based on interpolation
72      kappa = ared / pred
73      if   kappa >= 1.0 - mu1    (very good step)
74        choose tau in [gamma3, gamma4]
75        radius = max(tau * norm(d), radius)
76      elif kappa >= 1.0 - mu2    (good step)
77        choose tau in [gamma2, gamma3]
78        if (tau >= 1.0)
79          radius = max(tau * norm(d), radius)
80        else
81          radius = tau * min(norm(d), radius)
82        fi
83      else                       (bad step)
84        choose tau in [gamma1, 1.0]
85        radius = tau * min(norm(d), radius)
86      fi
87   */
88 
89   PetscReal mu1;                /* used for model agreement in interpolation */
90   PetscReal mu2;                /* used for model agreement in interpolation */
91 
92   PetscReal gamma1;             /* factor used for interpolation */
93   PetscReal gamma2;             /* factor used for interpolation */
94   PetscReal gamma3;             /* factor used for interpolation */
95   PetscReal gamma4;             /* factor used for interpolation */
96 
97   PetscReal theta;              /* factor used for interpolation */
98 
99   /* Parameters when initializing trust-region radius based on interpolation */
100   PetscReal mu1_i;              /* used for model agreement in interpolation */
101   PetscReal mu2_i;              /* used for model agreement in interpolation */
102 
103   PetscReal gamma1_i;           /* factor used for interpolation */
104   PetscReal gamma2_i;           /* factor used for interpolation */
105   PetscReal gamma3_i;           /* factor used for interpolation */
106   PetscReal gamma4_i;           /* factor used for interpolation */
107 
108   PetscReal theta_i;            /* factor used for interpolation */
109 
110   /* Other parameters */
111   PetscReal min_radius;         /* lower bound on initial radius value */
112   PetscReal max_radius;         /* upper bound on trust region radius */
113   PetscReal epsilon;            /* tolerance used when computing ared/pred */
114 
115   PetscInt ntrust;              /* Trust-region steps accepted */
116   PetscInt newt;                /* Newton directions attempted */
117   PetscInt bfgs;                /* BFGS directions attempted */
118   PetscInt sgrad;               /* Scaled gradient directions attempted */
119   PetscInt grad;                /* Gradient directions attempted */
120 
121   PetscInt pc_type;             /* Preconditioner for the code */
122   PetscInt bfgs_scale_type;     /* Scaling matrix to used for the bfgs preconditioner */
123   PetscInt init_type;           /* Trust-region initialization method */
124   PetscInt update_type;         /* Trust-region update method */
125 } TAO_NTL;
126 
127 #endif /* if !defined(__TAO_NTL_H) */
128