1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/ 2a7e14dcfSSatish Balay 3a7e14dcfSSatish Balay /*@ 4*65ba42b6SBarry Smith TaoSetVariableBounds - Sets the upper and lower bounds for the optimization problem 5a7e14dcfSSatish Balay 6*65ba42b6SBarry 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 15*65ba42b6SBarry 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 34*65ba42b6SBarry Smith TaoSetVariableBoundsRoutine - Sets a function to be used to compute lower and upper variable bounds for the optimization 35a7e14dcfSSatish Balay 36*65ba42b6SBarry 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 53*65ba42b6SBarry Smith Note: 54*65ba42b6SBarry Smith The func passed to `TaoSetVariableBoundsRoutine()` takes precedence over any values set in `TaoSetVariableBounds()`. 55a7e14dcfSSatish Balay 56*65ba42b6SBarry 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 /*@ 70*65ba42b6SBarry 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 83*65ba42b6SBarry 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 96*65ba42b6SBarry Smith routine set by `TaoSetVariableBoundsRoutine()`. 97a7e14dcfSSatish Balay 98*65ba42b6SBarry Smith Collective on tao 99a7e14dcfSSatish Balay 1007721a36fSStefano Zampini Input Parameter: 101441846f8SBarry Smith . tao - the Tao context 102a7e14dcfSSatish Balay 103a7e14dcfSSatish Balay Level: developer 104a7e14dcfSSatish Balay 105*65ba42b6SBarry 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 } 1217721a36fSStefano Zampini PetscStackPush("Tao compute variable bounds"); 1229566063dSJacob Faibussowitsch PetscCall((*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP)); 1230cbffdbaSBarry Smith PetscStackPop; 1247721a36fSStefano Zampini } 125a7e14dcfSSatish Balay PetscFunctionReturn(0); 126a7e14dcfSSatish Balay } 127a7e14dcfSSatish Balay 128a7e14dcfSSatish Balay /*@ 129a7e14dcfSSatish Balay TaoSetInequalityBounds - Sets the upper and lower bounds 130a7e14dcfSSatish Balay 131*65ba42b6SBarry Smith Logically collective on tao 132a7e14dcfSSatish Balay 133a7e14dcfSSatish Balay Input Parameters: 134441846f8SBarry Smith + tao - the Tao context 135a7e14dcfSSatish Balay . IL - vector of lower bounds 136a7e14dcfSSatish Balay - IU - vector of upper bounds 137a7e14dcfSSatish Balay 138a7e14dcfSSatish Balay Level: beginner 139a7e14dcfSSatish Balay 140*65ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()` 141a7e14dcfSSatish Balay @*/ 142441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU) 143a7e14dcfSSatish Balay { 144a7e14dcfSSatish Balay PetscFunctionBegin; 145441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 1467721a36fSStefano Zampini if (IL) PetscValidHeaderSpecific(IL,VEC_CLASSID,2); 1477721a36fSStefano Zampini if (IU) PetscValidHeaderSpecific(IU,VEC_CLASSID,3); 1489566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IL)); 1499566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)IU)); 1509566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IL)); 1519566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->IU)); 152a7e14dcfSSatish Balay tao->IL = IL; 153a7e14dcfSSatish Balay tao->IU = IU; 1547721a36fSStefano Zampini tao->ineq_doublesided = (PetscBool)(IL || IU); 155a7e14dcfSSatish Balay PetscFunctionReturn(0); 156a7e14dcfSSatish Balay } 157a7e14dcfSSatish Balay 1587721a36fSStefano Zampini /*@ 159*65ba42b6SBarry Smith TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()` 1607721a36fSStefano Zampini 161*65ba42b6SBarry Smith Logically collective on tao 1627721a36fSStefano Zampini 1637721a36fSStefano Zampini Input Parameter: 164f1a722f8SMatthew G. Knepley . tao - the Tao context 1657721a36fSStefano Zampini 1667721a36fSStefano Zampini Output Parameters: 1677721a36fSStefano Zampini + IL - vector of lower bounds 1687721a36fSStefano Zampini - IU - vector of upper bounds 1697721a36fSStefano Zampini 1707721a36fSStefano Zampini Level: beginner 1717721a36fSStefano Zampini 172db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()` 1737721a36fSStefano Zampini @*/ 174441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU) 175a7e14dcfSSatish Balay { 176a7e14dcfSSatish Balay PetscFunctionBegin; 177441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 1787721a36fSStefano Zampini if (IL) *IL = tao->IL; 1797721a36fSStefano Zampini if (IU) *IU = tao->IU; 180a7e14dcfSSatish Balay PetscFunctionReturn(0); 181a7e14dcfSSatish Balay } 182a7e14dcfSSatish Balay 183a7e14dcfSSatish Balay /*@C 184a7e14dcfSSatish Balay TaoComputeConstraints - Compute the variable bounds using the 185*65ba42b6SBarry Smith routine set by `TaoSetConstraintsRoutine()`. 186a7e14dcfSSatish Balay 187*65ba42b6SBarry Smith Collective on tao 188a7e14dcfSSatish Balay 189a7e14dcfSSatish Balay Input Parameters: 190441846f8SBarry Smith . tao - the Tao context 191a7e14dcfSSatish Balay 192a7e14dcfSSatish Balay Level: developer 193a7e14dcfSSatish Balay 194*65ba42b6SBarry Smith .seealso: `Tao`, `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()` 195a7e14dcfSSatish Balay @*/ 196a7e14dcfSSatish Balay 197441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C) 198a7e14dcfSSatish Balay { 199a7e14dcfSSatish Balay PetscFunctionBegin; 200441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 201a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 202064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(C,VEC_CLASSID,3); 203a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 204a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,C,3); 2053c859ba3SBarry Smith PetscCheck(tao->ops->computeconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called"); 2069566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL)); 207441846f8SBarry Smith PetscStackPush("Tao constraints evaluation routine"); 2089566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeconstraints)(tao,X,C,tao->user_conP)); 209a7e14dcfSSatish Balay PetscStackPop; 2109566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL)); 211a7e14dcfSSatish Balay tao->nconstraints++; 212a7e14dcfSSatish Balay PetscFunctionReturn(0); 213a7e14dcfSSatish Balay } 214a7e14dcfSSatish Balay 215a7e14dcfSSatish Balay /*@C 216*65ba42b6SBarry Smith TaoSetConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 217a7e14dcfSSatish Balay 218*65ba42b6SBarry Smith Logically collective on tao 219a7e14dcfSSatish Balay 220a7e14dcfSSatish Balay Input Parameters: 221441846f8SBarry Smith + tao - the Tao context 222a7e14dcfSSatish Balay . c - A vector that will be used to store constraint evaluation 223a7e14dcfSSatish Balay . func - the bounds computation routine 2246c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL) 225a7e14dcfSSatish Balay 226a7e14dcfSSatish Balay Calling sequence of func: 227441846f8SBarry Smith $ func (Tao tao, Vec x, Vec c, void *ctx); 228a7e14dcfSSatish Balay 229441846f8SBarry Smith + tao - the Tao 230a7e14dcfSSatish Balay . x - point to evaluate constraints 231a7e14dcfSSatish Balay . c - vector constraints evaluated at x 232a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 233a7e14dcfSSatish Balay 234a7e14dcfSSatish Balay Level: intermediate 235a7e14dcfSSatish Balay 236*65ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()` 237a7e14dcfSSatish Balay 238a7e14dcfSSatish Balay @*/ 239441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 240a7e14dcfSSatish Balay { 241a7e14dcfSSatish Balay PetscFunctionBegin; 242441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 2437721a36fSStefano Zampini if (c) PetscValidHeaderSpecific(c,VEC_CLASSID,2); 2449566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)c)); 2459566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints)); 2467721a36fSStefano Zampini tao->constrained = func ? PETSC_TRUE : PETSC_FALSE; 247a7e14dcfSSatish Balay tao->constraints = c; 248a7e14dcfSSatish Balay tao->user_conP = ctx; 249a7e14dcfSSatish Balay tao->ops->computeconstraints = func; 250a7e14dcfSSatish Balay PetscFunctionReturn(0); 251a7e14dcfSSatish Balay } 252a7e14dcfSSatish Balay 253a7e14dcfSSatish Balay /*@ 254a7e14dcfSSatish Balay TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds 255a7e14dcfSSatish Balay of the variables 256a7e14dcfSSatish Balay 257*65ba42b6SBarry Smith Collective on tao 258a7e14dcfSSatish Balay 259f899ff85SJose E. Roman Input Parameter: 260441846f8SBarry Smith . tao - the Tao context 261a7e14dcfSSatish Balay 262d8d19677SJose E. Roman Output Parameters: 263a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds 264a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds 265a7e14dcfSSatish Balay 266a7e14dcfSSatish Balay Level: advanced 267a7e14dcfSSatish Balay 268a7e14dcfSSatish Balay Note: 269a7e14dcfSSatish Balay DL and DU should be created before calling this routine. If calling 270a7e14dcfSSatish Balay this routine after using an unconstrained solver, DL and DU are set to all 271a7e14dcfSSatish Balay zeros. 272a7e14dcfSSatish Balay 273a7e14dcfSSatish Balay Level: advanced 274a7e14dcfSSatish Balay 275*65ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()` 276a7e14dcfSSatish Balay @*/ 277441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU) 278a7e14dcfSSatish Balay { 279a7e14dcfSSatish Balay PetscFunctionBegin; 280441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 281a7e14dcfSSatish Balay PetscValidHeaderSpecific(DL,VEC_CLASSID,2); 282064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(DU,VEC_CLASSID,3); 283a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DL,2); 284a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,DU,3); 285a7e14dcfSSatish Balay if (tao->ops->computedual) { 2869566063dSJacob Faibussowitsch PetscCall((*tao->ops->computedual)(tao,DL,DU)); 287a7e14dcfSSatish Balay } else { 2889566063dSJacob Faibussowitsch PetscCall(VecSet(DL,0.0)); 2899566063dSJacob Faibussowitsch PetscCall(VecSet(DU,0.0)); 290a7e14dcfSSatish Balay } 291a7e14dcfSSatish Balay PetscFunctionReturn(0); 292a7e14dcfSSatish Balay } 293a7e14dcfSSatish Balay 294a7e14dcfSSatish Balay /*@ 295*65ba42b6SBarry Smith TaoGetDualVariables - Gets the dual vectors 296a7e14dcfSSatish Balay 297*65ba42b6SBarry Smith Collective on tao 298a7e14dcfSSatish Balay 299f899ff85SJose E. Roman Input Parameter: 300441846f8SBarry Smith . tao - the Tao context 301a7e14dcfSSatish Balay 302d8d19677SJose E. Roman Output Parameters: 303a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds 304a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds 305a7e14dcfSSatish Balay 306a7e14dcfSSatish Balay Level: advanced 307a7e14dcfSSatish Balay 308*65ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeDualVariables()` 309a7e14dcfSSatish Balay @*/ 310441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI) 311a7e14dcfSSatish Balay { 312a7e14dcfSSatish Balay PetscFunctionBegin; 313441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3147721a36fSStefano Zampini if (DE) *DE = tao->DE; 3157721a36fSStefano Zampini if (DI) *DI = tao->DI; 316a7e14dcfSSatish Balay PetscFunctionReturn(0); 317a7e14dcfSSatish Balay } 318a7e14dcfSSatish Balay 319a7e14dcfSSatish Balay /*@C 320*65ba42b6SBarry Smith TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 321a7e14dcfSSatish Balay 322*65ba42b6SBarry Smith Logically collective on tao 323a7e14dcfSSatish Balay 324a7e14dcfSSatish Balay Input Parameters: 325441846f8SBarry Smith + tao - the Tao context 326a7e14dcfSSatish Balay . ce - A vector that will be used to store equality constraint evaluation 327a7e14dcfSSatish Balay . func - the bounds computation routine 3286c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL) 329a7e14dcfSSatish Balay 330a7e14dcfSSatish Balay Calling sequence of func: 331441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ce, void *ctx); 332a7e14dcfSSatish Balay 333441846f8SBarry Smith + tao - the Tao 334a7e14dcfSSatish Balay . x - point to evaluate equality constraints 335a7e14dcfSSatish Balay . ce - vector of equality constraints evaluated at x 336a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 337a7e14dcfSSatish Balay 338a7e14dcfSSatish Balay Level: intermediate 339a7e14dcfSSatish Balay 340*65ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 341a7e14dcfSSatish Balay 342a7e14dcfSSatish Balay @*/ 343441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 344a7e14dcfSSatish Balay { 345a7e14dcfSSatish Balay PetscFunctionBegin; 346441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3477721a36fSStefano Zampini if (ce) PetscValidHeaderSpecific(ce,VEC_CLASSID,2); 3489566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ce)); 3499566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_equality)); 3507721a36fSStefano Zampini tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 351a7e14dcfSSatish Balay tao->constraints_equality = ce; 352a7e14dcfSSatish Balay tao->user_con_equalityP = ctx; 353a7e14dcfSSatish Balay tao->ops->computeequalityconstraints = func; 354a7e14dcfSSatish Balay PetscFunctionReturn(0); 355a7e14dcfSSatish Balay } 356a7e14dcfSSatish Balay 357a7e14dcfSSatish Balay /*@C 358*65ba42b6SBarry Smith TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints. Tao only handles constraints under certain conditions, see manual for details 359a7e14dcfSSatish Balay 360*65ba42b6SBarry Smith Logically collective on tao 361a7e14dcfSSatish Balay 362a7e14dcfSSatish Balay Input Parameters: 363441846f8SBarry Smith + tao - the Tao context 364a7e14dcfSSatish Balay . ci - A vector that will be used to store inequality constraint evaluation 365a7e14dcfSSatish Balay . func - the bounds computation routine 3666c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL) 367a7e14dcfSSatish Balay 368a7e14dcfSSatish Balay Calling sequence of func: 369441846f8SBarry Smith $ func (Tao tao, Vec x, Vec ci, void *ctx); 370a7e14dcfSSatish Balay 371441846f8SBarry Smith + tao - the Tao 372a7e14dcfSSatish Balay . x - point to evaluate inequality constraints 373a7e14dcfSSatish Balay . ci - vector of inequality constraints evaluated at x 374a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context 375a7e14dcfSSatish Balay 376a7e14dcfSSatish Balay Level: intermediate 377a7e14dcfSSatish Balay 378*65ba42b6SBarry Smith .seealso: `Tao, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()` 379a7e14dcfSSatish Balay 380a7e14dcfSSatish Balay @*/ 381441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx) 382a7e14dcfSSatish Balay { 383a7e14dcfSSatish Balay PetscFunctionBegin; 384441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 3857721a36fSStefano Zampini if (ci) PetscValidHeaderSpecific(ci,VEC_CLASSID,2); 3869566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)ci)); 3879566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->constraints_inequality)); 388a7e14dcfSSatish Balay tao->constraints_inequality = ci; 3897721a36fSStefano Zampini tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE; 390a7e14dcfSSatish Balay tao->user_con_inequalityP = ctx; 391a7e14dcfSSatish Balay tao->ops->computeinequalityconstraints = func; 392a7e14dcfSSatish Balay PetscFunctionReturn(0); 393a7e14dcfSSatish Balay } 394a7e14dcfSSatish Balay 395a7e14dcfSSatish Balay /*@C 396a7e14dcfSSatish Balay TaoComputeEqualityConstraints - Compute the variable bounds using the 397*65ba42b6SBarry Smith routine set by `TaoSetEqualityConstraintsRoutine()`. 398a7e14dcfSSatish Balay 399*65ba42b6SBarry Smith Collective on tao 400a7e14dcfSSatish Balay 401*65ba42b6SBarry Smith Input Parameter: 402441846f8SBarry Smith . tao - the Tao context 403a7e14dcfSSatish Balay 404*65ba42b6SBarry Smith Output Parameters: 405*65ba42b6SBarry Smith + X - point the equality constraints were evaluted on 406*65ba42b6SBarry Smith - CE - vector of equality constraints evaluated at X 407*65ba42b6SBarry Smith 408a7e14dcfSSatish Balay Level: developer 409a7e14dcfSSatish Balay 410*65ba42b6SBarry Smith .seealso: `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()` 411a7e14dcfSSatish Balay @*/ 412a7e14dcfSSatish Balay 413441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE) 414a7e14dcfSSatish Balay { 415a7e14dcfSSatish Balay PetscFunctionBegin; 416441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 417a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 418064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CE,VEC_CLASSID,3); 419a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 420a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CE,3); 4213c859ba3SBarry Smith PetscCheck(tao->ops->computeequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called"); 4229566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL)); 423441846f8SBarry Smith PetscStackPush("Tao equality constraints evaluation routine"); 4249566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP)); 425a7e14dcfSSatish Balay PetscStackPop; 4269566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL)); 427a7e14dcfSSatish Balay tao->nconstraints++; 428a7e14dcfSSatish Balay PetscFunctionReturn(0); 429a7e14dcfSSatish Balay } 430a7e14dcfSSatish Balay 431a7e14dcfSSatish Balay /*@C 432a7e14dcfSSatish Balay TaoComputeInequalityConstraints - Compute the variable bounds using the 433*65ba42b6SBarry Smith routine set by `TaoSetInequalityConstraintsRoutine()`. 434a7e14dcfSSatish Balay 435*65ba42b6SBarry Smith Collective on tao 436a7e14dcfSSatish Balay 437*65ba42b6SBarry Smith Input Parameter: 438441846f8SBarry Smith . tao - the Tao context 439a7e14dcfSSatish Balay 440*65ba42b6SBarry Smith Output Parameters: 441*65ba42b6SBarry Smith + X - point the inequality constraints were evaluted on 442*65ba42b6SBarry Smith - CE - vector of inequality constraints evaluated at X 443*65ba42b6SBarry Smith 444a7e14dcfSSatish Balay Level: developer 445a7e14dcfSSatish Balay 446*65ba42b6SBarry Smith .seealso: `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()` 447a7e14dcfSSatish Balay @*/ 448a7e14dcfSSatish Balay 449441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI) 450a7e14dcfSSatish Balay { 451a7e14dcfSSatish Balay PetscFunctionBegin; 452441846f8SBarry Smith PetscValidHeaderSpecific(tao,TAO_CLASSID,1); 453a7e14dcfSSatish Balay PetscValidHeaderSpecific(X,VEC_CLASSID,2); 454064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(CI,VEC_CLASSID,3); 455a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,X,2); 456a7e14dcfSSatish Balay PetscCheckSameComm(tao,1,CI,3); 4573c859ba3SBarry Smith PetscCheck(tao->ops->computeinequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called"); 4589566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL)); 459441846f8SBarry Smith PetscStackPush("Tao inequality constraints evaluation routine"); 4609566063dSJacob Faibussowitsch PetscCall((*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP)); 461a7e14dcfSSatish Balay PetscStackPop; 4629566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL)); 463a7e14dcfSSatish Balay tao->nconstraints++; 464a7e14dcfSSatish Balay PetscFunctionReturn(0); 465a7e14dcfSSatish Balay } 466