Lines Matching defs:auglag

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