Actual source code: ntlimpl.h

  1: /*
  2:   Context for a Newton trust-region, line-search method for unconstrained
  3:   minimization
  4: */

  6: #pragma once
  7: #include <petsc/private/taoimpl.h>

  9: typedef struct {
 10:   Mat M;
 11:   PC  bfgs_pre;

 13:   Vec W;
 14:   Vec Xold;
 15:   Vec Gold;

 17:   /* Parameters when updating the trust-region radius based on steplength

 19:      if   step < nu1            (very bad step)
 20:        radius = omega1 * min(norm(d), radius)
 21:      elif step < nu2            (bad step)
 22:        radius = omega2 * min(norm(d), radius)
 23:      elif step < nu3            (okay step)
 24:        radius = omega3 * radius;
 25:      elif step < nu4            (good step)
 26:        radius = max(omega4 * norm(d), radius)
 27:      else                       (very good step)
 28:        radius = max(omega5 * norm(d), radius)
 29:      fi
 30:   */

 32:   PetscReal nu1; /* used to compute trust-region radius */
 33:   PetscReal nu2; /* used to compute trust-region radius */
 34:   PetscReal nu3; /* used to compute trust-region radius */
 35:   PetscReal nu4; /* used to compute trust-region radius */

 37:   PetscReal omega1; /* factor used for trust-region update */
 38:   PetscReal omega2; /* factor used for trust-region update */
 39:   PetscReal omega3; /* factor used for trust-region update */
 40:   PetscReal omega4; /* factor used for trust-region update */
 41:   PetscReal omega5; /* factor used for trust-region update */

 43:   /* Parameters when updating the trust-region radius based on reduction

 45:      kappa = ared / pred
 46:      if   kappa < eta1          (very bad step)
 47:        radius = alpha1 * min(norm(d), radius)
 48:      elif kappa < eta2          (bad step)
 49:        radius = alpha2 * min(norm(d), radius)
 50:      elif kappa < eta3          (okay step)
 51:        radius = alpha3 * radius;
 52:      elif kappa < eta4          (good step)
 53:        radius = max(alpha4 * norm(d), radius)
 54:      else                       (very good step)
 55:        radius = max(alpha5 * norm(d), radius)
 56:      fi
 57:   */

 59:   PetscReal eta1; /* used to compute trust-region radius */
 60:   PetscReal eta2; /* used to compute trust-region radius */
 61:   PetscReal eta3; /* used to compute trust-region radius */
 62:   PetscReal eta4; /* used to compute trust-region radius */

 64:   PetscReal alpha1; /* factor used for trust-region update */
 65:   PetscReal alpha2; /* factor used for trust-region update */
 66:   PetscReal alpha3; /* factor used for trust-region update */
 67:   PetscReal alpha4; /* factor used for trust-region update */
 68:   PetscReal alpha5; /* factor used for trust-region update */

 70:   /* Parameters when updating the trust-region radius based on interpolation
 71:      kappa = ared / pred
 72:      if   kappa >= 1.0 - mu1    (very good step)
 73:        choose tau in [gamma3, gamma4]
 74:        radius = max(tau * norm(d), radius)
 75:      elif kappa >= 1.0 - mu2    (good step)
 76:        choose tau in [gamma2, gamma3]
 77:        if (tau >= 1.0)
 78:          radius = max(tau * norm(d), radius)
 79:        else
 80:          radius = tau * min(norm(d), radius)
 81:        fi
 82:      else                       (bad step)
 83:        choose tau in [gamma1, 1.0]
 84:        radius = tau * min(norm(d), radius)
 85:      fi
 86:   */

 88:   PetscReal mu1; /* used for model agreement in interpolation */
 89:   PetscReal mu2; /* used for model agreement in interpolation */

 91:   PetscReal gamma1; /* factor used for interpolation */
 92:   PetscReal gamma2; /* factor used for interpolation */
 93:   PetscReal gamma3; /* factor used for interpolation */
 94:   PetscReal gamma4; /* factor used for interpolation */

 96:   PetscReal theta; /* factor used for interpolation */

 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 grad;   /* Gradient directions attempted */

119:   PetscInt init_type;   /* Trust-region initialization method */
120:   PetscInt update_type; /* Trust-region update method */
121: } TAO_NTL;