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