Lines Matching defs:tao

1 #include <../src/tao/leastsquares/impls/brgn/brgn.h> /*I "petsctao.h" I*/
69 . tao - a `Tao` of type `TAOBRGN` with `TAOBRGN_REGULARIZATION_LM` regularization
78 PetscErrorCode TaoBRGNGetDampingVector(Tao tao, Vec *d)
81 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
83 PetscUseMethod((PetscObject)tao, "TaoBRGNGetDampingVector_C", (Tao, Vec *), (tao, d));
87 static PetscErrorCode TaoBRGNGetDampingVector_BRGN(Tao tao, Vec *d)
89 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
92 PetscCheck(gn->reg_type == TAOBRGN_REGULARIZATION_LM, PetscObjectComm((PetscObject)tao), PETSC_ERR_SUP, "Damping vector is only available if regularization type is lm.");
97 static PetscErrorCode GNObjectiveGradientEval(Tao tao, Vec X, PetscReal *fcn, Vec G, void *ptr)
107 PetscCall(TaoComputeResidual(tao, X, tao->ls_res));
108 PetscCall(VecDot(tao->ls_res, tao->ls_res, fcn));
111 PetscCall(TaoComputeResidualJacobian(tao, X, tao->ls_jac, tao->ls_jac_pre));
112 PetscCall(MatMultTranspose(tao->ls_jac, tao->ls_res, G));
116 PetscCall((*gn->regularizerobjandgrad)(tao, X, &f_reg, gn->x_work, gn->reg_obj_ctx));
165 static PetscErrorCode GNComputeHessian(Tao tao, Vec X, Mat H, Mat Hpre, void *ptr)
172 PetscCall(TaoComputeResidualJacobian(tao, X, tao->ls_jac, tao->ls_jac_pre));
173 if (gn->mat_explicit) PetscCall(MatTransposeMatMult(tao->ls_jac, tao->ls_jac, MAT_REUSE_MATRIX, PETSC_DETERMINE, &gn->H));
177 PetscCall((*gn->regularizerhessian)(tao, X, gn->Hreg, gn->reg_hess_ctx));
221 static PetscErrorCode GNHookFunction(Tao tao, PetscInt iter, PetscCtx ctx)
226 /* Update basic tao information from the subsolver */
227 gn->parent->nfuncs = tao->nfuncs;
228 gn->parent->ngrads = tao->ngrads;
229 gn->parent->nfuncgrads = tao->nfuncgrads;
230 gn->parent->nhess = tao->nhess;
231 gn->parent->niter = tao->niter;
232 gn->parent->ksp_its = tao->ksp_its;
233 gn->parent->ksp_tot_its = tao->ksp_tot_its;
234 gn->parent->fc = tao->fc;
235 PetscCall(TaoGetConvergedReason(tao, &gn->parent->reason));
240 PetscCall(VecCopy(tao->solution, gn->x_old));
241 PetscCall(VecCopy(tao->solution, gn->parent->solution));
244 PetscCall(VecCopy(tao->gradient, gn->parent->gradient));
249 if (gn->fc_old > tao->fc) {
256 gn->fc_old = tao->fc;
264 static PetscErrorCode TaoBRGNGetRegularizationType_BRGN(Tao tao, TaoBRGNRegularizationType *type)
266 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
279 . tao - a `Tao` of type `TAOBRGN`
288 PetscErrorCode TaoBRGNGetRegularizationType(Tao tao, TaoBRGNRegularizationType *type)
291 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
293 PetscUseMethod((PetscObject)tao, "TaoBRGNGetRegularizationType_C", (Tao, TaoBRGNRegularizationType *), (tao, type));
297 static PetscErrorCode TaoBRGNSetRegularizationType_BRGN(Tao tao, TaoBRGNRegularizationType type)
299 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
312 + tao - a `Tao` of type `TAOBRGN`
319 PetscErrorCode TaoBRGNSetRegularizationType(Tao tao, TaoBRGNRegularizationType type)
322 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
323 PetscValidLogicalCollectiveEnum(tao, type, 2);
324 PetscTryMethod((PetscObject)tao, "TaoBRGNSetRegularizationType_C", (Tao, TaoBRGNRegularizationType), (tao, type));
328 static PetscErrorCode TaoSolve_BRGN(Tao tao)
330 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
334 /* Update basic tao information from the subsolver */
335 tao->nfuncs = gn->subsolver->nfuncs;
336 tao->ngrads = gn->subsolver->ngrads;
337 tao->nfuncgrads = gn->subsolver->nfuncgrads;
338 tao->nhess = gn->subsolver->nhess;
339 tao->niter = gn->subsolver->niter;
340 tao->ksp_its = gn->subsolver->ksp_its;
341 tao->ksp_tot_its = gn->subsolver->ksp_tot_its;
342 PetscCall(TaoGetConvergedReason(gn->subsolver, &tao->reason));
344 PetscCall(VecCopy(gn->subsolver->solution, tao->solution));
345 PetscCall(VecCopy(gn->subsolver->gradient, tao->gradient));
349 static PetscErrorCode TaoSetFromOptions_BRGN(Tao tao, PetscOptionItems PetscOptionsObject)
351 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
372 static PetscErrorCode TaoView_BRGN(Tao tao, PetscViewer viewer)
374 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
405 static PetscErrorCode TaoSetUp_BRGN(Tao tao)
407 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
412 PetscCheck(tao->ls_res, PetscObjectComm((PetscObject)tao), PETSC_ERR_ORDER, "TaoSetResidualRoutine() must be called before setup!");
416 PetscCheck((!is_bnls && !is_bntr && !is_bntl) || tao->ls_jac, PetscObjectComm((PetscObject)tao), PETSC_ERR_ORDER, "TaoSetResidualJacobianRoutine() must be called before setup!");
417 if (!tao->gradient) PetscCall(VecDuplicate(tao->solution, &tao->gradient));
418 if (!gn->x_work) PetscCall(VecDuplicate(tao->solution, &gn->x_work));
419 if (!gn->r_work) PetscCall(VecDuplicate(tao->ls_res, &gn->r_work));
421 PetscCall(VecDuplicate(tao->solution, &gn->x_old));
431 PetscCall(VecDuplicate(tao->solution, &gn->y)); /* If user does not setup dict matrix, use identity matrix, K=N */
442 if (!gn->diag) PetscCall(MatCreateVecs(tao->ls_jac, &gn->diag, NULL));
443 if (!gn->damping) PetscCall(MatCreateVecs(tao->ls_jac, &gn->damping, NULL));
446 if (!tao->setupcalled) {
449 PetscCall(TaoComputeResidualJacobian(tao, tao->solution, tao->ls_jac, tao->ls_jac_pre));
450 PetscCall(MatTransposeMatMult(tao->ls_jac, tao->ls_jac, MAT_INITIAL_MATRIX, PETSC_DETERMINE, &gn->H));
452 PetscCall(VecGetLocalSize(tao->solution, &n));
453 PetscCall(VecGetSize(tao->solution, &N));
454 PetscCall(MatCreate(PetscObjectComm((PetscObject)tao), &gn->H));
464 PetscCall(TaoSetSolution(gn->subsolver, tao->solution));
465 if (tao->bounded) PetscCall(TaoSetVariableBounds(gn->subsolver, tao->XL, tao->XU));
466 PetscCall(TaoSetResidualRoutine(gn->subsolver, tao->ls_res, tao->ops->computeresidual, tao->user_lsresP));
467 PetscCall(TaoSetJacobianResidualRoutine(gn->subsolver, tao->ls_jac, tao->ls_jac, tao->ops->computeresidualjacobian, tao->user_lsjacP));
471 PetscCall(TaoSetTolerances(gn->subsolver, tao->gatol, tao->grtol, tao->gttol));
472 PetscCall(TaoSetMaximumIterations(gn->subsolver, tao->max_it));
473 PetscCall(TaoSetMaximumFunctionEvaluations(gn->subsolver, tao->max_funcs));
479 static PetscErrorCode TaoDestroy_BRGN(Tao tao)
481 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
484 if (tao->setupcalled) {
485 PetscCall(VecDestroy(&tao->gradient));
500 PetscCall(PetscFree(tao->data));
501 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNGetRegularizationType_C", NULL));
502 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetRegularizationType_C", NULL));
503 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNGetDampingVector_C", NULL));
504 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetDictionaryMatrix_C", NULL));
505 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNGetSubsolver_C", NULL));
506 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetRegularizerWeight_C", NULL));
507 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetL1SmoothEpsilon_C", NULL));
508 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetRegularizerObjectiveAndGradientRoutine_C", NULL));
509 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetRegularizerHessianRoutine_C", NULL));
519 + tao - the Tao solver context
526 PetscErrorCode TaoBRGNGetSubsolver(Tao tao, Tao *subsolver)
529 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
530 PetscUseMethod((PetscObject)tao, "TaoBRGNGetSubsolver_C", (Tao, Tao *), (tao, subsolver));
534 static PetscErrorCode TaoBRGNGetSubsolver_BRGN(Tao tao, Tao *subsolver)
536 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
549 + tao - the `Tao` solver context
556 PetscErrorCode TaoBRGNSetRegularizerWeight(Tao tao, PetscReal lambda)
559 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
560 PetscValidLogicalCollectiveReal(tao, lambda, 2);
561 PetscTryMethod((PetscObject)tao, "TaoBRGNSetRegularizerWeight_C", (Tao, PetscReal), (tao, lambda));
565 static PetscErrorCode TaoBRGNSetRegularizerWeight_BRGN(Tao tao, PetscReal lambda)
567 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
580 + tao - the `Tao` solver context
587 PetscErrorCode TaoBRGNSetL1SmoothEpsilon(Tao tao, PetscReal epsilon)
590 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
591 PetscValidLogicalCollectiveReal(tao, epsilon, 2);
592 PetscTryMethod((PetscObject)tao, "TaoBRGNSetL1SmoothEpsilon_C", (Tao, PetscReal), (tao, epsilon));
596 static PetscErrorCode TaoBRGNSetL1SmoothEpsilon_BRGN(Tao tao, PetscReal epsilon)
598 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
609 + tao - the `Tao` context
616 PetscErrorCode TaoBRGNSetDictionaryMatrix(Tao tao, Mat dict)
619 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
620 PetscTryMethod((PetscObject)tao, "TaoBRGNSetDictionaryMatrix_C", (Tao, Mat), (tao, dict));
624 static PetscErrorCode TaoBRGNSetDictionaryMatrix_BRGN(Tao tao, Mat dict)
626 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
631 PetscCheckSameComm(tao, 1, dict, 2);
644 + tao - the Tao context
649 + tao - the `Tao` context
659 PetscErrorCode TaoBRGNSetRegularizerObjectiveAndGradientRoutine(Tao tao, PetscErrorCode (*func)(Tao tao, Vec u, PetscReal *val, Vec g, PetscCtx ctx), PetscCtx ctx)
662 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
663 PetscTryMethod((PetscObject)tao, "TaoBRGNSetRegularizerObjectiveAndGradientRoutine_C", (Tao, PetscErrorCode (*)(Tao, Vec, PetscReal *, Vec, void *), void *), (tao, func, ctx));
667 static PetscErrorCode TaoBRGNSetRegularizerObjectiveAndGradientRoutine_BRGN(Tao tao, PetscErrorCode (*func)(Tao tao, Vec u, PetscReal *val, Vec g, PetscCtx ctx), PetscCtx ctx)
669 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
682 + tao - the `Tao` context
688 + tao - the `Tao` context
697 PetscErrorCode TaoBRGNSetRegularizerHessianRoutine(Tao tao, Mat Hreg, PetscErrorCode (*func)(Tao tao, Vec u, Mat Hreg, PetscCtx ctx), PetscCtx ctx)
700 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
701 PetscTryMethod((PetscObject)tao, "TaoBRGNSetRegularizerHessianRoutine_C", (Tao, Mat, PetscErrorCode (*)(Tao, Vec, Mat, void *), void *), (tao, Hreg, func, ctx));
705 static PetscErrorCode TaoBRGNSetRegularizerHessianRoutine_BRGN(Tao tao, Mat Hreg, PetscErrorCode (*func)(Tao tao, Vec u, Mat Hreg, PetscCtx ctx), PetscCtx ctx)
707 TAO_BRGN *gn = (TAO_BRGN *)tao->data;
712 PetscCheckSameComm(tao, 1, Hreg, 2);
713 } else SETERRQ(PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_WRONG, "NULL Hessian detected! User must provide valid Hessian for the regularizer.");
745 PETSC_EXTERN PetscErrorCode TaoCreate_BRGN(Tao tao)
752 tao->ops->destroy = TaoDestroy_BRGN;
753 tao->ops->setup = TaoSetUp_BRGN;
754 tao->ops->setfromoptions = TaoSetFromOptions_BRGN;
755 tao->ops->view = TaoView_BRGN;
756 tao->ops->solve = TaoSolve_BRGN;
758 PetscCall(TaoParametersInitialize(tao));
760 tao->data = gn;
766 gn->parent = tao;
768 PetscCall(TaoCreate(PetscObjectComm((PetscObject)tao), &gn->subsolver));
771 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNGetRegularizationType_C", TaoBRGNGetRegularizationType_BRGN));
772 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetRegularizationType_C", TaoBRGNSetRegularizationType_BRGN));
773 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNGetDampingVector_C", TaoBRGNGetDampingVector_BRGN));
774 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetDictionaryMatrix_C", TaoBRGNSetDictionaryMatrix_BRGN));
775 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNGetSubsolver_C", TaoBRGNGetSubsolver_BRGN));
776 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetRegularizerWeight_C", TaoBRGNSetRegularizerWeight_BRGN));
777 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetL1SmoothEpsilon_C", TaoBRGNSetL1SmoothEpsilon_BRGN));
778 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetRegularizerObjectiveAndGradientRoutine_C", TaoBRGNSetRegularizerObjectiveAndGradientRoutine_BRGN));
779 PetscCall(PetscObjectComposeFunction((PetscObject)tao, "TaoBRGNSetRegularizerHessianRoutine_C", TaoBRGNSetRegularizerHessianRoutine_BRGN));