Lines Matching refs:cg
15 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoBNCGEstimateActiveSet() local
18 PetscCall(ISDestroy(&cg->inactive_old)); in TaoBNCGEstimateActiveSet()
19 if (cg->inactive_idx) { in TaoBNCGEstimateActiveSet()
20 PetscCall(ISDuplicate(cg->inactive_idx, &cg->inactive_old)); in TaoBNCGEstimateActiveSet()
21 PetscCall(ISCopy(cg->inactive_idx, cg->inactive_old)); in TaoBNCGEstimateActiveSet()
25 PetscCall(ISDestroy(&cg->inactive_idx)); in TaoBNCGEstimateActiveSet()
26 …PetscCall(VecWhichInactive(tao->XL, tao->solution, cg->unprojected_gradient, tao->XU, PETSC_TRUE, … in TaoBNCGEstimateActiveSet()
27 PetscCall(ISDestroy(&cg->active_idx)); in TaoBNCGEstimateActiveSet()
28 PetscCall(ISComplementVec(cg->inactive_idx, tao->solution, &cg->active_idx)); in TaoBNCGEstimateActiveSet()
32 PetscCall(VecCopy(cg->unprojected_gradient, cg->W)); in TaoBNCGEstimateActiveSet()
33 PetscCall(VecScale(cg->W, -1.0)); in TaoBNCGEstimateActiveSet()
34 …U, cg->unprojected_gradient, cg->W, cg->work, cg->as_step, &cg->as_tol, &cg->active_lower, &cg->ac… in TaoBNCGEstimateActiveSet()
44 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoBNCGBoundStep() local
49 if (cg->active_idx) PetscCall(VecISSet(step, cg->active_idx, 0.0)); in TaoBNCGBoundStep()
52 …PetscCall(TaoBoundStep(tao->solution, tao->XL, tao->XU, cg->active_lower, cg->active_upper, cg->ac… in TaoBNCGBoundStep()
62 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoSolve_BNCG() local
74 …>recycle) PetscCall(TaoComputeObjectiveAndGradient(tao, tao->solution, &cg->f, cg->unprojected_gra… in TaoSolve_BNCG()
75 PetscCall(VecNorm(cg->unprojected_gradient, NORM_2, &gnorm)); in TaoSolve_BNCG()
76 …PetscCheck(!PetscIsInfOrNanReal(cg->f) && !PetscIsInfOrNanReal(gnorm), PetscObjectComm((PetscObjec… in TaoSolve_BNCG()
79 PetscCall(TaoBNCGEstimateActiveSet(tao, cg->as_type)); in TaoSolve_BNCG()
82 PetscCall(VecCopy(cg->unprojected_gradient, tao->gradient)); in TaoSolve_BNCG()
83 if (cg->active_idx) PetscCall(VecISSet(tao->gradient, cg->active_idx, 0.0)); in TaoSolve_BNCG()
89 cg->ls_fails = cg->descent_error = 0; in TaoSolve_BNCG()
90 cg->resets = -1; in TaoSolve_BNCG()
91 cg->skipped_updates = cg->pure_gd_steps = 0; in TaoSolve_BNCG()
92 cg->iter_quad = 0; in TaoSolve_BNCG()
97 PetscCall(VecFischer(tao->solution, cg->unprojected_gradient, tao->XL, tao->XU, cg->W)); in TaoSolve_BNCG()
98 PetscCall(VecNorm(cg->W, NORM_2, &resnorm)); in TaoSolve_BNCG()
100 PetscCall(TaoLogConvergenceHistory(tao, cg->f, resnorm, 0.0, tao->ksp_its)); in TaoSolve_BNCG()
101 PetscCall(TaoMonitor(tao, tao->niter, cg->f, resnorm, 0.0, step)); in TaoSolve_BNCG()
114 PetscCall(TaoComputeObjective(tao, tao->solution, &cg->f)); in TaoSolve_BNCG()
123 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoSetUp_BNCG() local
128 if (!cg->W) PetscCall(VecDuplicate(tao->solution, &cg->W)); in TaoSetUp_BNCG()
129 if (!cg->work) PetscCall(VecDuplicate(tao->solution, &cg->work)); in TaoSetUp_BNCG()
130 if (!cg->sk) PetscCall(VecDuplicate(tao->solution, &cg->sk)); in TaoSetUp_BNCG()
131 if (!cg->yk) PetscCall(VecDuplicate(tao->gradient, &cg->yk)); in TaoSetUp_BNCG()
132 if (!cg->X_old) PetscCall(VecDuplicate(tao->solution, &cg->X_old)); in TaoSetUp_BNCG()
133 if (!cg->G_old) PetscCall(VecDuplicate(tao->gradient, &cg->G_old)); in TaoSetUp_BNCG()
134 if (cg->diag_scaling) { in TaoSetUp_BNCG()
135 PetscCall(VecDuplicate(tao->solution, &cg->d_work)); in TaoSetUp_BNCG()
136 PetscCall(VecDuplicate(tao->solution, &cg->y_work)); in TaoSetUp_BNCG()
137 PetscCall(VecDuplicate(tao->solution, &cg->g_work)); in TaoSetUp_BNCG()
139 if (!cg->unprojected_gradient) PetscCall(VecDuplicate(tao->gradient, &cg->unprojected_gradient)); in TaoSetUp_BNCG()
140 …if (!cg->unprojected_gradient_old) PetscCall(VecDuplicate(tao->gradient, &cg->unprojected_gradient… in TaoSetUp_BNCG()
141 PetscCall(MatLMVMAllocate(cg->B, cg->sk, cg->yk)); in TaoSetUp_BNCG()
142 if (cg->pc) PetscCall(MatLMVMSetJ0(cg->B, cg->pc)); in TaoSetUp_BNCG()
148 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoDestroy_BNCG() local
152 PetscCall(VecDestroy(&cg->W)); in TaoDestroy_BNCG()
153 PetscCall(VecDestroy(&cg->work)); in TaoDestroy_BNCG()
154 PetscCall(VecDestroy(&cg->X_old)); in TaoDestroy_BNCG()
155 PetscCall(VecDestroy(&cg->G_old)); in TaoDestroy_BNCG()
156 PetscCall(VecDestroy(&cg->unprojected_gradient)); in TaoDestroy_BNCG()
157 PetscCall(VecDestroy(&cg->unprojected_gradient_old)); in TaoDestroy_BNCG()
158 PetscCall(VecDestroy(&cg->g_work)); in TaoDestroy_BNCG()
159 PetscCall(VecDestroy(&cg->d_work)); in TaoDestroy_BNCG()
160 PetscCall(VecDestroy(&cg->y_work)); in TaoDestroy_BNCG()
161 PetscCall(VecDestroy(&cg->sk)); in TaoDestroy_BNCG()
162 PetscCall(VecDestroy(&cg->yk)); in TaoDestroy_BNCG()
164 PetscCall(ISDestroy(&cg->active_lower)); in TaoDestroy_BNCG()
165 PetscCall(ISDestroy(&cg->active_upper)); in TaoDestroy_BNCG()
166 PetscCall(ISDestroy(&cg->active_fixed)); in TaoDestroy_BNCG()
167 PetscCall(ISDestroy(&cg->active_idx)); in TaoDestroy_BNCG()
168 PetscCall(ISDestroy(&cg->inactive_idx)); in TaoDestroy_BNCG()
169 PetscCall(ISDestroy(&cg->inactive_old)); in TaoDestroy_BNCG()
170 PetscCall(ISDestroy(&cg->new_inactives)); in TaoDestroy_BNCG()
171 PetscCall(MatDestroy(&cg->B)); in TaoDestroy_BNCG()
172 if (cg->pc) PetscCall(MatDestroy(&cg->pc)); in TaoDestroy_BNCG()
179 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoSetFromOptions_BNCG() local
183 …"CG update formula", "TaoBNCGTypes", TaoBNCGTypes, (PetscEnum)cg->cg_type, (PetscEnum *)&cg->cg_ty… in TaoSetFromOptions_BNCG()
184 …if (cg->cg_type != TAO_BNCG_SSML_BFGS) cg->alpha = -1.0; /* Setting defaults for non-BFGS methods.… in TaoSetFromOptions_BNCG()
185 if (TAO_BNCG_GD == cg->cg_type) { in TaoSetFromOptions_BNCG()
186 cg->cg_type = TAO_BNCG_PCGD; in TaoSetFromOptions_BNCG()
188 cg->unscaled_restart = PETSC_TRUE; in TaoSetFromOptions_BNCG()
189 cg->diag_scaling = PETSC_FALSE; in TaoSetFromOptions_BNCG()
191 …sReal("-tao_bncg_hz_eta", "(developer) cutoff tolerance for HZ", "", cg->hz_eta, &cg->hz_eta, NULL… in TaoSetFromOptions_BNCG()
192 …sReal("-tao_bncg_eps", "(developer) cutoff value for restarts", "", cg->epsilon, &cg->epsilon, NUL… in TaoSetFromOptions_BNCG()
193 …sReal("-tao_bncg_dk_eta", "(developer) cutoff tolerance for DK", "", cg->dk_eta, &cg->dk_eta, NULL… in TaoSetFromOptions_BNCG()
194 …cOptionsReal("-tao_bncg_xi", "(developer) Parameter in the KD method", "", cg->xi, &cg->xi, NULL)); in TaoSetFromOptions_BNCG()
195 …g_theta", "(developer) update parameter for the Broyden method", "", cg->theta, &cg->theta, NULL)); in TaoSetFromOptions_BNCG()
196 …cg_hz_theta", "(developer) parameter for the HZ (2006) method", "", cg->hz_theta, &cg->hz_theta, N… in TaoSetFromOptions_BNCG()
197 …tao_bncg_alpha", "(developer) parameter for the scalar scaling", "", cg->alpha, &cg->alpha, NULL)); in TaoSetFromOptions_BNCG()
198 …ale", "(developer) update parameter for bfgs/brdn CG methods", "", cg->bfgs_scale, &cg->bfgs_scale… in TaoSetFromOptions_BNCG()
199 …ale", "(developer) update parameter for bfgs/brdn CG methods", "", cg->dfp_scale, &cg->dfp_scale, … in TaoSetFromOptions_BNCG()
200 …iag_scaling", "Enable diagonal Broyden-like preconditioning", "", cg->diag_scaling, &cg->diag_scal… in TaoSetFromOptions_BNCG()
201 …rt", "(developer) use dynamic restarts as in HZ, DK, KD", "", cg->use_dynamic_restart, &cg->use_dy… in TaoSetFromOptions_BNCG()
202 …led_restart", "(developer) use unscaled gradient restarts", "", cg->unscaled_restart, &cg->unscale… in TaoSetFromOptions_BNCG()
203 …o_bncg_zeta", "(developer) Free parameter for the Kou-Dai method", "", cg->zeta, &cg->zeta, NULL)); in TaoSetFromOptions_BNCG()
204 …ations with approximate quadratic behavior needed for restart", "", cg->min_quad, &cg->min_quad, N… in TaoSetFromOptions_BNCG()
205 …) Number of iterations between restarts (times dimension)", "", cg->min_restart_num, &cg->min_rest… in TaoSetFromOptions_BNCG()
206 …eepest descent restarting every fixed number of iterations", "", cg->spaced_restart, &cg->spaced_r… in TaoSetFromOptions_BNCG()
207 …ao_bncg_no_scaling", "Disable all scaling except in restarts", "", cg->no_scaling, &cg->no_scaling… in TaoSetFromOptions_BNCG()
208 if (cg->no_scaling) { in TaoSetFromOptions_BNCG()
209 cg->diag_scaling = PETSC_FALSE; in TaoSetFromOptions_BNCG()
210 cg->alpha = -1.0; in TaoSetFromOptions_BNCG()
212 …if (cg->alpha == -1.0 && cg->cg_type == TAO_BNCG_KD && !cg->diag_scaling) { /* Some more default o… in TaoSetFromOptions_BNCG()
213 cg->neg_xi = PETSC_TRUE; in TaoSetFromOptions_BNCG()
215 …xi when it might be a smaller descent direction than necessary", "", cg->neg_xi, &cg->neg_xi, NULL… in TaoSetFromOptions_BNCG()
216 …tive set estimation method", "", CG_AS_TYPE, CG_AS_SIZE, CG_AS_TYPE[cg->as_type], &cg->as_type, NU… in TaoSetFromOptions_BNCG()
217 …tial tolerance used when estimating actively bounded variables", "", cg->as_tol, &cg->as_tol, NULL… in TaoSetFromOptions_BNCG()
218 …) step length used when estimating actively bounded variables", "", cg->as_step, &cg->as_step, NUL… in TaoSetFromOptions_BNCG()
219 …er) minimum scaling factor used for scaled gradient restarts", "", cg->delta_min, &cg->delta_min, … in TaoSetFromOptions_BNCG()
220 …er) maximum scaling factor used for scaled gradient restarts", "", cg->delta_max, &cg->delta_max, … in TaoSetFromOptions_BNCG()
223 PetscCall(MatSetOptionsPrefix(cg->B, ((PetscObject)tao)->prefix)); in TaoSetFromOptions_BNCG()
224 PetscCall(MatAppendOptionsPrefix(cg->B, "tao_bncg_")); in TaoSetFromOptions_BNCG()
225 PetscCall(MatSetFromOptions(cg->B)); in TaoSetFromOptions_BNCG()
232 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoView_BNCG() local
238 PetscCall(PetscViewerASCIIPrintf(viewer, "CG Type: %s\n", TaoBNCGTypes[cg->cg_type])); in TaoView_BNCG()
239 …werASCIIPrintf(viewer, "Skipped Stepdirection Updates: %" PetscInt_FMT "\n", cg->skipped_updates)); in TaoView_BNCG()
240 …PetscCall(PetscViewerASCIIPrintf(viewer, "Scaled gradient steps: %" PetscInt_FMT "\n", cg->resets)… in TaoView_BNCG()
241 …PetscCall(PetscViewerASCIIPrintf(viewer, "Pure gradient steps: %" PetscInt_FMT "\n", cg->pure_gd_s… in TaoView_BNCG()
242 …PetscCall(PetscViewerASCIIPrintf(viewer, "Not a descent direction: %" PetscInt_FMT "\n", cg->desce… in TaoView_BNCG()
243 … PetscCall(PetscViewerASCIIPrintf(viewer, "Line search fails: %" PetscInt_FMT "\n", cg->ls_fails)); in TaoView_BNCG()
244 if (cg->diag_scaling) { in TaoView_BNCG()
248 PetscCall(MatView(cg->B, viewer)); in TaoView_BNCG()
333 TAO_BNCG *cg; in TaoCreate_BNCG() local
357 PetscCall(PetscNew(&cg)); in TaoCreate_BNCG()
358 tao->data = (void *)cg; in TaoCreate_BNCG()
360 PetscCall(MatCreate(PetscObjectComm((PetscObject)tao), &cg->B)); in TaoCreate_BNCG()
361 PetscCall(PetscObjectIncrementTabLevel((PetscObject)cg->B, (PetscObject)tao, 1)); in TaoCreate_BNCG()
362 PetscCall(MatSetType(cg->B, MATLMVMDIAGBROYDEN)); in TaoCreate_BNCG()
364 cg->pc = NULL; in TaoCreate_BNCG()
366 cg->dk_eta = 0.5; in TaoCreate_BNCG()
367 cg->hz_eta = 0.4; in TaoCreate_BNCG()
368 cg->dynamic_restart = PETSC_FALSE; in TaoCreate_BNCG()
369 cg->unscaled_restart = PETSC_FALSE; in TaoCreate_BNCG()
370 cg->no_scaling = PETSC_FALSE; in TaoCreate_BNCG()
371 cg->delta_min = 1e-7; in TaoCreate_BNCG()
372 cg->delta_max = 100; in TaoCreate_BNCG()
373 cg->theta = 1.0; in TaoCreate_BNCG()
374 cg->hz_theta = 1.0; in TaoCreate_BNCG()
375 cg->dfp_scale = 1.0; in TaoCreate_BNCG()
376 cg->bfgs_scale = 1.0; in TaoCreate_BNCG()
377 cg->zeta = 0.1; in TaoCreate_BNCG()
378 cg->min_quad = 6; in TaoCreate_BNCG()
379 cg->min_restart_num = 6; /* As in CG_DESCENT and KD2015*/ in TaoCreate_BNCG()
380 cg->xi = 1.0; in TaoCreate_BNCG()
381 cg->neg_xi = PETSC_TRUE; in TaoCreate_BNCG()
382 cg->spaced_restart = PETSC_FALSE; in TaoCreate_BNCG()
383 cg->tol_quad = 1e-8; in TaoCreate_BNCG()
384 cg->as_step = 0.001; in TaoCreate_BNCG()
385 cg->as_tol = 0.001; in TaoCreate_BNCG()
386 cg->eps_23 = PetscPowReal(PETSC_MACHINE_EPSILON, 2.0 / 3.0); /* Just a little tighter*/ in TaoCreate_BNCG()
387 cg->as_type = CG_AS_BERTSEKAS; in TaoCreate_BNCG()
388 cg->cg_type = TAO_BNCG_SSML_BFGS; in TaoCreate_BNCG()
389 cg->alpha = 1.0; in TaoCreate_BNCG()
390 cg->diag_scaling = PETSC_TRUE; in TaoCreate_BNCG()
396 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoBNCGResetUpdate() local
400 ++cg->resets; in TaoBNCGResetUpdate()
401 scaling = 2.0 * PetscMax(1.0, PetscAbsScalar(cg->f)) / PetscMax(gnormsq, cg->eps_23); in TaoBNCGResetUpdate()
402 scaling = PetscMin(cg->delta_max, PetscMax(cg->delta_min, scaling)); in TaoBNCGResetUpdate()
403 if (cg->unscaled_restart) { in TaoBNCGResetUpdate()
405 ++cg->pure_gd_steps; in TaoBNCGResetUpdate()
409 if (cg->diag_scaling) PetscCall(MatLMVMReset(cg->B, PETSC_FALSE)); in TaoBNCGResetUpdate()
415 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoBNCGCheckDynamicRestart() local
419 if (cg->f < cg->min_quad / 10) { in TaoBNCGCheckDynamicRestart()
423 quadinterp = 2.0 * (cg->f - fold) / (stepsize * (gd + gd_old)); in TaoBNCGCheckDynamicRestart()
424 if (PetscAbs(quadinterp - 1.0) < cg->tol_quad) ++cg->iter_quad; in TaoBNCGCheckDynamicRestart()
426 cg->iter_quad = 0; in TaoBNCGCheckDynamicRestart()
429 if (cg->iter_quad >= cg->min_quad) { in TaoBNCGCheckDynamicRestart()
430 cg->iter_quad = 0; in TaoBNCGCheckDynamicRestart()
438 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoBNCGStepDirectionUpdate() local
448 PetscCall(VecWAXPY(cg->yk, -1.0, cg->G_old, tao->gradient)); in TaoBNCGStepDirectionUpdate()
449 PetscCall(VecNorm(cg->yk, NORM_2, &ynorm)); in TaoBNCGStepDirectionUpdate()
451 PetscCall(VecDot(cg->yk, tao->stepdirection, &dk_yk)); in TaoBNCGStepDirectionUpdate()
454 ++cg->skipped_updates; in TaoBNCGStepDirectionUpdate()
456 if (cg->spaced_restart) { in TaoBNCGStepDirectionUpdate()
458 if (tao->niter % (dim * cg->min_restart_num)) cg_restart = PETSC_TRUE; in TaoBNCGStepDirectionUpdate()
462 if (cg->spaced_restart) { in TaoBNCGStepDirectionUpdate()
467 if (cg->diag_scaling) PetscCall(MatLMVMUpdate(cg->B, tao->solution, tao->gradient)); in TaoBNCGStepDirectionUpdate()
495 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
496 PetscCall(VecAXPBY(tao->stepdirection, -1.0, 0.0, cg->g_work)); in TaoBNCGStepDirectionUpdate()
498 switch (cg->cg_type) { in TaoBNCGStepDirectionUpdate()
500 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
501 if (!cg->no_scaling) { in TaoBNCGStepDirectionUpdate()
502 cg->sts = step * step * dnorm * dnorm; in TaoBNCGStepDirectionUpdate()
503 PetscCall(TaoBNCGComputeScalarScaling(ynorm2, step * dk_yk, cg->sts, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
506 ++cg->pure_gd_steps; in TaoBNCGStepDirectionUpdate()
510 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
511 PetscCall(VecAXPBY(tao->stepdirection, -1.0, 0.0, cg->g_work)); in TaoBNCGStepDirectionUpdate()
517 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
518 cg->sts = step * step * dnorm * dnorm; in TaoBNCGStepDirectionUpdate()
519 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
520 PetscCall(TaoBNCGComputeScalarScaling(ynorm2, step * dk_yk, cg->sts, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
524 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
525 PetscCall(VecDot(cg->yk, cg->g_work, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
527 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work)); in TaoBNCGStepDirectionUpdate()
532 PetscCall(VecDot(cg->G_old, cg->G_old, &gnorm2_old)); in TaoBNCGStepDirectionUpdate()
533 PetscCall(VecWAXPY(cg->yk, -1.0, cg->G_old, tao->gradient)); in TaoBNCGStepDirectionUpdate()
534 PetscCall(VecNorm(cg->yk, NORM_2, &ynorm)); in TaoBNCGStepDirectionUpdate()
536 PetscCall(VecDot(cg->yk, tao->stepdirection, &dk_yk)); in TaoBNCGStepDirectionUpdate()
537 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
538 …TaoBNCGComputeScalarScaling(ynorm2, step * dk_yk, step * step * dnorm * dnorm, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
542 PetscCall(VecDot(cg->G_old, cg->g_work, &gnorm2_old)); /* Before it's updated */ in TaoBNCGStepDirectionUpdate()
543 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
544 PetscCall(VecDot(tao->gradient, cg->g_work, &tmp)); in TaoBNCGStepDirectionUpdate()
546 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work)); in TaoBNCGStepDirectionUpdate()
552 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
553 PetscCall(VecDot(cg->G_old, cg->G_old, &gnorm2_old)); in TaoBNCGStepDirectionUpdate()
554 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
555 … PetscCall(TaoBNCGComputeScalarScaling(ynorm2, step * dk_yk, snorm * snorm, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
559 PetscCall(VecDot(cg->G_old, cg->g_work, &gnorm2_old)); in TaoBNCGStepDirectionUpdate()
560 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
561 PetscCall(VecDot(cg->g_work, cg->yk, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
563 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work)); in TaoBNCGStepDirectionUpdate()
568 PetscCall(VecWAXPY(cg->yk, -1.0, cg->G_old, tao->gradient)); in TaoBNCGStepDirectionUpdate()
569 PetscCall(VecNorm(cg->yk, NORM_2, &ynorm)); in TaoBNCGStepDirectionUpdate()
571 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
572 PetscCall(VecDot(cg->G_old, cg->G_old, &gnorm2_old)); in TaoBNCGStepDirectionUpdate()
573 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
574 … PetscCall(TaoBNCGComputeScalarScaling(ynorm2, step * dk_yk, snorm * snorm, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
579 PetscCall(VecDot(cg->G_old, cg->g_work, &gnorm2_old)); /* Old gtDg */ in TaoBNCGStepDirectionUpdate()
580 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
581 PetscCall(VecDot(cg->g_work, cg->yk, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
584 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work)); in TaoBNCGStepDirectionUpdate()
591 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
593 PetscCall(VecDot(cg->G_old, tao->stepdirection, &gd_old)); in TaoBNCGStepDirectionUpdate()
594 PetscCall(TaoBNCGComputeScalarScaling(ynorm2, step * dk_yk, cg->yts, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
598 PetscCall(MatMult(cg->B, tao->stepdirection, cg->d_work)); in TaoBNCGStepDirectionUpdate()
599 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
600 PetscCall(VecDot(cg->g_work, tao->gradient, >Dg)); in TaoBNCGStepDirectionUpdate()
601 PetscCall(VecDot(tao->stepdirection, cg->G_old, &gd_old)); in TaoBNCGStepDirectionUpdate()
602 PetscCall(VecDot(cg->d_work, cg->g_work, &dk_yk)); in TaoBNCGStepDirectionUpdate()
605 PetscCall(VecScale(cg->d_work, beta)); in TaoBNCGStepDirectionUpdate()
606 PetscCall(VecWAXPY(tao->stepdirection, -1.0, cg->g_work, cg->d_work)); in TaoBNCGStepDirectionUpdate()
614 PetscCall(VecDot(cg->G_old, tao->stepdirection, &gd_old)); in TaoBNCGStepDirectionUpdate()
615 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution)); in TaoBNCGStepDirectionUpdate()
617 cg->yts = step * dk_yk; in TaoBNCGStepDirectionUpdate()
618 …if (cg->use_dynamic_restart) PetscCall(TaoBNCGCheckDynamicRestart(tao, step, gd, gd_old, &cg->dyna… in TaoBNCGStepDirectionUpdate()
619 if (cg->dynamic_restart) { in TaoBNCGStepDirectionUpdate()
622 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
623 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
624 PetscCall(TaoBNCGComputeScalarScaling(ynorm2, cg->yts, snorm * snorm, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
629 …beta = PetscMax(PetscMax(beta, cg->hz_eta * tau_k * gd_old / (dnorm * dnorm)), cg->dk_eta * tau_k … in TaoBNCGStepDirectionUpdate()
634 cg->yty = ynorm2; in TaoBNCGStepDirectionUpdate()
635 cg->sts = snorm * snorm; in TaoBNCGStepDirectionUpdate()
637 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
638 PetscCall(MatSolve(cg->B, cg->yk, cg->y_work)); in TaoBNCGStepDirectionUpdate()
639 PetscCall(MatSolve(cg->B, tao->stepdirection, cg->d_work)); in TaoBNCGStepDirectionUpdate()
641 PetscCall(VecDot(cg->yk, cg->g_work, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
644 PetscCall(VecDot(cg->yk, cg->y_work, &tau_k)); in TaoBNCGStepDirectionUpdate()
647 beta = gkp1_yk / dk_yk + cg->hz_theta * tau_k; /* HZ; (1.15) from DK 2013 */ in TaoBNCGStepDirectionUpdate()
649 PetscCall(VecDot(cg->G_old, cg->d_work, &gd_old)); in TaoBNCGStepDirectionUpdate()
650 PetscCall(VecDot(tao->stepdirection, cg->g_work, &gd)); in TaoBNCGStepDirectionUpdate()
651 …beta = PetscMax(PetscMax(beta, cg->hz_eta * gd_old / (dnorm * dnorm)), cg->dk_eta * gd / (dnorm * … in TaoBNCGStepDirectionUpdate()
653 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work)); in TaoBNCGStepDirectionUpdate()
662 PetscCall(VecDot(cg->G_old, tao->stepdirection, &gd_old)); in TaoBNCGStepDirectionUpdate()
663 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution)); in TaoBNCGStepDirectionUpdate()
665 cg->yts = dk_yk * step; in TaoBNCGStepDirectionUpdate()
666 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
667 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
668 PetscCall(TaoBNCGComputeScalarScaling(ynorm2, cg->yts, snorm * snorm, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
672 …beta = PetscMax(PetscMax(beta, cg->hz_eta * tau_k * gd_old / (dnorm * dnorm)), cg->dk_eta * tau_k … in TaoBNCGStepDirectionUpdate()
674 PetscCall(VecAXPBYPCZ(tao->stepdirection, -tau_k, 0.0, beta, tao->gradient, cg->yk)); in TaoBNCGStepDirectionUpdate()
677 cg->yty = ynorm2; in TaoBNCGStepDirectionUpdate()
678 cg->sts = snorm * snorm; in TaoBNCGStepDirectionUpdate()
679 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
680 PetscCall(MatSolve(cg->B, cg->yk, cg->y_work)); in TaoBNCGStepDirectionUpdate()
681 PetscCall(MatSolve(cg->B, tao->stepdirection, cg->d_work)); in TaoBNCGStepDirectionUpdate()
683 PetscCall(VecDot(cg->yk, cg->g_work, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
684 PetscCall(VecDot(cg->yk, cg->y_work, &tau_k)); in TaoBNCGStepDirectionUpdate()
690 PetscCall(VecDot(cg->y_work, tao->stepdirection, &dk_yk)); in TaoBNCGStepDirectionUpdate()
692 PetscCall(VecDot(tao->stepdirection, cg->g_work, &gd)); in TaoBNCGStepDirectionUpdate()
693 PetscCall(VecDot(cg->G_old, cg->d_work, &gd_old)); in TaoBNCGStepDirectionUpdate()
694 …beta = PetscMax(PetscMax(beta, cg->hz_eta * gd_old / (dnorm * dnorm)), cg->dk_eta * gd / (dnorm * … in TaoBNCGStepDirectionUpdate()
696 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work)); in TaoBNCGStepDirectionUpdate()
704 PetscCall(VecDot(cg->G_old, tao->stepdirection, &gd_old)); in TaoBNCGStepDirectionUpdate()
705 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution)); in TaoBNCGStepDirectionUpdate()
707 cg->yts = dk_yk * step; in TaoBNCGStepDirectionUpdate()
708 …if (cg->use_dynamic_restart) PetscCall(TaoBNCGCheckDynamicRestart(tao, step, gd, gd_old, &cg->dyna… in TaoBNCGStepDirectionUpdate()
709 if (cg->dynamic_restart) { in TaoBNCGStepDirectionUpdate()
712 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
713 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
714 PetscCall(TaoBNCGComputeScalarScaling(ynorm2, cg->yts, snorm * snorm, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
716 if (beta < cg->zeta * tau_k * gd / (dnorm * dnorm)) /* 0.1 is KD's zeta parameter */ in TaoBNCGStepDirectionUpdate()
718 beta = cg->zeta * tau_k * gd / (dnorm * dnorm); in TaoBNCGStepDirectionUpdate()
721 if (gkp1_yk < 0 && cg->neg_xi) gamma = -1.0 * gd / dk_yk; in TaoBNCGStepDirectionUpdate()
724 else gamma = cg->xi * gd / dk_yk; in TaoBNCGStepDirectionUpdate()
727 … PetscCall(VecAXPBYPCZ(tao->stepdirection, -tau_k, gamma * tau_k, beta, tao->gradient, cg->yk)); in TaoBNCGStepDirectionUpdate()
730 cg->yty = ynorm2; in TaoBNCGStepDirectionUpdate()
731 cg->sts = snorm * snorm; in TaoBNCGStepDirectionUpdate()
732 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
733 PetscCall(MatSolve(cg->B, cg->yk, cg->y_work)); in TaoBNCGStepDirectionUpdate()
735 PetscCall(VecDot(cg->yk, cg->g_work, &gkp1D_yk)); in TaoBNCGStepDirectionUpdate()
739 PetscCall(VecDot(cg->yk, cg->y_work, &tau_k)); in TaoBNCGStepDirectionUpdate()
744 PetscCall(VecDot(tao->stepdirection, cg->g_work, &tmp)); in TaoBNCGStepDirectionUpdate()
745 if (cg->neg_xi) { in TaoBNCGStepDirectionUpdate()
748 else gamma = cg->xi * gd / dk_yk; in TaoBNCGStepDirectionUpdate()
749 if (beta < cg->zeta * tmp / (dnorm * dnorm)) { in TaoBNCGStepDirectionUpdate()
750 beta = cg->zeta * tmp / (dnorm * dnorm); in TaoBNCGStepDirectionUpdate()
754 if (beta < cg->zeta * tmp / (dnorm * dnorm)) { in TaoBNCGStepDirectionUpdate()
755 beta = cg->zeta * tmp / (dnorm * dnorm); in TaoBNCGStepDirectionUpdate()
757 } else gamma = cg->xi * gd / dk_yk; in TaoBNCGStepDirectionUpdate()
760 PetscCall(VecAXPBY(tao->stepdirection, -1.0, beta, cg->g_work)); in TaoBNCGStepDirectionUpdate()
761 PetscCall(VecAXPY(tao->stepdirection, gamma, cg->y_work)); in TaoBNCGStepDirectionUpdate()
770 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution)); in TaoBNCGStepDirectionUpdate()
772 cg->yts = dk_yk * step; in TaoBNCGStepDirectionUpdate()
773 cg->yty = ynorm2; in TaoBNCGStepDirectionUpdate()
774 cg->sts = snorm * snorm; in TaoBNCGStepDirectionUpdate()
775 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
776 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
777 PetscCall(TaoBNCGComputeScalarScaling(cg->yty, cg->yts, cg->sts, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
779 beta = tau_k * (gkp1_yk / dk_yk - cg->yty * gd / (dk_yk * dk_yk)) - step * tmp; in TaoBNCGStepDirectionUpdate()
781 … PetscCall(VecAXPBYPCZ(tao->stepdirection, -tau_k, tmp * tau_k, beta, tao->gradient, cg->yk)); in TaoBNCGStepDirectionUpdate()
784 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
785 PetscCall(MatSolve(cg->B, cg->yk, cg->y_work)); in TaoBNCGStepDirectionUpdate()
787 PetscCall(VecDot(cg->g_work, cg->yk, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
788 PetscCall(VecDot(cg->y_work, cg->yk, &tmp)); in TaoBNCGStepDirectionUpdate()
793 PetscCall(VecAXPBYPCZ(tao->stepdirection, -1.0, gamma, beta, cg->g_work, cg->y_work)); in TaoBNCGStepDirectionUpdate()
799 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution)); in TaoBNCGStepDirectionUpdate()
801 cg->yts = dk_yk * step; in TaoBNCGStepDirectionUpdate()
802 cg->yty = ynorm2; in TaoBNCGStepDirectionUpdate()
803 cg->sts = snorm * snorm; in TaoBNCGStepDirectionUpdate()
804 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
806 PetscCall(TaoBNCGComputeScalarScaling(cg->yty, cg->yts, cg->sts, &tau_k, cg->alpha)); in TaoBNCGStepDirectionUpdate()
807 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
808 tau_k = cg->dfp_scale * tau_k; in TaoBNCGStepDirectionUpdate()
809 tmp = tau_k * gkp1_yk / cg->yty; in TaoBNCGStepDirectionUpdate()
812 PetscCall(VecAXPBYPCZ(tao->stepdirection, -tau_k, tmp, beta, tao->gradient, cg->yk)); in TaoBNCGStepDirectionUpdate()
815 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
816 PetscCall(MatSolve(cg->B, cg->yk, cg->y_work)); in TaoBNCGStepDirectionUpdate()
818 PetscCall(VecDot(cg->g_work, cg->yk, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
819 PetscCall(VecDot(cg->y_work, cg->yk, &tmp)); in TaoBNCGStepDirectionUpdate()
824 PetscCall(VecAXPBYPCZ(tao->stepdirection, -1.0, gamma, beta, cg->g_work, cg->y_work)); in TaoBNCGStepDirectionUpdate()
830 PetscCall(VecWAXPY(cg->sk, -1.0, cg->X_old, tao->solution)); in TaoBNCGStepDirectionUpdate()
832 cg->yts = step * dk_yk; in TaoBNCGStepDirectionUpdate()
833 cg->yty = ynorm2; in TaoBNCGStepDirectionUpdate()
834 cg->sts = snorm * snorm; in TaoBNCGStepDirectionUpdate()
835 if (!cg->diag_scaling) { in TaoBNCGStepDirectionUpdate()
837 …PetscCall(TaoBNCGComputeScalarScaling(cg->yty, step * dk_yk, snorm * snorm, &tau_bfgs, cg->bfgs_sc… in TaoBNCGStepDirectionUpdate()
838 …PetscCall(TaoBNCGComputeScalarScaling(cg->yty, step * dk_yk, snorm * snorm, &tau_dfp, cg->dfp_scal… in TaoBNCGStepDirectionUpdate()
839 PetscCall(VecDot(cg->yk, tao->gradient, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
840 tau_k = cg->theta * tau_bfgs + (1.0 - cg->theta) * tau_dfp; in TaoBNCGStepDirectionUpdate()
843 tmp = cg->theta * tau_bfgs * gd / dk_yk + (1 - cg->theta) * tau_dfp * gkp1_yk / cg->yty; in TaoBNCGStepDirectionUpdate()
844 …beta = cg->theta * tau_bfgs * (gkp1_yk / dk_yk - cg->yty * gd / (dk_yk * dk_yk)) - step * gd / dk_… in TaoBNCGStepDirectionUpdate()
846 PetscCall(VecAXPBYPCZ(tao->stepdirection, -tau_k, tmp, beta, tao->gradient, cg->yk)); in TaoBNCGStepDirectionUpdate()
849 PetscCall(MatSolve(cg->B, tao->gradient, cg->g_work)); in TaoBNCGStepDirectionUpdate()
850 PetscCall(MatSolve(cg->B, cg->yk, cg->y_work)); in TaoBNCGStepDirectionUpdate()
852 PetscCall(VecDot(cg->g_work, cg->yk, &gkp1_yk)); in TaoBNCGStepDirectionUpdate()
853 PetscCall(VecDot(cg->y_work, cg->yk, &tmp)); in TaoBNCGStepDirectionUpdate()
854 gamma = cg->theta * gd / dk_yk + (1 - cg->theta) * (gkp1_yk / tmp); in TaoBNCGStepDirectionUpdate()
856 beta = cg->theta * (gkp1_yk / dk_yk - gd * tmp / (dk_yk * dk_yk)) - step * gd / dk_yk; in TaoBNCGStepDirectionUpdate()
858 PetscCall(VecAXPBYPCZ(tao->stepdirection, -1.0, gamma, beta, cg->g_work, cg->y_work)); in TaoBNCGStepDirectionUpdate()
871 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoBNCGConductIteration() local
880 PetscCall(VecCopy(tao->solution, cg->X_old)); in TaoBNCGConductIteration()
881 PetscCall(VecCopy(tao->gradient, cg->G_old)); in TaoBNCGConductIteration()
882 PetscCall(VecCopy(cg->unprojected_gradient, cg->unprojected_gradient_old)); in TaoBNCGConductIteration()
886 f_old = cg->f; in TaoBNCGConductIteration()
892 …PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &cg->f, cg->unprojected_gradient, tao… in TaoBNCGConductIteration()
897 ++cg->ls_fails; in TaoBNCGConductIteration()
898 if (cg->cg_type == TAO_BNCG_GD) { in TaoBNCGConductIteration()
904 PetscCall(VecCopy(cg->X_old, tao->solution)); in TaoBNCGConductIteration()
905 PetscCall(VecCopy(cg->G_old, tao->gradient)); in TaoBNCGConductIteration()
906 PetscCall(VecCopy(cg->unprojected_gradient_old, cg->unprojected_gradient)); in TaoBNCGConductIteration()
909 cg->f = f_old; in TaoBNCGConductIteration()
912 if (cg->cg_type != TAO_BNCG_PCGD && cg->diag_scaling) { in TaoBNCGConductIteration()
917 PetscCall(TaoBNCGBoundStep(tao, cg->as_type, tao->stepdirection)); in TaoBNCGConductIteration()
920 …PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &cg->f, cg->unprojected_gradient, tao… in TaoBNCGConductIteration()
926 ++cg->ls_fails; in TaoBNCGConductIteration()
932 ++cg->ls_fails; in TaoBNCGConductIteration()
934 PetscCall(TaoBNCGBoundStep(tao, cg->as_type, tao->stepdirection)); in TaoBNCGConductIteration()
936 …PetscCall(TaoLineSearchApply(tao->linesearch, tao->solution, &cg->f, cg->unprojected_gradient, tao… in TaoBNCGConductIteration()
942 ++cg->ls_fails; in TaoBNCGConductIteration()
955 PetscCall(VecFischer(tao->solution, cg->unprojected_gradient, tao->XL, tao->XU, cg->W)); in TaoBNCGConductIteration()
956 PetscCall(VecNorm(cg->W, NORM_2, &resnorm)); in TaoBNCGConductIteration()
958 PetscCall(TaoLogConvergenceHistory(tao, cg->f, resnorm, 0.0, tao->ksp_its)); in TaoBNCGConductIteration()
959 PetscCall(TaoMonitor(tao, tao->niter, cg->f, resnorm, 0.0, step)); in TaoBNCGConductIteration()
966 PetscCall(TaoBNCGEstimateActiveSet(tao, cg->as_type)); in TaoBNCGConductIteration()
968 PetscCall(VecCopy(cg->unprojected_gradient, tao->gradient)); in TaoBNCGConductIteration()
969 if (cg->active_idx) PetscCall(VecISSet(tao->gradient, cg->active_idx, 0.0)); in TaoBNCGConductIteration()
978 PetscCall(TaoBNCGBoundStep(tao, cg->as_type, tao->stepdirection)); in TaoBNCGConductIteration()
980 if (cg->cg_type != TAO_BNCG_GD) { in TaoBNCGConductIteration()
982 PetscCall(ISDestroy(&cg->new_inactives)); in TaoBNCGConductIteration()
983 …if (cg->inactive_idx && cg->inactive_old) PetscCall(ISDifference(cg->inactive_idx, cg->inactive_ol… in TaoBNCGConductIteration()
985 if (cg->new_inactives) { in TaoBNCGConductIteration()
986 PetscCall(VecGetSubVector(tao->stepdirection, cg->new_inactives, &cg->inactive_step)); in TaoBNCGConductIteration()
987 PetscCall(VecGetSubVector(cg->unprojected_gradient, cg->new_inactives, &cg->inactive_grad)); in TaoBNCGConductIteration()
988 PetscCall(VecCopy(cg->inactive_grad, cg->inactive_step)); in TaoBNCGConductIteration()
989 PetscCall(VecScale(cg->inactive_step, -1.0)); in TaoBNCGConductIteration()
990 PetscCall(VecRestoreSubVector(tao->stepdirection, cg->new_inactives, &cg->inactive_step)); in TaoBNCGConductIteration()
991 … PetscCall(VecRestoreSubVector(cg->unprojected_gradient, cg->new_inactives, &cg->inactive_grad)); in TaoBNCGConductIteration()
999 PetscCall(TaoBNCGBoundStep(tao, cg->as_type, tao->stepdirection)); in TaoBNCGConductIteration()
1000 ++cg->descent_error; in TaoBNCGConductIteration()
1009 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoBNCGSetH0() local
1016 cg->pc = H0; in TaoBNCGSetH0()
1036 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoBNCGGetType() local
1042 *type = cg->cg_type; in TaoBNCGGetType()
1059 TAO_BNCG *cg = (TAO_BNCG *)tao->data; in TaoBNCGSetType() local
1064 if (same) cg->cg_type = type; in TaoBNCGSetType()