xref: /petsc/src/tao/bound/impls/bncg/bncg.h (revision 50b47da0f1ee44d44f7d7183a5d0083a5c160eaf)
1ac9112b8SAlp Dener /*
2ac9112b8SAlp Dener     Context for bound-constrained nonlinear conjugate gradient method
3ac9112b8SAlp Dener  */
4ac9112b8SAlp Dener 
5ac9112b8SAlp Dener 
6ac9112b8SAlp Dener #ifndef __TAO_BNCG_H
7ac9112b8SAlp Dener #define __TAO_BNCG_H
8ac9112b8SAlp Dener 
9ac9112b8SAlp Dener #include <petsc/private/taoimpl.h>
10ac9112b8SAlp Dener 
11ac9112b8SAlp Dener typedef struct {
12*50b47da0SAdam Denchfield   Mat B;
13*50b47da0SAdam Denchfield   Vec G_old, X_old, W, work;
14c8bcdf1eSAdam Denchfield   Vec g_work, y_work, d_work;
15c8bcdf1eSAdam Denchfield   Vec sk, yk;
16c8bcdf1eSAdam Denchfield   Vec steffnm1, steffn, steffnp1;
17*50b47da0SAdam Denchfield   Vec steffva, steffvatmp;
1889da521bSAlp Dener   Vec unprojected_gradient, unprojected_gradient_old;
19ac9112b8SAlp Dener   Vec inactive_grad, inactive_step;
2061be54a6SAlp Dener 
21*50b47da0SAdam Denchfield   PetscReal alpha;                   /* convex ratio in the scalar scaling */
22*50b47da0SAdam Denchfield   PetscReal hz_theta;
23*50b47da0SAdam Denchfield   PetscReal xi;                      /* Parameter for KD, DK, and HZ methods. */
24*50b47da0SAdam Denchfield   PetscReal theta;                   /* The convex combination parameter in the SSML_Broyden method. */
25*50b47da0SAdam Denchfield   PetscReal zeta;                    /* Another parameter, exclusive to Kou-Dai, modifying the y_k scalar contribution */
26*50b47da0SAdam Denchfield   PetscReal hz_eta, dk_eta;
27*50b47da0SAdam Denchfield   PetscReal bfgs_scale, dfp_scale;   /* Scaling of the bfgs/dfp tau parameter in the bfgs and broyden methods. Default 1. */
28*50b47da0SAdam Denchfield   PetscReal tau_bfgs, tau_dfp;
29*50b47da0SAdam Denchfield   PetscReal as_step, as_tol, yts, yty, sts;
30c0f10754SAlp Dener   PetscReal f;
31*50b47da0SAdam Denchfield   PetscReal epsilon;                 /* Machine precision unless changed by user */
32c8bcdf1eSAdam Denchfield   PetscReal eps_23;                  /*  Two-thirds power of machine precision */
33*50b47da0SAdam Denchfield 
34*50b47da0SAdam Denchfield   IS  active_lower, active_upper, active_fixed, active_idx, inactive_idx, inactive_old, new_inactives;
35*50b47da0SAdam Denchfield 
36*50b47da0SAdam Denchfield   PetscInt cg_type;                  /*  Formula to use */
37*50b47da0SAdam Denchfield   PetscInt  min_restart_num;         /* Restarts every x*n iterations, where n is the dimension */
38*50b47da0SAdam Denchfield   PetscInt ls_fails, resets, descent_error;
39*50b47da0SAdam Denchfield   PetscInt iter_quad, min_quad;      /* Dynamic restart variables in Dai-Kou, SIAM J. Optim. Vol 23, pp. 296-320, Algorithm 4.1 */
40*50b47da0SAdam Denchfield   PetscInt  as_type;
41*50b47da0SAdam Denchfield 
42c0f10754SAlp Dener   PetscBool recycle;
43c8bcdf1eSAdam Denchfield   PetscBool inv_sig;
44c8bcdf1eSAdam Denchfield   PetscReal tol_quad;                /* tolerance for Dai-Kou dynamic restart */
45c8bcdf1eSAdam Denchfield   PetscBool dynamic_restart;         /* Keeps track of whether or not to do a dynamic (KD) restart */
46c8bcdf1eSAdam Denchfield   PetscBool use_steffenson;          /* In development - attempting to use vector-based steffenson acceleration to the fixed point */
47c8bcdf1eSAdam Denchfield   PetscBool spaced_restart;          /* If true, restarts the CG method every x*n iterations */
48c8bcdf1eSAdam Denchfield   PetscBool use_dynamic_restart;
49c8bcdf1eSAdam Denchfield   PetscBool neg_xi;
50*50b47da0SAdam Denchfield   PetscBool unscaled_restart;        /* Gradient descent restarts are done without rescaling*/
51c8bcdf1eSAdam Denchfield   PetscBool diag_scaling;
52*50b47da0SAdam Denchfield 
53ac9112b8SAlp Dener } TAO_BNCG;
54ac9112b8SAlp Dener 
55ac9112b8SAlp Dener #endif /* ifndef __TAO_BNCG_H */
56ac9112b8SAlp Dener 
5761be54a6SAlp Dener PETSC_INTERN PetscErrorCode TaoBNCGEstimateActiveSet(Tao, PetscInt);
58a1318120SAlp Dener PETSC_INTERN PetscErrorCode TaoBNCGBoundStep(Tao, PetscInt, Vec);
59c0f10754SAlp Dener PETSC_EXTERN PetscErrorCode TaoBNCGSetRecycleFlag(Tao, PetscBool);
60c8bcdf1eSAdam Denchfield PETSC_INTERN PetscErrorCode TaoBNCGComputeScalarScaling(PetscReal, PetscReal, PetscReal, PetscReal*, PetscReal);
61c8bcdf1eSAdam Denchfield PETSC_INTERN PetscErrorCode TaoBNCGConductIteration(Tao, PetscReal);
62c8bcdf1eSAdam Denchfield PETSC_INTERN PetscErrorCode TaoBNCGStepDirectionUpdate(Tao, PetscReal, PetscReal, PetscReal, PetscReal, PetscBool, PetscReal, PetscReal);
63c8bcdf1eSAdam Denchfield PETSC_INTERN PetscErrorCode TaoBNCGComputeDiagScaling(Tao, PetscReal, PetscReal);
64c8bcdf1eSAdam Denchfield PETSC_INTERN PetscErrorCode TaoBNCGResetUpdate(Tao, PetscReal);
65c8bcdf1eSAdam Denchfield PETSC_INTERN PetscErrorCode TaoBNCGCheckDynamicRestart(Tao, PetscReal, PetscReal, PetscReal, PetscBool*, PetscReal);
66c8bcdf1eSAdam Denchfield PETSC_INTERN PetscErrorCode TaoBNCGSteffensonAcceleration(Tao);
67