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