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