Lines Matching defs:tao

1 #include <../src/tao/constrained/impls/admm/admm.h> /*I "petsctao.h" I*/
27 static PetscErrorCode TaoADMMToleranceUpdate(Tao tao)
29 TAO_ADMM *am = (TAO_ADMM *)tao->data;
56 PetscCall(TaoSetConstraintTolerances(tao, temp, PETSC_CURRENT));
57 PetscCall(TaoSetTolerances(tao, am->gatol_admm * ATynorm, PETSC_CURRENT, PETSC_CURRENT));
62 static PetscErrorCode AdaptiveADMMPenaltyUpdate(Tao tao)
64 TAO_ADMM *am = (TAO_ADMM *)tao->data;
114 static PetscErrorCode TaoADMMSetRegularizerType_ADMM(Tao tao, TaoADMMRegularizerType type)
116 TAO_ADMM *am = (TAO_ADMM *)tao->data;
123 static PetscErrorCode TaoADMMGetRegularizerType_ADMM(Tao tao, TaoADMMRegularizerType *type)
125 TAO_ADMM *am = (TAO_ADMM *)tao->data;
132 static PetscErrorCode TaoADMMSetUpdateType_ADMM(Tao tao, TaoADMMUpdateType type)
134 TAO_ADMM *am = (TAO_ADMM *)tao->data;
141 static PetscErrorCode TaoADMMGetUpdateType_ADMM(Tao tao, TaoADMMUpdateType *type)
143 TAO_ADMM *am = (TAO_ADMM *)tao->data;
152 static PetscErrorCode ADMMUpdateConstraintResidualVector(Tao tao, Vec x, Vec z, Vec Ax, Vec Bz, Vec residual)
154 TAO_ADMM *am = (TAO_ADMM *)tao->data;
173 static PetscErrorCode SubObjGradUpdate(Tao tao, Vec x, PetscReal *f, Vec g, void *ptr)
192 PetscCall(MatMultTranspose(tao->jacobian_equality, am->residual, tempJR));
194 PetscCall(MatMultTranspose(tao->jacobian_equality, am->y, tempJR));
202 static PetscErrorCode RegObjGradUpdate(Tao tao, Vec z, PetscReal *f, Vec g, void *ptr)
228 static PetscErrorCode ADMML1EpsilonNorm(Tao tao, Vec x, PetscReal eps, PetscReal *norm)
230 TAO_ADMM *am = (TAO_ADMM *)tao->data;
273 static PetscErrorCode SubHessianUpdate(Tao tao, Vec x, Mat H, Mat Hpre, void *ptr)
293 static PetscErrorCode RegHessianUpdate(Tao tao, Vec z, Mat H, Mat Hpre, void *ptr)
314 * TaoSetJacobianEqualityRoutine(tao, NULL,NULL, ...)
325 * TaoADMMSetRegularizerConstraintJacobian(tao, NULL,NULL, ...)
336 static PetscErrorCode TaoSolve_ADMM(Tao tao)
338 TAO_ADMM *am = (TAO_ADMM *)tao->data;
346 PetscCheck(am->subsolverX->ops->computejacobianequality, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_WRONGSTATE, "Must call TaoADMMSetMisfitConstraintJacobian() first");
347 PetscCheck(am->subsolverZ->ops->computejacobianequality, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_WRONGSTATE, "Must call TaoADMMSetRegularizerConstraintJacobian() first");
353 if (am->Hx && am->ops->misfithess) PetscCall(TaoSetHessian(am->subsolverX, am->Hx, am->Hx, SubHessianUpdate, tao));
376 if (am->ops->regobjgrad) PetscCall(TaoSetObjectiveAndGradient(am->subsolverZ, NULL, RegObjGradUpdate, tao));
377 if (am->Hz && am->ops->reghess) PetscCall(TaoSetHessian(am->subsolverZ, am->Hz, am->Hzpre, RegHessianUpdate, tao));
405 tao->reason = TAO_CONTINUE_ITERATING;
407 while (tao->reason == TAO_CONTINUE_ITERATING) {
408 PetscTryTypeMethod(tao, update, tao->niter, tao->user_update);
431 PetscCall(ADMMUpdateConstraintResidualVector(tao, am->subsolverX->solution, am->subsolverZ->solution, am->Ax, am->Bz, am->residual));
436 PetscCall(TaoADMMToleranceUpdate(tao));
445 if (tao->niter == 0) {
453 } else if (tao->niter % am->T == 1) {
458 PetscCall(AdaptiveADMMPenaltyUpdate(tao));
470 tao->niter++;
476 PetscCall(ADMML1EpsilonNorm(tao, am->subsolverZ->solution, am->l1epsilon, &reg_func));
482 PetscCall(ADMML1EpsilonNorm(tao, am->subsolverZ->solution, am->l1epsilon, &reg_func));
486 PetscCall(ADMMUpdateConstraintResidualVector(tao, am->subsolverX->solution, am->subsolverZ->solution, am->Ax, am->Bz, am->residual));
488 PetscCall(TaoLogConvergenceHistory(tao, am->last_misfit_val + reg_func, am->dualres, am->resnorm, tao->ksp_its));
490 PetscCall(TaoMonitor(tao, tao->niter, am->last_misfit_val + reg_func, am->dualres, am->resnorm, 1.0));
491 PetscUseTypeMethod(tao, convergencetest, tao->cnvP);
494 PetscCall(VecCopy(am->subsolverX->solution, tao->solution));
495 PetscCall(VecCopy(am->subsolverX->gradient, tao->gradient));
498 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMSetRegularizerType_C", NULL));
499 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMGetRegularizerType_C", NULL));
500 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMSetUpdateType_C", NULL));
501 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMGetUpdateType_C", NULL));
505 static PetscErrorCode TaoSetFromOptions_ADMM(Tao tao, PetscOptionItems PetscOptionsObject)
507 TAO_ADMM *am = (TAO_ADMM *)tao->data;
525 static PetscErrorCode TaoView_ADMM(Tao tao, PetscViewer viewer)
527 TAO_ADMM *am = (TAO_ADMM *)tao->data;
537 static PetscErrorCode TaoSetUp_ADMM(Tao tao)
539 TAO_ADMM *am = (TAO_ADMM *)tao->data;
543 PetscCall(VecGetLocalSize(tao->solution, &n));
544 PetscCall(VecGetSize(tao->solution, &N));
548 PetscCall(MatCreateShell(PetscObjectComm((PetscObject)tao), n, n, PETSC_DETERMINE, PETSC_DETERMINE, NULL, &am->JB));
555 PetscCall(MatCreateShell(PetscObjectComm((PetscObject)tao), n, n, PETSC_DETERMINE, PETSC_DETERMINE, NULL, &am->JA));
561 if (!tao->gradient) PetscCall(VecDuplicate(tao->solution, &tao->gradient));
562 PetscCall(TaoSetSolution(am->subsolverX, tao->solution));
564 PetscCall(VecDuplicate(tao->solution, &am->z));
568 if (!am->workLeft) PetscCall(VecDuplicate(tao->solution, &am->workLeft));
603 PetscCheck(M == N, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_WRONGSTATE, "Solution vector and constraint vector must be of same size!");
606 /* Save changed tao tolerance for adaptive tolerance */
607 if (tao->gatol != tao->default_gatol) am->gatol_admm = tao->gatol;
608 if (tao->catol != tao->default_catol) am->catol_admm = tao->catol;
611 PetscCall(TaoSetObjectiveAndGradient(am->subsolverX, NULL, SubObjGradUpdate, tao));
617 static PetscErrorCode TaoDestroy_ADMM(Tao tao)
619 TAO_ADMM *am = (TAO_ADMM *)tao->data;
655 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMSetRegularizerType_C", NULL));
656 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMGetRegularizerType_C", NULL));
657 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMSetUpdateType_C", NULL));
658 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMGetUpdateType_C", NULL));
659 PetscCall(PetscFree(tao->data));
699 PETSC_EXTERN PetscErrorCode TaoCreate_ADMM(Tao tao)
706 tao->ops->destroy = TaoDestroy_ADMM;
707 tao->ops->setup = TaoSetUp_ADMM;
708 tao->ops->setfromoptions = TaoSetFromOptions_ADMM;
709 tao->ops->view = TaoView_ADMM;
710 tao->ops->solve = TaoSolve_ADMM;
712 PetscCall(TaoParametersInitialize(tao));
714 tao->data = (void *)am;
723 am->parent = tao;
742 PetscCall(TaoCreate(PetscObjectComm((PetscObject)tao), &am->subsolverX));
744 PetscCall(PetscObjectIncrementTabLevel((PetscObject)am->subsolverX, (PetscObject)tao, 1));
745 PetscCall(TaoCreate(PetscObjectComm((PetscObject)tao), &am->subsolverZ));
747 PetscCall(PetscObjectIncrementTabLevel((PetscObject)am->subsolverZ, (PetscObject)tao, 1));
751 PetscCall(PetscObjectCompose((PetscObject)am->subsolverX, "TaoGetADMMParentTao_ADMM", (PetscObject)tao));
752 PetscCall(PetscObjectCompose((PetscObject)am->subsolverZ, "TaoGetADMMParentTao_ADMM", (PetscObject)tao));
753 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMSetRegularizerType_C", TaoADMMSetRegularizerType_ADMM));
754 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMGetRegularizerType_C", TaoADMMGetRegularizerType_ADMM));
755 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMSetUpdateType_C", TaoADMMSetUpdateType_ADMM));
756 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoADMMGetUpdateType_C", TaoADMMGetUpdateType_ADMM));
766 + tao - the Tao solver context.
773 PetscErrorCode TaoADMMSetMisfitHessianChangeStatus(Tao tao, PetscBool b)
775 TAO_ADMM *am = (TAO_ADMM *)tao->data;
788 + tao - the `Tao` solver context
795 PetscErrorCode TaoADMMSetRegHessianChangeStatus(Tao tao, PetscBool b)
797 TAO_ADMM *am = (TAO_ADMM *)tao->data;
810 + tao - the `Tao` solver context
817 PetscErrorCode TaoADMMSetSpectralPenalty(Tao tao, PetscReal mu)
819 TAO_ADMM *am = (TAO_ADMM *)tao->data;
832 . tao - the `Tao` solver context
841 PetscErrorCode TaoADMMGetSpectralPenalty(Tao tao, PetscReal *mu)
843 TAO_ADMM *am = (TAO_ADMM *)tao->data;
846 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
858 . tao - the `Tao` solver context
867 PetscErrorCode TaoADMMGetMisfitSubsolver(Tao tao, Tao *misfit)
869 TAO_ADMM *am = (TAO_ADMM *)tao->data;
882 . tao - the `Tao` solver context
891 PetscErrorCode TaoADMMGetRegularizationSubsolver(Tao tao, Tao *reg)
893 TAO_ADMM *am = (TAO_ADMM *)tao->data;
906 + tao - the `Tao` solver context
913 PetscErrorCode TaoADMMSetConstraintVectorRHS(Tao tao, Vec c)
915 TAO_ADMM *am = (TAO_ADMM *)tao->data;
928 + tao - the `Tao` solver context
935 PetscErrorCode TaoADMMSetMinimumSpectralPenalty(Tao tao, PetscReal mu)
937 TAO_ADMM *am = (TAO_ADMM *)tao->data;
950 + tao - the `Tao` solver context
957 PetscErrorCode TaoADMMSetRegularizerCoefficient(Tao tao, PetscReal lambda)
959 TAO_ADMM *am = (TAO_ADMM *)tao->data;
972 . tao - the `Tao` solver context
981 PetscErrorCode TaoADMMGetRegularizerCoefficient(Tao tao, PetscReal *lambda)
983 TAO_ADMM *am = (TAO_ADMM *)tao->data;
996 + tao - the Tao solver context
1006 PetscErrorCode TaoADMMSetMisfitConstraintJacobian(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void *), PetscCtx ctx)
1008 TAO_ADMM *am = (TAO_ADMM *)tao->data;
1011 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1014 PetscCheckSameComm(tao, 1, J, 2);
1018 PetscCheckSameComm(tao, 1, Jpre, 3);
1042 + tao - the `Tao` solver context
1052 PetscErrorCode TaoADMMSetRegularizerConstraintJacobian(Tao tao, Mat J, Mat Jpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void *), PetscCtx ctx)
1054 TAO_ADMM *am = (TAO_ADMM *)tao->data;
1057 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1060 PetscCheckSameComm(tao, 1, J, 2);
1064 PetscCheckSameComm(tao, 1, Jpre, 3);
1088 + tao - the `Tao` context
1096 PetscErrorCode TaoADMMSetMisfitObjectiveAndGradientRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, PetscReal *, Vec, void *), PetscCtx ctx)
1098 TAO_ADMM *am = (TAO_ADMM *)tao->data;
1101 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1114 + tao - the `Tao` context
1124 PetscErrorCode TaoADMMSetMisfitHessianRoutine(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void *), PetscCtx ctx)
1126 TAO_ADMM *am = (TAO_ADMM *)tao->data;
1129 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1132 PetscCheckSameComm(tao, 1, H, 2);
1136 PetscCheckSameComm(tao, 1, Hpre, 3);
1159 + tao - the Tao context
1167 PetscErrorCode TaoADMMSetRegularizerObjectiveAndGradientRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, PetscReal *, Vec, void *), PetscCtx ctx)
1169 TAO_ADMM *am = (TAO_ADMM *)tao->data;
1172 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1185 + tao - the `Tao` context
1195 PetscErrorCode TaoADMMSetRegularizerHessianRoutine(Tao tao, Mat H, Mat Hpre, PetscErrorCode (*func)(Tao, Vec, Mat, Mat, void *), PetscCtx ctx)
1197 TAO_ADMM *am = (TAO_ADMM *)tao->data;
1200 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1203 PetscCheckSameComm(tao, 1, H, 2);
1207 PetscCheckSameComm(tao, 1, Hpre, 3);
1230 . tao - the `Tao` context
1239 PetscErrorCode TaoGetADMMParentTao(Tao tao, Tao *admm_tao)
1242 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1243 PetscCall(PetscObjectQuery((PetscObject)tao, "TaoGetADMMParentTao_ADMM", (PetscObject *)admm_tao));
1253 . tao - the `Tao` context
1262 PetscErrorCode TaoADMMGetDualVector(Tao tao, Vec *Y)
1264 TAO_ADMM *am = (TAO_ADMM *)tao->data;
1267 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1278 + tao - the `Tao` context
1288 PetscErrorCode TaoADMMSetRegularizerType(Tao tao, TaoADMMRegularizerType type)
1291 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1292 PetscValidLogicalCollectiveEnum(tao, type, 2);
1293 PetscTryMethod(tao, "TaoADMMSetRegularizerType_C", (Tao, TaoADMMRegularizerType), (tao, type));
1303 . tao - the `Tao` context
1312 PetscErrorCode TaoADMMGetRegularizerType(Tao tao, TaoADMMRegularizerType *type)
1315 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1316 PetscUseMethod(tao, "TaoADMMGetRegularizerType_C", (Tao, TaoADMMRegularizerType *), (tao, type));
1326 + tao - the `Tao` context
1333 PetscErrorCode TaoADMMSetUpdateType(Tao tao, TaoADMMUpdateType type)
1336 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1337 PetscValidLogicalCollectiveEnum(tao, type, 2);
1338 PetscTryMethod(tao, "TaoADMMSetUpdateType_C", (Tao, TaoADMMUpdateType), (tao, type));
1348 . tao - the `Tao` context
1357 PetscErrorCode TaoADMMGetUpdateType(Tao tao, TaoADMMUpdateType *type)
1360 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1361 PetscUseMethod(tao, "TaoADMMGetUpdateType_C", (Tao, TaoADMMUpdateType *), (tao, type));