16285c0a3SHansol Suh #if !defined(TAOADMM_H) 26285c0a3SHansol Suh #define TAOADMM_H 36285c0a3SHansol Suh #include <petsc/private/taoimpl.h> 46285c0a3SHansol Suh 56285c0a3SHansol Suh typedef struct _TaoADMMOps *TaoADMMOps; 66285c0a3SHansol Suh 76285c0a3SHansol Suh struct _TaoADMMOps { 86285c0a3SHansol Suh PetscErrorCode (*misfitobjgrad)(Tao, Vec, PetscReal*, Vec, void*); 96285c0a3SHansol Suh PetscErrorCode (*misfithess)(Tao, Vec, Mat, Mat, void*); 106285c0a3SHansol Suh PetscErrorCode (*misfitjac)(Tao, Vec, Mat, Mat, void*); 116285c0a3SHansol Suh PetscErrorCode (*regobjgrad)(Tao, Vec, PetscReal*, Vec, void*); 126285c0a3SHansol Suh PetscErrorCode (*reghess)(Tao, Vec, Mat, Mat, void*); 136285c0a3SHansol Suh PetscErrorCode (*regjac)(Tao, Vec, Mat, Mat, void*); 146285c0a3SHansol Suh }; 156285c0a3SHansol Suh 166285c0a3SHansol Suh typedef struct { 176285c0a3SHansol Suh PETSCHEADER(struct _TaoADMMOps); 186285c0a3SHansol Suh Tao subsolverX, subsolverZ, parent; 196285c0a3SHansol Suh Vec residual,y,yold,y0,yhat,yhatold,constraint; 206285c0a3SHansol Suh Vec z,zold,Ax,Bz,Axold,Bzold,Bz0; 216285c0a3SHansol Suh Vec workLeft,workJacobianRight,workJacobianRight2; /*Ax,Bz,y,constraint are workJacobianRight sized. workLeft is solution sized */ 226285c0a3SHansol Suh Mat Hx,Hxpre,Hz,Hzpre,ATA,BTB,JA,JApre,JB,JBpre; 236285c0a3SHansol Suh void* regobjgradP; 246285c0a3SHansol Suh void* reghessP; 256285c0a3SHansol Suh void* regjacobianP; 266285c0a3SHansol Suh void* misfitobjgradP; 276285c0a3SHansol Suh void* misfithessP; 286285c0a3SHansol Suh void* misfitjacobianP; 296285c0a3SHansol Suh PetscReal gamma,last_misfit_val,last_reg_val,l1epsilon; 306285c0a3SHansol Suh PetscReal lambda,mu,muold,orthval,mueps,tol,mumin; 316285c0a3SHansol Suh PetscReal Bzdiffnorm,dualres,resnorm,const_norm; 326285c0a3SHansol Suh PetscReal gatol_admm,catol_admm; 33*7f5c9be9SBarry Smith PetscInt T; /* adaptive iteration cutoff */ 346285c0a3SHansol Suh PetscBool xJI, zJI; /* Bool to check whether A,B Jacobians are NULL-set identity */ 356285c0a3SHansol Suh PetscBool Hxchange, Hzchange; /* Bool to check whether Hx,Hz change wrt to x and z */ 366285c0a3SHansol Suh PetscBool Hxbool, Hzbool; /* Bool to make sure Hessian gets updated only once for Hchange False case */ 376285c0a3SHansol Suh TaoADMMUpdateType update; /* update policy for mu */ 386285c0a3SHansol Suh TaoADMMRegularizerType regswitch; /* regularization policy */ 396285c0a3SHansol Suh } TAO_ADMM; 406285c0a3SHansol Suh 416285c0a3SHansol Suh #endif 42