1 #if !defined(TAOADMM_H) 2 #define TAOADMM_H 3 #include <petsc/private/taoimpl.h> 4 5 typedef struct _TaoADMMOps *TaoADMMOps; 6 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 }; 15 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; 40 41 #endif 42