Lines Matching refs:tao
28 static PetscErrorCode TaoSolve_NTL(Tao tao) in TaoSolve_NTL() argument
30 TAO_NTL *tl = (TAO_NTL *)tao->data; in TaoSolve_NTL()
56 …if (tao->XL || tao->XU || tao->ops->computebounds) PetscCall(PetscInfo(tao, "WARNING: Variable bou… in TaoSolve_NTL()
58 PetscCall(KSPGetType(tao->ksp, &ksp_type)); in TaoSolve_NTL()
62 …PetscCheck(is_nash || is_stcg || is_gltr, PetscObjectComm((PetscObject)tao), PETSC_ERR_SUP, "TAO_N… in TaoSolve_NTL()
65 tao->trust = tao->trust0; in TaoSolve_NTL()
66 tao->trust = PetscMax(tao->trust, tl->min_radius); in TaoSolve_NTL()
67 tao->trust = PetscMin(tao->trust, tl->max_radius); in TaoSolve_NTL()
70 PetscCall(KSPGetPC(tao->ksp, &pc)); in TaoSolve_NTL()
76 PetscCall(VecGetLocalSize(tao->solution, &n)); in TaoSolve_NTL()
77 PetscCall(VecGetSize(tao->solution, &N)); in TaoSolve_NTL()
79 PetscCall(MatLMVMAllocate(tl->M, tao->solution, tao->gradient)); in TaoSolve_NTL()
81 …PetscCheck(sym_set && is_symmetric, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_INCOMP, "LMVM… in TaoSolve_NTL()
85 PetscCall(TaoComputeObjectiveAndGradient(tao, tao->solution, &f, tao->gradient)); in TaoSolve_NTL()
86 PetscCall(VecNorm(tao->gradient, NORM_2, &gnorm)); in TaoSolve_NTL()
87 …fOrNanReal(f) && !PetscIsInfOrNanReal(gnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "… in TaoSolve_NTL()
90 tao->reason = TAO_CONTINUE_ITERATING; in TaoSolve_NTL()
91 PetscCall(TaoLogConvergenceHistory(tao, f, gnorm, 0.0, tao->ksp_its)); in TaoSolve_NTL()
92 PetscCall(TaoMonitor(tao, tao->niter, f, gnorm, 0.0, step)); in TaoSolve_NTL()
93 PetscUseTypeMethod(tao, convergencetest, tao->cnvP); in TaoSolve_NTL()
94 if (tao->reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS); in TaoSolve_NTL()
111 PetscCall(TaoComputeHessian(tao, tao->solution, tao->hessian, tao->hessian_pre)); in TaoSolve_NTL()
116 PetscCall(VecCopy(tao->solution, tl->W)); in TaoSolve_NTL()
117 PetscCall(VecAXPY(tl->W, -tao->trust / gnorm, tao->gradient)); in TaoSolve_NTL()
119 PetscCall(TaoComputeObjective(tao, tl->W, &ftrial)); in TaoSolve_NTL()
125 sigma = -tao->trust / gnorm; in TaoSolve_NTL()
128 PetscCall(MatMult(tao->hessian, tao->gradient, tao->stepdirection)); in TaoSolve_NTL()
129 PetscCall(VecDot(tao->gradient, tao->stepdirection, &prered)); in TaoSolve_NTL()
131 prered = tao->trust * (gnorm - 0.5 * tao->trust * prered / (gnorm * gnorm)); in TaoSolve_NTL()
139 …tau_1 = tl->theta_i * gnorm * tao->trust / (tl->theta_i * gnorm * tao->trust + (1.0 - tl->theta_… in TaoSolve_NTL()
140 …tau_2 = tl->theta_i * gnorm * tao->trust / (tl->theta_i * gnorm * tao->trust - (1.0 + tl->theta_… in TaoSolve_NTL()
146 max_radius = PetscMax(max_radius, tao->trust); in TaoSolve_NTL()
161 max_radius = PetscMax(max_radius, tao->trust); in TaoSolve_NTL()
187 tao->trust = tau * tao->trust; in TaoSolve_NTL()
192 PetscCall(VecAXPY(tao->solution, sigma, tao->gradient)); in TaoSolve_NTL()
193 PetscCall(TaoComputeGradient(tao, tao->solution, tao->gradient)); in TaoSolve_NTL()
195 PetscCall(VecNorm(tao->gradient, NORM_2, &gnorm)); in TaoSolve_NTL()
196 …fOrNanReal(f) && !PetscIsInfOrNanReal(gnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "… in TaoSolve_NTL()
199 PetscCall(TaoLogConvergenceHistory(tao, f, gnorm, 0.0, tao->ksp_its)); in TaoSolve_NTL()
200 PetscCall(TaoMonitor(tao, tao->niter, f, gnorm, 0.0, step)); in TaoSolve_NTL()
201 PetscUseTypeMethod(tao, convergencetest, tao->cnvP); in TaoSolve_NTL()
202 if (tao->reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS); in TaoSolve_NTL()
205 tao->trust = PetscMax(tao->trust, max_radius); in TaoSolve_NTL()
208 tao->trust = PetscMax(tao->trust, tl->min_radius); in TaoSolve_NTL()
209 tao->trust = PetscMin(tao->trust, tl->max_radius); in TaoSolve_NTL()
214 tao->trust = 0.0; in TaoSolve_NTL()
225 while (tao->reason == TAO_CONTINUE_ITERATING) { in TaoSolve_NTL()
227 if (tao->ops->update) { in TaoSolve_NTL()
228 PetscUseTypeMethod(tao, update, tao->niter, tao->user_update); in TaoSolve_NTL()
229 PetscCall(TaoComputeObjective(tao, tao->solution, &f)); in TaoSolve_NTL()
231 ++tao->niter; in TaoSolve_NTL()
232 tao->ksp_its = 0; in TaoSolve_NTL()
234 if (needH) PetscCall(TaoComputeHessian(tao, tao->solution, tao->hessian, tao->hessian_pre)); in TaoSolve_NTL()
238 PetscCall(MatLMVMUpdate(tl->M, tao->solution, tao->gradient)); in TaoSolve_NTL()
241 PetscCall(KSPSetOperators(tao->ksp, tao->hessian, tao->hessian_pre)); in TaoSolve_NTL()
243 PetscCall(KSPCGSetRadius(tao->ksp, tl->max_radius)); in TaoSolve_NTL()
244 PetscCall(KSPSolve(tao->ksp, tao->gradient, tao->stepdirection)); in TaoSolve_NTL()
245 PetscCall(KSPGetIterationNumber(tao->ksp, &its)); in TaoSolve_NTL()
246 tao->ksp_its += its; in TaoSolve_NTL()
247 tao->ksp_tot_its += its; in TaoSolve_NTL()
248 PetscCall(KSPCGGetNormD(tao->ksp, &norm_d)); in TaoSolve_NTL()
250 if (0.0 == tao->trust) { in TaoSolve_NTL()
253 tao->trust = norm_d; in TaoSolve_NTL()
256 tao->trust = PetscMax(tao->trust, tl->min_radius); in TaoSolve_NTL()
257 tao->trust = PetscMin(tao->trust, tl->max_radius); in TaoSolve_NTL()
261 tao->trust = tao->trust0; in TaoSolve_NTL()
264 tao->trust = PetscMax(tao->trust, tl->min_radius); in TaoSolve_NTL()
265 tao->trust = PetscMin(tao->trust, tl->max_radius); in TaoSolve_NTL()
267 PetscCall(KSPCGSetRadius(tao->ksp, tl->max_radius)); in TaoSolve_NTL()
268 PetscCall(KSPSolve(tao->ksp, tao->gradient, tao->stepdirection)); in TaoSolve_NTL()
269 PetscCall(KSPGetIterationNumber(tao->ksp, &its)); in TaoSolve_NTL()
270 tao->ksp_its += its; in TaoSolve_NTL()
271 tao->ksp_tot_its += its; in TaoSolve_NTL()
272 PetscCall(KSPCGGetNormD(tao->ksp, &norm_d)); in TaoSolve_NTL()
274 …PetscCheck(norm_d != 0.0, PetscObjectComm((PetscObject)tao), PETSC_ERR_PLIB, "Initial direction ze… in TaoSolve_NTL()
278 PetscCall(VecScale(tao->stepdirection, -1.0)); in TaoSolve_NTL()
279 PetscCall(KSPGetConvergedReason(tao->ksp, &ksp_reason)); in TaoSolve_NTL()
284 PetscCall(MatLMVMUpdate(tl->M, tao->solution, tao->gradient)); in TaoSolve_NTL()
292 PetscCall(KSPCGGetObjFcn(tao->ksp, &prered)); in TaoSolve_NTL()
297 tao->trust = tl->alpha1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
301 PetscCall(VecCopy(tao->solution, tl->W)); in TaoSolve_NTL()
302 PetscCall(VecAXPY(tl->W, 1.0, tao->stepdirection)); in TaoSolve_NTL()
303 PetscCall(TaoComputeObjective(tao, tl->W, &ftrial)); in TaoSolve_NTL()
306 tao->trust = tl->alpha1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
321 tao->trust = tl->alpha1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
327 tao->trust = tl->alpha2 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
330 tao->trust = tl->alpha3 * tao->trust; in TaoSolve_NTL()
333 tao->trust = PetscMax(tl->alpha4 * norm_d, tao->trust); in TaoSolve_NTL()
336 tao->trust = PetscMax(tl->alpha5 * norm_d, tao->trust); in TaoSolve_NTL()
343 PetscCall(KSPCGGetObjFcn(tao->ksp, &prered)); in TaoSolve_NTL()
348 tao->trust = tl->gamma1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
351 PetscCall(VecCopy(tao->solution, tl->W)); in TaoSolve_NTL()
352 PetscCall(VecAXPY(tl->W, 1.0, tao->stepdirection)); in TaoSolve_NTL()
353 PetscCall(TaoComputeObjective(tao, tl->W, &ftrial)); in TaoSolve_NTL()
355 tao->trust = tl->gamma1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
358 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gdx)); in TaoSolve_NTL()
376 tao->trust = PetscMax(tao->trust, tl->gamma3 * norm_d); in TaoSolve_NTL()
378 tao->trust = PetscMax(tao->trust, tl->gamma4 * norm_d); in TaoSolve_NTL()
380 tao->trust = PetscMax(tao->trust, tau_max * norm_d); in TaoSolve_NTL()
386 tao->trust = tl->gamma2 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
388 tao->trust = PetscMax(tao->trust, tl->gamma3 * norm_d); in TaoSolve_NTL()
390 tao->trust = tau_max * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
392 tao->trust = PetscMax(tao->trust, tau_max * norm_d); in TaoSolve_NTL()
397 tao->trust = tl->gamma2 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
399 tao->trust = tl->gamma1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
401 tao->trust = tl->gamma1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
403 tao->trust = tau_1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
405 tao->trust = tau_2 * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
407 tao->trust = tau_max * PetscMin(tao->trust, norm_d); in TaoSolve_NTL()
418 PetscCall(VecDot(tao->stepdirection, tao->gradient, &gdx)); in TaoSolve_NTL()
425 PetscCall(VecCopy(tao->gradient, tao->stepdirection)); in TaoSolve_NTL()
426 PetscCall(VecScale(tao->stepdirection, -1.0)); in TaoSolve_NTL()
431 PetscCall(MatSolve(tl->M, tao->gradient, tao->stepdirection)); in TaoSolve_NTL()
432 PetscCall(VecScale(tao->stepdirection, -1.0)); in TaoSolve_NTL()
435 PetscCall(VecDot(tao->stepdirection, tao->gradient, &gdx)); in TaoSolve_NTL()
444 PetscCall(MatLMVMUpdate(tl->M, tao->solution, tao->gradient)); in TaoSolve_NTL()
445 PetscCall(MatSolve(tl->M, tao->gradient, tao->stepdirection)); in TaoSolve_NTL()
446 PetscCall(VecScale(tao->stepdirection, -1.0)); in TaoSolve_NTL()
471 PetscCall(VecCopy(tao->solution, tl->Xold)); in TaoSolve_NTL()
472 PetscCall(VecCopy(tao->gradient, tl->Gold)); in TaoSolve_NTL()
475 …PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &f, tao->gradient, tao->stepdirection… in TaoSolve_NTL()
476 PetscCall(TaoAddLineSearchCounts(tao)); in TaoSolve_NTL()
481 PetscCall(VecCopy(tl->Xold, tao->solution)); in TaoSolve_NTL()
482 PetscCall(VecCopy(tl->Gold, tao->gradient)); in TaoSolve_NTL()
491 PetscCall(VecCopy(tao->gradient, tao->stepdirection)); in TaoSolve_NTL()
496 PetscCall(MatSolve(tl->M, tao->gradient, tao->stepdirection)); in TaoSolve_NTL()
499 PetscCall(VecDot(tao->stepdirection, tao->gradient, &gdx)); in TaoSolve_NTL()
505 PetscCall(MatLMVMUpdate(tl->M, tao->solution, tao->gradient)); in TaoSolve_NTL()
506 PetscCall(MatSolve(tl->M, tao->gradient, tao->stepdirection)); in TaoSolve_NTL()
530 PetscCall(MatLMVMUpdate(tl->M, tao->solution, tao->gradient)); in TaoSolve_NTL()
531 PetscCall(MatSolve(tl->M, tao->gradient, tao->stepdirection)); in TaoSolve_NTL()
538 PetscCall(VecScale(tao->stepdirection, -1.0)); in TaoSolve_NTL()
543 …PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &f, tao->gradient, tao->stepdirection… in TaoSolve_NTL()
544 PetscCall(TaoAddLineSearchCounts(tao)); in TaoSolve_NTL()
550 PetscCall(VecCopy(tl->Xold, tao->solution)); in TaoSolve_NTL()
551 PetscCall(VecCopy(tl->Gold, tao->gradient)); in TaoSolve_NTL()
552 tao->trust = 0.0; in TaoSolve_NTL()
554 tao->reason = TAO_DIVERGED_LS_FAILURE; in TaoSolve_NTL()
559 tao->trust = tl->omega1 * PetscMin(norm_d, tao->trust); in TaoSolve_NTL()
562 tao->trust = tl->omega2 * PetscMin(norm_d, tao->trust); in TaoSolve_NTL()
566 tao->trust = tl->omega3 * PetscMin(norm_d, tao->trust); in TaoSolve_NTL()
568 tao->trust = PetscMax(tl->omega3 * norm_d, tao->trust); in TaoSolve_NTL()
572 tao->trust = PetscMax(tl->omega4 * norm_d, tao->trust); in TaoSolve_NTL()
575 tao->trust = PetscMax(tl->omega5 * norm_d, tao->trust); in TaoSolve_NTL()
579 tao->trust = tl->omega1 * PetscMin(norm_d, tao->trust); in TaoSolve_NTL()
583 PetscCall(VecCopy(tl->W, tao->solution)); in TaoSolve_NTL()
585 PetscCall(TaoComputeGradient(tao, tao->solution, tao->gradient)); in TaoSolve_NTL()
590 tao->trust = PetscMin(tao->trust, tl->max_radius); in TaoSolve_NTL()
593 PetscCall(VecNorm(tao->gradient, NORM_2, &gnorm)); in TaoSolve_NTL()
594 …fOrNanReal(f) && !PetscIsInfOrNanReal(gnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "… in TaoSolve_NTL()
597 PetscCall(TaoLogConvergenceHistory(tao, f, gnorm, 0.0, tao->ksp_its)); in TaoSolve_NTL()
598 PetscCall(TaoMonitor(tao, tao->niter, f, gnorm, 0.0, step)); in TaoSolve_NTL()
599 PetscUseTypeMethod(tao, convergencetest, tao->cnvP); in TaoSolve_NTL()
604 static PetscErrorCode TaoSetUp_NTL(Tao tao) in TaoSetUp_NTL() argument
606 TAO_NTL *tl = (TAO_NTL *)tao->data; in TaoSetUp_NTL()
609 if (!tao->gradient) PetscCall(VecDuplicate(tao->solution, &tao->gradient)); in TaoSetUp_NTL()
610 if (!tao->stepdirection) PetscCall(VecDuplicate(tao->solution, &tao->stepdirection)); in TaoSetUp_NTL()
611 if (!tl->W) PetscCall(VecDuplicate(tao->solution, &tl->W)); in TaoSetUp_NTL()
612 if (!tl->Xold) PetscCall(VecDuplicate(tao->solution, &tl->Xold)); in TaoSetUp_NTL()
613 if (!tl->Gold) PetscCall(VecDuplicate(tao->solution, &tl->Gold)); in TaoSetUp_NTL()
619 static PetscErrorCode TaoDestroy_NTL(Tao tao) in TaoDestroy_NTL() argument
621 TAO_NTL *tl = (TAO_NTL *)tao->data; in TaoDestroy_NTL()
624 if (tao->setupcalled) { in TaoDestroy_NTL()
629 PetscCall(KSPDestroy(&tao->ksp)); in TaoDestroy_NTL()
630 PetscCall(PetscFree(tao->data)); in TaoDestroy_NTL()
634 static PetscErrorCode TaoSetFromOptions_NTL(Tao tao, PetscOptionItems PetscOptionsObject) in TaoSetFromOptions_NTL() argument
636 TAO_NTL *tl = (TAO_NTL *)tao->data; in TaoSetFromOptions_NTL()
678 PetscCall(TaoLineSearchSetFromOptions(tao->linesearch)); in TaoSetFromOptions_NTL()
679 PetscCall(KSPSetFromOptions(tao->ksp)); in TaoSetFromOptions_NTL()
683 static PetscErrorCode TaoView_NTL(Tao tao, PetscViewer viewer) in TaoView_NTL() argument
685 TAO_NTL *tl = (TAO_NTL *)tao->data; in TaoView_NTL()
740 PETSC_EXTERN PetscErrorCode TaoCreate_NTL(Tao tao) in TaoCreate_NTL() argument
747 tao->ops->setup = TaoSetUp_NTL; in TaoCreate_NTL()
748 tao->ops->solve = TaoSolve_NTL; in TaoCreate_NTL()
749 tao->ops->view = TaoView_NTL; in TaoCreate_NTL()
750 tao->ops->setfromoptions = TaoSetFromOptions_NTL; in TaoCreate_NTL()
751 tao->ops->destroy = TaoDestroy_NTL; in TaoCreate_NTL()
754 PetscCall(TaoParametersInitialize(tao)); in TaoCreate_NTL()
755 PetscObjectParameterSetDefault(tao, max_it, 50); in TaoCreate_NTL()
756 PetscObjectParameterSetDefault(tao, trust0, 100.0); in TaoCreate_NTL()
758 tao->data = (void *)tl; in TaoCreate_NTL()
814 PetscCall(TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch)); in TaoCreate_NTL()
815 PetscCall(PetscObjectIncrementTabLevel((PetscObject)tao->linesearch, (PetscObject)tao, 1)); in TaoCreate_NTL()
816 PetscCall(TaoLineSearchSetType(tao->linesearch, morethuente_type)); in TaoCreate_NTL()
817 PetscCall(TaoLineSearchUseTaoRoutines(tao->linesearch, tao)); in TaoCreate_NTL()
818 PetscCall(TaoLineSearchSetOptionsPrefix(tao->linesearch, tao->hdr.prefix)); in TaoCreate_NTL()
819 PetscCall(KSPCreate(((PetscObject)tao)->comm, &tao->ksp)); in TaoCreate_NTL()
820 PetscCall(PetscObjectIncrementTabLevel((PetscObject)tao->ksp, (PetscObject)tao, 1)); in TaoCreate_NTL()
821 PetscCall(KSPSetOptionsPrefix(tao->ksp, tao->hdr.prefix)); in TaoCreate_NTL()
822 PetscCall(KSPAppendOptionsPrefix(tao->ksp, "tao_ntl_")); in TaoCreate_NTL()
823 PetscCall(KSPSetType(tao->ksp, KSPSTCG)); in TaoCreate_NTL()