Date: 2022-08-02T03:15:12+00:00

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