Actual source code: ntrimpl.h

      1: /*
      2:   Context for a Newton trust region method (unconstrained minimization)
      3: */

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

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

     13:   Vec D;
     14:   Vec W;

     16:   PetscReal radius;

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

     20:      kappa = ared / pred
     21:      if   kappa < eta1          (very bad step)
     22:        radius = alpha1 * min(norm(d), radius)
     23:      elif kappa < eta2          (bad step)
     24:        radius = alpha2 * min(norm(d), radius)
     25:      elif kappa < eta3          (okay step)
     26:        radius = alpha3 * radius;
     27:      elif kappa < eta4          (good step)
     28:        radius = max(alpha4 * norm(d), radius)
     29:      else                       (very good step)
     30:        radius = max(alpha5 * norm(d), radius)
     31:      fi
     32:   */

     34:   PetscReal eta1;          /*  used to compute trust-region radius */
     35:   PetscReal eta2;          /*  used to compute trust-region radius */
     36:   PetscReal eta3;          /*  used to compute trust-region radius */
     37:   PetscReal eta4;          /*  used to compute trust-region radius */

     39:   PetscReal alpha1;        /*  factor used for trust-region update */
     40:   PetscReal alpha2;        /*  factor used for trust-region update */
     41:   PetscReal alpha3;        /*  factor used for trust-region update */
     42:   PetscReal alpha4;        /*  factor used for trust-region update */
     43:   PetscReal alpha5;        /*  factor used for trust-region update */

     45:   /* Parameters when updating the trust-region radius based on interpolation

     47:      kappa = ared / pred
     48:      if   kappa >= 1.0 - mu1    (very good step)
     49:        choose tau in [gamma3, gamma4]
     50:        radius = max(tau * norm(d), radius)
     51:      elif kappa >= 1.0 - mu2    (good step)
     52:        choose tau in [gamma2, gamma3]
     53:        if (tau >= 1.0)
     54:          radius = max(tau * norm(d), radius)
     55:        else
     56:          radius = tau * min(norm(d), radius)
     57:        fi
     58:      else                       (bad step)
     59:        choose tau in [gamma1, 1.0]
     60:        radius = tau * min(norm(d), radius)
     61:      fi
     62:   */

     64:   PetscReal mu1;           /*  used for model agreement in radius update */
     65:   PetscReal mu2;           /*  used for model agreement in radius update */

     67:   PetscReal gamma1;        /*  factor used for radius update */
     68:   PetscReal gamma2;        /*  factor used for radius update */
     69:   PetscReal gamma3;        /*  factor used for radius update */
     70:   PetscReal gamma4;        /*  factor used for radius update */

     72:   PetscReal theta;         /*  factor used for radius update */

     74:   /* Parameters when initializing trust-region radius based on interpolation */

     76:   PetscReal mu1_i;         /*  used for model agreement in interpolation */
     77:   PetscReal mu2_i;         /*  used for model agreement in interpolation */

     79:   PetscReal gamma1_i;      /*  factor used for interpolation */
     80:   PetscReal gamma2_i;      /*  factor used for interpolation */
     81:   PetscReal gamma3_i;      /*  factor used for interpolation */
     82:   PetscReal gamma4_i;      /*  factor used for interpolation */

     84:   PetscReal theta_i;       /*  factor used for interpolation */

     86:   PetscReal min_radius;    /*  lower bound on initial radius value */
     87:   PetscReal max_radius;    /*  upper bound on trust region radius */
     88:   PetscReal epsilon;       /*  tolerance used when computing actred/prered */

     90:   PetscInt init_type;      /*  Trust-region initialization method */
     91:   PetscInt update_type;    /*  Trust-region update method */
     92: } TAO_NTR;

     94: #endif /* if !defined(__TAO_NTR_H) */