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 6*20f4b53cSBarry 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 1547450a7bSBarry Smith .seealso: [](chapter_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 36*20f4b53cSBarry 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 43*20f4b53cSBarry Smith Calling sequence of `func`: 44*20f4b53cSBarry Smith $ PetscErrorCode func (Tao tao, Vec xl, Vec xu, void *ctx); 4547450a7bSBarry Smith + tao - the `Tao` solver 46a7e14dcfSSatish Balay . xl - vector of lower bounds 47a7e14dcfSSatish Balay . xu - vector of upper bounds 48a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 49a7e14dcfSSatish Balay 50a7e14dcfSSatish Balay Level: beginner 51a7e14dcfSSatish Balay 5265ba42b6SBarry Smith Note: 5365ba42b6SBarry Smith The func passed to `TaoSetVariableBoundsRoutine()` takes precedence over any values set in `TaoSetVariableBounds()`. 54a7e14dcfSSatish Balay 5547450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 56a7e14dcfSSatish Balay @*/ 57d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx) 58d71ae5a4SJacob Faibussowitsch { 59a7e14dcfSSatish Balay PetscFunctionBegin; 60441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 61a7e14dcfSSatish Balay tao->user_boundsP = ctx; 62a7e14dcfSSatish Balay tao->ops->computebounds = func; 637721a36fSStefano Zampini tao->bounded = func ? PETSC_TRUE : PETSC_FALSE; 643ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 65a7e14dcfSSatish Balay } 66a7e14dcfSSatish Balay 677721a36fSStefano Zampini /*@ 6865ba42b6SBarry Smith TaoGetVariableBounds - Gets the upper and lower bounds vectors set with `TaoSetVariableBounds()` 697721a36fSStefano Zampini 70*20f4b53cSBarry Smith Not Collective 717721a36fSStefano Zampini 727721a36fSStefano Zampini Input Parameter: 7347450a7bSBarry Smith . tao - the `Tao` context 747721a36fSStefano Zampini 75d5b43468SJose E. Roman Output Parameters: 767721a36fSStefano Zampini + XL - vector of lower bounds 777721a36fSStefano Zampini - XU - vector of upper bounds 787721a36fSStefano Zampini 797721a36fSStefano Zampini Level: beginner 807721a36fSStefano Zampini 8147450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 827721a36fSStefano Zampini @*/ 83d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU) 84d71ae5a4SJacob Faibussowitsch { 85a7e14dcfSSatish Balay PetscFunctionBegin; 86441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 877721a36fSStefano Zampini if (XL) *XL = tao->XL; 887721a36fSStefano Zampini if (XU) *XU = tao->XU; 893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 90a7e14dcfSSatish Balay } 91a7e14dcfSSatish Balay 92a7e14dcfSSatish Balay /*@C 93a7e14dcfSSatish Balay TaoComputeVariableBounds - Compute the variable bounds using the 9465ba42b6SBarry Smith routine set by `TaoSetVariableBoundsRoutine()`. 95a7e14dcfSSatish Balay 96c3339decSBarry Smith Collective 97a7e14dcfSSatish Balay 987721a36fSStefano Zampini Input Parameter: 9947450a7bSBarry Smith . tao - the `Tao` context 100a7e14dcfSSatish Balay 101a7e14dcfSSatish Balay Level: developer 102a7e14dcfSSatish Balay 10347450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()` 104a7e14dcfSSatish Balay @*/ 105d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeVariableBounds(Tao tao) 106d71ae5a4SJacob Faibussowitsch { 107a7e14dcfSSatish Balay PetscFunctionBegin; 108441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 10976be6f4fSStefano Zampini if (tao->ops->computebounds) { 11076be6f4fSStefano Zampini if (!tao->XL) { 1119566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XL)); 1129566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XL, PETSC_NINFINITY)); 11376be6f4fSStefano Zampini } 11476be6f4fSStefano Zampini if (!tao->XU) { 1159566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XU)); 1169566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XU, PETSC_INFINITY)); 117a7e14dcfSSatish Balay } 118792fecdfSBarry Smith PetscCallBack("Tao callback variable bounds", (*tao->ops->computebounds)(tao, tao->XL, tao->XU, tao->user_boundsP)); 1197721a36fSStefano Zampini } 1203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 121a7e14dcfSSatish Balay } 122a7e14dcfSSatish Balay 123a7e14dcfSSatish Balay /*@ 124a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 125a7e14dcfSSatish Balay 126*20f4b53cSBarry Smith Logically Collective 127a7e14dcfSSatish Balay 128a7e14dcfSSatish Balay Input Parameters: 12947450a7bSBarry Smith + tao - the `Tao` context 130a7e14dcfSSatish Balay . IL - vector of lower bounds 131a7e14dcfSSatish Balay - IU - vector of upper bounds 132a7e14dcfSSatish Balay 133a7e14dcfSSatish Balay Level: beginner 134a7e14dcfSSatish Balay 13547450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()` 136a7e14dcfSSatish Balay @*/ 137d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 138d71ae5a4SJacob Faibussowitsch { 139a7e14dcfSSatish Balay PetscFunctionBegin; 140441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 1417721a36fSStefano Zampini if (IL) PetscValidHeaderSpecific(IL, VEC_CLASSID, 2); 1427721a36fSStefano Zampini if (IU) PetscValidHeaderSpecific(IU, VEC_CLASSID, 3); 1439566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IL)); 1449566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IU)); 1459566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IL)); 1469566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IU)); 147a7e14dcfSSatish Balay tao->IL = IL; 148a7e14dcfSSatish Balay tao->IU = IU; 1497721a36fSStefano Zampini tao->ineq_doublesided = (PetscBool)(IL || IU); 1503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 151a7e14dcfSSatish Balay } 152a7e14dcfSSatish Balay 1537721a36fSStefano Zampini /*@ 15465ba42b6SBarry Smith TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()` 1557721a36fSStefano Zampini 156*20f4b53cSBarry Smith Logically Collective 1577721a36fSStefano Zampini 1587721a36fSStefano Zampini Input Parameter: 15947450a7bSBarry Smith . tao - the `Tao` context 1607721a36fSStefano Zampini 1617721a36fSStefano Zampini Output Parameters: 1627721a36fSStefano Zampini + IL - vector of lower bounds 1637721a36fSStefano Zampini - IU - vector of upper bounds 1647721a36fSStefano Zampini 1657721a36fSStefano Zampini Level: beginner 1667721a36fSStefano Zampini 16747450a7bSBarry Smith .seealso: [](chapter_tao), `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()` 1687721a36fSStefano Zampini @*/ 169d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 170d71ae5a4SJacob Faibussowitsch { 171a7e14dcfSSatish Balay PetscFunctionBegin; 172441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 1737721a36fSStefano Zampini if (IL) *IL = tao->IL; 1747721a36fSStefano Zampini if (IU) *IU = tao->IU; 1753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 176a7e14dcfSSatish Balay } 177a7e14dcfSSatish Balay 178a7e14dcfSSatish Balay /*@C 179a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 18065ba42b6SBarry Smith routine set by `TaoSetConstraintsRoutine()`. 181a7e14dcfSSatish Balay 182c3339decSBarry Smith Collective 183a7e14dcfSSatish Balay 184a7e14dcfSSatish Balay Input Parameters: 185*20f4b53cSBarry Smith + tao - the `Tao` context 186*20f4b53cSBarry Smith - X - location to evaluate the constraints 187*20f4b53cSBarry Smith 188*20f4b53cSBarry Smith Output Parameter: 189*20f4b53cSBarry Smith . C - the constraints 190a7e14dcfSSatish Balay 191a7e14dcfSSatish Balay Level: developer 192a7e14dcfSSatish Balay 19347450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()` 194a7e14dcfSSatish Balay @*/ 195d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 196d71ae5a4SJacob Faibussowitsch { 197a7e14dcfSSatish Balay PetscFunctionBegin; 198441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 199a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 200064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(C, VEC_CLASSID, 3); 201a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 202a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, C, 3); 2039566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, C, NULL)); 204792fecdfSBarry Smith PetscCallBack("Tao callback constraints", (*tao->ops->computeconstraints)(tao, X, C, tao->user_conP)); 2059566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, C, NULL)); 206a7e14dcfSSatish Balay tao->nconstraints++; 2073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 208a7e14dcfSSatish Balay } 209a7e14dcfSSatish Balay 210a7e14dcfSSatish Balay /*@C 211*20f4b53cSBarry Smith TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see [](chapter_tao) for details 212a7e14dcfSSatish Balay 213*20f4b53cSBarry Smith Logically Collective 214a7e14dcfSSatish Balay 215a7e14dcfSSatish Balay Input Parameters: 21647450a7bSBarry Smith + tao - the `Tao` context 217a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 218a7e14dcfSSatish Balay . func - the bounds computation routine 219*20f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be `NULL`) 220a7e14dcfSSatish Balay 221*20f4b53cSBarry Smith Calling sequence of `func`: 222*20f4b53cSBarry Smith $ PetscErrorCode func(Tao tao, Vec x, Vec c, void *ctx); 22347450a7bSBarry Smith + tao - the `Tao` solver 224a7e14dcfSSatish Balay . x - point to evaluate constraints 22547450a7bSBarry Smith . c - vector constraints evaluated at `x` 226a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 227a7e14dcfSSatish Balay 228a7e14dcfSSatish Balay Level: intermediate 229a7e14dcfSSatish Balay 23047450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()` 231a7e14dcfSSatish Balay @*/ 232d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx) 233d71ae5a4SJacob Faibussowitsch { 234a7e14dcfSSatish Balay PetscFunctionBegin; 235441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 2367721a36fSStefano Zampini if (c) PetscValidHeaderSpecific(c, VEC_CLASSID, 2); 2379566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)c)); 2389566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints)); 2397721a36fSStefano Zampini tao->constrained = func ? PETSC_TRUE : PETSC_FALSE; 240a7e14dcfSSatish Balay tao->constraints = c; 241a7e14dcfSSatish Balay tao->user_conP = ctx; 242a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 2433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 244a7e14dcfSSatish Balay } 245a7e14dcfSSatish Balay 246a7e14dcfSSatish Balay /*@ 247a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 248a7e14dcfSSatish Balay of the variables 249a7e14dcfSSatish Balay 250c3339decSBarry Smith Collective 251a7e14dcfSSatish Balay 252f899ff85SJose E. Roman Input Parameter: 25347450a7bSBarry Smith . tao - the `Tao` context 254a7e14dcfSSatish Balay 255d8d19677SJose E. Roman Output Parameters: 256a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 257a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 258a7e14dcfSSatish Balay 259a7e14dcfSSatish Balay Level: advanced 260a7e14dcfSSatish Balay 261a7e14dcfSSatish Balay Note: 262a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 263*20f4b53cSBarry Smith this routine after using an unconstrained solver, `DL` and `DU` are set to all 264a7e14dcfSSatish Balay zeros. 265a7e14dcfSSatish Balay 26647450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()` 267a7e14dcfSSatish Balay @*/ 268d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 269d71ae5a4SJacob Faibussowitsch { 270a7e14dcfSSatish Balay PetscFunctionBegin; 271441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 272a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL, VEC_CLASSID, 2); 273064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(DU, VEC_CLASSID, 3); 274a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, DL, 2); 275a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, DU, 3); 276a7e14dcfSSatish Balay if (tao->ops->computedual) { 277dbbe0bcdSBarry Smith PetscUseTypeMethod(tao, computedual, DL, DU); 278a7e14dcfSSatish Balay } else { 2799566063dSJacob Faibussowitsch PetscCall(VecSet(DL, 0.0)); 2809566063dSJacob Faibussowitsch PetscCall(VecSet(DU, 0.0)); 281a7e14dcfSSatish Balay } 2823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 283a7e14dcfSSatish Balay } 284a7e14dcfSSatish Balay 285a7e14dcfSSatish Balay /*@ 28665ba42b6SBarry Smith TaoGetDualVariables - Gets the dual vectors 287a7e14dcfSSatish Balay 288c3339decSBarry Smith Collective 289a7e14dcfSSatish Balay 290f899ff85SJose E. Roman Input Parameter: 29147450a7bSBarry Smith . tao - the `Tao` context 292a7e14dcfSSatish Balay 293d8d19677SJose E. Roman Output Parameters: 294a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 295a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 296a7e14dcfSSatish Balay 297a7e14dcfSSatish Balay Level: advanced 298a7e14dcfSSatish Balay 29947450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoComputeDualVariables()` 300a7e14dcfSSatish Balay @*/ 301d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 302d71ae5a4SJacob Faibussowitsch { 303a7e14dcfSSatish Balay PetscFunctionBegin; 304441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3057721a36fSStefano Zampini if (DE) *DE = tao->DE; 3067721a36fSStefano Zampini if (DI) *DI = tao->DI; 3073ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 308a7e14dcfSSatish Balay } 309a7e14dcfSSatish Balay 310a7e14dcfSSatish Balay /*@C 311*20f4b53cSBarry Smith TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see [](chapter_tao) for details 312a7e14dcfSSatish Balay 313*20f4b53cSBarry Smith Logically Collective 314a7e14dcfSSatish Balay 315a7e14dcfSSatish Balay Input Parameters: 31647450a7bSBarry Smith + tao - the `Tao` context 317a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 318a7e14dcfSSatish Balay . func - the bounds computation routine 319*20f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be `NULL`) 320a7e14dcfSSatish Balay 321*20f4b53cSBarry Smith Calling sequence of `func`: 322*20f4b53cSBarry Smith $ PetscErrorCode func(Tao tao, Vec x, Vec ce, void *ctx); 32347450a7bSBarry Smith + tao - the `Tao` solver 324a7e14dcfSSatish Balay . x - point to evaluate equality constraints 325a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 326a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 327a7e14dcfSSatish Balay 328a7e14dcfSSatish Balay Level: intermediate 329a7e14dcfSSatish Balay 33047450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 331a7e14dcfSSatish Balay @*/ 332d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx) 333d71ae5a4SJacob Faibussowitsch { 334a7e14dcfSSatish Balay PetscFunctionBegin; 335441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3367721a36fSStefano Zampini if (ce) PetscValidHeaderSpecific(ce, VEC_CLASSID, 2); 3379566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ce)); 3389566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_equality)); 3397721a36fSStefano Zampini tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 340a7e14dcfSSatish Balay tao->constraints_equality = ce; 341a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 342a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 3433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 344a7e14dcfSSatish Balay } 345a7e14dcfSSatish Balay 346a7e14dcfSSatish Balay /*@C 347*20f4b53cSBarry Smith TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see [](chapter_tao) for details 348a7e14dcfSSatish Balay 349*20f4b53cSBarry Smith Logically Collective 350a7e14dcfSSatish Balay 351a7e14dcfSSatish Balay Input Parameters: 35247450a7bSBarry Smith + tao - the `Tao` context 353a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 354a7e14dcfSSatish Balay . func - the bounds computation routine 355*20f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be `NULL`) 356a7e14dcfSSatish Balay 357*20f4b53cSBarry Smith Calling sequence of `func`: 358*20f4b53cSBarry Smith $ PetscErrorCode func(Tao tao, Vec x, Vec ci, void *ctx); 35947450a7bSBarry Smith + tao - the `Tao` solver 360a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 361a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 362a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 363a7e14dcfSSatish Balay 364a7e14dcfSSatish Balay Level: intermediate 365a7e14dcfSSatish Balay 36647450a7bSBarry Smith .seealso: [](chapter_tao), `Tao, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 367a7e14dcfSSatish Balay @*/ 368d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx) 369d71ae5a4SJacob Faibussowitsch { 370a7e14dcfSSatish Balay PetscFunctionBegin; 371441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3727721a36fSStefano Zampini if (ci) PetscValidHeaderSpecific(ci, VEC_CLASSID, 2); 3739566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ci)); 3749566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_inequality)); 375a7e14dcfSSatish Balay tao->constraints_inequality = ci; 3767721a36fSStefano Zampini tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 377a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 378a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 3793ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 380a7e14dcfSSatish Balay } 381a7e14dcfSSatish Balay 382a7e14dcfSSatish Balay /*@C 383a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 38465ba42b6SBarry Smith routine set by `TaoSetEqualityConstraintsRoutine()`. 385a7e14dcfSSatish Balay 386c3339decSBarry Smith Collective 387a7e14dcfSSatish Balay 38865ba42b6SBarry Smith Input Parameter: 38947450a7bSBarry Smith . tao - the `Tao` context 390a7e14dcfSSatish Balay 39165ba42b6SBarry Smith Output Parameters: 392da81f932SPierre Jolivet + X - point the equality constraints were evaluated on 39365ba42b6SBarry Smith - CE - vector of equality constraints evaluated at X 39465ba42b6SBarry Smith 395a7e14dcfSSatish Balay Level: developer 396a7e14dcfSSatish Balay 39747450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()` 398a7e14dcfSSatish Balay @*/ 399d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 400d71ae5a4SJacob Faibussowitsch { 401a7e14dcfSSatish Balay PetscFunctionBegin; 402441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 403a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 404064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE, VEC_CLASSID, 3); 405a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 406a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, CE, 3); 4079566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CE, NULL)); 408792fecdfSBarry Smith PetscCallBack("Tao callback equality constraints", (*tao->ops->computeequalityconstraints)(tao, X, CE, tao->user_con_equalityP)); 4099566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CE, NULL)); 410a7e14dcfSSatish Balay tao->nconstraints++; 4113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 412a7e14dcfSSatish Balay } 413a7e14dcfSSatish Balay 414a7e14dcfSSatish Balay /*@C 415a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 41665ba42b6SBarry Smith routine set by `TaoSetInequalityConstraintsRoutine()`. 417a7e14dcfSSatish Balay 418c3339decSBarry Smith Collective 419a7e14dcfSSatish Balay 42065ba42b6SBarry Smith Input Parameter: 42147450a7bSBarry Smith . tao - the `Tao` context 422a7e14dcfSSatish Balay 42365ba42b6SBarry Smith Output Parameters: 424da81f932SPierre Jolivet + X - point the inequality constraints were evaluated on 42565ba42b6SBarry Smith - CE - vector of inequality constraints evaluated at X 42665ba42b6SBarry Smith 427a7e14dcfSSatish Balay Level: developer 428a7e14dcfSSatish Balay 42947450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()` 430a7e14dcfSSatish Balay @*/ 431d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 432d71ae5a4SJacob Faibussowitsch { 433a7e14dcfSSatish Balay PetscFunctionBegin; 434441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 435a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 436064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI, VEC_CLASSID, 3); 437a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 438a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, CI, 3); 4399566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CI, NULL)); 440792fecdfSBarry Smith PetscCallBack("Tao callback inequality constraints", (*tao->ops->computeinequalityconstraints)(tao, X, CI, tao->user_con_inequalityP)); 4419566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CI, NULL)); 442a7e14dcfSSatish Balay tao->nconstraints++; 4433ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 444a7e14dcfSSatish Balay } 445