1*6285c0a3SHansol Suh #if !defined(TAOADMM_H) 2*6285c0a3SHansol Suh #define TAOADMM_H 3*6285c0a3SHansol Suh #include <petsc/private/taoimpl.h> 4*6285c0a3SHansol Suh 5*6285c0a3SHansol Suh typedef struct _TaoADMMOps *TaoADMMOps; 6*6285c0a3SHansol Suh 7*6285c0a3SHansol Suh struct _TaoADMMOps { 8*6285c0a3SHansol Suh PetscErrorCode (*misfitobjgrad)(Tao, Vec, PetscReal*, Vec, void*); 9*6285c0a3SHansol Suh PetscErrorCode (*misfithess)(Tao, Vec, Mat, Mat, void*); 10*6285c0a3SHansol Suh PetscErrorCode (*misfitjac)(Tao, Vec, Mat, Mat, void*); 11*6285c0a3SHansol Suh PetscErrorCode (*regobjgrad)(Tao, Vec, PetscReal*, Vec, void*); 12*6285c0a3SHansol Suh PetscErrorCode (*reghess)(Tao, Vec, Mat, Mat, void*); 13*6285c0a3SHansol Suh PetscErrorCode (*regjac)(Tao, Vec, Mat, Mat, void*); 14*6285c0a3SHansol Suh }; 15*6285c0a3SHansol Suh 16*6285c0a3SHansol Suh typedef struct { 17*6285c0a3SHansol Suh PETSCHEADER(struct _TaoADMMOps); 18*6285c0a3SHansol Suh Tao subsolverX, subsolverZ, parent; 19*6285c0a3SHansol Suh Vec residual,y,yold,y0,yhat,yhatold,constraint; 20*6285c0a3SHansol Suh Vec z,zold,Ax,Bz,Axold,Bzold,Bz0; 21*6285c0a3SHansol Suh Vec workLeft,workJacobianRight,workJacobianRight2; /*Ax,Bz,y,constraint are workJacobianRight sized. workLeft is solution sized */ 22*6285c0a3SHansol Suh Mat Hx,Hxpre,Hz,Hzpre,ATA,BTB,JA,JApre,JB,JBpre; 23*6285c0a3SHansol Suh void* regobjgradP; 24*6285c0a3SHansol Suh void* reghessP; 25*6285c0a3SHansol Suh void* regjacobianP; 26*6285c0a3SHansol Suh void* misfitobjgradP; 27*6285c0a3SHansol Suh void* misfithessP; 28*6285c0a3SHansol Suh void* misfitjacobianP; 29*6285c0a3SHansol Suh PetscReal gamma,last_misfit_val,last_reg_val,l1epsilon; 30*6285c0a3SHansol Suh PetscReal lambda,mu,muold,orthval,mueps,tol,mumin; 31*6285c0a3SHansol Suh PetscReal Bzdiffnorm,dualres,resnorm,const_norm; 32*6285c0a3SHansol Suh PetscReal gatol_admm,catol_admm; 33*6285c0a3SHansol Suh PetscInt T; /*T is adaptive iteration cutoff */ 34*6285c0a3SHansol Suh PetscBool xJI, zJI; /* Bool to check whether A,B Jacobians are NULL-set identity */ 35*6285c0a3SHansol Suh PetscBool Hxchange, Hzchange; /* Bool to check whether Hx,Hz change wrt to x and z */ 36*6285c0a3SHansol Suh PetscBool Hxbool, Hzbool; /* Bool to make sure Hessian gets updated only once for Hchange False case */ 37*6285c0a3SHansol Suh TaoADMMUpdateType update; /* update policy for mu */ 38*6285c0a3SHansol Suh TaoADMMRegularizerType regswitch; /* regularization policy */ 39*6285c0a3SHansol Suh } TAO_ADMM; 40*6285c0a3SHansol Suh 41*6285c0a3SHansol Suh #endif 42