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