Lines Matching defs:tao
2 #include <../src/tao/bound/impls/bncg/bncg.h> /*I "petsctao.h" I*/
13 PetscErrorCode TaoBNCGEstimateActiveSet(Tao tao, PetscInt asType)
15 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
26 PetscCall(VecWhichInactive(tao->XL, tao->solution, cg->unprojected_gradient, tao->XU, PETSC_TRUE, &cg->inactive_idx));
28 PetscCall(ISComplementVec(cg->inactive_idx, tao->solution, &cg->active_idx));
34 PetscCall(TaoEstimateActiveBounds(tao->solution, tao->XL, tao->XU, cg->unprojected_gradient, cg->W, cg->work, cg->as_step, &cg->as_tol, &cg->active_lower, &cg->active_upper, &cg->active_fixed, &cg->active_idx, &cg->inactive_idx));
42 PetscErrorCode TaoBNCGBoundStep(Tao tao, PetscInt asType, Vec step)
44 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
52 PetscCall(TaoBoundStep(tao->solution, tao->XL, tao->XU, cg->active_lower, cg->active_upper, cg->active_fixed, 1.0, step));
60 static PetscErrorCode TaoSolve_BNCG(Tao tao)
62 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
68 PetscCall(TaoComputeVariableBounds(tao));
69 PetscCall(TaoLineSearchSetVariableBounds(tao->linesearch, tao->XL, tao->XU));
72 PetscCall(TaoBoundSolution(tao->solution, tao->XL, tao->XU, 0.0, &nDiff, tao->solution));
74 if (nDiff > 0 || !tao->recycle) PetscCall(TaoComputeObjectiveAndGradient(tao, tao->solution, &cg->f, cg->unprojected_gradient));
76 PetscCheck(!PetscIsInfOrNanReal(cg->f) && !PetscIsInfOrNanReal(gnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "User provided compute function generated infinity or NaN");
79 PetscCall(TaoBNCGEstimateActiveSet(tao, cg->as_type));
82 PetscCall(VecCopy(cg->unprojected_gradient, tao->gradient));
83 if (cg->active_idx) PetscCall(VecISSet(tao->gradient, cg->active_idx, 0.0));
84 PetscCall(VecNorm(tao->gradient, NORM_2, &gnorm));
88 tao->niter = 0;
95 tao->reason = TAO_CONTINUE_ITERATING;
97 PetscCall(VecFischer(tao->solution, cg->unprojected_gradient, tao->XL, tao->XU, cg->W));
99 PetscCheck(!PetscIsInfOrNanReal(resnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "User provided compute function generated infinity or NaN");
100 PetscCall(TaoLogConvergenceHistory(tao, cg->f, resnorm, 0.0, tao->ksp_its));
101 PetscCall(TaoMonitor(tao, tao->niter, cg->f, resnorm, 0.0, step));
102 PetscUseTypeMethod(tao, convergencetest, tao->cnvP);
103 if (tao->reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS);
105 if (!tao->recycle) {
107 PetscCall(TaoBNCGResetUpdate(tao, gnorm2));
112 if (tao->ops->update) {
113 PetscUseTypeMethod(tao, update, tao->niter, tao->user_update);
114 PetscCall(TaoComputeObjective(tao, tao->solution, &cg->f));
116 PetscCall(TaoBNCGConductIteration(tao, gnorm));
117 if (tao->reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS);
121 static PetscErrorCode TaoSetUp_BNCG(Tao tao)
123 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
126 if (!tao->gradient) PetscCall(VecDuplicate(tao->solution, &tao->gradient));
127 if (!tao->stepdirection) PetscCall(VecDuplicate(tao->solution, &tao->stepdirection));
128 if (!cg->W) PetscCall(VecDuplicate(tao->solution, &cg->W));
129 if (!cg->work) PetscCall(VecDuplicate(tao->solution, &cg->work));
130 if (!cg->sk) PetscCall(VecDuplicate(tao->solution, &cg->sk));
131 if (!cg->yk) PetscCall(VecDuplicate(tao->gradient, &cg->yk));
132 if (!cg->X_old) PetscCall(VecDuplicate(tao->solution, &cg->X_old));
133 if (!cg->G_old) PetscCall(VecDuplicate(tao->gradient, &cg->G_old));
135 PetscCall(VecDuplicate(tao->solution, &cg->d_work));
136 PetscCall(VecDuplicate(tao->solution, &cg->y_work));
137 PetscCall(VecDuplicate(tao->solution, &cg->g_work));
139 if (!cg->unprojected_gradient) PetscCall(VecDuplicate(tao->gradient, &cg->unprojected_gradient));
140 if (!cg->unprojected_gradient_old) PetscCall(VecDuplicate(tao->gradient, &cg->unprojected_gradient_old));
146 static PetscErrorCode TaoDestroy_BNCG(Tao tao)
148 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
151 if (tao->setupcalled) {
173 PetscCall(PetscFree(tao->data));
177 static PetscErrorCode TaoSetFromOptions_BNCG(Tao tao, PetscOptionItems PetscOptionsObject)
179 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
223 PetscCall(MatSetOptionsPrefix(cg->B, ((PetscObject)tao)->prefix));
229 static PetscErrorCode TaoView_BNCG(Tao tao, PetscViewer viewer)
232 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
331 PETSC_EXTERN PetscErrorCode TaoCreate_BNCG(Tao tao)
337 tao->ops->setup = TaoSetUp_BNCG;
338 tao->ops->solve = TaoSolve_BNCG;
339 tao->ops->view = TaoView_BNCG;
340 tao->ops->setfromoptions = TaoSetFromOptions_BNCG;
341 tao->ops->destroy = TaoDestroy_BNCG;
344 PetscCall(TaoParametersInitialize(tao));
345 PetscObjectParameterSetDefault(tao, max_it, 2000);
346 PetscObjectParameterSetDefault(tao, max_funcs, 4000);
352 PetscCall(TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch));
353 PetscCall(PetscObjectIncrementTabLevel((PetscObject)tao->linesearch, (PetscObject)tao, 1));
354 PetscCall(TaoLineSearchSetType(tao->linesearch, morethuente_type));
355 PetscCall(TaoLineSearchUseTaoRoutines(tao->linesearch, tao));
358 tao->data = (void *)cg;
360 PetscCall(MatCreate(PetscObjectComm((PetscObject)tao), &cg->B));
361 PetscCall(PetscObjectIncrementTabLevel((PetscObject)cg->B, (PetscObject)tao, 1));
394 PetscErrorCode TaoBNCGResetUpdate(Tao tao, PetscReal gnormsq)
396 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
407 PetscCall(VecAXPBY(tao->stepdirection, -scaling, 0.0, tao->gradient));
413 PetscErrorCode TaoBNCGCheckDynamicRestart(Tao tao, PetscReal stepsize, PetscReal gd, PetscReal gd_old, PetscBool *dynrestart, PetscReal fold)
415 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
436 PETSC_INTERN PetscErrorCode TaoBNCGStepDirectionUpdate(Tao tao, PetscReal gnorm2, PetscReal step, PetscReal fold, PetscReal gnorm2_old, PetscReal dnorm, PetscBool pcgd_fallback)
438 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
447 if (tao->niter >= 1 || tao->recycle) {
448 PetscCall(VecWAXPY(cg->yk, -1.0, cg->G_old, tao->gradient));
451 PetscCall(VecDot(cg->yk, tao->stepdirection, &dk_yk));
457 PetscCall(VecGetSize(tao->gradient, &dim));
458 if (tao->niter % (dim * cg->min_restart_num)) cg_restart = PETSC_TRUE;
463 PetscCall(VecGetSize(tao->gradient, &dim));
464 if (0 == tao->niter % (6 * dim)) cg_restart = PETSC_TRUE;
467 if (cg->diag_scaling) PetscCall(MatLMVMUpdate(cg->B, tao->solution, tao->gradient));
492 PetscCall(TaoBNCGResetUpdate(tao, gnorm2));
495 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
496 PetscCall(VecAXPBY(tao->stepdirection, -1.0, 0.0, cg->g_work));
508 PetscCall(VecAXPBY(tao->stepdirection, -tau_k, 0.0, tao->gradient));
510 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
511 PetscCall(VecAXPBY(tao->stepdirection, -1.0, 0.0, cg->g_work));
519 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk));
522 PetscCall(VecAXPBY(tao->stepdirection, -tau_k, beta, tao->gradient));
524 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
527 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work));
533 PetscCall(VecWAXPY(cg->yk, -1.0, cg->G_old, tao->gradient));
536 PetscCall(VecDot(cg->yk, tao->stepdirection, &dk_yk));
540 PetscCall(VecAXPBY(tao->stepdirection, -tau_k, beta, tao->gradient));
543 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
544 PetscCall(VecDot(tao->gradient, cg->g_work, &tmp));
546 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work));
554 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk));
557 PetscCall(VecAXPBY(tao->stepdirection, -tau_k, beta, tao->gradient));
560 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
563 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work));
568 PetscCall(VecWAXPY(cg->yk, -1.0, cg->G_old, tao->gradient));
573 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk));
577 PetscCall(VecAXPBY(tao->stepdirection, -tau_k, beta, tao->gradient));
580 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
584 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work));
592 PetscCall(VecDot(tao->stepdirection, tao->gradient, &gd));
593 PetscCall(VecDot(cg->G_old, tao->stepdirection, &gd_old));
596 PetscCall(VecAXPBY(tao->stepdirection, -tau_k, beta, tao->gradient));
598 PetscCall(MatMult(cg->B, tao->stepdirection, cg->d_work));
599 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
600 PetscCall(VecDot(cg->g_work, tao->gradient, >Dg));
601 PetscCall(VecDot(tao->stepdirection, cg->G_old, &gd_old));
606 PetscCall(VecWAXPY(tao->stepdirection, -1.0, cg->g_work, cg->d_work));
613 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gd));
614 PetscCall(VecDot(cg->G_old, tao->stepdirection, &gd_old));
615 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution));
618 if (cg->use_dynamic_restart) PetscCall(TaoBNCGCheckDynamicRestart(tao, step, gd, gd_old, &cg->dynamic_restart, fold));
620 PetscCall(TaoBNCGResetUpdate(tao, gnorm2));
623 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk));
631 PetscCall(VecAXPBY(tao->stepdirection, -tau_k, beta, tao->gradient));
637 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
639 PetscCall(MatSolve(cg->B, tao->stepdirection, cg->d_work));
650 PetscCall(VecDot(tao->stepdirection, cg->g_work, &gd));
653 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work));
661 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gd));
662 PetscCall(VecDot(cg->G_old, tao->stepdirection, &gd_old));
663 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution));
667 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk));
674 PetscCall(VecAXPBYPCZ(tao->stepdirection, -tau_k, 0.0, beta, tao->gradient, cg->yk));
679 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
681 PetscCall(MatSolve(cg->B, tao->stepdirection, cg->d_work));
690 PetscCall(VecDot(cg->y_work, tao->stepdirection, &dk_yk));
692 PetscCall(VecDot(tao->stepdirection, cg->g_work, &gd));
696 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work));
703 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gd));
704 PetscCall(VecDot(cg->G_old, tao->stepdirection, &gd_old));
705 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution));
708 if (cg->use_dynamic_restart) PetscCall(TaoBNCGCheckDynamicRestart(tao, step, gd, gd_old, &cg->dynamic_restart, fold));
710 PetscCall(TaoBNCGResetUpdate(tao, gnorm2));
713 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk));
727 PetscCall(VecAXPBYPCZ(tao->stepdirection, -tau_k, gamma * tau_k, beta, tao->gradient, cg->yk));
732 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
744 PetscCall(VecDot(tao->stepdirection, cg->g_work, &tmp));
760 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work));
761 PetscCall(VecAXPY(tao->stepdirection, gamma, cg->y_work));
769 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gd));
770 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution));
776 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk));
781 PetscCall(VecAXPBYPCZ(tao->stepdirection, -tau_k, tmp * tau_k, beta, tao->gradient, cg->yk));
784 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
793 PetscCall(VecAXPBYPCZ(tao->stepdirection, -1.0, gamma, beta, cg->g_work, cg->y_work));
798 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gd));
799 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution));
807 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk));
812 PetscCall(VecAXPBYPCZ(tao->stepdirection, -tau_k, tmp, beta, tao->gradient, cg->yk));
815 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
824 PetscCall(VecAXPBYPCZ(tao->stepdirection, -1.0, gamma, beta, cg->g_work, cg->y_work));
829 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gd));
830 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution));
839 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk));
846 PetscCall(VecAXPBYPCZ(tao->stepdirection, -tau_k, tmp, beta, tao->gradient, cg->yk));
849 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work));
858 PetscCall(VecAXPBYPCZ(tao->stepdirection, -1.0, gamma, beta, cg->g_work, cg->y_work));
869 PETSC_INTERN PetscErrorCode TaoBNCGConductIteration(Tao tao, PetscReal gnorm)
871 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
880 PetscCall(VecCopy(tao->solution, cg->X_old));
881 PetscCall(VecCopy(tao->gradient, cg->G_old));
889 if (!(tao->recycle && 0 == tao->niter)) {
891 PetscCall(TaoLineSearchSetInitialStepLength(tao->linesearch, 1.0));
892 PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &cg->f, cg->unprojected_gradient, tao->stepdirection, &step, &ls_status));
893 PetscCall(TaoAddLineSearchCounts(tao));
901 tao->reason = TAO_DIVERGED_LS_FAILURE;
904 PetscCall(VecCopy(cg->X_old, tao->solution));
905 PetscCall(VecCopy(cg->G_old, tao->gradient));
914 PetscCall(TaoBNCGStepDirectionUpdate(tao, gnorm2, step, f_old, gnorm2_old, dnorm, pcgd_fallback));
916 PetscCall(TaoBNCGResetUpdate(tao, gnorm2));
917 PetscCall(TaoBNCGBoundStep(tao, cg->as_type, tao->stepdirection));
919 PetscCall(TaoLineSearchSetInitialStepLength(tao->linesearch, 1.0));
920 PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &cg->f, cg->unprojected_gradient, tao->stepdirection, &step, &ls_status));
921 PetscCall(TaoAddLineSearchCounts(tao));
933 PetscCall(TaoBNCGResetUpdate(tao, gnorm2));
934 PetscCall(TaoBNCGBoundStep(tao, cg->as_type, tao->stepdirection));
935 PetscCall(TaoLineSearchSetInitialStepLength(tao->linesearch, 1.0));
936 PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &cg->f, cg->unprojected_gradient, tao->stepdirection, &step, &ls_status));
937 PetscCall(TaoAddLineSearchCounts(tao));
944 tao->reason = TAO_DIVERGED_LS_FAILURE;
952 if (tao->reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS);
955 PetscCall(VecFischer(tao->solution, cg->unprojected_gradient, tao->XL, tao->XU, cg->W));
957 PetscCheck(!PetscIsInfOrNanReal(resnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "User provided compute function generated infinity or NaN");
958 PetscCall(TaoLogConvergenceHistory(tao, cg->f, resnorm, 0.0, tao->ksp_its));
959 PetscCall(TaoMonitor(tao, tao->niter, cg->f, resnorm, 0.0, step));
960 PetscUseTypeMethod(tao, convergencetest, tao->cnvP);
961 if (tao->reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS);
966 PetscCall(TaoBNCGEstimateActiveSet(tao, cg->as_type));
968 PetscCall(VecCopy(cg->unprojected_gradient, tao->gradient));
969 if (cg->active_idx) PetscCall(VecISSet(tao->gradient, cg->active_idx, 0.0));
970 PetscCall(VecNorm(tao->gradient, NORM_2, &gnorm));
974 PetscCall(VecNorm(tao->stepdirection, NORM_2, &dnorm));
976 PetscCall(TaoBNCGStepDirectionUpdate(tao, gnorm2, step, f_old, gnorm2_old, dnorm, pcgd_fallback));
977 ++tao->niter;
978 PetscCall(TaoBNCGBoundStep(tao, cg->as_type, tao->stepdirection));
986 PetscCall(VecGetSubVector(tao->stepdirection, cg->new_inactives, &cg->inactive_step));
990 PetscCall(VecRestoreSubVector(tao->stepdirection, cg->new_inactives, &cg->inactive_step));
994 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gd));
995 PetscCall(VecNorm(tao->stepdirection, NORM_2, &dnorm));
998 PetscCall(TaoBNCGResetUpdate(tao, gnorm2));
999 PetscCall(TaoBNCGBoundStep(tao, cg->as_type, tao->stepdirection));
1007 PETSC_INTERN PetscErrorCode TaoBNCGSetH0(Tao tao, Mat H0)
1009 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
1013 PetscCall(PetscObjectTypeCompare((PetscObject)tao, TAOBNCG, &same));
1025 . tao - the `Tao` solver context
1034 PetscErrorCode TaoBNCGGetType(Tao tao, TaoBNCGType *type)
1036 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
1040 PetscCall(PetscObjectTypeCompare((PetscObject)tao, TAOBNCG, &same));
1041 PetscCheck(same, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_INCOMP, "TAO solver is not BNCG type");
1050 + tao - the `Tao` solver context
1057 PetscErrorCode TaoBNCGSetType(Tao tao, TaoBNCGType type)
1059 TAO_BNCG *cg = (TAO_BNCG *)tao->data;
1063 PetscCall(PetscObjectTypeCompare((PetscObject)tao, TAOBNCG, &same));