Lines Matching refs:tao

43 static PetscErrorCode TaoSolve_NTR(Tao tao)  in TaoSolve_NTR()  argument
45 TAO_NTR *tr = (TAO_NTR *)tao->data; in TaoSolve_NTR()
62 …if (tao->XL || tao->XU || tao->ops->computebounds) PetscCall(PetscInfo(tao, "WARNING: Variable bou… in TaoSolve_NTR()
64 PetscCall(KSPGetType(tao->ksp, &ksp_type)); in TaoSolve_NTR()
68 …PetscCheck(is_nash || is_stcg || is_gltr, PetscObjectComm((PetscObject)tao), PETSC_ERR_SUP, "TAO_N… in TaoSolve_NTR()
71 tao->trust = tao->trust0; in TaoSolve_NTR()
72 tao->trust = PetscMax(tao->trust, tr->min_radius); in TaoSolve_NTR()
73 tao->trust = PetscMin(tao->trust, tr->max_radius); in TaoSolve_NTR()
76 PetscCall(KSPGetPC(tao->ksp, &pc)); in TaoSolve_NTR()
82 PetscCall(VecGetLocalSize(tao->solution, &n)); in TaoSolve_NTR()
83 PetscCall(VecGetSize(tao->solution, &N)); in TaoSolve_NTR()
85 PetscCall(MatLMVMAllocate(tr->M, tao->solution, tao->gradient)); in TaoSolve_NTR()
87 …PetscCheck(sym_set && is_symmetric, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_INCOMP, "LMVM… in TaoSolve_NTR()
91 PetscCall(TaoComputeObjectiveAndGradient(tao, tao->solution, &f, tao->gradient)); in TaoSolve_NTR()
92 PetscCall(TaoGradientNorm(tao, tao->gradient, NORM_2, &gnorm)); in TaoSolve_NTR()
93 …fOrNanReal(f) && !PetscIsInfOrNanReal(gnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "… in TaoSolve_NTR()
96 tao->reason = TAO_CONTINUE_ITERATING; in TaoSolve_NTR()
97 PetscCall(TaoLogConvergenceHistory(tao, f, gnorm, 0.0, tao->ksp_its)); in TaoSolve_NTR()
98 PetscCall(TaoMonitor(tao, tao->niter, f, gnorm, 0.0, 1.0)); in TaoSolve_NTR()
99 PetscUseTypeMethod(tao, convergencetest, tao->cnvP); in TaoSolve_NTR()
100 if (tao->reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS); in TaoSolve_NTR()
117 PetscCall(TaoComputeHessian(tao, tao->solution, tao->hessian, tao->hessian_pre)); in TaoSolve_NTR()
122 PetscCall(VecCopy(tao->solution, tr->W)); in TaoSolve_NTR()
123 PetscCall(VecAXPY(tr->W, -tao->trust / gnorm, tao->gradient)); in TaoSolve_NTR()
124 PetscCall(TaoComputeObjective(tao, tr->W, &ftrial)); in TaoSolve_NTR()
131 sigma = -tao->trust / gnorm; in TaoSolve_NTR()
134 PetscCall(MatMult(tao->hessian, tao->gradient, tao->stepdirection)); in TaoSolve_NTR()
135 PetscCall(VecDot(tao->gradient, tao->stepdirection, &prered)); in TaoSolve_NTR()
137 prered = tao->trust * (gnorm - 0.5 * tao->trust * prered / (gnorm * gnorm)); in TaoSolve_NTR()
145 …tau_1 = tr->theta_i * gnorm * tao->trust / (tr->theta_i * gnorm * tao->trust + (1.0 - tr->theta_… in TaoSolve_NTR()
146 …tau_2 = tr->theta_i * gnorm * tao->trust / (tr->theta_i * gnorm * tao->trust - (1.0 + tr->theta_… in TaoSolve_NTR()
152 max_radius = PetscMax(max_radius, tao->trust); in TaoSolve_NTR()
163 max_radius = PetscMax(max_radius, tao->trust); in TaoSolve_NTR()
189 tao->trust = tau * tao->trust; in TaoSolve_NTR()
194 PetscCall(VecAXPY(tao->solution, sigma, tao->gradient)); in TaoSolve_NTR()
195 PetscCall(TaoComputeGradient(tao, tao->solution, tao->gradient)); in TaoSolve_NTR()
197 PetscCall(TaoGradientNorm(tao, tao->gradient, NORM_2, &gnorm)); in TaoSolve_NTR()
198 …fOrNanReal(f) && !PetscIsInfOrNanReal(gnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "… in TaoSolve_NTR()
201 PetscCall(TaoLogConvergenceHistory(tao, f, gnorm, 0.0, tao->ksp_its)); in TaoSolve_NTR()
202 PetscCall(TaoMonitor(tao, tao->niter, f, gnorm, 0.0, 1.0)); in TaoSolve_NTR()
203 PetscUseTypeMethod(tao, convergencetest, tao->cnvP); in TaoSolve_NTR()
204 if (tao->reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS); in TaoSolve_NTR()
207 tao->trust = PetscMax(tao->trust, max_radius); in TaoSolve_NTR()
210 tao->trust = PetscMax(tao->trust, tr->min_radius); in TaoSolve_NTR()
211 tao->trust = PetscMin(tao->trust, tr->max_radius); in TaoSolve_NTR()
216 tao->trust = 0.0; in TaoSolve_NTR()
221 while (tao->reason == TAO_CONTINUE_ITERATING) { in TaoSolve_NTR()
223 if (tao->ops->update) { in TaoSolve_NTR()
224 PetscUseTypeMethod(tao, update, tao->niter, tao->user_update); in TaoSolve_NTR()
225 PetscCall(TaoComputeObjective(tao, tao->solution, &f)); in TaoSolve_NTR()
227 ++tao->niter; in TaoSolve_NTR()
228 tao->ksp_its = 0; in TaoSolve_NTR()
231 PetscCall(TaoComputeHessian(tao, tao->solution, tao->hessian, tao->hessian_pre)); in TaoSolve_NTR()
237 PetscCall(MatLMVMUpdate(tr->M, tao->solution, tao->gradient)); in TaoSolve_NTR()
240 while (tao->reason == TAO_CONTINUE_ITERATING) { in TaoSolve_NTR()
241 PetscCall(KSPSetOperators(tao->ksp, tao->hessian, tao->hessian_pre)); in TaoSolve_NTR()
244 PetscCall(KSPCGSetRadius(tao->ksp, tao->trust)); in TaoSolve_NTR()
245 PetscCall(KSPSolve(tao->ksp, tao->gradient, tao->stepdirection)); in TaoSolve_NTR()
246 PetscCall(KSPGetIterationNumber(tao->ksp, &its)); in TaoSolve_NTR()
247 tao->ksp_its += its; in TaoSolve_NTR()
248 tao->ksp_tot_its += its; in TaoSolve_NTR()
249 PetscCall(KSPCGGetNormD(tao->ksp, &norm_d)); in TaoSolve_NTR()
251 if (0.0 == tao->trust) { in TaoSolve_NTR()
254 tao->trust = norm_d; in TaoSolve_NTR()
257 tao->trust = PetscMax(tao->trust, tr->min_radius); in TaoSolve_NTR()
258 tao->trust = PetscMin(tao->trust, tr->max_radius); in TaoSolve_NTR()
262 tao->trust = tao->trust0; in TaoSolve_NTR()
265 tao->trust = PetscMax(tao->trust, tr->min_radius); in TaoSolve_NTR()
266 tao->trust = PetscMin(tao->trust, tr->max_radius); in TaoSolve_NTR()
268 PetscCall(KSPCGSetRadius(tao->ksp, tao->trust)); in TaoSolve_NTR()
269 PetscCall(KSPSolve(tao->ksp, tao->gradient, tao->stepdirection)); in TaoSolve_NTR()
270 PetscCall(KSPGetIterationNumber(tao->ksp, &its)); in TaoSolve_NTR()
271 tao->ksp_its += its; in TaoSolve_NTR()
272 tao->ksp_tot_its += its; in TaoSolve_NTR()
273 PetscCall(KSPCGGetNormD(tao->ksp, &norm_d)); in TaoSolve_NTR()
275 …PetscCheck(norm_d != 0.0, PetscObjectComm((PetscObject)tao), PETSC_ERR_PLIB, "Initial direction ze… in TaoSolve_NTR()
278 PetscCall(VecScale(tao->stepdirection, -1.0)); in TaoSolve_NTR()
279 PetscCall(KSPGetConvergedReason(tao->ksp, &ksp_reason)); in TaoSolve_NTR()
284 PetscCall(MatLMVMUpdate(tr->M, tao->solution, tao->gradient)); in TaoSolve_NTR()
289 PetscCall(KSPCGGetObjFcn(tao->ksp, &prered)); in TaoSolve_NTR()
294 tao->trust = tr->alpha1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
297 PetscCall(VecCopy(tao->solution, tr->W)); in TaoSolve_NTR()
298 PetscCall(VecAXPY(tr->W, 1.0, tao->stepdirection)); in TaoSolve_NTR()
299 PetscCall(TaoComputeObjective(tao, tr->W, &ftrial)); in TaoSolve_NTR()
302 tao->trust = tr->alpha1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
316 tao->trust = tr->alpha1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
321 tao->trust = tr->alpha2 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
324 tao->trust = tr->alpha3 * tao->trust; in TaoSolve_NTR()
327 tao->trust = PetscMax(tr->alpha4 * norm_d, tao->trust); in TaoSolve_NTR()
330 tao->trust = PetscMax(tr->alpha5 * norm_d, tao->trust); in TaoSolve_NTR()
338 PetscCall(KSPCGGetObjFcn(tao->ksp, &prered)); in TaoSolve_NTR()
343 tao->trust = tr->gamma1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
345 PetscCall(VecCopy(tao->solution, tr->W)); in TaoSolve_NTR()
346 PetscCall(VecAXPY(tr->W, 1.0, tao->stepdirection)); in TaoSolve_NTR()
347 PetscCall(TaoComputeObjective(tao, tr->W, &ftrial)); in TaoSolve_NTR()
349 tao->trust = tr->gamma1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
351 PetscCall(VecDot(tao->gradient, tao->stepdirection, &beta)); in TaoSolve_NTR()
368 tao->trust = PetscMax(tao->trust, tr->gamma3 * norm_d); in TaoSolve_NTR()
370 tao->trust = PetscMax(tao->trust, tr->gamma4 * norm_d); in TaoSolve_NTR()
372 tao->trust = PetscMax(tao->trust, tau_max * norm_d); in TaoSolve_NTR()
379 tao->trust = tr->gamma2 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
381 tao->trust = PetscMax(tao->trust, tr->gamma3 * norm_d); in TaoSolve_NTR()
383 tao->trust = tau_max * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
385 tao->trust = PetscMax(tao->trust, tau_max * norm_d); in TaoSolve_NTR()
391 tao->trust = tr->gamma2 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
393 tao->trust = tr->gamma1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
395 tao->trust = tr->gamma1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
397 tao->trust = tau_1 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
399 tao->trust = tau_2 * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
401 tao->trust = tau_max * PetscMin(tao->trust, norm_d); in TaoSolve_NTR()
410 PetscCall(TaoLogConvergenceHistory(tao, f, gnorm, 0.0, tao->ksp_its)); in TaoSolve_NTR()
411 PetscCall(TaoMonitor(tao, tao->niter, f, gnorm, 0.0, tao->trust)); in TaoSolve_NTR()
412 PetscUseTypeMethod(tao, convergencetest, tao->cnvP); in TaoSolve_NTR()
416 tao->trust = PetscMin(tao->trust, tr->max_radius); in TaoSolve_NTR()
418 if (tao->reason == TAO_CONTINUE_ITERATING) { in TaoSolve_NTR()
419 PetscCall(VecCopy(tr->W, tao->solution)); in TaoSolve_NTR()
421 PetscCall(TaoComputeGradient(tao, tao->solution, tao->gradient)); in TaoSolve_NTR()
422 PetscCall(TaoGradientNorm(tao, tao->gradient, NORM_2, &gnorm)); in TaoSolve_NTR()
423 …fOrNanReal(f) && !PetscIsInfOrNanReal(gnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "… in TaoSolve_NTR()
425 PetscCall(TaoLogConvergenceHistory(tao, f, gnorm, 0.0, tao->ksp_its)); in TaoSolve_NTR()
426 PetscCall(TaoMonitor(tao, tao->niter, f, gnorm, 0.0, tao->trust)); in TaoSolve_NTR()
427 PetscUseTypeMethod(tao, convergencetest, tao->cnvP); in TaoSolve_NTR()
433 static PetscErrorCode TaoSetUp_NTR(Tao tao) in TaoSetUp_NTR() argument
435 TAO_NTR *tr = (TAO_NTR *)tao->data; in TaoSetUp_NTR()
438 if (!tao->gradient) PetscCall(VecDuplicate(tao->solution, &tao->gradient)); in TaoSetUp_NTR()
439 if (!tao->stepdirection) PetscCall(VecDuplicate(tao->solution, &tao->stepdirection)); in TaoSetUp_NTR()
440 if (!tr->W) PetscCall(VecDuplicate(tao->solution, &tr->W)); in TaoSetUp_NTR()
447 static PetscErrorCode TaoDestroy_NTR(Tao tao) in TaoDestroy_NTR() argument
449 TAO_NTR *tr = (TAO_NTR *)tao->data; in TaoDestroy_NTR()
452 if (tao->setupcalled) PetscCall(VecDestroy(&tr->W)); in TaoDestroy_NTR()
453 PetscCall(KSPDestroy(&tao->ksp)); in TaoDestroy_NTR()
454 PetscCall(PetscFree(tao->data)); in TaoDestroy_NTR()
458 static PetscErrorCode TaoSetFromOptions_NTR(Tao tao, PetscOptionItems PetscOptionsObject) in TaoSetFromOptions_NTR() argument
460 TAO_NTR *tr = (TAO_NTR *)tao->data; in TaoSetFromOptions_NTR()
493 PetscCall(KSPSetFromOptions(tao->ksp)); in TaoSetFromOptions_NTR()
536 PETSC_EXTERN PetscErrorCode TaoCreate_NTR(Tao tao) in TaoCreate_NTR() argument
543 tao->ops->setup = TaoSetUp_NTR; in TaoCreate_NTR()
544 tao->ops->solve = TaoSolve_NTR; in TaoCreate_NTR()
545 tao->ops->setfromoptions = TaoSetFromOptions_NTR; in TaoCreate_NTR()
546 tao->ops->destroy = TaoDestroy_NTR; in TaoCreate_NTR()
549 PetscCall(TaoParametersInitialize(tao)); in TaoCreate_NTR()
550 PetscObjectParameterSetDefault(tao, max_it, 50); in TaoCreate_NTR()
551 PetscObjectParameterSetDefault(tao, trust0, 100.0); in TaoCreate_NTR()
552 tao->data = (void *)tr; in TaoCreate_NTR()
596 PetscCall(KSPCreate(((PetscObject)tao)->comm, &tao->ksp)); in TaoCreate_NTR()
597 PetscCall(PetscObjectIncrementTabLevel((PetscObject)tao->ksp, (PetscObject)tao, 1)); in TaoCreate_NTR()
598 PetscCall(KSPSetOptionsPrefix(tao->ksp, tao->hdr.prefix)); in TaoCreate_NTR()
599 PetscCall(KSPAppendOptionsPrefix(tao->ksp, "tao_ntr_")); in TaoCreate_NTR()
600 PetscCall(KSPSetType(tao->ksp, KSPSTCG)); in TaoCreate_NTR()