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