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