1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/ 2a7e14dcfSSatish Balay 3a7e14dcfSSatish Balay /*@ 465ba42b6SBarry Smith TaoSetVariableBounds - Sets the upper and lower bounds for the optimization problem 5a7e14dcfSSatish Balay 620f4b53cSBarry Smith Logically Collective 7a7e14dcfSSatish Balay 8a7e14dcfSSatish Balay Input Parameters: 947450a7bSBarry Smith + tao - the `Tao` context 10a7e14dcfSSatish Balay . XL - vector of lower bounds 11a7e14dcfSSatish Balay - XU - vector of upper bounds 12a7e14dcfSSatish Balay 13a7e14dcfSSatish Balay Level: beginner 14a7e14dcfSSatish Balay 151cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetVariableBounds()` 16a7e14dcfSSatish Balay @*/ 17d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetVariableBounds(Tao tao, Vec XL, Vec XU) 18d71ae5a4SJacob Faibussowitsch { 19a7e14dcfSSatish Balay PetscFunctionBegin; 20441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 217721a36fSStefano Zampini if (XL) PetscValidHeaderSpecific(XL, VEC_CLASSID, 2); 227721a36fSStefano Zampini if (XU) PetscValidHeaderSpecific(XU, VEC_CLASSID, 3); 239566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)XL)); 249566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)XU)); 259566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->XL)); 269566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->XU)); 27a7e14dcfSSatish Balay tao->XL = XL; 28a7e14dcfSSatish Balay tao->XU = XU; 297721a36fSStefano Zampini tao->bounded = (PetscBool)(XL || XU); 303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 31a7e14dcfSSatish Balay } 3245cf516eSBarry Smith 33a7e14dcfSSatish Balay /*@C 3465ba42b6SBarry Smith TaoSetVariableBoundsRoutine - Sets a function to be used to compute lower and upper variable bounds for the optimization 35a7e14dcfSSatish Balay 3620f4b53cSBarry Smith Logically Collective 37a7e14dcfSSatish Balay 38a7e14dcfSSatish Balay Input Parameters: 3947450a7bSBarry Smith + tao - the `Tao` context 40a7e14dcfSSatish Balay . func - the bounds computation routine 4147450a7bSBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be `NULL`) 42a7e14dcfSSatish Balay 4320f4b53cSBarry Smith Calling sequence of `func`: 4447450a7bSBarry Smith + tao - the `Tao` solver 45a7e14dcfSSatish Balay . xl - vector of lower bounds 46a7e14dcfSSatish Balay . xu - vector of upper bounds 47a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 48a7e14dcfSSatish Balay 49a7e14dcfSSatish Balay Level: beginner 50a7e14dcfSSatish Balay 5165ba42b6SBarry Smith Note: 5265ba42b6SBarry Smith The func passed to `TaoSetVariableBoundsRoutine()` takes precedence over any values set in `TaoSetVariableBounds()`. 53a7e14dcfSSatish Balay 541cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 55a7e14dcfSSatish Balay @*/ 56*2a8381b2SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao tao, Vec xl, Vec xu, PetscCtx ctx), PetscCtx ctx) 57d71ae5a4SJacob Faibussowitsch { 58a7e14dcfSSatish Balay PetscFunctionBegin; 59441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 60a7e14dcfSSatish Balay tao->user_boundsP = ctx; 61a7e14dcfSSatish Balay tao->ops->computebounds = func; 627721a36fSStefano Zampini tao->bounded = func ? PETSC_TRUE : PETSC_FALSE; 633ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 64a7e14dcfSSatish Balay } 65a7e14dcfSSatish Balay 667721a36fSStefano Zampini /*@ 6765ba42b6SBarry Smith TaoGetVariableBounds - Gets the upper and lower bounds vectors set with `TaoSetVariableBounds()` 687721a36fSStefano Zampini 6920f4b53cSBarry Smith Not Collective 707721a36fSStefano Zampini 717721a36fSStefano Zampini Input Parameter: 7247450a7bSBarry Smith . tao - the `Tao` context 737721a36fSStefano Zampini 74d5b43468SJose E. Roman Output Parameters: 757721a36fSStefano Zampini + XL - vector of lower bounds 767721a36fSStefano Zampini - XU - vector of upper bounds 777721a36fSStefano Zampini 787721a36fSStefano Zampini Level: beginner 797721a36fSStefano Zampini 801cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 817721a36fSStefano Zampini @*/ 82d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU) 83d71ae5a4SJacob Faibussowitsch { 84a7e14dcfSSatish Balay PetscFunctionBegin; 85441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 867721a36fSStefano Zampini if (XL) *XL = tao->XL; 877721a36fSStefano Zampini if (XU) *XU = tao->XU; 883ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 89a7e14dcfSSatish Balay } 90a7e14dcfSSatish Balay 91cc4c1da9SBarry Smith /*@ 92a7e14dcfSSatish Balay TaoComputeVariableBounds - Compute the variable bounds using the 9365ba42b6SBarry Smith routine set by `TaoSetVariableBoundsRoutine()`. 94a7e14dcfSSatish Balay 95c3339decSBarry Smith Collective 96a7e14dcfSSatish Balay 977721a36fSStefano Zampini Input Parameter: 9847450a7bSBarry Smith . tao - the `Tao` context 99a7e14dcfSSatish Balay 100a7e14dcfSSatish Balay Level: developer 101a7e14dcfSSatish Balay 1021cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()` 103a7e14dcfSSatish Balay @*/ 104d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeVariableBounds(Tao tao) 105d71ae5a4SJacob Faibussowitsch { 106a7e14dcfSSatish Balay PetscFunctionBegin; 107441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 10876be6f4fSStefano Zampini if (tao->ops->computebounds) { 10976be6f4fSStefano Zampini if (!tao->XL) { 1109566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XL)); 1119566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XL, PETSC_NINFINITY)); 11276be6f4fSStefano Zampini } 11376be6f4fSStefano Zampini if (!tao->XU) { 1149566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XU)); 1159566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XU, PETSC_INFINITY)); 116a7e14dcfSSatish Balay } 117792fecdfSBarry Smith PetscCallBack("Tao callback variable bounds", (*tao->ops->computebounds)(tao, tao->XL, tao->XU, tao->user_boundsP)); 1187721a36fSStefano Zampini } 1193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 120a7e14dcfSSatish Balay } 121a7e14dcfSSatish Balay 122a7e14dcfSSatish Balay /*@ 123a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 124a7e14dcfSSatish Balay 12520f4b53cSBarry Smith Logically Collective 126a7e14dcfSSatish Balay 127a7e14dcfSSatish Balay Input Parameters: 12847450a7bSBarry Smith + tao - the `Tao` context 129a7e14dcfSSatish Balay . IL - vector of lower bounds 130a7e14dcfSSatish Balay - IU - vector of upper bounds 131a7e14dcfSSatish Balay 132a7e14dcfSSatish Balay Level: beginner 133a7e14dcfSSatish Balay 1341cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()` 135a7e14dcfSSatish Balay @*/ 136d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 137d71ae5a4SJacob Faibussowitsch { 138a7e14dcfSSatish Balay PetscFunctionBegin; 139441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 1407721a36fSStefano Zampini if (IL) PetscValidHeaderSpecific(IL, VEC_CLASSID, 2); 1417721a36fSStefano Zampini if (IU) PetscValidHeaderSpecific(IU, VEC_CLASSID, 3); 1429566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IL)); 1439566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IU)); 1449566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IL)); 1459566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IU)); 146a7e14dcfSSatish Balay tao->IL = IL; 147a7e14dcfSSatish Balay tao->IU = IU; 1487721a36fSStefano Zampini tao->ineq_doublesided = (PetscBool)(IL || IU); 1493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 150a7e14dcfSSatish Balay } 151a7e14dcfSSatish Balay 1527721a36fSStefano Zampini /*@ 15365ba42b6SBarry Smith TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()` 1547721a36fSStefano Zampini 15520f4b53cSBarry Smith Logically Collective 1567721a36fSStefano Zampini 1577721a36fSStefano Zampini Input Parameter: 15847450a7bSBarry Smith . tao - the `Tao` context 1597721a36fSStefano Zampini 1607721a36fSStefano Zampini Output Parameters: 1617721a36fSStefano Zampini + IL - vector of lower bounds 1627721a36fSStefano Zampini - IU - vector of upper bounds 1637721a36fSStefano Zampini 1647721a36fSStefano Zampini Level: beginner 1657721a36fSStefano Zampini 1661cc06b55SBarry Smith .seealso: [](ch_tao), `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()` 1677721a36fSStefano Zampini @*/ 168d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 169d71ae5a4SJacob Faibussowitsch { 170a7e14dcfSSatish Balay PetscFunctionBegin; 171441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 1727721a36fSStefano Zampini if (IL) *IL = tao->IL; 1737721a36fSStefano Zampini if (IU) *IU = tao->IU; 1743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 175a7e14dcfSSatish Balay } 176a7e14dcfSSatish Balay 177cc4c1da9SBarry Smith /*@ 178a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 17965ba42b6SBarry Smith routine set by `TaoSetConstraintsRoutine()`. 180a7e14dcfSSatish Balay 181c3339decSBarry Smith Collective 182a7e14dcfSSatish Balay 183a7e14dcfSSatish Balay Input Parameters: 18420f4b53cSBarry Smith + tao - the `Tao` context 18520f4b53cSBarry Smith - X - location to evaluate the constraints 18620f4b53cSBarry Smith 18720f4b53cSBarry Smith Output Parameter: 18820f4b53cSBarry Smith . C - the constraints 189a7e14dcfSSatish Balay 190a7e14dcfSSatish Balay Level: developer 191a7e14dcfSSatish Balay 1921cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()` 193a7e14dcfSSatish Balay @*/ 194d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 195d71ae5a4SJacob Faibussowitsch { 196a7e14dcfSSatish Balay PetscFunctionBegin; 197441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 198a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 199064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(C, VEC_CLASSID, 3); 200a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 201a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, C, 3); 2029566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, C, NULL)); 203792fecdfSBarry Smith PetscCallBack("Tao callback constraints", (*tao->ops->computeconstraints)(tao, X, C, tao->user_conP)); 2049566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, C, NULL)); 205a7e14dcfSSatish Balay tao->nconstraints++; 2063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 207a7e14dcfSSatish Balay } 208a7e14dcfSSatish Balay 209a7e14dcfSSatish Balay /*@C 2101cc06b55SBarry Smith TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see [](ch_tao) for details 211a7e14dcfSSatish Balay 21220f4b53cSBarry Smith Logically Collective 213a7e14dcfSSatish Balay 214a7e14dcfSSatish Balay Input Parameters: 21547450a7bSBarry Smith + tao - the `Tao` context 216a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 217a7e14dcfSSatish Balay . func - the bounds computation routine 21820f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be `NULL`) 219a7e14dcfSSatish Balay 22020f4b53cSBarry Smith Calling sequence of `func`: 22147450a7bSBarry Smith + tao - the `Tao` solver 222a7e14dcfSSatish Balay . x - point to evaluate constraints 22347450a7bSBarry Smith . c - vector constraints evaluated at `x` 224a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 225a7e14dcfSSatish Balay 226a7e14dcfSSatish Balay Level: intermediate 227a7e14dcfSSatish Balay 2281cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()` 229a7e14dcfSSatish Balay @*/ 230*2a8381b2SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao tao, Vec x, Vec c, PetscCtx ctx), PetscCtx ctx) 231d71ae5a4SJacob Faibussowitsch { 232a7e14dcfSSatish Balay PetscFunctionBegin; 233441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 2347721a36fSStefano Zampini if (c) PetscValidHeaderSpecific(c, VEC_CLASSID, 2); 2359566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)c)); 2369566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints)); 2377721a36fSStefano Zampini tao->constrained = func ? PETSC_TRUE : PETSC_FALSE; 238a7e14dcfSSatish Balay tao->constraints = c; 239a7e14dcfSSatish Balay tao->user_conP = ctx; 240a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 2413ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 242a7e14dcfSSatish Balay } 243a7e14dcfSSatish Balay 244a7e14dcfSSatish Balay /*@ 245a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 246a7e14dcfSSatish Balay of the variables 247a7e14dcfSSatish Balay 248c3339decSBarry Smith Collective 249a7e14dcfSSatish Balay 250f899ff85SJose E. Roman Input Parameter: 25147450a7bSBarry Smith . tao - the `Tao` context 252a7e14dcfSSatish Balay 253d8d19677SJose E. Roman Output Parameters: 254a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 255a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 256a7e14dcfSSatish Balay 257a7e14dcfSSatish Balay Level: advanced 258a7e14dcfSSatish Balay 259a7e14dcfSSatish Balay Note: 260a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 26120f4b53cSBarry Smith this routine after using an unconstrained solver, `DL` and `DU` are set to all 262a7e14dcfSSatish Balay zeros. 263a7e14dcfSSatish Balay 2641cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()` 265a7e14dcfSSatish Balay @*/ 266d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 267d71ae5a4SJacob Faibussowitsch { 268a7e14dcfSSatish Balay PetscFunctionBegin; 269441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 270a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL, VEC_CLASSID, 2); 271064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(DU, VEC_CLASSID, 3); 272a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, DL, 2); 273a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, DU, 3); 274a7e14dcfSSatish Balay if (tao->ops->computedual) { 275dbbe0bcdSBarry Smith PetscUseTypeMethod(tao, computedual, DL, DU); 276a7e14dcfSSatish Balay } else { 2779566063dSJacob Faibussowitsch PetscCall(VecSet(DL, 0.0)); 2789566063dSJacob Faibussowitsch PetscCall(VecSet(DU, 0.0)); 279a7e14dcfSSatish Balay } 2803ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 281a7e14dcfSSatish Balay } 282a7e14dcfSSatish Balay 283a7e14dcfSSatish Balay /*@ 28465ba42b6SBarry Smith TaoGetDualVariables - Gets the dual vectors 285a7e14dcfSSatish Balay 286c3339decSBarry Smith Collective 287a7e14dcfSSatish Balay 288f899ff85SJose E. Roman Input Parameter: 28947450a7bSBarry Smith . tao - the `Tao` context 290a7e14dcfSSatish Balay 291d8d19677SJose E. Roman Output Parameters: 292a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 293a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 294a7e14dcfSSatish Balay 295a7e14dcfSSatish Balay Level: advanced 296a7e14dcfSSatish Balay 2971cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoComputeDualVariables()` 298a7e14dcfSSatish Balay @*/ 299d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 300d71ae5a4SJacob Faibussowitsch { 301a7e14dcfSSatish Balay PetscFunctionBegin; 302441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3037721a36fSStefano Zampini if (DE) *DE = tao->DE; 3047721a36fSStefano Zampini if (DI) *DI = tao->DI; 3053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 306a7e14dcfSSatish Balay } 307a7e14dcfSSatish Balay 308a7e14dcfSSatish Balay /*@C 3091cc06b55SBarry Smith TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see [](ch_tao) for details 310a7e14dcfSSatish Balay 31120f4b53cSBarry Smith Logically Collective 312a7e14dcfSSatish Balay 313a7e14dcfSSatish Balay Input Parameters: 31447450a7bSBarry Smith + tao - the `Tao` context 315a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 316a7e14dcfSSatish Balay . func - the bounds computation routine 31720f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be `NULL`) 318a7e14dcfSSatish Balay 31920f4b53cSBarry Smith Calling sequence of `func`: 32047450a7bSBarry Smith + tao - the `Tao` solver 321a7e14dcfSSatish Balay . x - point to evaluate equality constraints 322a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 323a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 324a7e14dcfSSatish Balay 325a7e14dcfSSatish Balay Level: intermediate 326a7e14dcfSSatish Balay 3271cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 328a7e14dcfSSatish Balay @*/ 329*2a8381b2SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao tao, Vec x, Vec ce, PetscCtx ctx), PetscCtx ctx) 330d71ae5a4SJacob Faibussowitsch { 331a7e14dcfSSatish Balay PetscFunctionBegin; 332441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3337721a36fSStefano Zampini if (ce) PetscValidHeaderSpecific(ce, VEC_CLASSID, 2); 3349566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ce)); 3359566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_equality)); 3367721a36fSStefano Zampini tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 337a7e14dcfSSatish Balay tao->constraints_equality = ce; 338a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 339a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 3403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 341a7e14dcfSSatish Balay } 342a7e14dcfSSatish Balay 343a7e14dcfSSatish Balay /*@C 3441b4e8d38Spaul.kuehner TaoGetEqualityConstraintsRoutine - Gets the function used to compute equality constraints. 3451b4e8d38Spaul.kuehner 3461b4e8d38Spaul.kuehner Not Collective 3471b4e8d38Spaul.kuehner 3481b4e8d38Spaul.kuehner Input Parameter: 3491b4e8d38Spaul.kuehner . tao - the `Tao` context 3501b4e8d38Spaul.kuehner 3511b4e8d38Spaul.kuehner Output Parameters: 3521b4e8d38Spaul.kuehner + ci - the vector to internally hold the constraint computation 3531b4e8d38Spaul.kuehner . func - the bounds computation routine 3541b4e8d38Spaul.kuehner - ctx - the (optional) user-defined context 3551b4e8d38Spaul.kuehner 3561b4e8d38Spaul.kuehner Calling sequence of `func`: 3571b4e8d38Spaul.kuehner + tao - the `Tao` solver 3581b4e8d38Spaul.kuehner . x - point to evaluate equality constraints 3591b4e8d38Spaul.kuehner . ci - vector of equality constraints evaluated at x 3601b4e8d38Spaul.kuehner - ctx - the (optional) user-defined function context 3611b4e8d38Spaul.kuehner 3621b4e8d38Spaul.kuehner Level: intermediate 3631b4e8d38Spaul.kuehner 3641b4e8d38Spaul.kuehner .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoGetObjective()`, `TaoGetGradient()`, `TaoGetHessian()`, `TaoGetObjectiveAndGradient()`, `TaoGetInequalityConstraintsRoutine()` 3651b4e8d38Spaul.kuehner @*/ 366*2a8381b2SBarry Smith PetscErrorCode TaoGetEqualityConstraintsRoutine(Tao tao, Vec *ci, PetscErrorCode (**func)(Tao tao, Vec x, Vec ci, PetscCtx ctx), PetscCtxRt ctx) 3671b4e8d38Spaul.kuehner { 3681b4e8d38Spaul.kuehner PetscFunctionBegin; 3691b4e8d38Spaul.kuehner PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3701b4e8d38Spaul.kuehner if (ci) *ci = tao->constraints_equality; 3711b4e8d38Spaul.kuehner if (func) *func = tao->ops->computeequalityconstraints; 372*2a8381b2SBarry Smith if (ctx) *(void **)ctx = tao->user_con_equalityP; 3731b4e8d38Spaul.kuehner PetscFunctionReturn(PETSC_SUCCESS); 3741b4e8d38Spaul.kuehner } 3751b4e8d38Spaul.kuehner 3761b4e8d38Spaul.kuehner /*@C 3771cc06b55SBarry Smith TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see [](ch_tao) for details 378a7e14dcfSSatish Balay 37920f4b53cSBarry Smith Logically Collective 380a7e14dcfSSatish Balay 381a7e14dcfSSatish Balay Input Parameters: 38247450a7bSBarry Smith + tao - the `Tao` context 383a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 384a7e14dcfSSatish Balay . func - the bounds computation routine 38520f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be `NULL`) 386a7e14dcfSSatish Balay 38720f4b53cSBarry Smith Calling sequence of `func`: 38847450a7bSBarry Smith + tao - the `Tao` solver 389a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 390a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 391a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 392a7e14dcfSSatish Balay 393a7e14dcfSSatish Balay Level: intermediate 394a7e14dcfSSatish Balay 395e056e8ceSJacob Faibussowitsch .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 396a7e14dcfSSatish Balay @*/ 397*2a8381b2SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao tao, Vec x, Vec ci, PetscCtx ctx), PetscCtx ctx) 398d71ae5a4SJacob Faibussowitsch { 399a7e14dcfSSatish Balay PetscFunctionBegin; 400441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 4017721a36fSStefano Zampini if (ci) PetscValidHeaderSpecific(ci, VEC_CLASSID, 2); 4029566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ci)); 4039566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_inequality)); 404a7e14dcfSSatish Balay tao->constraints_inequality = ci; 4057721a36fSStefano Zampini tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 406a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 407a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 4083ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 409a7e14dcfSSatish Balay } 410a7e14dcfSSatish Balay 411434d79ddSpaul.kuehner /*@C 412434d79ddSpaul.kuehner TaoGetInequalityConstraintsRoutine - Gets the function used to compute inequality constraints. 413434d79ddSpaul.kuehner 414434d79ddSpaul.kuehner Not Collective 415434d79ddSpaul.kuehner 416434d79ddSpaul.kuehner Input Parameter: 417434d79ddSpaul.kuehner . tao - the `Tao` context 418434d79ddSpaul.kuehner 419434d79ddSpaul.kuehner Output Parameters: 420434d79ddSpaul.kuehner + ci - the vector to internally hold the constraint computation 421434d79ddSpaul.kuehner . func - the bounds computation routine 422434d79ddSpaul.kuehner - ctx - the (optional) user-defined context 423434d79ddSpaul.kuehner 424434d79ddSpaul.kuehner Calling sequence of `func`: 425434d79ddSpaul.kuehner + tao - the `Tao` solver 426434d79ddSpaul.kuehner . x - point to evaluate inequality constraints 427434d79ddSpaul.kuehner . ci - vector of inequality constraints evaluated at x 428434d79ddSpaul.kuehner - ctx - the (optional) user-defined function context 429434d79ddSpaul.kuehner 430434d79ddSpaul.kuehner Level: intermediate 431434d79ddSpaul.kuehner 4321b4e8d38Spaul.kuehner .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoGetObjective()`, `TaoGetGradient()`, `TaoGetHessian()`, `TaoGetObjectiveAndGradient()`, `TaoGetEqualityConstraintsRoutine()` 433434d79ddSpaul.kuehner @*/ 434*2a8381b2SBarry Smith PetscErrorCode TaoGetInequalityConstraintsRoutine(Tao tao, Vec *ci, PetscErrorCode (**func)(Tao tao, Vec x, Vec ci, PetscCtx ctx), PetscCtxRt ctx) 435434d79ddSpaul.kuehner { 436434d79ddSpaul.kuehner PetscFunctionBegin; 437434d79ddSpaul.kuehner PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 438434d79ddSpaul.kuehner if (ci) *ci = tao->constraints_inequality; 439434d79ddSpaul.kuehner if (func) *func = tao->ops->computeinequalityconstraints; 440*2a8381b2SBarry Smith if (ctx) *(void **)ctx = tao->user_con_inequalityP; 441434d79ddSpaul.kuehner PetscFunctionReturn(PETSC_SUCCESS); 442434d79ddSpaul.kuehner } 443434d79ddSpaul.kuehner 444cc4c1da9SBarry Smith /*@ 445a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 44665ba42b6SBarry Smith routine set by `TaoSetEqualityConstraintsRoutine()`. 447a7e14dcfSSatish Balay 448c3339decSBarry Smith Collective 449a7e14dcfSSatish Balay 45065ba42b6SBarry Smith Input Parameter: 45147450a7bSBarry Smith . tao - the `Tao` context 452a7e14dcfSSatish Balay 45365ba42b6SBarry Smith Output Parameters: 454da81f932SPierre Jolivet + X - point the equality constraints were evaluated on 45565ba42b6SBarry Smith - CE - vector of equality constraints evaluated at X 45665ba42b6SBarry Smith 457a7e14dcfSSatish Balay Level: developer 458a7e14dcfSSatish Balay 4591cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()` 460a7e14dcfSSatish Balay @*/ 461d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 462d71ae5a4SJacob Faibussowitsch { 463a7e14dcfSSatish Balay PetscFunctionBegin; 464441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 465a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 466064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE, VEC_CLASSID, 3); 467a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 468a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, CE, 3); 4699566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CE, NULL)); 470792fecdfSBarry Smith PetscCallBack("Tao callback equality constraints", (*tao->ops->computeequalityconstraints)(tao, X, CE, tao->user_con_equalityP)); 4719566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CE, NULL)); 472a7e14dcfSSatish Balay tao->nconstraints++; 4733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 474a7e14dcfSSatish Balay } 475a7e14dcfSSatish Balay 476cc4c1da9SBarry Smith /*@ 477a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 47865ba42b6SBarry Smith routine set by `TaoSetInequalityConstraintsRoutine()`. 479a7e14dcfSSatish Balay 480c3339decSBarry Smith Collective 481a7e14dcfSSatish Balay 48265ba42b6SBarry Smith Input Parameter: 48347450a7bSBarry Smith . tao - the `Tao` context 484a7e14dcfSSatish Balay 48565ba42b6SBarry Smith Output Parameters: 486da81f932SPierre Jolivet + X - point the inequality constraints were evaluated on 487e056e8ceSJacob Faibussowitsch - CI - vector of inequality constraints evaluated at X 48865ba42b6SBarry Smith 489a7e14dcfSSatish Balay Level: developer 490a7e14dcfSSatish Balay 4911cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()` 492a7e14dcfSSatish Balay @*/ 493d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 494d71ae5a4SJacob Faibussowitsch { 495a7e14dcfSSatish Balay PetscFunctionBegin; 496441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 497a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 498064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI, VEC_CLASSID, 3); 499a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 500a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, CI, 3); 5019566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CI, NULL)); 502792fecdfSBarry Smith PetscCallBack("Tao callback inequality constraints", (*tao->ops->computeinequalityconstraints)(tao, X, CI, tao->user_con_inequalityP)); 5039566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CI, NULL)); 504a7e14dcfSSatish Balay tao->nconstraints++; 5053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 506a7e14dcfSSatish Balay } 507