xref: /petsc/src/tao/unconstrained/impls/ntr/ntrimpl.h (revision fb90e4d1cca66432f1358a047212a451cd5dc03e)
1*fb90e4d1STodd Munson /*
2*fb90e4d1STodd Munson   Context for a Newton trust region method (unconstrained minimization)
3*fb90e4d1STodd Munson */
4*fb90e4d1STodd Munson 
5*fb90e4d1STodd Munson #if !defined(__TAO_NTR_H)
6*fb90e4d1STodd Munson #define __TAO_NTR_H
7*fb90e4d1STodd Munson #include <petsc/private/taoimpl.h>
8*fb90e4d1STodd Munson 
9*fb90e4d1STodd Munson typedef struct {
10*fb90e4d1STodd Munson   Mat M;
11*fb90e4d1STodd Munson 
12*fb90e4d1STodd Munson   Vec D;
13*fb90e4d1STodd Munson   Vec W;
14*fb90e4d1STodd Munson 
15*fb90e4d1STodd Munson   Vec Diag;
16*fb90e4d1STodd Munson   PetscReal radius;
17*fb90e4d1STodd Munson 
18*fb90e4d1STodd Munson   /* Parameters when updating the trust-region radius based on reduction
19*fb90e4d1STodd Munson 
20*fb90e4d1STodd Munson      kappa = ared / pred
21*fb90e4d1STodd Munson      if   kappa < eta1          (very bad step)
22*fb90e4d1STodd Munson        radius = alpha1 * min(norm(d), radius)
23*fb90e4d1STodd Munson      elif kappa < eta2          (bad step)
24*fb90e4d1STodd Munson        radius = alpha2 * min(norm(d), radius)
25*fb90e4d1STodd Munson      elif kappa < eta3          (okay step)
26*fb90e4d1STodd Munson        radius = alpha3 * radius;
27*fb90e4d1STodd Munson      elif kappa < eta4          (good step)
28*fb90e4d1STodd Munson        radius = max(alpha4 * norm(d), radius)
29*fb90e4d1STodd Munson      else                       (very good step)
30*fb90e4d1STodd Munson        radius = max(alpha5 * norm(d), radius)
31*fb90e4d1STodd Munson      fi
32*fb90e4d1STodd Munson   */
33*fb90e4d1STodd Munson 
34*fb90e4d1STodd Munson   PetscReal eta1;          /*  used to compute trust-region radius */
35*fb90e4d1STodd Munson   PetscReal eta2;          /*  used to compute trust-region radius */
36*fb90e4d1STodd Munson   PetscReal eta3;          /*  used to compute trust-region radius */
37*fb90e4d1STodd Munson   PetscReal eta4;          /*  used to compute trust-region radius */
38*fb90e4d1STodd Munson 
39*fb90e4d1STodd Munson   PetscReal alpha1;        /*  factor used for trust-region update */
40*fb90e4d1STodd Munson   PetscReal alpha2;        /*  factor used for trust-region update */
41*fb90e4d1STodd Munson   PetscReal alpha3;        /*  factor used for trust-region update */
42*fb90e4d1STodd Munson   PetscReal alpha4;        /*  factor used for trust-region update */
43*fb90e4d1STodd Munson   PetscReal alpha5;        /*  factor used for trust-region update */
44*fb90e4d1STodd Munson 
45*fb90e4d1STodd Munson   /* Parameters when updating the trust-region radius based on interpolation
46*fb90e4d1STodd Munson 
47*fb90e4d1STodd Munson      kappa = ared / pred
48*fb90e4d1STodd Munson      if   kappa >= 1.0 - mu1    (very good step)
49*fb90e4d1STodd Munson        choose tau in [gamma3, gamma4]
50*fb90e4d1STodd Munson        radius = max(tau * norm(d), radius)
51*fb90e4d1STodd Munson      elif kappa >= 1.0 - mu2    (good step)
52*fb90e4d1STodd Munson        choose tau in [gamma2, gamma3]
53*fb90e4d1STodd Munson        if (tau >= 1.0)
54*fb90e4d1STodd Munson          radius = max(tau * norm(d), radius)
55*fb90e4d1STodd Munson        else
56*fb90e4d1STodd Munson          radius = tau * min(norm(d), radius)
57*fb90e4d1STodd Munson        fi
58*fb90e4d1STodd Munson      else                       (bad step)
59*fb90e4d1STodd Munson        choose tau in [gamma1, 1.0]
60*fb90e4d1STodd Munson        radius = tau * min(norm(d), radius)
61*fb90e4d1STodd Munson      fi
62*fb90e4d1STodd Munson   */
63*fb90e4d1STodd Munson 
64*fb90e4d1STodd Munson   PetscReal mu1;           /*  used for model agreement in radius update */
65*fb90e4d1STodd Munson   PetscReal mu2;           /*  used for model agreement in radius update */
66*fb90e4d1STodd Munson 
67*fb90e4d1STodd Munson   PetscReal gamma1;        /*  factor used for radius update */
68*fb90e4d1STodd Munson   PetscReal gamma2;        /*  factor used for radius update */
69*fb90e4d1STodd Munson   PetscReal gamma3;        /*  factor used for radius update */
70*fb90e4d1STodd Munson   PetscReal gamma4;        /*  factor used for radius update */
71*fb90e4d1STodd Munson 
72*fb90e4d1STodd Munson   PetscReal theta;         /*  factor used for radius update */
73*fb90e4d1STodd Munson 
74*fb90e4d1STodd Munson   /* Parameters when initializing trust-region radius based on interpolation */
75*fb90e4d1STodd Munson 
76*fb90e4d1STodd Munson   PetscReal mu1_i;         /*  used for model agreement in interpolation */
77*fb90e4d1STodd Munson   PetscReal mu2_i;         /*  used for model agreement in interpolation */
78*fb90e4d1STodd Munson 
79*fb90e4d1STodd Munson   PetscReal gamma1_i;      /*  factor used for interpolation */
80*fb90e4d1STodd Munson   PetscReal gamma2_i;      /*  factor used for interpolation */
81*fb90e4d1STodd Munson   PetscReal gamma3_i;      /*  factor used for interpolation */
82*fb90e4d1STodd Munson   PetscReal gamma4_i;      /*  factor used for interpolation */
83*fb90e4d1STodd Munson 
84*fb90e4d1STodd Munson   PetscReal theta_i;       /*  factor used for interpolation */
85*fb90e4d1STodd Munson 
86*fb90e4d1STodd Munson   PetscReal min_radius;    /*  lower bound on initial radius value */
87*fb90e4d1STodd Munson   PetscReal max_radius;    /*  upper bound on trust region radius */
88*fb90e4d1STodd Munson   PetscReal epsilon;       /*  tolerance used when computing actred/prered */
89*fb90e4d1STodd Munson 
90*fb90e4d1STodd Munson   PetscInt pc_type;        /*  Preconditioner for the code */
91*fb90e4d1STodd Munson   PetscInt bfgs_scale_type;/*  Scaling matrix for the bfgs preconditioner */
92*fb90e4d1STodd Munson   PetscInt init_type;      /*  Trust-region initialization method */
93*fb90e4d1STodd Munson   PetscInt update_type;    /*  Trust-region update method */
94*fb90e4d1STodd Munson } TAO_NTR;
95*fb90e4d1STodd Munson 
96*fb90e4d1STodd Munson #endif /* ifndef __TAO_NTR_H */
97