Lines Matching refs:am
29 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMToleranceUpdate() local
35 mis = am->subsolverX; in TaoADMMToleranceUpdate()
36 tempJR = am->workJacobianRight; in TaoADMMToleranceUpdate()
37 tempL = am->workLeft; in TaoADMMToleranceUpdate()
39 …PetscCall(TaoComputeJacobianEquality(mis, am->y, mis->jacobian_equality, mis->jacobian_equality_pr… in TaoADMMToleranceUpdate()
40 PetscCall(MatMultTranspose(mis->jacobian_equality, am->y, tempJR)); in TaoADMMToleranceUpdate()
43 PetscCall(VecWAXPY(tempJR, -1., am->Bzold, am->Bz)); in TaoADMMToleranceUpdate()
45 PetscCall(VecNorm(tempL, NORM_2, &am->dualres)); in TaoADMMToleranceUpdate()
46 am->dualres *= am->mu; in TaoADMMToleranceUpdate()
49 PetscCall(VecNorm(am->Ax, NORM_2, &Axnorm)); in TaoADMMToleranceUpdate()
50 PetscCall(VecNorm(am->Bz, NORM_2, &Bznorm)); in TaoADMMToleranceUpdate()
55 …temp = am->catol_admm * PetscMax(Axnorm, (!am->const_norm) ? Bznorm : PetscMax(Bznorm, am->const_n… in TaoADMMToleranceUpdate()
57 PetscCall(TaoSetTolerances(tao, am->gatol_admm * ATynorm, PETSC_CURRENT, PETSC_CURRENT)); in TaoADMMToleranceUpdate()
64 TAO_ADMM *am = (TAO_ADMM *)tao->data; in AdaptiveADMMPenaltyUpdate() local
70 tempJR = am->workJacobianRight; in AdaptiveADMMPenaltyUpdate()
71 tempJR2 = am->workJacobianRight2; in AdaptiveADMMPenaltyUpdate()
77 PetscCall(VecWAXPY(tempJR, -1., am->Axold, am->Ax)); in AdaptiveADMMPenaltyUpdate()
78 PetscCall(VecWAXPY(tempJR2, -1., am->yhatold, am->yhat)); in AdaptiveADMMPenaltyUpdate()
83 PetscCall(VecWAXPY(tempJR, -1., am->Bz0, am->Bz)); in AdaptiveADMMPenaltyUpdate()
84 PetscCall(VecWAXPY(tempJR2, -1., am->y, am->y0)); in AdaptiveADMMPenaltyUpdate()
89 if (Axyhat > am->orthval * Axdiff_norm * yhatdiff_norm + am->mueps) { in AdaptiveADMMPenaltyUpdate()
95 if (Bzy > am->orthval * Bzdiff_norm * ydiff_norm + am->mueps) { in AdaptiveADMMPenaltyUpdate()
101 am->muold = am->mu; in AdaptiveADMMPenaltyUpdate()
103 am->mu = PetscSqrtReal(a_k * b_k); in AdaptiveADMMPenaltyUpdate()
105 am->mu = a_k; in AdaptiveADMMPenaltyUpdate()
107 am->mu = b_k; in AdaptiveADMMPenaltyUpdate()
109 if (am->mu > am->muold) am->mu = am->muold; in AdaptiveADMMPenaltyUpdate()
110 if (am->mu < am->mumin) am->mu = am->mumin; in AdaptiveADMMPenaltyUpdate()
116 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetRegularizerType_ADMM() local
119 am->regswitch = type; in TaoADMMSetRegularizerType_ADMM()
125 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMGetRegularizerType_ADMM() local
128 *type = am->regswitch; in TaoADMMGetRegularizerType_ADMM()
134 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetUpdateType_ADMM() local
137 am->update = type; in TaoADMMSetUpdateType_ADMM()
143 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMGetUpdateType_ADMM() local
146 *type = am->update; in TaoADMMGetUpdateType_ADMM()
154 TAO_ADMM *am = (TAO_ADMM *)tao->data; in ADMMUpdateConstraintResidualVector() local
158 mis = am->subsolverX; in ADMMUpdateConstraintResidualVector()
159 reg = am->subsolverZ; in ADMMUpdateConstraintResidualVector()
166 if (am->constraint != NULL) PetscCall(VecAXPY(residual, -1., am->constraint)); in ADMMUpdateConstraintResidualVector()
176 TAO_ADMM *am = (TAO_ADMM *)parent->data; in SubObjGradUpdate() local
181 tempJR = am->workJacobianRight; in SubObjGradUpdate()
182 …tscCall(ADMMUpdateConstraintResidualVector(parent, x, am->subsolverZ->solution, am->Ax, am->Bz, am… in SubObjGradUpdate()
183 PetscCall((*am->ops->misfitobjgrad)(am->subsolverX, x, f, g, am->misfitobjgradP)); in SubObjGradUpdate()
185 am->last_misfit_val = *f; in SubObjGradUpdate()
187 PetscCall(VecTDot(am->residual, am->y, &temp)); in SubObjGradUpdate()
188 PetscCall(VecTDot(am->residual, am->residual, &temp2)); in SubObjGradUpdate()
189 *f += temp + (am->mu / 2) * temp2; in SubObjGradUpdate()
192 PetscCall(MatMultTranspose(tao->jacobian_equality, am->residual, tempJR)); in SubObjGradUpdate()
193 PetscCall(VecAXPY(g, am->mu, tempJR)); in SubObjGradUpdate()
194 PetscCall(MatMultTranspose(tao->jacobian_equality, am->y, tempJR)); in SubObjGradUpdate()
205 TAO_ADMM *am = (TAO_ADMM *)parent->data; in RegObjGradUpdate() local
210 tempJR = am->workJacobianRight; in RegObjGradUpdate()
211 …PetscCall(ADMMUpdateConstraintResidualVector(parent, am->subsolverX->solution, z, am->Ax, am->Bz, … in RegObjGradUpdate()
212 PetscCall((*am->ops->regobjgrad)(am->subsolverZ, z, f, g, am->regobjgradP)); in RegObjGradUpdate()
213 am->last_reg_val = *f; in RegObjGradUpdate()
215 PetscCall(VecTDot(am->residual, am->y, &temp)); in RegObjGradUpdate()
216 PetscCall(VecTDot(am->residual, am->residual, &temp2)); in RegObjGradUpdate()
217 *f += temp + (am->mu / 2) * temp2; in RegObjGradUpdate()
220 PetscCall(MatMultTranspose(am->subsolverZ->jacobian_equality, am->residual, tempJR)); in RegObjGradUpdate()
221 PetscCall(VecAXPY(g, am->mu, tempJR)); in RegObjGradUpdate()
222 PetscCall(MatMultTranspose(am->subsolverZ->jacobian_equality, am->y, tempJR)); in RegObjGradUpdate()
230 TAO_ADMM *am = (TAO_ADMM *)tao->data; in ADMML1EpsilonNorm() local
234 PetscCall(VecGetSize(am->workLeft, &N)); in ADMML1EpsilonNorm()
235 PetscCall(VecPointwiseMult(am->workLeft, x, x)); in ADMML1EpsilonNorm()
236 PetscCall(VecShift(am->workLeft, am->l1epsilon * am->l1epsilon)); in ADMML1EpsilonNorm()
237 PetscCall(VecSqrtAbs(am->workLeft)); in ADMML1EpsilonNorm()
238 PetscCall(VecSum(am->workLeft, norm)); in ADMML1EpsilonNorm()
239 *norm += N * am->l1epsilon; in ADMML1EpsilonNorm()
240 *norm *= am->lambda; in ADMML1EpsilonNorm()
246 TAO_ADMM *am = (TAO_ADMM *)ptr; in ADMMInternalHessianUpdate() local
249 switch (am->update) { in ADMMInternalHessianUpdate()
254 if (H && (am->muold != am->mu)) { in ADMMInternalHessianUpdate()
256 PetscCall(MatAXPY(H, am->mu - am->muold, Constraint, DIFFERENT_NONZERO_PATTERN)); in ADMMInternalHessianUpdate()
258 PetscCall(MatShift(H, am->mu - am->muold)); in ADMMInternalHessianUpdate()
276 TAO_ADMM *am = (TAO_ADMM *)parent->data; in SubHessianUpdate() local
279 if (am->Hxchange) { in SubHessianUpdate()
281 PetscCall((*am->ops->misfithess)(am->subsolverX, x, H, Hpre, am->misfithessP)); in SubHessianUpdate()
282 PetscCall(ADMMInternalHessianUpdate(am->subsolverX->hessian, am->ATA, am->xJI, am)); in SubHessianUpdate()
283 } else if (am->Hxbool) { in SubHessianUpdate()
286 PetscCall(ADMMInternalHessianUpdate(am->subsolverX->hessian, am->ATA, am->xJI, am)); in SubHessianUpdate()
287 am->Hxbool = PETSC_FALSE; in SubHessianUpdate()
296 TAO_ADMM *am = (TAO_ADMM *)parent->data; in RegHessianUpdate() local
299 if (am->Hzchange) { in RegHessianUpdate()
301 PetscCall((*am->ops->reghess)(am->subsolverZ, z, H, Hpre, am->reghessP)); in RegHessianUpdate()
302 PetscCall(ADMMInternalHessianUpdate(am->subsolverZ->hessian, am->BTB, am->zJI, am)); in RegHessianUpdate()
303 } else if (am->Hzbool) { in RegHessianUpdate()
306 PetscCall(ADMMInternalHessianUpdate(am->subsolverZ->hessian, am->BTB, am->zJI, am)); in RegHessianUpdate()
307 am->Hzbool = PETSC_FALSE; in RegHessianUpdate()
338 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoSolve_ADMM() local
345 if (am->regswitch != TAO_ADMM_REGULARIZER_SOFT_THRESH) { in TaoSolve_ADMM()
346 …PetscCheck(am->subsolverX->ops->computejacobianequality, PetscObjectComm((PetscObject)tao), PETSC_… in TaoSolve_ADMM()
347 …PetscCheck(am->subsolverZ->ops->computejacobianequality, PetscObjectComm((PetscObject)tao), PETSC_… in TaoSolve_ADMM()
348 if (am->constraint != NULL) PetscCall(VecNorm(am->constraint, NORM_2, &am->const_norm)); in TaoSolve_ADMM()
350 tempL = am->workLeft; in TaoSolve_ADMM()
353 …if (am->Hx && am->ops->misfithess) PetscCall(TaoSetHessian(am->subsolverX, am->Hx, am->Hx, SubHess… in TaoSolve_ADMM()
355 if (!am->zJI) { in TaoSolve_ADMM()
357 PetscCall(MatTransposeMatMult(am->JB, am->JB, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &am->BTB)); in TaoSolve_ADMM()
359 if (!am->xJI) { in TaoSolve_ADMM()
361 …(MatTransposeMatMult(am->subsolverX->jacobian_equality, am->subsolverX->jacobian_equality, MAT_INI… in TaoSolve_ADMM()
366 PetscCall(PetscObjectTypeCompare((PetscObject)am->subsolverZ, TAOSHELL, &is_reg_shell)); in TaoSolve_ADMM()
369 switch (am->regswitch) { in TaoSolve_ADMM()
376 …if (am->ops->regobjgrad) PetscCall(TaoSetObjectiveAndGradient(am->subsolverZ, NULL, RegObjGradUpda… in TaoSolve_ADMM()
377 …if (am->Hz && am->ops->reghess) PetscCall(TaoSetHessian(am->subsolverZ, am->Hz, am->Hzpre, RegHess… in TaoSolve_ADMM()
380 switch (am->update) { in TaoSolve_ADMM()
382 if (am->subsolverX->hessian) { in TaoSolve_ADMM()
385 if (!am->xJI) { in TaoSolve_ADMM()
386 PetscCall(MatAXPY(am->subsolverX->hessian, am->mu, am->ATA, DIFFERENT_NONZERO_PATTERN)); in TaoSolve_ADMM()
388 PetscCall(MatShift(am->subsolverX->hessian, am->mu)); in TaoSolve_ADMM()
391 if (am->subsolverZ->hessian && am->regswitch == TAO_ADMM_REGULARIZER_USER) { in TaoSolve_ADMM()
392 if (am->regswitch == TAO_ADMM_REGULARIZER_USER && !am->zJI) { in TaoSolve_ADMM()
393 PetscCall(MatAXPY(am->subsolverZ->hessian, am->mu, am->BTB, DIFFERENT_NONZERO_PATTERN)); in TaoSolve_ADMM()
395 PetscCall(MatShift(am->subsolverZ->hessian, am->mu)); in TaoSolve_ADMM()
409 PetscCall(VecCopy(am->Bz, am->Bzold)); in TaoSolve_ADMM()
412 PetscCall(TaoSolve(am->subsolverX)); in TaoSolve_ADMM()
413 …PetscCall(TaoComputeJacobianEquality(am->subsolverX, am->subsolverX->solution, am->subsolverX->jac… in TaoSolve_ADMM()
414 PetscCall(MatMult(am->subsolverX->jacobian_equality, am->subsolverX->solution, am->Ax)); in TaoSolve_ADMM()
416 am->Hxbool = PETSC_TRUE; in TaoSolve_ADMM()
419 switch (am->regswitch) { in TaoSolve_ADMM()
421 PetscCall(TaoSolve(am->subsolverZ)); in TaoSolve_ADMM()
425 PetscCall(VecWAXPY(am->workJacobianRight, 1 / am->mu, am->y, am->Ax)); in TaoSolve_ADMM()
426 …PetscCall(TaoSoftThreshold(am->workJacobianRight, -am->lambda / am->mu, am->lambda / am->mu, am->s… in TaoSolve_ADMM()
429 am->Hzbool = PETSC_TRUE; in TaoSolve_ADMM()
431 …(ADMMUpdateConstraintResidualVector(tao, am->subsolverX->solution, am->subsolverZ->solution, am->A… in TaoSolve_ADMM()
433 PetscCall(VecWAXPY(am->y, am->mu, am->residual, am->yold)); in TaoSolve_ADMM()
439 switch (am->update) { in TaoSolve_ADMM()
441 am->muold = am->mu; in TaoSolve_ADMM()
446 PetscCall(VecCopy(am->y, am->y0)); in TaoSolve_ADMM()
447 PetscCall(VecWAXPY(am->residual, 1., am->Ax, am->Bzold)); in TaoSolve_ADMM()
448 if (am->constraint) PetscCall(VecAXPY(am->residual, -1., am->constraint)); in TaoSolve_ADMM()
449 PetscCall(VecWAXPY(am->yhatold, -am->mu, am->residual, am->yold)); in TaoSolve_ADMM()
450 PetscCall(VecCopy(am->Ax, am->Axold)); in TaoSolve_ADMM()
451 PetscCall(VecCopy(am->Bz, am->Bz0)); in TaoSolve_ADMM()
452 am->muold = am->mu; in TaoSolve_ADMM()
453 } else if (tao->niter % am->T == 1) { in TaoSolve_ADMM()
455 PetscCall(VecWAXPY(am->residual, 1., am->Ax, am->Bzold)); in TaoSolve_ADMM()
456 if (am->constraint) PetscCall(VecAXPY(am->residual, -1., am->constraint)); in TaoSolve_ADMM()
457 PetscCall(VecWAXPY(am->yhat, -am->mu, am->residual, am->yold)); in TaoSolve_ADMM()
459 PetscCall(VecCopy(am->Ax, am->Axold)); in TaoSolve_ADMM()
460 PetscCall(VecCopy(am->Bz, am->Bz0)); in TaoSolve_ADMM()
461 PetscCall(VecCopy(am->yhat, am->yhatold)); in TaoSolve_ADMM()
462 PetscCall(VecCopy(am->y, am->y0)); in TaoSolve_ADMM()
464 am->muold = am->mu; in TaoSolve_ADMM()
473 switch (am->regswitch) { in TaoSolve_ADMM()
476 PetscCall(ADMML1EpsilonNorm(tao, am->subsolverZ->solution, am->l1epsilon, ®_func)); in TaoSolve_ADMM()
478 …PetscCall((*am->ops->regobjgrad)(am->subsolverZ, am->subsolverX->solution, ®_func, tempL, am->r… in TaoSolve_ADMM()
482 PetscCall(ADMML1EpsilonNorm(tao, am->subsolverZ->solution, am->l1epsilon, ®_func)); in TaoSolve_ADMM()
485 PetscCall(VecCopy(am->y, am->yold)); in TaoSolve_ADMM()
486 …(ADMMUpdateConstraintResidualVector(tao, am->subsolverX->solution, am->subsolverZ->solution, am->A… in TaoSolve_ADMM()
487 PetscCall(VecNorm(am->residual, NORM_2, &am->resnorm)); in TaoSolve_ADMM()
488 …PetscCall(TaoLogConvergenceHistory(tao, am->last_misfit_val + reg_func, am->dualres, am->resnorm, … in TaoSolve_ADMM()
490 …PetscCall(TaoMonitor(tao, tao->niter, am->last_misfit_val + reg_func, am->dualres, am->resnorm, 1.… in TaoSolve_ADMM()
494 PetscCall(VecCopy(am->subsolverX->solution, tao->solution)); in TaoSolve_ADMM()
495 PetscCall(VecCopy(am->subsolverX->gradient, tao->gradient)); in TaoSolve_ADMM()
496 PetscCall(PetscObjectCompose((PetscObject)am->subsolverX, "TaoGetADMMParentTao_ADMM", NULL)); in TaoSolve_ADMM()
497 PetscCall(PetscObjectCompose((PetscObject)am->subsolverZ, "TaoGetADMMParentTao_ADMM", NULL)); in TaoSolve_ADMM()
507 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoSetFromOptions_ADMM() local
511 …eal("-tao_admm_regularizer_coefficient", "regularizer constant", "", am->lambda, &am->lambda, NULL… in TaoSetFromOptions_ADMM()
512 …tao_admm_spectral_penalty", "Constant for Augmented Lagrangian term.", "", am->mu, &am->mu, NULL)); in TaoSetFromOptions_ADMM()
513 …m_relaxation_parameter", "x relaxation parameter for Z update.", "", am->gamma, &am->gamma, NULL)); in TaoSetFromOptions_ADMM()
514 …m_tolerance_update_factor", "ADMM dynamic tolerance update factor.", "", am->tol, &am->tol, NULL)); in TaoSetFromOptions_ADMM()
515 …or", "ADMM spectral penalty update curvature safeguard value.", "", am->orthval, &am->orthval, NUL… in TaoSetFromOptions_ADMM()
516 …minimum_spectral_penalty", "Set ADMM minimum spectral penalty.", "", am->mumin, &am->mumin, NULL)); in TaoSetFromOptions_ADMM()
517 … policy", "TaoADMMUpdateType", TaoADMMUpdateTypes, (PetscEnum)am->update, (PetscEnum *)&am->update… in TaoSetFromOptions_ADMM()
518 …TaoADMMRegularizerType", TaoADMMRegularizerTypes, (PetscEnum)am->regswitch, (PetscEnum *)&am->regs… in TaoSetFromOptions_ADMM()
520 PetscCall(TaoSetFromOptions(am->subsolverX)); in TaoSetFromOptions_ADMM()
521 …if (am->regswitch != TAO_ADMM_REGULARIZER_SOFT_THRESH) PetscCall(TaoSetFromOptions(am->subsolverZ)… in TaoSetFromOptions_ADMM()
527 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoView_ADMM() local
531 PetscCall(TaoView(am->subsolverX, viewer)); in TaoView_ADMM()
532 PetscCall(TaoView(am->subsolverZ, viewer)); in TaoView_ADMM()
539 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoSetUp_ADMM() local
546 if (!am->JB) { in TaoSetUp_ADMM()
547 am->zJI = PETSC_TRUE; in TaoSetUp_ADMM()
548 …teShell(PetscObjectComm((PetscObject)tao), n, n, PETSC_DETERMINE, PETSC_DETERMINE, NULL, &am->JB)); in TaoSetUp_ADMM()
549 PetscCall(MatShellSetOperation(am->JB, MATOP_MULT, (PetscErrorCodeFn *)JacobianIdentityB)); in TaoSetUp_ADMM()
550 …PetscCall(MatShellSetOperation(am->JB, MATOP_MULT_TRANSPOSE, (PetscErrorCodeFn *)JacobianIdentityB… in TaoSetUp_ADMM()
551 am->JBpre = am->JB; in TaoSetUp_ADMM()
553 if (!am->JA) { in TaoSetUp_ADMM()
554 am->xJI = PETSC_TRUE; in TaoSetUp_ADMM()
555 …teShell(PetscObjectComm((PetscObject)tao), n, n, PETSC_DETERMINE, PETSC_DETERMINE, NULL, &am->JA)); in TaoSetUp_ADMM()
556 PetscCall(MatShellSetOperation(am->JA, MATOP_MULT, (PetscErrorCodeFn *)JacobianIdentity)); in TaoSetUp_ADMM()
557 …PetscCall(MatShellSetOperation(am->JA, MATOP_MULT_TRANSPOSE, (PetscErrorCodeFn *)JacobianIdentity)… in TaoSetUp_ADMM()
558 am->JApre = am->JA; in TaoSetUp_ADMM()
560 PetscCall(MatCreateVecs(am->JA, NULL, &am->Ax)); in TaoSetUp_ADMM()
562 PetscCall(TaoSetSolution(am->subsolverX, tao->solution)); in TaoSetUp_ADMM()
563 if (!am->z) { in TaoSetUp_ADMM()
564 PetscCall(VecDuplicate(tao->solution, &am->z)); in TaoSetUp_ADMM()
565 PetscCall(VecSet(am->z, 0.0)); in TaoSetUp_ADMM()
567 PetscCall(TaoSetSolution(am->subsolverZ, am->z)); in TaoSetUp_ADMM()
568 if (!am->workLeft) PetscCall(VecDuplicate(tao->solution, &am->workLeft)); in TaoSetUp_ADMM()
569 if (!am->Axold) PetscCall(VecDuplicate(am->Ax, &am->Axold)); in TaoSetUp_ADMM()
570 if (!am->workJacobianRight) PetscCall(VecDuplicate(am->Ax, &am->workJacobianRight)); in TaoSetUp_ADMM()
571 if (!am->workJacobianRight2) PetscCall(VecDuplicate(am->Ax, &am->workJacobianRight2)); in TaoSetUp_ADMM()
572 if (!am->Bz) PetscCall(VecDuplicate(am->Ax, &am->Bz)); in TaoSetUp_ADMM()
573 if (!am->Bzold) PetscCall(VecDuplicate(am->Ax, &am->Bzold)); in TaoSetUp_ADMM()
574 if (!am->Bz0) PetscCall(VecDuplicate(am->Ax, &am->Bz0)); in TaoSetUp_ADMM()
575 if (!am->y) { in TaoSetUp_ADMM()
576 PetscCall(VecDuplicate(am->Ax, &am->y)); in TaoSetUp_ADMM()
577 PetscCall(VecSet(am->y, 0.0)); in TaoSetUp_ADMM()
579 if (!am->yold) { in TaoSetUp_ADMM()
580 PetscCall(VecDuplicate(am->Ax, &am->yold)); in TaoSetUp_ADMM()
581 PetscCall(VecSet(am->yold, 0.0)); in TaoSetUp_ADMM()
583 if (!am->y0) { in TaoSetUp_ADMM()
584 PetscCall(VecDuplicate(am->Ax, &am->y0)); in TaoSetUp_ADMM()
585 PetscCall(VecSet(am->y0, 0.0)); in TaoSetUp_ADMM()
587 if (!am->yhat) { in TaoSetUp_ADMM()
588 PetscCall(VecDuplicate(am->Ax, &am->yhat)); in TaoSetUp_ADMM()
589 PetscCall(VecSet(am->yhat, 0.0)); in TaoSetUp_ADMM()
591 if (!am->yhatold) { in TaoSetUp_ADMM()
592 PetscCall(VecDuplicate(am->Ax, &am->yhatold)); in TaoSetUp_ADMM()
593 PetscCall(VecSet(am->yhatold, 0.0)); in TaoSetUp_ADMM()
595 if (!am->residual) { in TaoSetUp_ADMM()
596 PetscCall(VecDuplicate(am->Ax, &am->residual)); in TaoSetUp_ADMM()
597 PetscCall(VecSet(am->residual, 0.0)); in TaoSetUp_ADMM()
599 if (!am->constraint) { in TaoSetUp_ADMM()
600 am->constraint = NULL; in TaoSetUp_ADMM()
602 PetscCall(VecGetSize(am->constraint, &M)); in TaoSetUp_ADMM()
607 if (tao->gatol != tao->default_gatol) am->gatol_admm = tao->gatol; in TaoSetUp_ADMM()
608 if (tao->catol != tao->default_catol) am->catol_admm = tao->catol; in TaoSetUp_ADMM()
611 PetscCall(TaoSetObjectiveAndGradient(am->subsolverX, NULL, SubObjGradUpdate, tao)); in TaoSetUp_ADMM()
612 …PetscCall(TaoSetJacobianEqualityRoutine(am->subsolverX, am->JA, am->JApre, am->ops->misfitjac, am-… in TaoSetUp_ADMM()
613 …PetscCall(TaoSetJacobianEqualityRoutine(am->subsolverZ, am->JB, am->JBpre, am->ops->regjac, am->re… in TaoSetUp_ADMM()
619 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoDestroy_ADMM() local
622 PetscCall(VecDestroy(&am->z)); in TaoDestroy_ADMM()
623 PetscCall(VecDestroy(&am->Ax)); in TaoDestroy_ADMM()
624 PetscCall(VecDestroy(&am->Axold)); in TaoDestroy_ADMM()
625 PetscCall(VecDestroy(&am->Bz)); in TaoDestroy_ADMM()
626 PetscCall(VecDestroy(&am->Bzold)); in TaoDestroy_ADMM()
627 PetscCall(VecDestroy(&am->Bz0)); in TaoDestroy_ADMM()
628 PetscCall(VecDestroy(&am->residual)); in TaoDestroy_ADMM()
629 PetscCall(VecDestroy(&am->y)); in TaoDestroy_ADMM()
630 PetscCall(VecDestroy(&am->yold)); in TaoDestroy_ADMM()
631 PetscCall(VecDestroy(&am->y0)); in TaoDestroy_ADMM()
632 PetscCall(VecDestroy(&am->yhat)); in TaoDestroy_ADMM()
633 PetscCall(VecDestroy(&am->yhatold)); in TaoDestroy_ADMM()
634 PetscCall(VecDestroy(&am->workLeft)); in TaoDestroy_ADMM()
635 PetscCall(VecDestroy(&am->workJacobianRight)); in TaoDestroy_ADMM()
636 PetscCall(VecDestroy(&am->workJacobianRight2)); in TaoDestroy_ADMM()
638 PetscCall(MatDestroy(&am->JA)); in TaoDestroy_ADMM()
639 PetscCall(MatDestroy(&am->JB)); in TaoDestroy_ADMM()
640 if (!am->xJI) PetscCall(MatDestroy(&am->JApre)); in TaoDestroy_ADMM()
641 if (!am->zJI) PetscCall(MatDestroy(&am->JBpre)); in TaoDestroy_ADMM()
642 if (am->Hx) { in TaoDestroy_ADMM()
643 PetscCall(MatDestroy(&am->Hx)); in TaoDestroy_ADMM()
644 PetscCall(MatDestroy(&am->Hxpre)); in TaoDestroy_ADMM()
646 if (am->Hz) { in TaoDestroy_ADMM()
647 PetscCall(MatDestroy(&am->Hz)); in TaoDestroy_ADMM()
648 PetscCall(MatDestroy(&am->Hzpre)); in TaoDestroy_ADMM()
650 PetscCall(MatDestroy(&am->ATA)); in TaoDestroy_ADMM()
651 PetscCall(MatDestroy(&am->BTB)); in TaoDestroy_ADMM()
652 PetscCall(TaoDestroy(&am->subsolverX)); in TaoDestroy_ADMM()
653 PetscCall(TaoDestroy(&am->subsolverZ)); in TaoDestroy_ADMM()
654 am->parent = NULL; in TaoDestroy_ADMM()
701 TAO_ADMM *am; in TaoCreate_ADMM() local
704 PetscCall(PetscNew(&am)); in TaoCreate_ADMM()
714 tao->data = (void *)am; in TaoCreate_ADMM()
715 am->l1epsilon = 1e-6; in TaoCreate_ADMM()
716 am->lambda = 1e-4; in TaoCreate_ADMM()
717 am->mu = 1.; in TaoCreate_ADMM()
718 am->muold = 0.; in TaoCreate_ADMM()
719 am->mueps = PETSC_MACHINE_EPSILON; in TaoCreate_ADMM()
720 am->mumin = 0.; in TaoCreate_ADMM()
721 am->orthval = 0.2; in TaoCreate_ADMM()
722 am->T = 2; in TaoCreate_ADMM()
723 am->parent = tao; in TaoCreate_ADMM()
724 am->update = TAO_ADMM_UPDATE_BASIC; in TaoCreate_ADMM()
725 am->regswitch = TAO_ADMM_REGULARIZER_SOFT_THRESH; in TaoCreate_ADMM()
726 am->tol = PETSC_SMALL; in TaoCreate_ADMM()
727 am->const_norm = 0; in TaoCreate_ADMM()
728 am->resnorm = 0; in TaoCreate_ADMM()
729 am->dualres = 0; in TaoCreate_ADMM()
730 am->ops->regobjgrad = NULL; in TaoCreate_ADMM()
731 am->ops->reghess = NULL; in TaoCreate_ADMM()
732 am->gamma = 1; in TaoCreate_ADMM()
733 am->regobjgradP = NULL; in TaoCreate_ADMM()
734 am->reghessP = NULL; in TaoCreate_ADMM()
735 am->gatol_admm = 1e-8; in TaoCreate_ADMM()
736 am->catol_admm = 0; in TaoCreate_ADMM()
737 am->Hxchange = PETSC_TRUE; in TaoCreate_ADMM()
738 am->Hzchange = PETSC_TRUE; in TaoCreate_ADMM()
739 am->Hzbool = PETSC_TRUE; in TaoCreate_ADMM()
740 am->Hxbool = PETSC_TRUE; in TaoCreate_ADMM()
742 PetscCall(TaoCreate(PetscObjectComm((PetscObject)tao), &am->subsolverX)); in TaoCreate_ADMM()
743 PetscCall(TaoSetOptionsPrefix(am->subsolverX, "misfit_")); in TaoCreate_ADMM()
744 PetscCall(PetscObjectIncrementTabLevel((PetscObject)am->subsolverX, (PetscObject)tao, 1)); in TaoCreate_ADMM()
745 PetscCall(TaoCreate(PetscObjectComm((PetscObject)tao), &am->subsolverZ)); in TaoCreate_ADMM()
746 PetscCall(TaoSetOptionsPrefix(am->subsolverZ, "reg_")); in TaoCreate_ADMM()
747 PetscCall(PetscObjectIncrementTabLevel((PetscObject)am->subsolverZ, (PetscObject)tao, 1)); in TaoCreate_ADMM()
749 PetscCall(TaoSetType(am->subsolverX, TAONLS)); in TaoCreate_ADMM()
750 PetscCall(TaoSetType(am->subsolverZ, TAONLS)); in TaoCreate_ADMM()
751 …PetscCall(PetscObjectCompose((PetscObject)am->subsolverX, "TaoGetADMMParentTao_ADMM", (PetscObject… in TaoCreate_ADMM()
752 …PetscCall(PetscObjectCompose((PetscObject)am->subsolverZ, "TaoGetADMMParentTao_ADMM", (PetscObject… in TaoCreate_ADMM()
775 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetMisfitHessianChangeStatus() local
778 am->Hxchange = b; in TaoADMMSetMisfitHessianChangeStatus()
797 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetRegHessianChangeStatus() local
800 am->Hzchange = b; in TaoADMMSetRegHessianChangeStatus()
819 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetSpectralPenalty() local
822 am->mu = mu; in TaoADMMSetSpectralPenalty()
843 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMGetSpectralPenalty() local
848 *mu = am->mu; in TaoADMMGetSpectralPenalty()
869 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMGetMisfitSubsolver() local
872 *misfit = am->subsolverX; in TaoADMMGetMisfitSubsolver()
893 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMGetRegularizationSubsolver() local
896 *reg = am->subsolverZ; in TaoADMMGetRegularizationSubsolver()
915 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetConstraintVectorRHS() local
918 am->constraint = c; in TaoADMMSetConstraintVectorRHS()
937 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetMinimumSpectralPenalty() local
940 am->mumin = mu; in TaoADMMSetMinimumSpectralPenalty()
959 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetRegularizerCoefficient() local
962 am->lambda = lambda; in TaoADMMSetRegularizerCoefficient()
983 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMGetRegularizerCoefficient() local
986 *lambda = am->lambda; in TaoADMMGetRegularizerCoefficient()
1008 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetMisfitConstraintJacobian() local
1020 if (ctx) am->misfitjacobianP = ctx; in TaoADMMSetMisfitConstraintJacobian()
1021 if (func) am->ops->misfitjac = func; in TaoADMMSetMisfitConstraintJacobian()
1025 PetscCall(MatDestroy(&am->JA)); in TaoADMMSetMisfitConstraintJacobian()
1026 am->JA = J; in TaoADMMSetMisfitConstraintJacobian()
1030 PetscCall(MatDestroy(&am->JApre)); in TaoADMMSetMisfitConstraintJacobian()
1031 am->JApre = Jpre; in TaoADMMSetMisfitConstraintJacobian()
1054 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetRegularizerConstraintJacobian() local
1066 if (ctx) am->regjacobianP = ctx; in TaoADMMSetRegularizerConstraintJacobian()
1067 if (func) am->ops->regjac = func; in TaoADMMSetRegularizerConstraintJacobian()
1071 PetscCall(MatDestroy(&am->JB)); in TaoADMMSetRegularizerConstraintJacobian()
1072 am->JB = J; in TaoADMMSetRegularizerConstraintJacobian()
1076 PetscCall(MatDestroy(&am->JBpre)); in TaoADMMSetRegularizerConstraintJacobian()
1077 am->JBpre = Jpre; in TaoADMMSetRegularizerConstraintJacobian()
1098 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetMisfitObjectiveAndGradientRoutine() local
1102 am->misfitobjgradP = ctx; in TaoADMMSetMisfitObjectiveAndGradientRoutine()
1103 am->ops->misfitobjgrad = func; in TaoADMMSetMisfitObjectiveAndGradientRoutine()
1126 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetMisfitHessianRoutine() local
1138 if (ctx) am->misfithessP = ctx; in TaoADMMSetMisfitHessianRoutine()
1139 if (func) am->ops->misfithess = func; in TaoADMMSetMisfitHessianRoutine()
1142 PetscCall(MatDestroy(&am->Hx)); in TaoADMMSetMisfitHessianRoutine()
1143 am->Hx = H; in TaoADMMSetMisfitHessianRoutine()
1147 PetscCall(MatDestroy(&am->Hxpre)); in TaoADMMSetMisfitHessianRoutine()
1148 am->Hxpre = Hpre; in TaoADMMSetMisfitHessianRoutine()
1169 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetRegularizerObjectiveAndGradientRoutine() local
1173 am->regobjgradP = ctx; in TaoADMMSetRegularizerObjectiveAndGradientRoutine()
1174 am->ops->regobjgrad = func; in TaoADMMSetRegularizerObjectiveAndGradientRoutine()
1197 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMSetRegularizerHessianRoutine() local
1209 if (ctx) am->reghessP = ctx; in TaoADMMSetRegularizerHessianRoutine()
1210 if (func) am->ops->reghess = func; in TaoADMMSetRegularizerHessianRoutine()
1213 PetscCall(MatDestroy(&am->Hz)); in TaoADMMSetRegularizerHessianRoutine()
1214 am->Hz = H; in TaoADMMSetRegularizerHessianRoutine()
1218 PetscCall(MatDestroy(&am->Hzpre)); in TaoADMMSetRegularizerHessianRoutine()
1219 am->Hzpre = Hpre; in TaoADMMSetRegularizerHessianRoutine()
1264 TAO_ADMM *am = (TAO_ADMM *)tao->data; in TaoADMMGetDualVector() local
1268 *Y = am->y; in TaoADMMGetDualVector()