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 6c3339decSBarry Smith Logically collective 7a7e14dcfSSatish Balay 8a7e14dcfSSatish Balay Input Parameters: 9*47450a7bSBarry 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 15*47450a7bSBarry 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 36c3339decSBarry Smith Logically collective 37a7e14dcfSSatish Balay 38a7e14dcfSSatish Balay Input Parameters: 39*47450a7bSBarry Smith + tao - the `Tao` context 40a7e14dcfSSatish Balay . func - the bounds computation routine 41*47450a7bSBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be `NULL`) 42a7e14dcfSSatish Balay 43a7e14dcfSSatish Balay Calling sequence of func: 44441846f8SBarry Smith $ func (Tao tao, Vec xl, Vec xu); 45a7e14dcfSSatish Balay 46*47450a7bSBarry Smith + tao - the `Tao` solver 47a7e14dcfSSatish Balay . xl - vector of lower bounds 48a7e14dcfSSatish Balay . xu - vector of upper bounds 49a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 50a7e14dcfSSatish Balay 51a7e14dcfSSatish Balay Level: beginner 52a7e14dcfSSatish Balay 5365ba42b6SBarry Smith Note: 5465ba42b6SBarry Smith The func passed to `TaoSetVariableBoundsRoutine()` takes precedence over any values set in `TaoSetVariableBounds()`. 55a7e14dcfSSatish Balay 56*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 57a7e14dcfSSatish Balay @*/ 58d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx) 59d71ae5a4SJacob Faibussowitsch { 60a7e14dcfSSatish Balay PetscFunctionBegin; 61441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 62a7e14dcfSSatish Balay tao->user_boundsP = ctx; 63a7e14dcfSSatish Balay tao->ops->computebounds = func; 647721a36fSStefano Zampini tao->bounded = func ? PETSC_TRUE : PETSC_FALSE; 653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 66a7e14dcfSSatish Balay } 67a7e14dcfSSatish Balay 687721a36fSStefano Zampini /*@ 6965ba42b6SBarry Smith TaoGetVariableBounds - Gets the upper and lower bounds vectors set with `TaoSetVariableBounds()` 707721a36fSStefano Zampini 717721a36fSStefano Zampini Not collective 727721a36fSStefano Zampini 737721a36fSStefano Zampini Input Parameter: 74*47450a7bSBarry Smith . tao - the `Tao` context 757721a36fSStefano Zampini 76d5b43468SJose E. Roman Output Parameters: 777721a36fSStefano Zampini + XL - vector of lower bounds 787721a36fSStefano Zampini - XU - vector of upper bounds 797721a36fSStefano Zampini 807721a36fSStefano Zampini Level: beginner 817721a36fSStefano Zampini 82*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 837721a36fSStefano Zampini @*/ 84d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU) 85d71ae5a4SJacob Faibussowitsch { 86a7e14dcfSSatish Balay PetscFunctionBegin; 87441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 887721a36fSStefano Zampini if (XL) *XL = tao->XL; 897721a36fSStefano Zampini if (XU) *XU = tao->XU; 903ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 91a7e14dcfSSatish Balay } 92a7e14dcfSSatish Balay 93a7e14dcfSSatish Balay /*@C 94a7e14dcfSSatish Balay TaoComputeVariableBounds - Compute the variable bounds using the 9565ba42b6SBarry Smith routine set by `TaoSetVariableBoundsRoutine()`. 96a7e14dcfSSatish Balay 97c3339decSBarry Smith Collective 98a7e14dcfSSatish Balay 997721a36fSStefano Zampini Input Parameter: 100*47450a7bSBarry Smith . tao - the `Tao` context 101a7e14dcfSSatish Balay 102a7e14dcfSSatish Balay Level: developer 103a7e14dcfSSatish Balay 104*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()` 105a7e14dcfSSatish Balay @*/ 106d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeVariableBounds(Tao tao) 107d71ae5a4SJacob Faibussowitsch { 108a7e14dcfSSatish Balay PetscFunctionBegin; 109441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 11076be6f4fSStefano Zampini if (tao->ops->computebounds) { 11176be6f4fSStefano Zampini if (!tao->XL) { 1129566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XL)); 1139566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XL, PETSC_NINFINITY)); 11476be6f4fSStefano Zampini } 11576be6f4fSStefano Zampini if (!tao->XU) { 1169566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XU)); 1179566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XU, PETSC_INFINITY)); 118a7e14dcfSSatish Balay } 119792fecdfSBarry Smith PetscCallBack("Tao callback variable bounds", (*tao->ops->computebounds)(tao, tao->XL, tao->XU, tao->user_boundsP)); 1207721a36fSStefano Zampini } 1213ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 122a7e14dcfSSatish Balay } 123a7e14dcfSSatish Balay 124a7e14dcfSSatish Balay /*@ 125a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 126a7e14dcfSSatish Balay 127c3339decSBarry Smith Logically collective 128a7e14dcfSSatish Balay 129a7e14dcfSSatish Balay Input Parameters: 130*47450a7bSBarry Smith + tao - the `Tao` context 131a7e14dcfSSatish Balay . IL - vector of lower bounds 132a7e14dcfSSatish Balay - IU - vector of upper bounds 133a7e14dcfSSatish Balay 134a7e14dcfSSatish Balay Level: beginner 135a7e14dcfSSatish Balay 136*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()` 137a7e14dcfSSatish Balay @*/ 138d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 139d71ae5a4SJacob Faibussowitsch { 140a7e14dcfSSatish Balay PetscFunctionBegin; 141441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 1427721a36fSStefano Zampini if (IL) PetscValidHeaderSpecific(IL, VEC_CLASSID, 2); 1437721a36fSStefano Zampini if (IU) PetscValidHeaderSpecific(IU, VEC_CLASSID, 3); 1449566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IL)); 1459566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IU)); 1469566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IL)); 1479566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IU)); 148a7e14dcfSSatish Balay tao->IL = IL; 149a7e14dcfSSatish Balay tao->IU = IU; 1507721a36fSStefano Zampini tao->ineq_doublesided = (PetscBool)(IL || IU); 1513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 152a7e14dcfSSatish Balay } 153a7e14dcfSSatish Balay 1547721a36fSStefano Zampini /*@ 15565ba42b6SBarry Smith TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()` 1567721a36fSStefano Zampini 157c3339decSBarry Smith Logically collective 1587721a36fSStefano Zampini 1597721a36fSStefano Zampini Input Parameter: 160*47450a7bSBarry Smith . tao - the `Tao` context 1617721a36fSStefano Zampini 1627721a36fSStefano Zampini Output Parameters: 1637721a36fSStefano Zampini + IL - vector of lower bounds 1647721a36fSStefano Zampini - IU - vector of upper bounds 1657721a36fSStefano Zampini 1667721a36fSStefano Zampini Level: beginner 1677721a36fSStefano Zampini 168*47450a7bSBarry Smith .seealso: [](chapter_tao), `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()` 1697721a36fSStefano Zampini @*/ 170d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 171d71ae5a4SJacob Faibussowitsch { 172a7e14dcfSSatish Balay PetscFunctionBegin; 173441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 1747721a36fSStefano Zampini if (IL) *IL = tao->IL; 1757721a36fSStefano Zampini if (IU) *IU = tao->IU; 1763ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 177a7e14dcfSSatish Balay } 178a7e14dcfSSatish Balay 179a7e14dcfSSatish Balay /*@C 180a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 18165ba42b6SBarry Smith routine set by `TaoSetConstraintsRoutine()`. 182a7e14dcfSSatish Balay 183c3339decSBarry Smith Collective 184a7e14dcfSSatish Balay 185a7e14dcfSSatish Balay Input Parameters: 186*47450a7bSBarry Smith . tao - the `Tao` context 187a7e14dcfSSatish Balay 188a7e14dcfSSatish Balay Level: developer 189a7e14dcfSSatish Balay 190*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()` 191a7e14dcfSSatish Balay @*/ 192d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 193d71ae5a4SJacob Faibussowitsch { 194a7e14dcfSSatish Balay PetscFunctionBegin; 195441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 196a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 197064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(C, VEC_CLASSID, 3); 198a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 199a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, C, 3); 2009566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, C, NULL)); 201792fecdfSBarry Smith PetscCallBack("Tao callback constraints", (*tao->ops->computeconstraints)(tao, X, C, tao->user_conP)); 2029566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, C, NULL)); 203a7e14dcfSSatish Balay tao->nconstraints++; 2043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 205a7e14dcfSSatish Balay } 206a7e14dcfSSatish Balay 207a7e14dcfSSatish Balay /*@C 20865ba42b6SBarry Smith TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 209a7e14dcfSSatish Balay 210c3339decSBarry Smith Logically collective 211a7e14dcfSSatish Balay 212a7e14dcfSSatish Balay Input Parameters: 213*47450a7bSBarry Smith + tao - the `Tao` context 214a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 215a7e14dcfSSatish Balay . func - the bounds computation routine 2166c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL) 217a7e14dcfSSatish Balay 218a7e14dcfSSatish Balay Calling sequence of func: 219441846f8SBarry Smith $ func (Tao tao, Vec x, Vec c, void *ctx); 220a7e14dcfSSatish Balay 221*47450a7bSBarry Smith + tao - the `Tao` solver 222a7e14dcfSSatish Balay . x - point to evaluate constraints 223*47450a7bSBarry Smith . c - vector constraints evaluated at `x` 224a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 225a7e14dcfSSatish Balay 226a7e14dcfSSatish Balay Level: intermediate 227a7e14dcfSSatish Balay 228*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()` 229a7e14dcfSSatish Balay @*/ 230d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void *), 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: 251*47450a7bSBarry 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 261a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 262a7e14dcfSSatish Balay zeros. 263a7e14dcfSSatish Balay 264*47450a7bSBarry Smith .seealso: [](chapter_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: 289*47450a7bSBarry 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 297*47450a7bSBarry Smith .seealso: [](chapter_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 30965ba42b6SBarry Smith TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 310a7e14dcfSSatish Balay 311c3339decSBarry Smith Logically collective 312a7e14dcfSSatish Balay 313a7e14dcfSSatish Balay Input Parameters: 314*47450a7bSBarry 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 3176c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 318a7e14dcfSSatish Balay 319a7e14dcfSSatish Balay Calling sequence of func: 320441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 321a7e14dcfSSatish Balay 322*47450a7bSBarry Smith + tao - the `Tao` solver 323a7e14dcfSSatish Balay . x - point to evaluate equality constraints 324a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 325a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 326a7e14dcfSSatish Balay 327a7e14dcfSSatish Balay Level: intermediate 328a7e14dcfSSatish Balay 329*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 330a7e14dcfSSatish Balay @*/ 331d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx) 332d71ae5a4SJacob Faibussowitsch { 333a7e14dcfSSatish Balay PetscFunctionBegin; 334441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3357721a36fSStefano Zampini if (ce) PetscValidHeaderSpecific(ce, VEC_CLASSID, 2); 3369566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ce)); 3379566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_equality)); 3387721a36fSStefano Zampini tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 339a7e14dcfSSatish Balay tao->constraints_equality = ce; 340a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 341a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 3423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 343a7e14dcfSSatish Balay } 344a7e14dcfSSatish Balay 345a7e14dcfSSatish Balay /*@C 34665ba42b6SBarry Smith TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 347a7e14dcfSSatish Balay 348c3339decSBarry Smith Logically collective 349a7e14dcfSSatish Balay 350a7e14dcfSSatish Balay Input Parameters: 351*47450a7bSBarry Smith + tao - the `Tao` context 352a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 353a7e14dcfSSatish Balay . func - the bounds computation routine 3546c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL) 355a7e14dcfSSatish Balay 356a7e14dcfSSatish Balay Calling sequence of func: 357441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ci, void *ctx); 358a7e14dcfSSatish Balay 359*47450a7bSBarry 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 366*47450a7bSBarry 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: 389*47450a7bSBarry 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 397*47450a7bSBarry 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: 421*47450a7bSBarry 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 429*47450a7bSBarry 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