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 @*/ 17441846f8SBarry Smith PetscErrorCode TaoSetVariableBounds(Tao tao, Vec XL, Vec XU) 18a7e14dcfSSatish Balay { 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 @*/ 59441846f8SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 60a7e14dcfSSatish Balay { 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 777721a36fSStefano Zampini Output Parametrs: 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 @*/ 85441846f8SBarry Smith PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU) 86a7e14dcfSSatish Balay { 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 108441846f8SBarry Smith PetscErrorCode TaoComputeVariableBounds(Tao tao) 109a7e14dcfSSatish Balay { 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 } 121*792fecdfSBarry 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 @*/ 140441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 141a7e14dcfSSatish Balay { 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 @*/ 172441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 173a7e14dcfSSatish Balay { 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 195441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 196a7e14dcfSSatish Balay { 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); 2033c859ba3SBarry Smith PetscCheck(tao->ops->computeconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called"); 2049566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL)); 205*792fecdfSBarry Smith PetscCallBack("Tao callback constraints",(*tao->ops->computeconstraints)(tao,X,C,tao->user_conP)); 2069566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL)); 207a7e14dcfSSatish Balay tao->nconstraints++; 208a7e14dcfSSatish Balay PetscFunctionReturn(0); 209a7e14dcfSSatish Balay } 210a7e14dcfSSatish Balay 211a7e14dcfSSatish Balay /*@C 21265ba42b6SBarry Smith TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 213a7e14dcfSSatish Balay 21465ba42b6SBarry Smith Logically collective on tao 215a7e14dcfSSatish Balay 216a7e14dcfSSatish Balay Input Parameters: 217441846f8SBarry Smith + tao - the Tao context 218a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 219a7e14dcfSSatish Balay . func - the bounds computation routine 2206c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL) 221a7e14dcfSSatish Balay 222a7e14dcfSSatish Balay Calling sequence of func: 223441846f8SBarry Smith $ func (Tao tao, Vec x, Vec c, void *ctx); 224a7e14dcfSSatish Balay 225441846f8SBarry Smith + tao - the Tao 226a7e14dcfSSatish Balay . x - point to evaluate constraints 227a7e14dcfSSatish Balay . c - vector constraints evaluated at x 228a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 229a7e14dcfSSatish Balay 230a7e14dcfSSatish Balay Level: intermediate 231a7e14dcfSSatish Balay 23265ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()` 233a7e14dcfSSatish Balay 234a7e14dcfSSatish Balay @*/ 235441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 236a7e14dcfSSatish Balay { 237a7e14dcfSSatish Balay PetscFunctionBegin; 238441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 2397721a36fSStefano Zampini if (c) PetscValidHeaderSpecific(c,VEC_CLASSID,2); 2409566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)c)); 2419566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints)); 2427721a36fSStefano Zampini tao->constrained = func ? PETSC_TRUE : PETSC_FALSE; 243a7e14dcfSSatish Balay tao->constraints = c; 244a7e14dcfSSatish Balay tao->user_conP = ctx; 245a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 246a7e14dcfSSatish Balay PetscFunctionReturn(0); 247a7e14dcfSSatish Balay } 248a7e14dcfSSatish Balay 249a7e14dcfSSatish Balay /*@ 250a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 251a7e14dcfSSatish Balay of the variables 252a7e14dcfSSatish Balay 25365ba42b6SBarry Smith Collective on tao 254a7e14dcfSSatish Balay 255f899ff85SJose E. Roman Input Parameter: 256441846f8SBarry Smith . tao - the Tao context 257a7e14dcfSSatish Balay 258d8d19677SJose E. Roman Output Parameters: 259a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 260a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 261a7e14dcfSSatish Balay 262a7e14dcfSSatish Balay Level: advanced 263a7e14dcfSSatish Balay 264a7e14dcfSSatish Balay Note: 265a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 266a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 267a7e14dcfSSatish Balay zeros. 268a7e14dcfSSatish Balay 269a7e14dcfSSatish Balay Level: advanced 270a7e14dcfSSatish Balay 27165ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()` 272a7e14dcfSSatish Balay @*/ 273441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 274a7e14dcfSSatish Balay { 275a7e14dcfSSatish Balay PetscFunctionBegin; 276441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 277a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL,VEC_CLASSID,2); 278064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(DU,VEC_CLASSID,3); 279a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DL,2); 280a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DU,3); 281a7e14dcfSSatish Balay if (tao->ops->computedual) { 2829566063dSJacob Faibussowitsch PetscCall((*tao->ops->computedual)(tao,DL,DU)); 283a7e14dcfSSatish Balay } else { 2849566063dSJacob Faibussowitsch PetscCall(VecSet(DL,0.0)); 2859566063dSJacob Faibussowitsch PetscCall(VecSet(DU,0.0)); 286a7e14dcfSSatish Balay } 287a7e14dcfSSatish Balay PetscFunctionReturn(0); 288a7e14dcfSSatish Balay } 289a7e14dcfSSatish Balay 290a7e14dcfSSatish Balay /*@ 29165ba42b6SBarry Smith TaoGetDualVariables - Gets the dual vectors 292a7e14dcfSSatish Balay 29365ba42b6SBarry Smith Collective on tao 294a7e14dcfSSatish Balay 295f899ff85SJose E. Roman Input Parameter: 296441846f8SBarry Smith . tao - the Tao context 297a7e14dcfSSatish Balay 298d8d19677SJose E. Roman Output Parameters: 299a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 300a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 301a7e14dcfSSatish Balay 302a7e14dcfSSatish Balay Level: advanced 303a7e14dcfSSatish Balay 30465ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeDualVariables()` 305a7e14dcfSSatish Balay @*/ 306441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 307a7e14dcfSSatish Balay { 308a7e14dcfSSatish Balay PetscFunctionBegin; 309441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3107721a36fSStefano Zampini if (DE) *DE = tao->DE; 3117721a36fSStefano Zampini if (DI) *DI = tao->DI; 312a7e14dcfSSatish Balay PetscFunctionReturn(0); 313a7e14dcfSSatish Balay } 314a7e14dcfSSatish Balay 315a7e14dcfSSatish Balay /*@C 31665ba42b6SBarry Smith TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 317a7e14dcfSSatish Balay 31865ba42b6SBarry Smith Logically collective on tao 319a7e14dcfSSatish Balay 320a7e14dcfSSatish Balay Input Parameters: 321441846f8SBarry Smith + tao - the Tao context 322a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 323a7e14dcfSSatish Balay . func - the bounds computation routine 3246c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 325a7e14dcfSSatish Balay 326a7e14dcfSSatish Balay Calling sequence of func: 327441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 328a7e14dcfSSatish Balay 329441846f8SBarry Smith + tao - the Tao 330a7e14dcfSSatish Balay . x - point to evaluate equality constraints 331a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 332a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 333a7e14dcfSSatish Balay 334a7e14dcfSSatish Balay Level: intermediate 335a7e14dcfSSatish Balay 33665ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 337a7e14dcfSSatish Balay 338a7e14dcfSSatish Balay @*/ 339441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 340a7e14dcfSSatish Balay { 341a7e14dcfSSatish Balay PetscFunctionBegin; 342441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3437721a36fSStefano Zampini if (ce) PetscValidHeaderSpecific(ce,VEC_CLASSID,2); 3449566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ce)); 3459566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_equality)); 3467721a36fSStefano Zampini tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 347a7e14dcfSSatish Balay tao->constraints_equality = ce; 348a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 349a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 350a7e14dcfSSatish Balay PetscFunctionReturn(0); 351a7e14dcfSSatish Balay } 352a7e14dcfSSatish Balay 353a7e14dcfSSatish Balay /*@C 35465ba42b6SBarry Smith TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 355a7e14dcfSSatish Balay 35665ba42b6SBarry Smith Logically collective on tao 357a7e14dcfSSatish Balay 358a7e14dcfSSatish Balay Input Parameters: 359441846f8SBarry Smith + tao - the Tao context 360a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 361a7e14dcfSSatish Balay . func - the bounds computation routine 3626c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL) 363a7e14dcfSSatish Balay 364a7e14dcfSSatish Balay Calling sequence of func: 365441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ci, void *ctx); 366a7e14dcfSSatish Balay 367441846f8SBarry Smith + tao - the Tao 368a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 369a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 370a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 371a7e14dcfSSatish Balay 372a7e14dcfSSatish Balay Level: intermediate 373a7e14dcfSSatish Balay 37465ba42b6SBarry Smith .seealso: `Tao, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 375a7e14dcfSSatish Balay 376a7e14dcfSSatish Balay @*/ 377441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 378a7e14dcfSSatish Balay { 379a7e14dcfSSatish Balay PetscFunctionBegin; 380441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3817721a36fSStefano Zampini if (ci) PetscValidHeaderSpecific(ci,VEC_CLASSID,2); 3829566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ci)); 3839566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_inequality)); 384a7e14dcfSSatish Balay tao->constraints_inequality = ci; 3857721a36fSStefano Zampini tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 386a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 387a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 388a7e14dcfSSatish Balay PetscFunctionReturn(0); 389a7e14dcfSSatish Balay } 390a7e14dcfSSatish Balay 391a7e14dcfSSatish Balay /*@C 392a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 39365ba42b6SBarry Smith routine set by `TaoSetEqualityConstraintsRoutine()`. 394a7e14dcfSSatish Balay 39565ba42b6SBarry Smith Collective on tao 396a7e14dcfSSatish Balay 39765ba42b6SBarry Smith Input Parameter: 398441846f8SBarry Smith . tao - the Tao context 399a7e14dcfSSatish Balay 40065ba42b6SBarry Smith Output Parameters: 40165ba42b6SBarry Smith + X - point the equality constraints were evaluted on 40265ba42b6SBarry Smith - CE - vector of equality constraints evaluated at X 40365ba42b6SBarry Smith 404a7e14dcfSSatish Balay Level: developer 405a7e14dcfSSatish Balay 40665ba42b6SBarry Smith .seealso: `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()` 407a7e14dcfSSatish Balay @*/ 408a7e14dcfSSatish Balay 409441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 410a7e14dcfSSatish Balay { 411a7e14dcfSSatish Balay PetscFunctionBegin; 412441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 413a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 414064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE,VEC_CLASSID,3); 415a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 416a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CE,3); 4173c859ba3SBarry Smith PetscCheck(tao->ops->computeequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called"); 4189566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL)); 419*792fecdfSBarry Smith PetscCallBack("Tao callback equality constraints",(*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP)); 4209566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL)); 421a7e14dcfSSatish Balay tao->nconstraints++; 422a7e14dcfSSatish Balay PetscFunctionReturn(0); 423a7e14dcfSSatish Balay } 424a7e14dcfSSatish Balay 425a7e14dcfSSatish Balay /*@C 426a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 42765ba42b6SBarry Smith routine set by `TaoSetInequalityConstraintsRoutine()`. 428a7e14dcfSSatish Balay 42965ba42b6SBarry Smith Collective on tao 430a7e14dcfSSatish Balay 43165ba42b6SBarry Smith Input Parameter: 432441846f8SBarry Smith . tao - the Tao context 433a7e14dcfSSatish Balay 43465ba42b6SBarry Smith Output Parameters: 43565ba42b6SBarry Smith + X - point the inequality constraints were evaluted on 43665ba42b6SBarry Smith - CE - vector of inequality constraints evaluated at X 43765ba42b6SBarry Smith 438a7e14dcfSSatish Balay Level: developer 439a7e14dcfSSatish Balay 44065ba42b6SBarry Smith .seealso: `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()` 441a7e14dcfSSatish Balay @*/ 442a7e14dcfSSatish Balay 443441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 444a7e14dcfSSatish Balay { 445a7e14dcfSSatish Balay PetscFunctionBegin; 446441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 447a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 448064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI,VEC_CLASSID,3); 449a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 450a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CI,3); 4513c859ba3SBarry Smith PetscCheck(tao->ops->computeinequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called"); 4529566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL)); 453*792fecdfSBarry Smith PetscCallBack("Tao callback inequality constraints",(*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP)); 4549566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL)); 455a7e14dcfSSatish Balay tao->nconstraints++; 456a7e14dcfSSatish Balay PetscFunctionReturn(0); 457a7e14dcfSSatish Balay } 458