Lines Matching refs:auglag
15 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoSolve_ALMM() local
23 PetscCall(VecZeroEntries(auglag->Ps)); in TaoSolve_ALMM()
24 PetscCall(TaoALMMCombinePrimal_Private(tao, auglag->Px, auglag->Ps, auglag->P)); in TaoSolve_ALMM()
25 PetscCall(VecSet(auglag->Yi, 0.0)); in TaoSolve_ALMM()
27 if (tao->eq_constrained) PetscCall(VecSet(auglag->Ye, 0.0)); in TaoSolve_ALMM()
31 PetscCall((*auglag->sub_obj)(tao)); in TaoSolve_ALMM()
34 PetscCall(PetscInfo(tao, "Solving with %s formulation\n", TaoALMMTypes[auglag->type])); in TaoSolve_ALMM()
35 …PetscCall(TaoLogConvergenceHistory(tao, auglag->Lval, auglag->gnorm, auglag->cnorm, tao->ksp_its)); in TaoSolve_ALMM()
36 PetscCall(TaoMonitor(tao, tao->niter, auglag->fval, auglag->gnorm, auglag->cnorm, 0.0)); in TaoSolve_ALMM()
39 switch (auglag->type) { in TaoSolve_ALMM()
41 auglag->mu = auglag->mu0; in TaoSolve_ALMM()
44 auglag->cenorm = 0.0; in TaoSolve_ALMM()
45 if (tao->eq_constrained) PetscCall(VecDot(auglag->Ce, auglag->Ce, &auglag->cenorm)); in TaoSolve_ALMM()
46 auglag->cinorm = 0.0; in TaoSolve_ALMM()
48 PetscCall(VecCopy(auglag->Ci, auglag->Ciwork)); in TaoSolve_ALMM()
49 PetscCall(VecScale(auglag->Ciwork, -1.0)); in TaoSolve_ALMM()
50 PetscCall(VecPointwiseMax(auglag->Ciwork, auglag->Cizero, auglag->Ciwork)); in TaoSolve_ALMM()
51 PetscCall(VecDot(auglag->Ciwork, auglag->Ciwork, &auglag->cinorm)); in TaoSolve_ALMM()
54 if (PetscAbsReal(auglag->cenorm + auglag->cinorm) == 0.0) auglag->mu = 10.0; in TaoSolve_ALMM()
55 …else auglag->mu = PetscMax(1.e-6, PetscMin(10.0, 2.0 * PetscAbsReal(auglag->fval) / (auglag->cenor… in TaoSolve_ALMM()
60 auglag->gtol = auglag->gtol0; in TaoSolve_ALMM()
61 PetscCall(PetscInfo(tao, "Initial penalty: %.2g\n", (double)auglag->mu)); in TaoSolve_ALMM()
67 PetscCall(PetscInfo(tao, "Subsolver tolerance: ||G|| <= %e\n", (double)auglag->gtol)); in TaoSolve_ALMM()
68 PetscCall(TaoSetTolerances(auglag->subsolver, auglag->gtol, 0.0, 0.0)); in TaoSolve_ALMM()
70 PetscCall(VecCopy(auglag->P, auglag->subsolver->solution)); in TaoSolve_ALMM()
71 PetscCall(TaoSolve(auglag->subsolver)); in TaoSolve_ALMM()
72 PetscCall(VecCopy(auglag->subsolver->solution, auglag->P)); in TaoSolve_ALMM()
73 PetscCall(TaoGetConvergedReason(auglag->subsolver, &reason)); in TaoSolve_ALMM()
74 tao->ksp_its += auglag->subsolver->ksp_its; in TaoSolve_ALMM()
77 PetscCall((*auglag->sub_obj)(tao)); in TaoSolve_ALMM()
81 if (auglag->cnorm <= auglag->ytol) { in TaoSolve_ALMM()
82 PetscCall(PetscInfo(tao, "Multipliers updated: ||C|| <= %e\n", (double)auglag->ytol)); in TaoSolve_ALMM()
85 PetscCall(VecAXPY(auglag->Ye, auglag->mu, auglag->Ce)); in TaoSolve_ALMM()
86 PetscCall(VecSet(auglag->Cework, auglag->ye_max)); in TaoSolve_ALMM()
87 PetscCall(VecPointwiseMin(auglag->Ye, auglag->Cework, auglag->Ye)); in TaoSolve_ALMM()
88 PetscCall(VecSet(auglag->Cework, auglag->ye_min)); in TaoSolve_ALMM()
89 PetscCall(VecPointwiseMax(auglag->Ye, auglag->Cework, auglag->Ye)); in TaoSolve_ALMM()
92 PetscCall(VecAXPY(auglag->Yi, auglag->mu, auglag->Ci)); in TaoSolve_ALMM()
93 PetscCall(VecSet(auglag->Ciwork, auglag->yi_max)); in TaoSolve_ALMM()
94 PetscCall(VecPointwiseMin(auglag->Yi, auglag->Ciwork, auglag->Yi)); in TaoSolve_ALMM()
95 PetscCall(VecSet(auglag->Ciwork, auglag->yi_min)); in TaoSolve_ALMM()
96 PetscCall(VecPointwiseMax(auglag->Yi, auglag->Ciwork, auglag->Yi)); in TaoSolve_ALMM()
99 if (auglag->type != TAO_ALMM_PHR) { in TaoSolve_ALMM()
100 … auglag->ytol = PetscMax(tao->catol, auglag->ytol / PetscPowReal(auglag->mu, auglag->mu_pow_good)); in TaoSolve_ALMM()
101 auglag->gtol = PetscMax(tao->gatol, auglag->gtol / auglag->mu); in TaoSolve_ALMM()
106 auglag->mu = PetscMin(auglag->mu_max, auglag->mu_fac * auglag->mu); in TaoSolve_ALMM()
108 if (auglag->type != TAO_ALMM_PHR) { in TaoSolve_ALMM()
109 auglag->ytol = PetscMax(tao->catol, 1.0 / PetscPowReal(auglag->mu, auglag->mu_pow_bad)); in TaoSolve_ALMM()
110 auglag->gtol = PetscMax(tao->gatol, 1.0 / auglag->mu); in TaoSolve_ALMM()
112 PetscCall(PetscInfo(tao, "Penalty increased: mu = %.2g\n", (double)auglag->mu)); in TaoSolve_ALMM()
114 …PetscCall(TaoLogConvergenceHistory(tao, auglag->fval, auglag->gnorm, auglag->cnorm, tao->ksp_its)); in TaoSolve_ALMM()
115 PetscCall(TaoMonitor(tao, tao->niter, auglag->fval, auglag->gnorm, auglag->cnorm, updated)); in TaoSolve_ALMM()
123 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoView_ALMM() local
128 PetscCall(TaoView(auglag->subsolver, viewer)); in TaoView_ALMM()
133 …PetscCall(PetscViewerASCIIPrintf(viewer, "ALMM Formulation Type: %s\n", TaoALMMTypes[auglag->type]… in TaoView_ALMM()
141 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoSetUp_ALMM() local
152 auglag->Px = tao->solution; in TaoSetUp_ALMM()
156 auglag->LgradX = tao->gradient; in TaoSetUp_ALMM()
157 if (!auglag->Xwork) { /* opt var work vector */ in TaoSetUp_ALMM()
158 PetscCall(VecDuplicate(tao->solution, &auglag->Xwork)); in TaoSetUp_ALMM()
161 auglag->Ce = tao->constraints_equality; in TaoSetUp_ALMM()
162 auglag->Ae = tao->jacobian_equality; in TaoSetUp_ALMM()
163 if (!auglag->Ye) { /* equality multipliers */ in TaoSetUp_ALMM()
164 PetscCall(VecDuplicate(auglag->Ce, &auglag->Ye)); in TaoSetUp_ALMM()
166 if (!auglag->Cework) PetscCall(VecDuplicate(auglag->Ce, &auglag->Cework)); in TaoSetUp_ALMM()
169 auglag->Ci = tao->constraints_inequality; in TaoSetUp_ALMM()
170 auglag->Ai = tao->jacobian_inequality; in TaoSetUp_ALMM()
171 if (!auglag->Yi) { /* inequality multipliers */ in TaoSetUp_ALMM()
172 PetscCall(VecDuplicate(auglag->Ci, &auglag->Yi)); in TaoSetUp_ALMM()
174 if (!auglag->Ciwork) PetscCall(VecDuplicate(auglag->Ci, &auglag->Ciwork)); in TaoSetUp_ALMM()
175 if (!auglag->Cizero) { in TaoSetUp_ALMM()
176 PetscCall(VecDuplicate(auglag->Ci, &auglag->Cizero)); in TaoSetUp_ALMM()
177 PetscCall(VecZeroEntries(auglag->Cizero)); in TaoSetUp_ALMM()
179 if (!auglag->Ps) { /* slack vars */ in TaoSetUp_ALMM()
180 PetscCall(VecDuplicate(auglag->Ci, &auglag->Ps)); in TaoSetUp_ALMM()
182 if (!auglag->LgradS) { /* slack component of Lagrangian gradient */ in TaoSetUp_ALMM()
183 PetscCall(VecDuplicate(auglag->Ci, &auglag->LgradS)); in TaoSetUp_ALMM()
186 if (!auglag->P) { in TaoSetUp_ALMM()
187 PetscCall(PetscMalloc1(2, &auglag->Parr)); in TaoSetUp_ALMM()
188 auglag->Parr[0] = auglag->Px; in TaoSetUp_ALMM()
189 auglag->Parr[1] = auglag->Ps; in TaoSetUp_ALMM()
190 PetscCall(VecConcatenate(2, auglag->Parr, &auglag->P, &auglag->Pis)); in TaoSetUp_ALMM()
191 PetscCall(PetscMalloc1(2, &auglag->Pscatter)); in TaoSetUp_ALMM()
192 … PetscCall(VecScatterCreate(auglag->P, auglag->Pis[0], auglag->Px, NULL, &auglag->Pscatter[0])); in TaoSetUp_ALMM()
193 … PetscCall(VecScatterCreate(auglag->P, auglag->Pis[1], auglag->Ps, NULL, &auglag->Pscatter[1])); in TaoSetUp_ALMM()
197 if (!auglag->Y) { in TaoSetUp_ALMM()
198 PetscCall(PetscMalloc1(2, &auglag->Yarr)); in TaoSetUp_ALMM()
199 auglag->Yarr[0] = auglag->Ye; in TaoSetUp_ALMM()
200 auglag->Yarr[1] = auglag->Yi; in TaoSetUp_ALMM()
201 PetscCall(VecConcatenate(2, auglag->Yarr, &auglag->Y, &auglag->Yis)); in TaoSetUp_ALMM()
202 PetscCall(PetscMalloc1(2, &auglag->Yscatter)); in TaoSetUp_ALMM()
203 … PetscCall(VecScatterCreate(auglag->Y, auglag->Yis[0], auglag->Ye, NULL, &auglag->Yscatter[0])); in TaoSetUp_ALMM()
204 … PetscCall(VecScatterCreate(auglag->Y, auglag->Yis[1], auglag->Yi, NULL, &auglag->Yscatter[1])); in TaoSetUp_ALMM()
206 if (!auglag->C) PetscCall(VecDuplicate(auglag->Y, &auglag->C)); in TaoSetUp_ALMM()
208 if (!auglag->C) auglag->C = auglag->Ci; in TaoSetUp_ALMM()
209 if (!auglag->Y) auglag->Y = auglag->Yi; in TaoSetUp_ALMM()
212 if (!auglag->P) auglag->P = auglag->Px; in TaoSetUp_ALMM()
213 if (!auglag->G) auglag->G = auglag->LgradX; in TaoSetUp_ALMM()
214 if (!auglag->C) auglag->C = auglag->Ce; in TaoSetUp_ALMM()
215 if (!auglag->Y) auglag->Y = auglag->Ye; in TaoSetUp_ALMM()
218 PetscCall(VecDuplicate(auglag->P, &auglag->Psub)); in TaoSetUp_ALMM()
219 PetscCall(VecDuplicate(auglag->P, &auglag->G)); in TaoSetUp_ALMM()
221 if (auglag->type == TAO_ALMM_PHR) { in TaoSetUp_ALMM()
222 auglag->mu_fac = 10.0; in TaoSetUp_ALMM()
223 auglag->yi_min = 0.0; in TaoSetUp_ALMM()
224 auglag->ytol0 = 0.5; in TaoSetUp_ALMM()
225 auglag->gtol0 = tao->gatol; in TaoSetUp_ALMM()
232 switch (auglag->type) { in TaoSetUp_ALMM()
234 auglag->sub_obj = TaoALMMComputeAugLagAndGradient_Private; in TaoSetUp_ALMM()
237 auglag->sub_obj = TaoALMMComputePHRLagAndGradient_Private; in TaoSetUp_ALMM()
243 PetscCall(TaoSetSolution(auglag->subsolver, auglag->Psub)); in TaoSetUp_ALMM()
244 PetscCall(TaoSetObjective(auglag->subsolver, TaoALMMSubsolverObjective_Private, (void *)auglag)); in TaoSetUp_ALMM()
245 …scCall(TaoSetObjectiveAndGradient(auglag->subsolver, NULL, TaoALMMSubsolverObjectiveAndGradient_Pr… in TaoSetUp_ALMM()
248 PetscCall(PetscObjectTypeCompare((PetscObject)auglag->subsolver, TAOCG, &is_cg)); in TaoSetUp_ALMM()
249 PetscCall(PetscObjectTypeCompare((PetscObject)auglag->subsolver, TAOLMVM, &is_lmvm)); in TaoSetUp_ALMM()
251 PetscCall(TaoSetType(auglag->subsolver, TAOBNCG)); in TaoSetUp_ALMM()
255 PetscCall(TaoSetType(auglag->subsolver, TAOBQNLS)); in TaoSetUp_ALMM()
259 if (!auglag->PL) PetscCall(VecDuplicate(auglag->P, &auglag->PL)); in TaoSetUp_ALMM()
260 if (!auglag->PU) PetscCall(VecDuplicate(auglag->P, &auglag->PU)); in TaoSetUp_ALMM()
263 PetscCall(VecDuplicate(auglag->Ci, &SL)); in TaoSetUp_ALMM()
265 PetscCall(VecDuplicate(auglag->Ci, &SU)); in TaoSetUp_ALMM()
268 PetscCall(TaoALMMCombinePrimal_Private(tao, tao->XL, SL, auglag->PL)); in TaoSetUp_ALMM()
269 PetscCall(TaoALMMCombinePrimal_Private(tao, tao->XU, SU, auglag->PU)); in TaoSetUp_ALMM()
275 PetscCall(VecCopy(tao->XL, auglag->PL)); in TaoSetUp_ALMM()
276 PetscCall(VecCopy(tao->XU, auglag->PU)); in TaoSetUp_ALMM()
278 PetscCall(TaoSetVariableBounds(auglag->subsolver, auglag->PL, auglag->PU)); in TaoSetUp_ALMM()
282 if (auglag->type == TAO_ALMM_CLASSIC) { in TaoSetUp_ALMM()
286 if (!auglag->PL) PetscCall(VecDuplicate(auglag->P, &auglag->PL)); in TaoSetUp_ALMM()
287 if (!auglag->PU) PetscCall(VecDuplicate(auglag->P, &auglag->PU)); in TaoSetUp_ALMM()
288 PetscCall(VecSet(auglag->PL, PETSC_NINFINITY)); in TaoSetUp_ALMM()
289 PetscCall(VecSet(auglag->PU, PETSC_INFINITY)); in TaoSetUp_ALMM()
291 PetscCall(VecDuplicate(auglag->Ci, &SL)); in TaoSetUp_ALMM()
293 PetscCall(VecDuplicate(auglag->Ci, &SU)); in TaoSetUp_ALMM()
296 … PetscCall(VecScatterBegin(auglag->Pscatter[1], SL, auglag->PL, INSERT_VALUES, SCATTER_REVERSE)); in TaoSetUp_ALMM()
297 … PetscCall(VecScatterEnd(auglag->Pscatter[1], SL, auglag->PL, INSERT_VALUES, SCATTER_REVERSE)); in TaoSetUp_ALMM()
298 … PetscCall(VecScatterBegin(auglag->Pscatter[1], SU, auglag->PU, INSERT_VALUES, SCATTER_REVERSE)); in TaoSetUp_ALMM()
299 … PetscCall(VecScatterEnd(auglag->Pscatter[1], SU, auglag->PU, INSERT_VALUES, SCATTER_REVERSE)); in TaoSetUp_ALMM()
305 PetscCall(PetscObjectTypeCompare((PetscObject)auglag->subsolver, TAOCG, &is_cg)); in TaoSetUp_ALMM()
306 PetscCall(PetscObjectTypeCompare((PetscObject)auglag->subsolver, TAOLMVM, &is_lmvm)); in TaoSetUp_ALMM()
308 PetscCall(TaoSetType(auglag->subsolver, TAOBNCG)); in TaoSetUp_ALMM()
312 PetscCall(TaoSetType(auglag->subsolver, TAOBQNLS)); in TaoSetUp_ALMM()
315 PetscCall(TaoSetVariableBounds(auglag->subsolver, auglag->PL, auglag->PU)); in TaoSetUp_ALMM()
319 PetscCall(TaoSetUp(auglag->subsolver)); in TaoSetUp_ALMM()
325 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoDestroy_ALMM() local
328 PetscCall(TaoDestroy(&auglag->subsolver)); in TaoDestroy_ALMM()
329 PetscCall(VecDestroy(&auglag->Psub)); in TaoDestroy_ALMM()
330 PetscCall(VecDestroy(&auglag->G)); in TaoDestroy_ALMM()
332 PetscCall(VecDestroy(&auglag->Xwork)); in TaoDestroy_ALMM()
334 PetscCall(VecDestroy(&auglag->Ye)); /* equality multipliers */ in TaoDestroy_ALMM()
335 PetscCall(VecDestroy(&auglag->Cework)); /* equality work vector */ in TaoDestroy_ALMM()
338 PetscCall(VecDestroy(&auglag->Ps)); /* slack vars */ in TaoDestroy_ALMM()
339 PetscCall(PetscFree(auglag->Parr)); /* array of primal vectors */ in TaoDestroy_ALMM()
340 PetscCall(VecDestroy(&auglag->LgradS)); /* slack grad */ in TaoDestroy_ALMM()
341 PetscCall(VecDestroy(&auglag->Cizero)); /* zero vector for pointwise max */ in TaoDestroy_ALMM()
342 PetscCall(VecDestroy(&auglag->Yi)); /* inequality multipliers */ in TaoDestroy_ALMM()
343 PetscCall(VecDestroy(&auglag->Ciwork)); /* inequality work vector */ in TaoDestroy_ALMM()
344 PetscCall(VecDestroy(&auglag->P)); /* combo primal solution */ in TaoDestroy_ALMM()
345 PetscCall(ISDestroy(&auglag->Pis[0])); /* index set for X inside P */ in TaoDestroy_ALMM()
346 PetscCall(ISDestroy(&auglag->Pis[1])); /* index set for S inside P */ in TaoDestroy_ALMM()
347 PetscCall(PetscFree(auglag->Pis)); /* array of P index sets */ in TaoDestroy_ALMM()
348 PetscCall(VecScatterDestroy(&auglag->Pscatter[0])); in TaoDestroy_ALMM()
349 PetscCall(VecScatterDestroy(&auglag->Pscatter[1])); in TaoDestroy_ALMM()
350 PetscCall(PetscFree(auglag->Pscatter)); in TaoDestroy_ALMM()
352 PetscCall(VecDestroy(&auglag->Y)); /* combo multipliers */ in TaoDestroy_ALMM()
353 PetscCall(PetscFree(auglag->Yarr)); /* array of dual vectors */ in TaoDestroy_ALMM()
354 PetscCall(VecDestroy(&auglag->C)); /* combo constraints */ in TaoDestroy_ALMM()
355 PetscCall(ISDestroy(&auglag->Yis[0])); /* index set for Ye inside Y */ in TaoDestroy_ALMM()
356 PetscCall(ISDestroy(&auglag->Yis[1])); /* index set for Yi inside Y */ in TaoDestroy_ALMM()
357 PetscCall(PetscFree(auglag->Yis)); in TaoDestroy_ALMM()
358 PetscCall(VecScatterDestroy(&auglag->Yscatter[0])); in TaoDestroy_ALMM()
359 PetscCall(VecScatterDestroy(&auglag->Yscatter[1])); in TaoDestroy_ALMM()
360 PetscCall(PetscFree(auglag->Yscatter)); in TaoDestroy_ALMM()
364 PetscCall(VecDestroy(&auglag->PL)); /* lower bounds for subsolver */ in TaoDestroy_ALMM()
365 PetscCall(VecDestroy(&auglag->PU)); /* upper bounds for subsolver */ in TaoDestroy_ALMM()
367 if (auglag->type == TAO_ALMM_CLASSIC) { in TaoDestroy_ALMM()
368 PetscCall(VecDestroy(&auglag->PL)); /* lower bounds for subsolver */ in TaoDestroy_ALMM()
369 PetscCall(VecDestroy(&auglag->PU)); /* upper bounds for subsolver */ in TaoDestroy_ALMM()
387 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoSetFromOptions_ALMM() local
391 …OptionsReal("-tao_almm_mu_init", "initial penalty parameter", "", auglag->mu0, &auglag->mu0, NULL)… in TaoSetFromOptions_ALMM()
392 …lmm_mu_factor", "increase factor for the penalty parameter", "", auglag->mu_fac, &auglag->mu_fac, … in TaoSetFromOptions_ALMM()
393 …or penalty parameter when multiplier update is accepted", "", auglag->mu_pow_good, &auglag->mu_pow… in TaoSetFromOptions_ALMM()
394 …for penalty parameter when multiplier update is rejected", "", auglag->mu_pow_bad, &auglag->mu_pow… in TaoSetFromOptions_ALMM()
395 …_mu_max", "maximum safeguard for penalty parameter updates", "", auglag->mu_max, &auglag->mu_max, … in TaoSetFromOptions_ALMM()
396 …e_min", "minimum safeguard for equality multiplier updates", "", auglag->ye_min, &auglag->ye_min, … in TaoSetFromOptions_ALMM()
397 …_max", "maximum safeguard for equality multipliers updates", "", auglag->ye_max, &auglag->ye_max, … in TaoSetFromOptions_ALMM()
398 …in", "minimum safeguard for inequality multipliers updates", "", auglag->yi_min, &auglag->yi_min, … in TaoSetFromOptions_ALMM()
399 …ax", "maximum safeguard for inequality multipliers updates", "", auglag->yi_max, &auglag->yi_max, … in TaoSetFromOptions_ALMM()
400 …r the subproblem", "TaoALMMType", TaoALMMTypes, (PetscEnum)auglag->type, (PetscEnum *)&auglag->typ… in TaoSetFromOptions_ALMM()
402 PetscCall(TaoSetOptionsPrefix(auglag->subsolver, ((PetscObject)tao)->prefix)); in TaoSetFromOptions_ALMM()
403 PetscCall(TaoAppendOptionsPrefix(auglag->subsolver, "tao_almm_subsolver_")); in TaoSetFromOptions_ALMM()
404 PetscCall(TaoSetFromOptions(auglag->subsolver)); in TaoSetFromOptions_ALMM()
462 TAO_ALMM *auglag; in TaoCreate_ALMM() local
465 PetscCall(PetscNew(&auglag)); in TaoCreate_ALMM()
480 tao->data = (void *)auglag; in TaoCreate_ALMM()
481 auglag->parent = tao; in TaoCreate_ALMM()
482 auglag->mu0 = 10.0; in TaoCreate_ALMM()
483 auglag->mu = auglag->mu0; in TaoCreate_ALMM()
484 auglag->mu_fac = 10.0; in TaoCreate_ALMM()
485 auglag->mu_max = PETSC_INFINITY; in TaoCreate_ALMM()
486 auglag->mu_pow_good = 0.9; in TaoCreate_ALMM()
487 auglag->mu_pow_bad = 0.1; in TaoCreate_ALMM()
488 auglag->ye_min = PETSC_NINFINITY; in TaoCreate_ALMM()
489 auglag->ye_max = PETSC_INFINITY; in TaoCreate_ALMM()
490 auglag->yi_min = PETSC_NINFINITY; in TaoCreate_ALMM()
491 auglag->yi_max = PETSC_INFINITY; in TaoCreate_ALMM()
492 auglag->ytol0 = 1.0 / PetscPowReal(auglag->mu0, auglag->mu_pow_bad); in TaoCreate_ALMM()
493 auglag->ytol = auglag->ytol0; in TaoCreate_ALMM()
494 auglag->gtol0 = 1.0 / auglag->mu0; in TaoCreate_ALMM()
495 auglag->gtol = auglag->gtol0; in TaoCreate_ALMM()
497 auglag->sub_obj = TaoALMMComputeAugLagAndGradient_Private; in TaoCreate_ALMM()
498 auglag->type = TAO_ALMM_PHR; in TaoCreate_ALMM()
500 PetscCall(TaoCreate(PetscObjectComm((PetscObject)tao), &auglag->subsolver)); in TaoCreate_ALMM()
501 PetscCall(TaoSetType(auglag->subsolver, TAOBQNLS)); in TaoCreate_ALMM()
502 PetscCall(TaoSetTolerances(auglag->subsolver, auglag->gtol, 0.0, 0.0)); in TaoCreate_ALMM()
503 PetscCall(TaoSetMaximumIterations(auglag->subsolver, 1000)); in TaoCreate_ALMM()
504 PetscCall(TaoSetMaximumFunctionEvaluations(auglag->subsolver, 10000)); in TaoCreate_ALMM()
505 PetscCall(TaoSetFunctionLowerBound(auglag->subsolver, PETSC_NINFINITY)); in TaoCreate_ALMM()
506 PetscCall(PetscObjectIncrementTabLevel((PetscObject)auglag->subsolver, (PetscObject)tao, 1)); in TaoCreate_ALMM()
521 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoALMMCombinePrimal_Private() local
525 PetscCall(VecScatterBegin(auglag->Pscatter[0], X, P, INSERT_VALUES, SCATTER_REVERSE)); in TaoALMMCombinePrimal_Private()
526 PetscCall(VecScatterEnd(auglag->Pscatter[0], X, P, INSERT_VALUES, SCATTER_REVERSE)); in TaoALMMCombinePrimal_Private()
527 PetscCall(VecScatterBegin(auglag->Pscatter[1], S, P, INSERT_VALUES, SCATTER_REVERSE)); in TaoALMMCombinePrimal_Private()
528 PetscCall(VecScatterEnd(auglag->Pscatter[1], S, P, INSERT_VALUES, SCATTER_REVERSE)); in TaoALMMCombinePrimal_Private()
537 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoALMMCombineDual_Private() local
542 PetscCall(VecScatterBegin(auglag->Yscatter[0], EQ, Y, INSERT_VALUES, SCATTER_REVERSE)); in TaoALMMCombineDual_Private()
543 PetscCall(VecScatterEnd(auglag->Yscatter[0], EQ, Y, INSERT_VALUES, SCATTER_REVERSE)); in TaoALMMCombineDual_Private()
544 PetscCall(VecScatterBegin(auglag->Yscatter[1], IN, Y, INSERT_VALUES, SCATTER_REVERSE)); in TaoALMMCombineDual_Private()
545 PetscCall(VecScatterEnd(auglag->Yscatter[1], IN, Y, INSERT_VALUES, SCATTER_REVERSE)); in TaoALMMCombineDual_Private()
557 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoALMMSplitPrimal_Private() local
561 PetscCall(VecScatterBegin(auglag->Pscatter[0], P, X, INSERT_VALUES, SCATTER_FORWARD)); in TaoALMMSplitPrimal_Private()
562 PetscCall(VecScatterEnd(auglag->Pscatter[0], P, X, INSERT_VALUES, SCATTER_FORWARD)); in TaoALMMSplitPrimal_Private()
563 PetscCall(VecScatterBegin(auglag->Pscatter[1], P, S, INSERT_VALUES, SCATTER_FORWARD)); in TaoALMMSplitPrimal_Private()
564 PetscCall(VecScatterEnd(auglag->Pscatter[1], P, S, INSERT_VALUES, SCATTER_FORWARD)); in TaoALMMSplitPrimal_Private()
574 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoALMMComputeOptimalityNorms_Private() local
578 …ao->bounded) PetscCall(VecBoundGradientProjection(auglag->LgradX, auglag->Px, tao->XL, tao->XU, au… in TaoALMMComputeOptimalityNorms_Private()
579 if (auglag->type == TAO_ALMM_PHR) { in TaoALMMComputeOptimalityNorms_Private()
580 PetscCall(VecNorm(auglag->LgradX, NORM_INFINITY, &auglag->gnorm)); in TaoALMMComputeOptimalityNorms_Private()
581 auglag->cenorm = 0.0; in TaoALMMComputeOptimalityNorms_Private()
582 if (tao->eq_constrained) PetscCall(VecNorm(auglag->Ce, NORM_INFINITY, &auglag->cenorm)); in TaoALMMComputeOptimalityNorms_Private()
583 auglag->cinorm = 0.0; in TaoALMMComputeOptimalityNorms_Private()
585 PetscCall(VecCopy(auglag->Yi, auglag->Ciwork)); in TaoALMMComputeOptimalityNorms_Private()
586 PetscCall(VecScale(auglag->Ciwork, -1.0 / auglag->mu)); in TaoALMMComputeOptimalityNorms_Private()
587 PetscCall(VecPointwiseMax(auglag->Ciwork, auglag->Ci, auglag->Ciwork)); in TaoALMMComputeOptimalityNorms_Private()
588 PetscCall(VecNorm(auglag->Ciwork, NORM_INFINITY, &auglag->cinorm)); in TaoALMMComputeOptimalityNorms_Private()
590 auglag->cnorm_old = auglag->cnorm; in TaoALMMComputeOptimalityNorms_Private()
591 auglag->cnorm = PetscMax(auglag->cenorm, auglag->cinorm); in TaoALMMComputeOptimalityNorms_Private()
592 auglag->ytol = auglag->ytol0 * auglag->cnorm_old; in TaoALMMComputeOptimalityNorms_Private()
594 PetscCall(VecNorm(auglag->LgradX, NORM_2, &auglag->gnorm)); in TaoALMMComputeOptimalityNorms_Private()
595 PetscCall(VecNorm(auglag->C, NORM_2, &auglag->cnorm)); in TaoALMMComputeOptimalityNorms_Private()
602 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoALMMEvaluateIterate_Private() local
606 PetscCall(TaoALMMSplitPrimal_Private(tao, auglag->P, auglag->Px, auglag->Ps)); in TaoALMMEvaluateIterate_Private()
609 PetscCall(TaoComputeObjectiveAndGradient(tao, auglag->Px, &auglag->fval, auglag->LgradX)); in TaoALMMEvaluateIterate_Private()
611 PetscCall(TaoComputeEqualityConstraints(tao, auglag->Px, auglag->Ce)); in TaoALMMEvaluateIterate_Private()
612 PetscCall(TaoComputeJacobianEquality(tao, auglag->Px, auglag->Ae, auglag->Ae)); in TaoALMMEvaluateIterate_Private()
615 PetscCall(TaoComputeInequalityConstraints(tao, auglag->Px, auglag->Ci)); in TaoALMMEvaluateIterate_Private()
616 PetscCall(TaoComputeJacobianInequality(tao, auglag->Px, auglag->Ai, auglag->Ai)); in TaoALMMEvaluateIterate_Private()
617 switch (auglag->type) { in TaoALMMEvaluateIterate_Private()
620 PetscCall(VecAXPY(auglag->Ci, -1.0, auglag->Ps)); in TaoALMMEvaluateIterate_Private()
624 PetscCall(VecScale(auglag->Ci, -1.0)); in TaoALMMEvaluateIterate_Private()
625 PetscCall(MatScale(auglag->Ai, -1.0)); in TaoALMMEvaluateIterate_Private()
632 PetscCall(TaoALMMCombineDual_Private(tao, auglag->Ce, auglag->Ci, auglag->C)); in TaoALMMEvaluateIterate_Private()
645 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoALMMComputePHRLagAndGradient_Private() local
652 PetscCall(VecWAXPY(auglag->Cework, 1.0 / auglag->mu, auglag->Ye, auglag->Ce)); in TaoALMMComputePHRLagAndGradient_Private()
653 …PetscCall(VecDot(auglag->Cework, auglag->Cework, &eq_norm)); /* contribution to scalar Lagrangian … in TaoALMMComputePHRLagAndGradient_Private()
654 PetscCall(VecScale(auglag->Cework, auglag->mu)); in TaoALMMComputePHRLagAndGradient_Private()
656 PetscCall(MatMultTransposeAdd(auglag->Ae, auglag->Cework, auglag->LgradX, auglag->LgradX)); in TaoALMMComputePHRLagAndGradient_Private()
660 PetscCall(VecWAXPY(auglag->Ciwork, 1.0 / auglag->mu, auglag->Yi, auglag->Ci)); in TaoALMMComputePHRLagAndGradient_Private()
661 PetscCall(VecPointwiseMax(auglag->Ciwork, auglag->Cizero, auglag->Ciwork)); in TaoALMMComputePHRLagAndGradient_Private()
662 …PetscCall(VecDot(auglag->Ciwork, auglag->Ciwork, &ineq_norm)); /* contribution to scalar Lagrangia… in TaoALMMComputePHRLagAndGradient_Private()
664 PetscCall(VecScale(auglag->Ciwork, auglag->mu)); in TaoALMMComputePHRLagAndGradient_Private()
665 PetscCall(MatMultTransposeAdd(auglag->Ai, auglag->Ciwork, auglag->LgradX, auglag->LgradX)); in TaoALMMComputePHRLagAndGradient_Private()
667 PetscCall(VecZeroEntries(auglag->LgradS)); in TaoALMMComputePHRLagAndGradient_Private()
670 PetscCall(TaoALMMCombinePrimal_Private(tao, auglag->LgradX, auglag->LgradS, auglag->G)); in TaoALMMComputePHRLagAndGradient_Private()
672 auglag->Lval = auglag->fval + 0.5 * auglag->mu * (eq_norm + ineq_norm); in TaoALMMComputePHRLagAndGradient_Private()
685 TAO_ALMM *auglag = (TAO_ALMM *)tao->data; in TaoALMMComputeAugLagAndGradient_Private() local
692 PetscCall(VecDot(auglag->Ye, auglag->Ce, &yeTce)); in TaoALMMComputeAugLagAndGradient_Private()
693 PetscCall(VecDot(auglag->Ce, auglag->Ce, &ceTce)); in TaoALMMComputeAugLagAndGradient_Private()
695 PetscCall(MatMultTransposeAdd(auglag->Ae, auglag->Ye, auglag->LgradX, auglag->LgradX)); in TaoALMMComputeAugLagAndGradient_Private()
697 PetscCall(MatMultTranspose(auglag->Ae, auglag->Ce, auglag->Xwork)); in TaoALMMComputeAugLagAndGradient_Private()
698 PetscCall(VecAXPY(auglag->LgradX, auglag->mu, auglag->Xwork)); in TaoALMMComputeAugLagAndGradient_Private()
702 PetscCall(VecDot(auglag->Yi, auglag->Ci, &yiTcims)); in TaoALMMComputeAugLagAndGradient_Private()
703 PetscCall(VecDot(auglag->Ci, auglag->Ci, &cimsTcims)); in TaoALMMComputeAugLagAndGradient_Private()
705 PetscCall(MatMultTransposeAdd(auglag->Ai, auglag->Yi, auglag->LgradX, auglag->LgradX)); in TaoALMMComputeAugLagAndGradient_Private()
707 PetscCall(MatMultTranspose(auglag->Ai, auglag->Ci, auglag->Xwork)); in TaoALMMComputeAugLagAndGradient_Private()
708 PetscCall(VecAXPY(auglag->LgradX, auglag->mu, auglag->Xwork)); in TaoALMMComputeAugLagAndGradient_Private()
710 PetscCall(VecWAXPY(auglag->LgradS, auglag->mu, auglag->Ci, auglag->Yi)); in TaoALMMComputeAugLagAndGradient_Private()
711 PetscCall(VecScale(auglag->LgradS, -1.0)); in TaoALMMComputeAugLagAndGradient_Private()
714 PetscCall(TaoALMMCombinePrimal_Private(tao, auglag->LgradX, auglag->LgradS, auglag->G)); in TaoALMMComputeAugLagAndGradient_Private()
716 auglag->Lval = auglag->fval + yeTce + yiTcims + 0.5 * auglag->mu * (ceTce + cimsTcims); in TaoALMMComputeAugLagAndGradient_Private()
722 TAO_ALMM *auglag = (TAO_ALMM *)ctx; in TaoALMMSubsolverObjective_Private() local
725 PetscCall(VecCopy(P, auglag->P)); in TaoALMMSubsolverObjective_Private()
726 PetscCall((*auglag->sub_obj)(auglag->parent)); in TaoALMMSubsolverObjective_Private()
727 *Lval = auglag->Lval; in TaoALMMSubsolverObjective_Private()
733 TAO_ALMM *auglag = (TAO_ALMM *)ctx; in TaoALMMSubsolverObjectiveAndGradient_Private() local
736 PetscCall(VecCopy(P, auglag->P)); in TaoALMMSubsolverObjectiveAndGradient_Private()
737 PetscCall((*auglag->sub_obj)(auglag->parent)); in TaoALMMSubsolverObjectiveAndGradient_Private()
738 PetscCall(VecCopy(auglag->G, G)); in TaoALMMSubsolverObjectiveAndGradient_Private()
739 *Lval = auglag->Lval; in TaoALMMSubsolverObjectiveAndGradient_Private()