Lines Matching refs:tao

6 static PetscErrorCode TaoDestroy_TRON(Tao tao)  in TaoDestroy_TRON()  argument
8 TAO_TRON *tron = (TAO_TRON *)tao->data; in TaoDestroy_TRON()
21 PetscCall(KSPDestroy(&tao->ksp)); in TaoDestroy_TRON()
22 PetscCall(PetscFree(tao->data)); in TaoDestroy_TRON()
26 static PetscErrorCode TaoSetFromOptions_TRON(Tao tao, PetscOptionItems PetscOptionsObject) in TaoSetFromOptions_TRON() argument
28 TAO_TRON *tron = (TAO_TRON *)tao->data; in TaoSetFromOptions_TRON()
35 PetscCall(KSPSetFromOptions(tao->ksp)); in TaoSetFromOptions_TRON()
39 static PetscErrorCode TaoView_TRON(Tao tao, PetscViewer viewer) in TaoView_TRON() argument
41 TAO_TRON *tron = (TAO_TRON *)tao->data; in TaoView_TRON()
53 static PetscErrorCode TaoSetup_TRON(Tao tao) in TaoSetup_TRON() argument
55 TAO_TRON *tron = (TAO_TRON *)tao->data; in TaoSetup_TRON()
59 PetscCall(VecDuplicate(tao->solution, &tron->diag)); in TaoSetup_TRON()
60 PetscCall(VecDuplicate(tao->solution, &tron->X_New)); in TaoSetup_TRON()
61 PetscCall(VecDuplicate(tao->solution, &tron->G_New)); in TaoSetup_TRON()
62 PetscCall(VecDuplicate(tao->solution, &tron->Work)); in TaoSetup_TRON()
63 PetscCall(VecDuplicate(tao->solution, &tao->gradient)); in TaoSetup_TRON()
64 PetscCall(VecDuplicate(tao->solution, &tao->stepdirection)); in TaoSetup_TRON()
68 static PetscErrorCode TaoSolve_TRON(Tao tao) in TaoSolve_TRON() argument
70 TAO_TRON *tron = (TAO_TRON *)tao->data; in TaoSolve_TRON()
77 tao->trust = tao->trust0; in TaoSolve_TRON()
79 PetscCall(TaoComputeVariableBounds(tao)); in TaoSolve_TRON()
80 PetscCall(TaoLineSearchSetVariableBounds(tao->linesearch, tao->XL, tao->XU)); in TaoSolve_TRON()
83 PetscCall(VecMedian(tao->XL, tao->solution, tao->XU, tao->solution)); in TaoSolve_TRON()
86 PetscCall(TaoComputeObjectiveAndGradient(tao, tao->solution, &tron->f, tao->gradient)); in TaoSolve_TRON()
87 PetscCall(VecNorm(tao->gradient, NORM_2, &tron->gnorm)); in TaoSolve_TRON()
88 …ron->f) && !PetscIsInfOrNanReal(tron->gnorm), PetscObjectComm((PetscObject)tao), PETSC_ERR_USER, "… in TaoSolve_TRON()
91 …PetscCall(VecBoundGradientProjection(tao->gradient, tao->solution, tao->XL, tao->XU, tao->gradient… in TaoSolve_TRON()
92 PetscCall(VecNorm(tao->gradient, NORM_2, &tron->gnorm)); in TaoSolve_TRON()
95 tao->trust = tao->trust0; in TaoSolve_TRON()
96 if (tao->trust <= 0) tao->trust = PetscMax(tron->gnorm * tron->gnorm, 1.0); in TaoSolve_TRON()
100 tron->stepsize = tao->trust; in TaoSolve_TRON()
102 tao->reason = TAO_CONTINUE_ITERATING; in TaoSolve_TRON()
103 PetscCall(TaoLogConvergenceHistory(tao, tron->f, tron->gnorm, 0.0, tao->ksp_its)); in TaoSolve_TRON()
104 PetscCall(TaoMonitor(tao, tao->niter, tron->f, tron->gnorm, 0.0, tron->stepsize)); in TaoSolve_TRON()
105 PetscUseTypeMethod(tao, convergencetest, tao->cnvP); in TaoSolve_TRON()
106 while (tao->reason == TAO_CONTINUE_ITERATING) { in TaoSolve_TRON()
108 if (tao->ops->update) { in TaoSolve_TRON()
109 PetscUseTypeMethod(tao, update, tao->niter, tao->user_update); in TaoSolve_TRON()
110 PetscCall(TaoComputeObjective(tao, tao->solution, &tron->f)); in TaoSolve_TRON()
114 PetscCall(TronGradientProjections(tao, tron)); in TaoSolve_TRON()
116 …PetscCall(VecBoundGradientProjection(tao->gradient, tao->solution, tao->XL, tao->XU, tao->gradient… in TaoSolve_TRON()
117 PetscCall(VecNorm(tao->gradient, NORM_2, &tron->gnorm)); in TaoSolve_TRON()
119 tao->ksp_its = 0; in TaoSolve_TRON()
121 delta = tao->trust; in TaoSolve_TRON()
123 PetscCall(TaoComputeHessian(tao, tao->solution, tao->hessian, tao->hessian_pre)); in TaoSolve_TRON()
127 …PetscCall(VecWhichInactive(tao->XL, tao->solution, tao->gradient, tao->XU, PETSC_TRUE, &tron->Free… in TaoSolve_TRON()
132 PetscCall(VecNorm(tao->gradient, NORM_2, &tron->gnorm)); in TaoSolve_TRON()
133 PetscCall(TaoLogConvergenceHistory(tao, tron->f, tron->gnorm, 0.0, tao->ksp_its)); in TaoSolve_TRON()
134 PetscCall(TaoMonitor(tao, tao->niter, tron->f, tron->gnorm, 0.0, delta)); in TaoSolve_TRON()
135 PetscUseTypeMethod(tao, convergencetest, tao->cnvP); in TaoSolve_TRON()
136 if (!tao->reason) tao->reason = TAO_CONVERGED_STEPTOL; in TaoSolve_TRON()
140 PetscCall(TaoVecGetSubVec(tao->gradient, tron->Free_Local, tao->subset_type, 0.0, &tron->R)); in TaoSolve_TRON()
141 … PetscCall(TaoVecGetSubVec(tao->gradient, tron->Free_Local, tao->subset_type, 0.0, &tron->DXFree)); in TaoSolve_TRON()
144 …PetscCall(TaoMatGetSubMat(tao->hessian, tron->Free_Local, tron->diag, tao->subset_type, &tron->H_s… in TaoSolve_TRON()
145 if (tao->hessian == tao->hessian_pre) { in TaoSolve_TRON()
150 …PetscCall(TaoMatGetSubMat(tao->hessian_pre, tron->Free_Local, tron->diag, tao->subset_type, &tron-… in TaoSolve_TRON()
152 PetscCall(KSPReset(tao->ksp)); in TaoSolve_TRON()
153 PetscCall(KSPSetOperators(tao->ksp, tron->H_sub, tron->Hpre_sub)); in TaoSolve_TRON()
156 PetscCall(KSPCGSetRadius(tao->ksp, delta)); in TaoSolve_TRON()
158 PetscCall(KSPSolve(tao->ksp, tron->R, tron->DXFree)); in TaoSolve_TRON()
159 PetscCall(KSPGetIterationNumber(tao->ksp, &its)); in TaoSolve_TRON()
160 tao->ksp_its += its; in TaoSolve_TRON()
161 tao->ksp_tot_its += its; in TaoSolve_TRON()
162 PetscCall(VecSet(tao->stepdirection, 0.0)); in TaoSolve_TRON()
165 PetscCall(VecISAXPY(tao->stepdirection, tron->Free_Local, 1.0, tron->DXFree)); in TaoSolve_TRON()
167 PetscCall(VecDot(tao->gradient, tao->stepdirection, &gdx)); in TaoSolve_TRON()
168 PetscCall(VecCopy(tao->solution, tron->X_New)); in TaoSolve_TRON()
169 PetscCall(VecCopy(tao->gradient, tron->G_New)); in TaoSolve_TRON()
174 PetscCall(TaoLineSearchSetInitialStepLength(tao->linesearch, 1.0)); in TaoSolve_TRON()
175 …PetscCall(TaoLineSearchApply(tao->linesearch, tron->X_New, &f_new, tron->G_New, tao->stepdirection… in TaoSolve_TRON()
176 PetscCall(TaoAddLineSearchCounts(tao)); in TaoSolve_TRON()
178 PetscCall(MatMult(tao->hessian, tao->stepdirection, tron->Work)); in TaoSolve_TRON()
179 PetscCall(VecAYPX(tron->Work, 0.5, tao->gradient)); in TaoSolve_TRON()
180 PetscCall(VecDot(tao->stepdirection, tron->Work, &prered)); in TaoSolve_TRON()
193 PetscCall(VecCopy(tron->X_New, tao->stepdirection)); in TaoSolve_TRON()
194 PetscCall(VecAXPY(tao->stepdirection, -1.0, tao->solution)); in TaoSolve_TRON()
196 PetscCall(VecNorm(tao->stepdirection, NORM_2, &xdiff)); in TaoSolve_TRON()
207 … PetscCall(VecBoundGradientProjection(tron->G_New, tron->X_New, tao->XL, tao->XU, tao->gradient)); in TaoSolve_TRON()
209 …PetscCall(VecWhichInactive(tao->XL, tron->X_New, tao->gradient, tao->XU, PETSC_TRUE, &tron->Free_L… in TaoSolve_TRON()
211 PetscCall(VecNorm(tao->gradient, NORM_2, &tron->gnorm)); in TaoSolve_TRON()
212 PetscCall(VecCopy(tron->X_New, tao->solution)); in TaoSolve_TRON()
213 PetscCall(VecCopy(tron->G_New, tao->gradient)); in TaoSolve_TRON()
224 tao->trust = delta; in TaoSolve_TRON()
225 tao->niter++; in TaoSolve_TRON()
226 PetscCall(TaoLogConvergenceHistory(tao, tron->f, tron->gnorm, 0.0, tao->ksp_its)); in TaoSolve_TRON()
227 PetscCall(TaoMonitor(tao, tao->niter, tron->f, tron->gnorm, 0.0, stepsize)); in TaoSolve_TRON()
228 PetscUseTypeMethod(tao, convergencetest, tao->cnvP); in TaoSolve_TRON()
233 static PetscErrorCode TronGradientProjections(Tao tao, TAO_TRON *tron) in TronGradientProjections() argument
254 PetscCall(VecCopy(tao->gradient, tao->stepdirection)); in TronGradientProjections()
255 PetscCall(VecScale(tao->stepdirection, -1.0)); in TronGradientProjections()
256 PetscCall(TaoLineSearchSetInitialStepLength(tao->linesearch, tron->pgstepsize)); in TronGradientProjections()
257 …PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &f_new, tao->gradient, tao->stepdirec… in TronGradientProjections()
258 PetscCall(TaoAddLineSearchCounts(tao)); in TronGradientProjections()
260 …PetscCall(VecBoundGradientProjection(tao->gradient, tao->solution, tao->XL, tao->XU, tao->gradient… in TronGradientProjections()
261 PetscCall(VecNorm(tao->gradient, NORM_2, &tron->gnorm)); in TronGradientProjections()
271 static PetscErrorCode TaoComputeDual_TRON(Tao tao, Vec DXL, Vec DXU) in TaoComputeDual_TRON() argument
273 TAO_TRON *tron = (TAO_TRON *)tao->data; in TaoComputeDual_TRON()
276 PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); in TaoComputeDual_TRON()
279 …PetscCheck(tron->Work && tao->gradient, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Dual variables don't ex… in TaoComputeDual_TRON()
281 PetscCall(VecBoundGradientProjection(tao->gradient, tao->solution, tao->XL, tao->XU, tron->Work)); in TaoComputeDual_TRON()
283 PetscCall(VecAXPY(DXL, -1.0, tao->gradient)); in TaoComputeDual_TRON()
287 PetscCall(VecCopy(tao->gradient, DXU)); in TaoComputeDual_TRON()
304 PETSC_EXTERN PetscErrorCode TaoCreate_TRON(Tao tao) in TaoCreate_TRON() argument
310 tao->ops->setup = TaoSetup_TRON; in TaoCreate_TRON()
311 tao->ops->solve = TaoSolve_TRON; in TaoCreate_TRON()
312 tao->ops->view = TaoView_TRON; in TaoCreate_TRON()
313 tao->ops->setfromoptions = TaoSetFromOptions_TRON; in TaoCreate_TRON()
314 tao->ops->destroy = TaoDestroy_TRON; in TaoCreate_TRON()
315 tao->ops->computedual = TaoComputeDual_TRON; in TaoCreate_TRON()
318 tao->data = (void *)tron; in TaoCreate_TRON()
321 PetscCall(TaoParametersInitialize(tao)); in TaoCreate_TRON()
322 PetscObjectParameterSetDefault(tao, max_it, 50); in TaoCreate_TRON()
323 PetscObjectParameterSetDefault(tao, trust0, 1.0); in TaoCreate_TRON()
324 PetscObjectParameterSetDefault(tao, steptol, 0.0); in TaoCreate_TRON()
352 tao->subset_type = TAO_SUBSET_SUBVEC; in TaoCreate_TRON()
354 PetscCall(TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch)); in TaoCreate_TRON()
355 PetscCall(PetscObjectIncrementTabLevel((PetscObject)tao->linesearch, (PetscObject)tao, 1)); in TaoCreate_TRON()
356 PetscCall(TaoLineSearchSetType(tao->linesearch, morethuente_type)); in TaoCreate_TRON()
357 PetscCall(TaoLineSearchUseTaoRoutines(tao->linesearch, tao)); in TaoCreate_TRON()
358 PetscCall(TaoLineSearchSetOptionsPrefix(tao->linesearch, tao->hdr.prefix)); in TaoCreate_TRON()
360 PetscCall(KSPCreate(((PetscObject)tao)->comm, &tao->ksp)); in TaoCreate_TRON()
361 PetscCall(PetscObjectIncrementTabLevel((PetscObject)tao->ksp, (PetscObject)tao, 1)); in TaoCreate_TRON()
362 PetscCall(KSPSetOptionsPrefix(tao->ksp, tao->hdr.prefix)); in TaoCreate_TRON()
363 PetscCall(KSPSetType(tao->ksp, KSPSTCG)); in TaoCreate_TRON()