xref: /petsc/src/tao/unconstrained/impls/ntl/ntlimpl.h (revision 9dd11ecf0918283bb567d8b33a92f53ac4ea7840)
155119615STodd Munson /*
255119615STodd Munson   Context for a Newton trust-region, line-search method for unconstrained
355119615STodd Munson   minimization
455119615STodd Munson */
555119615STodd Munson 
6*a4963045SJacob Faibussowitsch #pragma once
755119615STodd Munson #include <petsc/private/taoimpl.h>
855119615STodd Munson 
955119615STodd Munson typedef struct {
1055119615STodd Munson   Mat M;
110c51296cSAlp Dener   PC  bfgs_pre;
1255119615STodd Munson 
1355119615STodd Munson   Vec W;
1455119615STodd Munson   Vec Xold;
1555119615STodd Munson   Vec Gold;
1655119615STodd Munson 
1755119615STodd Munson   /* Parameters when updating the trust-region radius based on steplength
1855119615STodd Munson 
1955119615STodd Munson      if   step < nu1            (very bad step)
2055119615STodd Munson        radius = omega1 * min(norm(d), radius)
2155119615STodd Munson      elif step < nu2            (bad step)
2255119615STodd Munson        radius = omega2 * min(norm(d), radius)
2355119615STodd Munson      elif step < nu3            (okay step)
2455119615STodd Munson        radius = omega3 * radius;
2555119615STodd Munson      elif step < nu4            (good step)
2655119615STodd Munson        radius = max(omega4 * norm(d), radius)
2755119615STodd Munson      else                       (very good step)
2855119615STodd Munson        radius = max(omega5 * norm(d), radius)
2955119615STodd Munson      fi
3055119615STodd Munson   */
3155119615STodd Munson 
3255119615STodd Munson   PetscReal nu1; /* used to compute trust-region radius */
3355119615STodd Munson   PetscReal nu2; /* used to compute trust-region radius */
3455119615STodd Munson   PetscReal nu3; /* used to compute trust-region radius */
3555119615STodd Munson   PetscReal nu4; /* used to compute trust-region radius */
3655119615STodd Munson 
3755119615STodd Munson   PetscReal omega1; /* factor used for trust-region update */
3855119615STodd Munson   PetscReal omega2; /* factor used for trust-region update */
3955119615STodd Munson   PetscReal omega3; /* factor used for trust-region update */
4055119615STodd Munson   PetscReal omega4; /* factor used for trust-region update */
4155119615STodd Munson   PetscReal omega5; /* factor used for trust-region update */
4255119615STodd Munson 
4355119615STodd Munson   /* Parameters when updating the trust-region radius based on reduction
4455119615STodd Munson 
4555119615STodd Munson      kappa = ared / pred
4655119615STodd Munson      if   kappa < eta1          (very bad step)
4755119615STodd Munson        radius = alpha1 * min(norm(d), radius)
4855119615STodd Munson      elif kappa < eta2          (bad step)
4955119615STodd Munson        radius = alpha2 * min(norm(d), radius)
5055119615STodd Munson      elif kappa < eta3          (okay step)
5155119615STodd Munson        radius = alpha3 * radius;
5255119615STodd Munson      elif kappa < eta4          (good step)
5355119615STodd Munson        radius = max(alpha4 * norm(d), radius)
5455119615STodd Munson      else                       (very good step)
5555119615STodd Munson        radius = max(alpha5 * norm(d), radius)
5655119615STodd Munson      fi
5755119615STodd Munson   */
5855119615STodd Munson 
5955119615STodd Munson   PetscReal eta1; /* used to compute trust-region radius */
6055119615STodd Munson   PetscReal eta2; /* used to compute trust-region radius */
6155119615STodd Munson   PetscReal eta3; /* used to compute trust-region radius */
6255119615STodd Munson   PetscReal eta4; /* used to compute trust-region radius */
6355119615STodd Munson 
6455119615STodd Munson   PetscReal alpha1; /* factor used for trust-region update */
6555119615STodd Munson   PetscReal alpha2; /* factor used for trust-region update */
6655119615STodd Munson   PetscReal alpha3; /* factor used for trust-region update */
6755119615STodd Munson   PetscReal alpha4; /* factor used for trust-region update */
6855119615STodd Munson   PetscReal alpha5; /* factor used for trust-region update */
6955119615STodd Munson 
7055119615STodd Munson   /* Parameters when updating the trust-region radius based on interpolation
7155119615STodd Munson      kappa = ared / pred
7255119615STodd Munson      if   kappa >= 1.0 - mu1    (very good step)
7355119615STodd Munson        choose tau in [gamma3, gamma4]
7455119615STodd Munson        radius = max(tau * norm(d), radius)
7555119615STodd Munson      elif kappa >= 1.0 - mu2    (good step)
7655119615STodd Munson        choose tau in [gamma2, gamma3]
7755119615STodd Munson        if (tau >= 1.0)
7855119615STodd Munson          radius = max(tau * norm(d), radius)
7955119615STodd Munson        else
8055119615STodd Munson          radius = tau * min(norm(d), radius)
8155119615STodd Munson        fi
8255119615STodd Munson      else                       (bad step)
8355119615STodd Munson        choose tau in [gamma1, 1.0]
8455119615STodd Munson        radius = tau * min(norm(d), radius)
8555119615STodd Munson      fi
8655119615STodd Munson   */
8755119615STodd Munson 
8855119615STodd Munson   PetscReal mu1; /* used for model agreement in interpolation */
8955119615STodd Munson   PetscReal mu2; /* used for model agreement in interpolation */
9055119615STodd Munson 
9155119615STodd Munson   PetscReal gamma1; /* factor used for interpolation */
9255119615STodd Munson   PetscReal gamma2; /* factor used for interpolation */
9355119615STodd Munson   PetscReal gamma3; /* factor used for interpolation */
9455119615STodd Munson   PetscReal gamma4; /* factor used for interpolation */
9555119615STodd Munson 
9655119615STodd Munson   PetscReal theta; /* factor used for interpolation */
9755119615STodd Munson 
9855119615STodd Munson   /* Parameters when initializing trust-region radius based on interpolation */
9955119615STodd Munson   PetscReal mu1_i; /* used for model agreement in interpolation */
10055119615STodd Munson   PetscReal mu2_i; /* used for model agreement in interpolation */
10155119615STodd Munson 
10255119615STodd Munson   PetscReal gamma1_i; /* factor used for interpolation */
10355119615STodd Munson   PetscReal gamma2_i; /* factor used for interpolation */
10455119615STodd Munson   PetscReal gamma3_i; /* factor used for interpolation */
10555119615STodd Munson   PetscReal gamma4_i; /* factor used for interpolation */
10655119615STodd Munson 
10755119615STodd Munson   PetscReal theta_i; /* factor used for interpolation */
10855119615STodd Munson 
10955119615STodd Munson   /* Other parameters */
11055119615STodd Munson   PetscReal min_radius; /* lower bound on initial radius value */
11155119615STodd Munson   PetscReal max_radius; /* upper bound on trust region radius */
11255119615STodd Munson   PetscReal epsilon;    /* tolerance used when computing ared/pred */
11355119615STodd Munson 
11455119615STodd Munson   PetscInt ntrust; /* Trust-region steps accepted */
11555119615STodd Munson   PetscInt newt;   /* Newton directions attempted */
11655119615STodd Munson   PetscInt bfgs;   /* BFGS directions attempted */
11755119615STodd Munson   PetscInt grad;   /* Gradient directions attempted */
11855119615STodd Munson 
11955119615STodd Munson   PetscInt init_type;   /* Trust-region initialization method */
12055119615STodd Munson   PetscInt update_type; /* Trust-region update method */
12155119615STodd Munson } TAO_NTL;
122