Actual source code: admm.h

  1: #if !defined(TAOADMM_H)
  2: #define TAOADMM_H
  3: #include <petsc/private/taoimpl.h>

  5: typedef struct _TaoADMMOps *TaoADMMOps;

  7: struct _TaoADMMOps {
  8:   PetscErrorCode (*misfitobjgrad)(Tao, Vec, PetscReal*, Vec, void*);
  9:   PetscErrorCode (*misfithess)(Tao, Vec, Mat, Mat,  void*);
 10:   PetscErrorCode (*misfitjac)(Tao, Vec, Mat, Mat,  void*);
 11:   PetscErrorCode (*regobjgrad)(Tao, Vec, PetscReal*, Vec, void*);
 12:   PetscErrorCode (*reghess)(Tao, Vec, Mat, Mat,  void*);
 13:   PetscErrorCode (*regjac)(Tao, Vec, Mat, Mat,  void*);
 14: };

 16: typedef struct {
 17:   PETSCHEADER(struct _TaoADMMOps);
 18:   Tao                    subsolverX, subsolverZ, parent;
 19:   Vec                    residual,y,yold,y0,yhat,yhatold,constraint;
 20:   Vec                    z,zold,Ax,Bz,Axold,Bzold,Bz0;
 21:   Vec                    workLeft,workJacobianRight,workJacobianRight2; /*Ax,Bz,y,constraint are workJacobianRight sized. workLeft is solution sized */
 22:   Mat                    Hx,Hxpre,Hz,Hzpre,ATA,BTB,JA,JApre,JB,JBpre;
 23:   void*                  regobjgradP;
 24:   void*                  reghessP;
 25:   void*                  regjacobianP;
 26:   void*                  misfitobjgradP;
 27:   void*                  misfithessP;
 28:   void*                  misfitjacobianP;
 29:   PetscReal              gamma,last_misfit_val,last_reg_val,l1epsilon;
 30:   PetscReal              lambda,mu,muold,orthval,mueps,tol,mumin;
 31:   PetscReal              Bzdiffnorm,dualres,resnorm,const_norm;
 32:   PetscReal              gatol_admm,catol_admm;
 33:   PetscInt               T;                                             /* adaptive iteration cutoff */
 34:   PetscBool              xJI, zJI;                                      /* Bool to check whether A,B Jacobians are NULL-set identity */
 35:   PetscBool              Hxchange, Hzchange;                            /* Bool to check whether Hx,Hz change wrt to x and z */
 36:   PetscBool              Hxbool, Hzbool;                                /* Bool to make sure Hessian gets updated only once for Hchange False case */
 37:   TaoADMMUpdateType      update;                                        /* update policy for mu */
 38:   TaoADMMRegularizerType regswitch;                                     /* regularization policy */
 39: } TAO_ADMM;

 41: #endif