xref: /petsc/src/tao/interface/taosolver_bounds.c (revision 4e8208cbcbc709572b8abe32f33c78b69c819375)
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 
620f4b53cSBarry Smith   Logically Collective
7a7e14dcfSSatish Balay 
8a7e14dcfSSatish Balay   Input Parameters:
947450a7bSBarry Smith + tao - the `Tao` context
10a7e14dcfSSatish Balay . XL  - vector of lower bounds
11a7e14dcfSSatish Balay - XU  - vector of upper bounds
12a7e14dcfSSatish Balay 
13a7e14dcfSSatish Balay   Level: beginner
14a7e14dcfSSatish Balay 
151cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetVariableBounds()`
16a7e14dcfSSatish Balay @*/
TaoSetVariableBounds(Tao tao,Vec XL,Vec XU)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 
3620f4b53cSBarry Smith   Logically Collective
37a7e14dcfSSatish Balay 
38a7e14dcfSSatish Balay   Input Parameters:
3947450a7bSBarry Smith + tao  - the `Tao` context
40a7e14dcfSSatish Balay . func - the bounds computation routine
4147450a7bSBarry Smith - ctx  - [optional] user-defined context for private data for the bounds computation (may be `NULL`)
42a7e14dcfSSatish Balay 
4320f4b53cSBarry Smith   Calling sequence of `func`:
4447450a7bSBarry Smith + tao - the `Tao` solver
45a7e14dcfSSatish Balay . xl  - vector of lower bounds
46a7e14dcfSSatish Balay . xu  - vector of upper bounds
47a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
48a7e14dcfSSatish Balay 
49a7e14dcfSSatish Balay   Level: beginner
50a7e14dcfSSatish Balay 
5165ba42b6SBarry Smith   Note:
5265ba42b6SBarry Smith   The func passed to `TaoSetVariableBoundsRoutine()` takes precedence over any values set in `TaoSetVariableBounds()`.
53a7e14dcfSSatish Balay 
541cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
55a7e14dcfSSatish Balay @*/
TaoSetVariableBoundsRoutine(Tao tao,PetscErrorCode (* func)(Tao tao,Vec xl,Vec xu,PetscCtx ctx),PetscCtx ctx)56*2a8381b2SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao tao, Vec xl, Vec xu, PetscCtx ctx), PetscCtx ctx)
57d71ae5a4SJacob Faibussowitsch {
58a7e14dcfSSatish Balay   PetscFunctionBegin;
59441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
60a7e14dcfSSatish Balay   tao->user_boundsP       = ctx;
61a7e14dcfSSatish Balay   tao->ops->computebounds = func;
627721a36fSStefano Zampini   tao->bounded            = func ? PETSC_TRUE : PETSC_FALSE;
633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
64a7e14dcfSSatish Balay }
65a7e14dcfSSatish Balay 
667721a36fSStefano Zampini /*@
6765ba42b6SBarry Smith   TaoGetVariableBounds - Gets the upper and lower bounds vectors set with `TaoSetVariableBounds()`
687721a36fSStefano Zampini 
6920f4b53cSBarry Smith   Not Collective
707721a36fSStefano Zampini 
717721a36fSStefano Zampini   Input Parameter:
7247450a7bSBarry Smith . tao - the `Tao` context
737721a36fSStefano Zampini 
74d5b43468SJose E. Roman   Output Parameters:
757721a36fSStefano Zampini + XL - vector of lower bounds
767721a36fSStefano Zampini - XU - vector of upper bounds
777721a36fSStefano Zampini 
787721a36fSStefano Zampini   Level: beginner
797721a36fSStefano Zampini 
801cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
817721a36fSStefano Zampini @*/
TaoGetVariableBounds(Tao tao,Vec * XL,Vec * XU)82d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU)
83d71ae5a4SJacob Faibussowitsch {
84a7e14dcfSSatish Balay   PetscFunctionBegin;
85441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
867721a36fSStefano Zampini   if (XL) *XL = tao->XL;
877721a36fSStefano Zampini   if (XU) *XU = tao->XU;
883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
89a7e14dcfSSatish Balay }
90a7e14dcfSSatish Balay 
91cc4c1da9SBarry Smith /*@
92a7e14dcfSSatish Balay   TaoComputeVariableBounds - Compute the variable bounds using the
9365ba42b6SBarry Smith   routine set by `TaoSetVariableBoundsRoutine()`.
94a7e14dcfSSatish Balay 
95c3339decSBarry Smith   Collective
96a7e14dcfSSatish Balay 
977721a36fSStefano Zampini   Input Parameter:
9847450a7bSBarry Smith . tao - the `Tao` context
99a7e14dcfSSatish Balay 
100a7e14dcfSSatish Balay   Level: developer
101a7e14dcfSSatish Balay 
1021cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()`
103a7e14dcfSSatish Balay @*/
TaoComputeVariableBounds(Tao tao)104d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeVariableBounds(Tao tao)
105d71ae5a4SJacob Faibussowitsch {
106a7e14dcfSSatish Balay   PetscFunctionBegin;
107441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
10876be6f4fSStefano Zampini   if (tao->ops->computebounds) {
10976be6f4fSStefano Zampini     if (!tao->XL) {
1109566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(tao->solution, &tao->XL));
1119566063dSJacob Faibussowitsch       PetscCall(VecSet(tao->XL, PETSC_NINFINITY));
11276be6f4fSStefano Zampini     }
11376be6f4fSStefano Zampini     if (!tao->XU) {
1149566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(tao->solution, &tao->XU));
1159566063dSJacob Faibussowitsch       PetscCall(VecSet(tao->XU, PETSC_INFINITY));
116a7e14dcfSSatish Balay     }
117792fecdfSBarry Smith     PetscCallBack("Tao callback variable bounds", (*tao->ops->computebounds)(tao, tao->XL, tao->XU, tao->user_boundsP));
1187721a36fSStefano Zampini   }
1193ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
120a7e14dcfSSatish Balay }
121a7e14dcfSSatish Balay 
122a7e14dcfSSatish Balay /*@
123a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
124a7e14dcfSSatish Balay 
12520f4b53cSBarry Smith   Logically Collective
126a7e14dcfSSatish Balay 
127a7e14dcfSSatish Balay   Input Parameters:
12847450a7bSBarry Smith + tao - the `Tao` context
129a7e14dcfSSatish Balay . IL  - vector of lower bounds
130a7e14dcfSSatish Balay - IU  - vector of upper bounds
131a7e14dcfSSatish Balay 
132a7e14dcfSSatish Balay   Level: beginner
133a7e14dcfSSatish Balay 
1341cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()`
135a7e14dcfSSatish Balay @*/
TaoSetInequalityBounds(Tao tao,Vec IL,Vec IU)136d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
137d71ae5a4SJacob Faibussowitsch {
138a7e14dcfSSatish Balay   PetscFunctionBegin;
139441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1407721a36fSStefano Zampini   if (IL) PetscValidHeaderSpecific(IL, VEC_CLASSID, 2);
1417721a36fSStefano Zampini   if (IU) PetscValidHeaderSpecific(IU, VEC_CLASSID, 3);
1429566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IL));
1439566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IU));
1449566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IL));
1459566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IU));
146a7e14dcfSSatish Balay   tao->IL               = IL;
147a7e14dcfSSatish Balay   tao->IU               = IU;
1487721a36fSStefano Zampini   tao->ineq_doublesided = (PetscBool)(IL || IU);
1493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
150a7e14dcfSSatish Balay }
151a7e14dcfSSatish Balay 
1527721a36fSStefano Zampini /*@
15365ba42b6SBarry Smith   TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()`
1547721a36fSStefano Zampini 
15520f4b53cSBarry Smith   Logically Collective
1567721a36fSStefano Zampini 
1577721a36fSStefano Zampini   Input Parameter:
15847450a7bSBarry Smith . tao - the `Tao` context
1597721a36fSStefano Zampini 
1607721a36fSStefano Zampini   Output Parameters:
1617721a36fSStefano Zampini + IL - vector of lower bounds
1627721a36fSStefano Zampini - IU - vector of upper bounds
1637721a36fSStefano Zampini 
1647721a36fSStefano Zampini   Level: beginner
1657721a36fSStefano Zampini 
1661cc06b55SBarry Smith .seealso: [](ch_tao), `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()`
1677721a36fSStefano Zampini @*/
TaoGetInequalityBounds(Tao tao,Vec * IL,Vec * IU)168d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
169d71ae5a4SJacob Faibussowitsch {
170a7e14dcfSSatish Balay   PetscFunctionBegin;
171441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1727721a36fSStefano Zampini   if (IL) *IL = tao->IL;
1737721a36fSStefano Zampini   if (IU) *IU = tao->IU;
1743ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
175a7e14dcfSSatish Balay }
176a7e14dcfSSatish Balay 
177cc4c1da9SBarry Smith /*@
178a7e14dcfSSatish Balay   TaoComputeConstraints - Compute the variable bounds using the
17965ba42b6SBarry Smith   routine set by `TaoSetConstraintsRoutine()`.
180a7e14dcfSSatish Balay 
181c3339decSBarry Smith   Collective
182a7e14dcfSSatish Balay 
183a7e14dcfSSatish Balay   Input Parameters:
18420f4b53cSBarry Smith + tao - the `Tao` context
18520f4b53cSBarry Smith - X   - location to evaluate the constraints
18620f4b53cSBarry Smith 
18720f4b53cSBarry Smith   Output Parameter:
18820f4b53cSBarry Smith . C - the constraints
189a7e14dcfSSatish Balay 
190a7e14dcfSSatish Balay   Level: developer
191a7e14dcfSSatish Balay 
1921cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()`
193a7e14dcfSSatish Balay @*/
TaoComputeConstraints(Tao tao,Vec X,Vec C)194d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C)
195d71ae5a4SJacob Faibussowitsch {
196a7e14dcfSSatish Balay   PetscFunctionBegin;
197441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
198a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
199064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(C, VEC_CLASSID, 3);
200a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, X, 2);
201a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, C, 3);
2029566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, C, NULL));
203792fecdfSBarry Smith   PetscCallBack("Tao callback constraints", (*tao->ops->computeconstraints)(tao, X, C, tao->user_conP));
2049566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, C, NULL));
205a7e14dcfSSatish Balay   tao->nconstraints++;
2063ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
207a7e14dcfSSatish Balay }
208a7e14dcfSSatish Balay 
209a7e14dcfSSatish Balay /*@C
2101cc06b55SBarry Smith   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see [](ch_tao) for details
211a7e14dcfSSatish Balay 
21220f4b53cSBarry Smith   Logically Collective
213a7e14dcfSSatish Balay 
214a7e14dcfSSatish Balay   Input Parameters:
21547450a7bSBarry Smith + tao  - the `Tao` context
216a7e14dcfSSatish Balay . c    - A vector that will be used to store constraint evaluation
217a7e14dcfSSatish Balay . func - the bounds computation routine
21820f4b53cSBarry Smith - ctx  - [optional] user-defined context for private data for the constraints computation (may be `NULL`)
219a7e14dcfSSatish Balay 
22020f4b53cSBarry Smith   Calling sequence of `func`:
22147450a7bSBarry Smith + tao - the `Tao` solver
222a7e14dcfSSatish Balay . x   - point to evaluate constraints
22347450a7bSBarry Smith . c   - vector constraints evaluated at `x`
224a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
225a7e14dcfSSatish Balay 
226a7e14dcfSSatish Balay   Level: intermediate
227a7e14dcfSSatish Balay 
2281cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()`
229a7e14dcfSSatish Balay @*/
TaoSetConstraintsRoutine(Tao tao,Vec c,PetscErrorCode (* func)(Tao tao,Vec x,Vec c,PetscCtx ctx),PetscCtx ctx)230*2a8381b2SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao tao, Vec x, Vec c, PetscCtx ctx), PetscCtx 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:
25147450a7bSBarry 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
26120f4b53cSBarry Smith   this routine after using an unconstrained solver, `DL` and `DU` are set to all
262a7e14dcfSSatish Balay   zeros.
263a7e14dcfSSatish Balay 
2641cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()`
265a7e14dcfSSatish Balay @*/
TaoComputeDualVariables(Tao tao,Vec DL,Vec DU)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:
28947450a7bSBarry 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 
2971cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoComputeDualVariables()`
298a7e14dcfSSatish Balay @*/
TaoGetDualVariables(Tao tao,Vec * DE,Vec * DI)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
3091cc06b55SBarry Smith   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see [](ch_tao) for details
310a7e14dcfSSatish Balay 
31120f4b53cSBarry Smith   Logically Collective
312a7e14dcfSSatish Balay 
313a7e14dcfSSatish Balay   Input Parameters:
31447450a7bSBarry 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
31720f4b53cSBarry Smith - ctx  - [optional] user-defined context for private data for the equality constraints computation (may be `NULL`)
318a7e14dcfSSatish Balay 
31920f4b53cSBarry Smith   Calling sequence of `func`:
32047450a7bSBarry Smith + tao - the `Tao` solver
321a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
322a7e14dcfSSatish Balay . ce  - vector of equality constraints evaluated at x
323a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
324a7e14dcfSSatish Balay 
325a7e14dcfSSatish Balay   Level: intermediate
326a7e14dcfSSatish Balay 
3271cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
328a7e14dcfSSatish Balay @*/
TaoSetEqualityConstraintsRoutine(Tao tao,Vec ce,PetscErrorCode (* func)(Tao tao,Vec x,Vec ce,PetscCtx ctx),PetscCtx ctx)329*2a8381b2SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao tao, Vec x, Vec ce, PetscCtx ctx), PetscCtx ctx)
330d71ae5a4SJacob Faibussowitsch {
331a7e14dcfSSatish Balay   PetscFunctionBegin;
332441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3337721a36fSStefano Zampini   if (ce) PetscValidHeaderSpecific(ce, VEC_CLASSID, 2);
3349566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ce));
3359566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_equality));
3367721a36fSStefano Zampini   tao->eq_constrained                  = func ? PETSC_TRUE : PETSC_FALSE;
337a7e14dcfSSatish Balay   tao->constraints_equality            = ce;
338a7e14dcfSSatish Balay   tao->user_con_equalityP              = ctx;
339a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
3403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
341a7e14dcfSSatish Balay }
342a7e14dcfSSatish Balay 
343a7e14dcfSSatish Balay /*@C
3441b4e8d38Spaul.kuehner   TaoGetEqualityConstraintsRoutine - Gets the function used to compute equality constraints.
3451b4e8d38Spaul.kuehner 
3461b4e8d38Spaul.kuehner   Not Collective
3471b4e8d38Spaul.kuehner 
3481b4e8d38Spaul.kuehner   Input Parameter:
3491b4e8d38Spaul.kuehner . tao - the `Tao` context
3501b4e8d38Spaul.kuehner 
3511b4e8d38Spaul.kuehner   Output Parameters:
3521b4e8d38Spaul.kuehner + ci   - the vector to internally hold the constraint computation
3531b4e8d38Spaul.kuehner . func - the bounds computation routine
3541b4e8d38Spaul.kuehner - ctx  - the (optional) user-defined context
3551b4e8d38Spaul.kuehner 
3561b4e8d38Spaul.kuehner   Calling sequence of `func`:
3571b4e8d38Spaul.kuehner + tao - the `Tao` solver
3581b4e8d38Spaul.kuehner . x   - point to evaluate equality constraints
3591b4e8d38Spaul.kuehner . ci  - vector of equality constraints evaluated at x
3601b4e8d38Spaul.kuehner - ctx - the (optional) user-defined function context
3611b4e8d38Spaul.kuehner 
3621b4e8d38Spaul.kuehner   Level: intermediate
3631b4e8d38Spaul.kuehner 
3641b4e8d38Spaul.kuehner .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoGetObjective()`, `TaoGetGradient()`, `TaoGetHessian()`, `TaoGetObjectiveAndGradient()`, `TaoGetInequalityConstraintsRoutine()`
3651b4e8d38Spaul.kuehner @*/
TaoGetEqualityConstraintsRoutine(Tao tao,Vec * ci,PetscErrorCode (** func)(Tao tao,Vec x,Vec ci,PetscCtx ctx),PetscCtxRt ctx)366*2a8381b2SBarry Smith PetscErrorCode TaoGetEqualityConstraintsRoutine(Tao tao, Vec *ci, PetscErrorCode (**func)(Tao tao, Vec x, Vec ci, PetscCtx ctx), PetscCtxRt ctx)
3671b4e8d38Spaul.kuehner {
3681b4e8d38Spaul.kuehner   PetscFunctionBegin;
3691b4e8d38Spaul.kuehner   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3701b4e8d38Spaul.kuehner   if (ci) *ci = tao->constraints_equality;
3711b4e8d38Spaul.kuehner   if (func) *func = tao->ops->computeequalityconstraints;
372*2a8381b2SBarry Smith   if (ctx) *(void **)ctx = tao->user_con_equalityP;
3731b4e8d38Spaul.kuehner   PetscFunctionReturn(PETSC_SUCCESS);
3741b4e8d38Spaul.kuehner }
3751b4e8d38Spaul.kuehner 
3761b4e8d38Spaul.kuehner /*@C
3771cc06b55SBarry Smith   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see [](ch_tao) for details
378a7e14dcfSSatish Balay 
37920f4b53cSBarry Smith   Logically Collective
380a7e14dcfSSatish Balay 
381a7e14dcfSSatish Balay   Input Parameters:
38247450a7bSBarry Smith + tao  - the `Tao` context
383a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
384a7e14dcfSSatish Balay . func - the bounds computation routine
38520f4b53cSBarry Smith - ctx  - [optional] user-defined context for private data for the inequality constraints computation (may be `NULL`)
386a7e14dcfSSatish Balay 
38720f4b53cSBarry Smith   Calling sequence of `func`:
38847450a7bSBarry Smith + tao - the `Tao` solver
389a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
390a7e14dcfSSatish Balay . ci  - vector of inequality constraints evaluated at x
391a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
392a7e14dcfSSatish Balay 
393a7e14dcfSSatish Balay   Level: intermediate
394a7e14dcfSSatish Balay 
395e056e8ceSJacob Faibussowitsch .seealso: [](ch_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
396a7e14dcfSSatish Balay @*/
TaoSetInequalityConstraintsRoutine(Tao tao,Vec ci,PetscErrorCode (* func)(Tao tao,Vec x,Vec ci,PetscCtx ctx),PetscCtx ctx)397*2a8381b2SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao tao, Vec x, Vec ci, PetscCtx ctx), PetscCtx ctx)
398d71ae5a4SJacob Faibussowitsch {
399a7e14dcfSSatish Balay   PetscFunctionBegin;
400441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
4017721a36fSStefano Zampini   if (ci) PetscValidHeaderSpecific(ci, VEC_CLASSID, 2);
4029566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ci));
4039566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_inequality));
404a7e14dcfSSatish Balay   tao->constraints_inequality            = ci;
4057721a36fSStefano Zampini   tao->ineq_constrained                  = func ? PETSC_TRUE : PETSC_FALSE;
406a7e14dcfSSatish Balay   tao->user_con_inequalityP              = ctx;
407a7e14dcfSSatish Balay   tao->ops->computeinequalityconstraints = func;
4083ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
409a7e14dcfSSatish Balay }
410a7e14dcfSSatish Balay 
411434d79ddSpaul.kuehner /*@C
412434d79ddSpaul.kuehner   TaoGetInequalityConstraintsRoutine - Gets the function used to compute inequality constraints.
413434d79ddSpaul.kuehner 
414434d79ddSpaul.kuehner   Not Collective
415434d79ddSpaul.kuehner 
416434d79ddSpaul.kuehner   Input Parameter:
417434d79ddSpaul.kuehner . tao - the `Tao` context
418434d79ddSpaul.kuehner 
419434d79ddSpaul.kuehner   Output Parameters:
420434d79ddSpaul.kuehner + ci   - the vector to internally hold the constraint computation
421434d79ddSpaul.kuehner . func - the bounds computation routine
422434d79ddSpaul.kuehner - ctx  - the (optional) user-defined context
423434d79ddSpaul.kuehner 
424434d79ddSpaul.kuehner   Calling sequence of `func`:
425434d79ddSpaul.kuehner + tao - the `Tao` solver
426434d79ddSpaul.kuehner . x   - point to evaluate inequality constraints
427434d79ddSpaul.kuehner . ci  - vector of inequality constraints evaluated at x
428434d79ddSpaul.kuehner - ctx - the (optional) user-defined function context
429434d79ddSpaul.kuehner 
430434d79ddSpaul.kuehner   Level: intermediate
431434d79ddSpaul.kuehner 
4321b4e8d38Spaul.kuehner .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoGetObjective()`, `TaoGetGradient()`, `TaoGetHessian()`, `TaoGetObjectiveAndGradient()`, `TaoGetEqualityConstraintsRoutine()`
433434d79ddSpaul.kuehner @*/
TaoGetInequalityConstraintsRoutine(Tao tao,Vec * ci,PetscErrorCode (** func)(Tao tao,Vec x,Vec ci,PetscCtx ctx),PetscCtxRt ctx)434*2a8381b2SBarry Smith PetscErrorCode TaoGetInequalityConstraintsRoutine(Tao tao, Vec *ci, PetscErrorCode (**func)(Tao tao, Vec x, Vec ci, PetscCtx ctx), PetscCtxRt ctx)
435434d79ddSpaul.kuehner {
436434d79ddSpaul.kuehner   PetscFunctionBegin;
437434d79ddSpaul.kuehner   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
438434d79ddSpaul.kuehner   if (ci) *ci = tao->constraints_inequality;
439434d79ddSpaul.kuehner   if (func) *func = tao->ops->computeinequalityconstraints;
440*2a8381b2SBarry Smith   if (ctx) *(void **)ctx = tao->user_con_inequalityP;
441434d79ddSpaul.kuehner   PetscFunctionReturn(PETSC_SUCCESS);
442434d79ddSpaul.kuehner }
443434d79ddSpaul.kuehner 
444cc4c1da9SBarry Smith /*@
445a7e14dcfSSatish Balay   TaoComputeEqualityConstraints - Compute the variable bounds using the
44665ba42b6SBarry Smith   routine set by `TaoSetEqualityConstraintsRoutine()`.
447a7e14dcfSSatish Balay 
448c3339decSBarry Smith   Collective
449a7e14dcfSSatish Balay 
45065ba42b6SBarry Smith   Input Parameter:
45147450a7bSBarry Smith . tao - the `Tao` context
452a7e14dcfSSatish Balay 
45365ba42b6SBarry Smith   Output Parameters:
454da81f932SPierre Jolivet + X  - point the equality constraints were evaluated on
45565ba42b6SBarry Smith - CE - vector of equality constraints evaluated at X
45665ba42b6SBarry Smith 
457a7e14dcfSSatish Balay   Level: developer
458a7e14dcfSSatish Balay 
4591cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()`
460a7e14dcfSSatish Balay @*/
TaoComputeEqualityConstraints(Tao tao,Vec X,Vec CE)461d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
462d71ae5a4SJacob Faibussowitsch {
463a7e14dcfSSatish Balay   PetscFunctionBegin;
464441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
465a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
466064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CE, VEC_CLASSID, 3);
467a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, X, 2);
468a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, CE, 3);
4699566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CE, NULL));
470792fecdfSBarry Smith   PetscCallBack("Tao callback equality constraints", (*tao->ops->computeequalityconstraints)(tao, X, CE, tao->user_con_equalityP));
4719566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CE, NULL));
472a7e14dcfSSatish Balay   tao->nconstraints++;
4733ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
474a7e14dcfSSatish Balay }
475a7e14dcfSSatish Balay 
476cc4c1da9SBarry Smith /*@
477a7e14dcfSSatish Balay   TaoComputeInequalityConstraints - Compute the variable bounds using the
47865ba42b6SBarry Smith   routine set by `TaoSetInequalityConstraintsRoutine()`.
479a7e14dcfSSatish Balay 
480c3339decSBarry Smith   Collective
481a7e14dcfSSatish Balay 
48265ba42b6SBarry Smith   Input Parameter:
48347450a7bSBarry Smith . tao - the `Tao` context
484a7e14dcfSSatish Balay 
48565ba42b6SBarry Smith   Output Parameters:
486da81f932SPierre Jolivet + X  - point the inequality constraints were evaluated on
487e056e8ceSJacob Faibussowitsch - CI - vector of inequality constraints evaluated at X
48865ba42b6SBarry Smith 
489a7e14dcfSSatish Balay   Level: developer
490a7e14dcfSSatish Balay 
4911cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()`
492a7e14dcfSSatish Balay @*/
TaoComputeInequalityConstraints(Tao tao,Vec X,Vec CI)493d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
494d71ae5a4SJacob Faibussowitsch {
495a7e14dcfSSatish Balay   PetscFunctionBegin;
496441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
497a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
498064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CI, VEC_CLASSID, 3);
499a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, X, 2);
500a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, CI, 3);
5019566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CI, NULL));
502792fecdfSBarry Smith   PetscCallBack("Tao callback inequality constraints", (*tao->ops->computeinequalityconstraints)(tao, X, CI, tao->user_con_inequalityP));
5039566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CI, NULL));
504a7e14dcfSSatish Balay   tao->nconstraints++;
5053ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
506a7e14dcfSSatish Balay }
507