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