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