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 665ba42b6SBarry Smith Logically collective on tao 7a7e14dcfSSatish Balay 8a7e14dcfSSatish Balay Input Parameters: 9441846f8SBarry 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 1565ba42b6SBarry Smith .seealso: `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); 30a7e14dcfSSatish Balay PetscFunctionReturn(0); 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 3665ba42b6SBarry Smith Logically collective on tao 37a7e14dcfSSatish Balay 38a7e14dcfSSatish Balay Input Parameters: 39441846f8SBarry Smith + tao - the Tao context 40a7e14dcfSSatish Balay . func - the bounds computation routine 416c23d075SBarry 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 46441846f8SBarry Smith + tao - the Tao 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 5665ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 57a7e14dcfSSatish Balay 58a7e14dcfSSatish Balay @*/ 59d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx) 60d71ae5a4SJacob Faibussowitsch { 61a7e14dcfSSatish Balay PetscFunctionBegin; 62441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 63a7e14dcfSSatish Balay tao->user_boundsP = ctx; 64a7e14dcfSSatish Balay tao->ops->computebounds = func; 657721a36fSStefano Zampini tao->bounded = func ? PETSC_TRUE : PETSC_FALSE; 66a7e14dcfSSatish Balay PetscFunctionReturn(0); 67a7e14dcfSSatish Balay } 68a7e14dcfSSatish Balay 697721a36fSStefano Zampini /*@ 7065ba42b6SBarry Smith TaoGetVariableBounds - Gets the upper and lower bounds vectors set with `TaoSetVariableBounds()` 717721a36fSStefano Zampini 727721a36fSStefano Zampini Not collective 737721a36fSStefano Zampini 747721a36fSStefano Zampini Input Parameter: 757721a36fSStefano Zampini . tao - the Tao context 767721a36fSStefano Zampini 77*d5b43468SJose E. Roman Output Parameters: 787721a36fSStefano Zampini + XL - vector of lower bounds 797721a36fSStefano Zampini - XU - vector of upper bounds 807721a36fSStefano Zampini 817721a36fSStefano Zampini Level: beginner 827721a36fSStefano Zampini 8365ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 847721a36fSStefano Zampini @*/ 85d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU) 86d71ae5a4SJacob Faibussowitsch { 87a7e14dcfSSatish Balay PetscFunctionBegin; 88441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 897721a36fSStefano Zampini if (XL) *XL = tao->XL; 907721a36fSStefano Zampini if (XU) *XU = tao->XU; 91a7e14dcfSSatish Balay PetscFunctionReturn(0); 92a7e14dcfSSatish Balay } 93a7e14dcfSSatish Balay 94a7e14dcfSSatish Balay /*@C 95a7e14dcfSSatish Balay TaoComputeVariableBounds - Compute the variable bounds using the 9665ba42b6SBarry Smith routine set by `TaoSetVariableBoundsRoutine()`. 97a7e14dcfSSatish Balay 9865ba42b6SBarry Smith Collective on tao 99a7e14dcfSSatish Balay 1007721a36fSStefano Zampini Input Parameter: 101441846f8SBarry Smith . tao - the Tao context 102a7e14dcfSSatish Balay 103a7e14dcfSSatish Balay Level: developer 104a7e14dcfSSatish Balay 10565ba42b6SBarry Smith .seealso: `Tao`, `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()` 106a7e14dcfSSatish Balay @*/ 107a7e14dcfSSatish Balay 108d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeVariableBounds(Tao tao) 109d71ae5a4SJacob Faibussowitsch { 110a7e14dcfSSatish Balay PetscFunctionBegin; 111441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 11276be6f4fSStefano Zampini if (tao->ops->computebounds) { 11376be6f4fSStefano Zampini if (!tao->XL) { 1149566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XL)); 1159566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XL, PETSC_NINFINITY)); 11676be6f4fSStefano Zampini } 11776be6f4fSStefano Zampini if (!tao->XU) { 1189566063dSJacob Faibussowitsch PetscCall(VecDuplicate(tao->solution, &tao->XU)); 1199566063dSJacob Faibussowitsch PetscCall(VecSet(tao->XU, PETSC_INFINITY)); 120a7e14dcfSSatish Balay } 121792fecdfSBarry Smith PetscCallBack("Tao callback variable bounds", (*tao->ops->computebounds)(tao, tao->XL, tao->XU, tao->user_boundsP)); 1227721a36fSStefano Zampini } 123a7e14dcfSSatish Balay PetscFunctionReturn(0); 124a7e14dcfSSatish Balay } 125a7e14dcfSSatish Balay 126a7e14dcfSSatish Balay /*@ 127a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 128a7e14dcfSSatish Balay 12965ba42b6SBarry Smith Logically collective on tao 130a7e14dcfSSatish Balay 131a7e14dcfSSatish Balay Input Parameters: 132441846f8SBarry Smith + tao - the Tao context 133a7e14dcfSSatish Balay . IL - vector of lower bounds 134a7e14dcfSSatish Balay - IU - vector of upper bounds 135a7e14dcfSSatish Balay 136a7e14dcfSSatish Balay Level: beginner 137a7e14dcfSSatish Balay 13865ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()` 139a7e14dcfSSatish Balay @*/ 140d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 141d71ae5a4SJacob Faibussowitsch { 142a7e14dcfSSatish Balay PetscFunctionBegin; 143441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 1447721a36fSStefano Zampini if (IL) PetscValidHeaderSpecific(IL, VEC_CLASSID, 2); 1457721a36fSStefano Zampini if (IU) PetscValidHeaderSpecific(IU, VEC_CLASSID, 3); 1469566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IL)); 1479566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IU)); 1489566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IL)); 1499566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IU)); 150a7e14dcfSSatish Balay tao->IL = IL; 151a7e14dcfSSatish Balay tao->IU = IU; 1527721a36fSStefano Zampini tao->ineq_doublesided = (PetscBool)(IL || IU); 153a7e14dcfSSatish Balay PetscFunctionReturn(0); 154a7e14dcfSSatish Balay } 155a7e14dcfSSatish Balay 1567721a36fSStefano Zampini /*@ 15765ba42b6SBarry Smith TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()` 1587721a36fSStefano Zampini 15965ba42b6SBarry Smith Logically collective on tao 1607721a36fSStefano Zampini 1617721a36fSStefano Zampini Input Parameter: 162f1a722f8SMatthew G. Knepley . tao - the Tao context 1637721a36fSStefano Zampini 1647721a36fSStefano Zampini Output Parameters: 1657721a36fSStefano Zampini + IL - vector of lower bounds 1667721a36fSStefano Zampini - IU - vector of upper bounds 1677721a36fSStefano Zampini 1687721a36fSStefano Zampini Level: beginner 1697721a36fSStefano Zampini 170db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()` 1717721a36fSStefano Zampini @*/ 172d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 173d71ae5a4SJacob Faibussowitsch { 174a7e14dcfSSatish Balay PetscFunctionBegin; 175441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 1767721a36fSStefano Zampini if (IL) *IL = tao->IL; 1777721a36fSStefano Zampini if (IU) *IU = tao->IU; 178a7e14dcfSSatish Balay PetscFunctionReturn(0); 179a7e14dcfSSatish Balay } 180a7e14dcfSSatish Balay 181a7e14dcfSSatish Balay /*@C 182a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 18365ba42b6SBarry Smith routine set by `TaoSetConstraintsRoutine()`. 184a7e14dcfSSatish Balay 18565ba42b6SBarry Smith Collective on tao 186a7e14dcfSSatish Balay 187a7e14dcfSSatish Balay Input Parameters: 188441846f8SBarry Smith . tao - the Tao context 189a7e14dcfSSatish Balay 190a7e14dcfSSatish Balay Level: developer 191a7e14dcfSSatish Balay 19265ba42b6SBarry Smith .seealso: `Tao`, `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()` 193a7e14dcfSSatish Balay @*/ 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++; 207a7e14dcfSSatish Balay PetscFunctionReturn(0); 208a7e14dcfSSatish Balay } 209a7e14dcfSSatish Balay 210a7e14dcfSSatish Balay /*@C 21165ba42b6SBarry Smith TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 212a7e14dcfSSatish Balay 21365ba42b6SBarry Smith Logically collective on tao 214a7e14dcfSSatish Balay 215a7e14dcfSSatish Balay Input Parameters: 216441846f8SBarry 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 2196c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL) 220a7e14dcfSSatish Balay 221a7e14dcfSSatish Balay Calling sequence of func: 222441846f8SBarry Smith $ func (Tao tao, Vec x, Vec c, void *ctx); 223a7e14dcfSSatish Balay 224441846f8SBarry Smith + tao - the Tao 225a7e14dcfSSatish Balay . x - point to evaluate constraints 226a7e14dcfSSatish Balay . c - vector constraints evaluated at x 227a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 228a7e14dcfSSatish Balay 229a7e14dcfSSatish Balay Level: intermediate 230a7e14dcfSSatish Balay 23165ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()` 232a7e14dcfSSatish Balay 233a7e14dcfSSatish Balay @*/ 234d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx) 235d71ae5a4SJacob Faibussowitsch { 236a7e14dcfSSatish Balay PetscFunctionBegin; 237441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 2387721a36fSStefano Zampini if (c) PetscValidHeaderSpecific(c, VEC_CLASSID, 2); 2399566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)c)); 2409566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints)); 2417721a36fSStefano Zampini tao->constrained = func ? PETSC_TRUE : PETSC_FALSE; 242a7e14dcfSSatish Balay tao->constraints = c; 243a7e14dcfSSatish Balay tao->user_conP = ctx; 244a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 245a7e14dcfSSatish Balay PetscFunctionReturn(0); 246a7e14dcfSSatish Balay } 247a7e14dcfSSatish Balay 248a7e14dcfSSatish Balay /*@ 249a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 250a7e14dcfSSatish Balay of the variables 251a7e14dcfSSatish Balay 25265ba42b6SBarry Smith Collective on tao 253a7e14dcfSSatish Balay 254f899ff85SJose E. Roman Input Parameter: 255441846f8SBarry Smith . tao - the Tao context 256a7e14dcfSSatish Balay 257d8d19677SJose E. Roman Output Parameters: 258a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 259a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 260a7e14dcfSSatish Balay 261a7e14dcfSSatish Balay Level: advanced 262a7e14dcfSSatish Balay 263a7e14dcfSSatish Balay Note: 264a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 265a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 266a7e14dcfSSatish Balay zeros. 267a7e14dcfSSatish Balay 268a7e14dcfSSatish Balay Level: advanced 269a7e14dcfSSatish Balay 27065ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()` 271a7e14dcfSSatish Balay @*/ 272d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 273d71ae5a4SJacob Faibussowitsch { 274a7e14dcfSSatish Balay PetscFunctionBegin; 275441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 276a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL, VEC_CLASSID, 2); 277064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(DU, VEC_CLASSID, 3); 278a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, DL, 2); 279a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, DU, 3); 280a7e14dcfSSatish Balay if (tao->ops->computedual) { 281dbbe0bcdSBarry Smith PetscUseTypeMethod(tao, computedual, DL, DU); 282a7e14dcfSSatish Balay } else { 2839566063dSJacob Faibussowitsch PetscCall(VecSet(DL, 0.0)); 2849566063dSJacob Faibussowitsch PetscCall(VecSet(DU, 0.0)); 285a7e14dcfSSatish Balay } 286a7e14dcfSSatish Balay PetscFunctionReturn(0); 287a7e14dcfSSatish Balay } 288a7e14dcfSSatish Balay 289a7e14dcfSSatish Balay /*@ 29065ba42b6SBarry Smith TaoGetDualVariables - Gets the dual vectors 291a7e14dcfSSatish Balay 29265ba42b6SBarry Smith Collective on tao 293a7e14dcfSSatish Balay 294f899ff85SJose E. Roman Input Parameter: 295441846f8SBarry Smith . tao - the Tao context 296a7e14dcfSSatish Balay 297d8d19677SJose E. Roman Output Parameters: 298a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 299a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 300a7e14dcfSSatish Balay 301a7e14dcfSSatish Balay Level: advanced 302a7e14dcfSSatish Balay 30365ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeDualVariables()` 304a7e14dcfSSatish Balay @*/ 305d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 306d71ae5a4SJacob Faibussowitsch { 307a7e14dcfSSatish Balay PetscFunctionBegin; 308441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3097721a36fSStefano Zampini if (DE) *DE = tao->DE; 3107721a36fSStefano Zampini if (DI) *DI = tao->DI; 311a7e14dcfSSatish Balay PetscFunctionReturn(0); 312a7e14dcfSSatish Balay } 313a7e14dcfSSatish Balay 314a7e14dcfSSatish Balay /*@C 31565ba42b6SBarry Smith TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 316a7e14dcfSSatish Balay 31765ba42b6SBarry Smith Logically collective on tao 318a7e14dcfSSatish Balay 319a7e14dcfSSatish Balay Input Parameters: 320441846f8SBarry Smith + tao - the Tao context 321a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 322a7e14dcfSSatish Balay . func - the bounds computation routine 3236c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 324a7e14dcfSSatish Balay 325a7e14dcfSSatish Balay Calling sequence of func: 326441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 327a7e14dcfSSatish Balay 328441846f8SBarry Smith + tao - the Tao 329a7e14dcfSSatish Balay . x - point to evaluate equality constraints 330a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 331a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 332a7e14dcfSSatish Balay 333a7e14dcfSSatish Balay Level: intermediate 334a7e14dcfSSatish Balay 33565ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 336a7e14dcfSSatish Balay 337a7e14dcfSSatish Balay @*/ 338d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx) 339d71ae5a4SJacob Faibussowitsch { 340a7e14dcfSSatish Balay PetscFunctionBegin; 341441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3427721a36fSStefano Zampini if (ce) PetscValidHeaderSpecific(ce, VEC_CLASSID, 2); 3439566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ce)); 3449566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_equality)); 3457721a36fSStefano Zampini tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 346a7e14dcfSSatish Balay tao->constraints_equality = ce; 347a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 348a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 349a7e14dcfSSatish Balay PetscFunctionReturn(0); 350a7e14dcfSSatish Balay } 351a7e14dcfSSatish Balay 352a7e14dcfSSatish Balay /*@C 35365ba42b6SBarry Smith TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 354a7e14dcfSSatish Balay 35565ba42b6SBarry Smith Logically collective on tao 356a7e14dcfSSatish Balay 357a7e14dcfSSatish Balay Input Parameters: 358441846f8SBarry Smith + tao - the Tao context 359a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 360a7e14dcfSSatish Balay . func - the bounds computation routine 3616c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL) 362a7e14dcfSSatish Balay 363a7e14dcfSSatish Balay Calling sequence of func: 364441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ci, void *ctx); 365a7e14dcfSSatish Balay 366441846f8SBarry Smith + tao - the Tao 367a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 368a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 369a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 370a7e14dcfSSatish Balay 371a7e14dcfSSatish Balay Level: intermediate 372a7e14dcfSSatish Balay 37365ba42b6SBarry Smith .seealso: `Tao, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 374a7e14dcfSSatish Balay 375a7e14dcfSSatish Balay @*/ 376d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx) 377d71ae5a4SJacob Faibussowitsch { 378a7e14dcfSSatish Balay PetscFunctionBegin; 379441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 3807721a36fSStefano Zampini if (ci) PetscValidHeaderSpecific(ci, VEC_CLASSID, 2); 3819566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ci)); 3829566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_inequality)); 383a7e14dcfSSatish Balay tao->constraints_inequality = ci; 3847721a36fSStefano Zampini tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 385a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 386a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 387a7e14dcfSSatish Balay PetscFunctionReturn(0); 388a7e14dcfSSatish Balay } 389a7e14dcfSSatish Balay 390a7e14dcfSSatish Balay /*@C 391a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 39265ba42b6SBarry Smith routine set by `TaoSetEqualityConstraintsRoutine()`. 393a7e14dcfSSatish Balay 39465ba42b6SBarry Smith Collective on tao 395a7e14dcfSSatish Balay 39665ba42b6SBarry Smith Input Parameter: 397441846f8SBarry Smith . tao - the Tao context 398a7e14dcfSSatish Balay 39965ba42b6SBarry Smith Output Parameters: 40065ba42b6SBarry Smith + X - point the equality constraints were evaluted on 40165ba42b6SBarry Smith - CE - vector of equality constraints evaluated at X 40265ba42b6SBarry Smith 403a7e14dcfSSatish Balay Level: developer 404a7e14dcfSSatish Balay 40565ba42b6SBarry Smith .seealso: `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()` 406a7e14dcfSSatish Balay @*/ 407a7e14dcfSSatish Balay 408d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 409d71ae5a4SJacob Faibussowitsch { 410a7e14dcfSSatish Balay PetscFunctionBegin; 411441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 412a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 413064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE, VEC_CLASSID, 3); 414a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 415a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, CE, 3); 4169566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CE, NULL)); 417792fecdfSBarry Smith PetscCallBack("Tao callback equality constraints", (*tao->ops->computeequalityconstraints)(tao, X, CE, tao->user_con_equalityP)); 4189566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CE, NULL)); 419a7e14dcfSSatish Balay tao->nconstraints++; 420a7e14dcfSSatish Balay PetscFunctionReturn(0); 421a7e14dcfSSatish Balay } 422a7e14dcfSSatish Balay 423a7e14dcfSSatish Balay /*@C 424a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 42565ba42b6SBarry Smith routine set by `TaoSetInequalityConstraintsRoutine()`. 426a7e14dcfSSatish Balay 42765ba42b6SBarry Smith Collective on tao 428a7e14dcfSSatish Balay 42965ba42b6SBarry Smith Input Parameter: 430441846f8SBarry Smith . tao - the Tao context 431a7e14dcfSSatish Balay 43265ba42b6SBarry Smith Output Parameters: 43365ba42b6SBarry Smith + X - point the inequality constraints were evaluted on 43465ba42b6SBarry Smith - CE - vector of inequality constraints evaluated at X 43565ba42b6SBarry Smith 436a7e14dcfSSatish Balay Level: developer 437a7e14dcfSSatish Balay 43865ba42b6SBarry Smith .seealso: `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()` 439a7e14dcfSSatish Balay @*/ 440a7e14dcfSSatish Balay 441d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 442d71ae5a4SJacob Faibussowitsch { 443a7e14dcfSSatish Balay PetscFunctionBegin; 444441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1); 445a7e14dcfSSatish Balay PetscValidHeaderSpecific(X, VEC_CLASSID, 2); 446064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI, VEC_CLASSID, 3); 447a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, X, 2); 448a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, CI, 3); 4499566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CI, NULL)); 450792fecdfSBarry Smith PetscCallBack("Tao callback inequality constraints", (*tao->ops->computeinequalityconstraints)(tao, X, CI, tao->user_con_inequalityP)); 4519566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CI, NULL)); 452a7e14dcfSSatish Balay tao->nconstraints++; 453a7e14dcfSSatish Balay PetscFunctionReturn(0); 454a7e14dcfSSatish Balay } 455