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*3b242c63SJacob Faibussowitsch PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao tao, Vec xl, Vec xu, void *ctx), void *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 91a7e14dcfSSatish Balay /*@C 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 177a7e14dcfSSatish Balay /*@C 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*3b242c63SJacob Faibussowitsch PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao tao, Vec x, Vec c, void *ctx), void *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*3b242c63SJacob Faibussowitsch PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao tao, Vec x, Vec ce, void *ctx), void *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 3441cc06b55SBarry Smith TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see [](ch_tao) for details 345a7e14dcfSSatish Balay 34620f4b53cSBarry Smith Logically Collective 347a7e14dcfSSatish Balay 348a7e14dcfSSatish Balay Input Parameters: 34947450a7bSBarry Smith + tao - the `Tao` context 350a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 351a7e14dcfSSatish Balay . func - the bounds computation routine 35220f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be `NULL`) 353a7e14dcfSSatish Balay 35420f4b53cSBarry Smith Calling sequence of `func`: 35547450a7bSBarry Smith + tao - the `Tao` solver 356a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 357a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 358a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 359a7e14dcfSSatish Balay 360a7e14dcfSSatish Balay Level: intermediate 361a7e14dcfSSatish Balay 362e056e8ceSJacob Faibussowitsch .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 363a7e14dcfSSatish Balay @*/ 364*3b242c63SJacob Faibussowitsch PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao tao, Vec x, Vec ci, void *ctx), void *ctx) 365d71ae5a4SJacob Faibussowitsch { 366a7e14dcfSSatish Balay PetscFunctionBegin; 367441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3687721a36fSStefano Zampini if (ci) PetscValidHeaderSpecific(ci, VEC_CLASSID, 2); 3699566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ci)); 3709566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_inequality)); 371a7e14dcfSSatish Balay tao->constraints_inequality = ci; 3727721a36fSStefano Zampini tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 373a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 374a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 3753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 376a7e14dcfSSatish Balay } 377a7e14dcfSSatish Balay 378a7e14dcfSSatish Balay /*@C 379a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 38065ba42b6SBarry Smith routine set by `TaoSetEqualityConstraintsRoutine()`. 381a7e14dcfSSatish Balay 382c3339decSBarry Smith Collective 383a7e14dcfSSatish Balay 38465ba42b6SBarry Smith Input Parameter: 38547450a7bSBarry Smith . tao - the `Tao` context 386a7e14dcfSSatish Balay 38765ba42b6SBarry Smith Output Parameters: 388da81f932SPierre Jolivet + X - point the equality constraints were evaluated on 38965ba42b6SBarry Smith - CE - vector of equality constraints evaluated at X 39065ba42b6SBarry Smith 391a7e14dcfSSatish Balay Level: developer 392a7e14dcfSSatish Balay 3931cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()` 394a7e14dcfSSatish Balay @*/ 395d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 396d71ae5a4SJacob Faibussowitsch { 397a7e14dcfSSatish Balay PetscFunctionBegin; 398441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 399a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 400064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE, VEC_CLASSID, 3); 401a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 402a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, CE, 3); 4039566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CE, NULL)); 404792fecdfSBarry Smith PetscCallBack("Tao callback equality constraints", (*tao->ops->computeequalityconstraints)(tao, X, CE, tao->user_con_equalityP)); 4059566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CE, NULL)); 406a7e14dcfSSatish Balay tao->nconstraints++; 4073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 408a7e14dcfSSatish Balay } 409a7e14dcfSSatish Balay 410a7e14dcfSSatish Balay /*@C 411a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 41265ba42b6SBarry Smith routine set by `TaoSetInequalityConstraintsRoutine()`. 413a7e14dcfSSatish Balay 414c3339decSBarry Smith Collective 415a7e14dcfSSatish Balay 41665ba42b6SBarry Smith Input Parameter: 41747450a7bSBarry Smith . tao - the `Tao` context 418a7e14dcfSSatish Balay 41965ba42b6SBarry Smith Output Parameters: 420da81f932SPierre Jolivet + X - point the inequality constraints were evaluated on 421e056e8ceSJacob Faibussowitsch - CI - vector of inequality constraints evaluated at X 42265ba42b6SBarry Smith 423a7e14dcfSSatish Balay Level: developer 424a7e14dcfSSatish Balay 4251cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()` 426a7e14dcfSSatish Balay @*/ 427d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 428d71ae5a4SJacob Faibussowitsch { 429a7e14dcfSSatish Balay PetscFunctionBegin; 430441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 431a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 432064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI, VEC_CLASSID, 3); 433a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 434a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, CI, 3); 4359566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CI, NULL)); 436792fecdfSBarry Smith PetscCallBack("Tao callback inequality constraints", (*tao->ops->computeinequalityconstraints)(tao, X, CI, tao->user_con_inequalityP)); 4379566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CI, NULL)); 438a7e14dcfSSatish Balay tao->nconstraints++; 4393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 440a7e14dcfSSatish Balay } 441