xref: /petsc/src/tao/interface/taosolver_bounds.c (revision 20f4b53cbb5e9bd9ef12b76a8697d60d197cda17)
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 
6*20f4b53cSBarry 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 
1547450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetVariableBounds()`
16a7e14dcfSSatish Balay @*/
17d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetVariableBounds(Tao tao, Vec XL, Vec XU)
18d71ae5a4SJacob Faibussowitsch {
19a7e14dcfSSatish Balay   PetscFunctionBegin;
20441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
217721a36fSStefano Zampini   if (XL) PetscValidHeaderSpecific(XL, VEC_CLASSID, 2);
227721a36fSStefano Zampini   if (XU) PetscValidHeaderSpecific(XU, VEC_CLASSID, 3);
239566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)XL));
249566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)XU));
259566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->XL));
269566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->XU));
27a7e14dcfSSatish Balay   tao->XL      = XL;
28a7e14dcfSSatish Balay   tao->XU      = XU;
297721a36fSStefano Zampini   tao->bounded = (PetscBool)(XL || XU);
303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
31a7e14dcfSSatish Balay }
3245cf516eSBarry Smith 
33a7e14dcfSSatish Balay /*@C
3465ba42b6SBarry Smith   TaoSetVariableBoundsRoutine - Sets a function to be used to compute lower and upper variable bounds for the optimization
35a7e14dcfSSatish Balay 
36*20f4b53cSBarry 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 
43*20f4b53cSBarry Smith   Calling sequence of `func`:
44*20f4b53cSBarry Smith $ PetscErrorCode func (Tao tao, Vec xl, Vec xu, void *ctx);
4547450a7bSBarry Smith + tao - the `Tao` solver
46a7e14dcfSSatish Balay . xl  - vector of lower bounds
47a7e14dcfSSatish Balay . xu  - vector of upper bounds
48a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
49a7e14dcfSSatish Balay 
50a7e14dcfSSatish Balay   Level: beginner
51a7e14dcfSSatish Balay 
5265ba42b6SBarry Smith   Note:
5365ba42b6SBarry Smith   The func passed to `TaoSetVariableBoundsRoutine()` takes precedence over any values set in `TaoSetVariableBounds()`.
54a7e14dcfSSatish Balay 
5547450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
56a7e14dcfSSatish Balay @*/
57d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
58d71ae5a4SJacob Faibussowitsch {
59a7e14dcfSSatish Balay   PetscFunctionBegin;
60441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
61a7e14dcfSSatish Balay   tao->user_boundsP       = ctx;
62a7e14dcfSSatish Balay   tao->ops->computebounds = func;
637721a36fSStefano Zampini   tao->bounded            = func ? PETSC_TRUE : PETSC_FALSE;
643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
65a7e14dcfSSatish Balay }
66a7e14dcfSSatish Balay 
677721a36fSStefano Zampini /*@
6865ba42b6SBarry Smith   TaoGetVariableBounds - Gets the upper and lower bounds vectors set with `TaoSetVariableBounds()`
697721a36fSStefano Zampini 
70*20f4b53cSBarry Smith   Not Collective
717721a36fSStefano Zampini 
727721a36fSStefano Zampini   Input Parameter:
7347450a7bSBarry Smith . tao - the `Tao` context
747721a36fSStefano Zampini 
75d5b43468SJose E. Roman   Output Parameters:
767721a36fSStefano Zampini + XL  - vector of lower bounds
777721a36fSStefano Zampini - XU  - vector of upper bounds
787721a36fSStefano Zampini 
797721a36fSStefano Zampini   Level: beginner
807721a36fSStefano Zampini 
8147450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
827721a36fSStefano Zampini @*/
83d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU)
84d71ae5a4SJacob Faibussowitsch {
85a7e14dcfSSatish Balay   PetscFunctionBegin;
86441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
877721a36fSStefano Zampini   if (XL) *XL = tao->XL;
887721a36fSStefano Zampini   if (XU) *XU = tao->XU;
893ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
90a7e14dcfSSatish Balay }
91a7e14dcfSSatish Balay 
92a7e14dcfSSatish Balay /*@C
93a7e14dcfSSatish Balay    TaoComputeVariableBounds - Compute the variable bounds using the
9465ba42b6SBarry Smith    routine set by `TaoSetVariableBoundsRoutine()`.
95a7e14dcfSSatish Balay 
96c3339decSBarry Smith    Collective
97a7e14dcfSSatish Balay 
987721a36fSStefano Zampini    Input Parameter:
9947450a7bSBarry Smith .  tao - the `Tao` context
100a7e14dcfSSatish Balay 
101a7e14dcfSSatish Balay    Level: developer
102a7e14dcfSSatish Balay 
10347450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()`
104a7e14dcfSSatish Balay @*/
105d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeVariableBounds(Tao tao)
106d71ae5a4SJacob Faibussowitsch {
107a7e14dcfSSatish Balay   PetscFunctionBegin;
108441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
10976be6f4fSStefano Zampini   if (tao->ops->computebounds) {
11076be6f4fSStefano Zampini     if (!tao->XL) {
1119566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(tao->solution, &tao->XL));
1129566063dSJacob Faibussowitsch       PetscCall(VecSet(tao->XL, PETSC_NINFINITY));
11376be6f4fSStefano Zampini     }
11476be6f4fSStefano Zampini     if (!tao->XU) {
1159566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(tao->solution, &tao->XU));
1169566063dSJacob Faibussowitsch       PetscCall(VecSet(tao->XU, PETSC_INFINITY));
117a7e14dcfSSatish Balay     }
118792fecdfSBarry Smith     PetscCallBack("Tao callback variable bounds", (*tao->ops->computebounds)(tao, tao->XL, tao->XU, tao->user_boundsP));
1197721a36fSStefano Zampini   }
1203ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
121a7e14dcfSSatish Balay }
122a7e14dcfSSatish Balay 
123a7e14dcfSSatish Balay /*@
124a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
125a7e14dcfSSatish Balay 
126*20f4b53cSBarry Smith   Logically Collective
127a7e14dcfSSatish Balay 
128a7e14dcfSSatish Balay   Input Parameters:
12947450a7bSBarry Smith + tao - the `Tao` context
130a7e14dcfSSatish Balay . IL  - vector of lower bounds
131a7e14dcfSSatish Balay - IU  - vector of upper bounds
132a7e14dcfSSatish Balay 
133a7e14dcfSSatish Balay   Level: beginner
134a7e14dcfSSatish Balay 
13547450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()`
136a7e14dcfSSatish Balay @*/
137d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
138d71ae5a4SJacob Faibussowitsch {
139a7e14dcfSSatish Balay   PetscFunctionBegin;
140441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1417721a36fSStefano Zampini   if (IL) PetscValidHeaderSpecific(IL, VEC_CLASSID, 2);
1427721a36fSStefano Zampini   if (IU) PetscValidHeaderSpecific(IU, VEC_CLASSID, 3);
1439566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IL));
1449566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IU));
1459566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IL));
1469566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IU));
147a7e14dcfSSatish Balay   tao->IL               = IL;
148a7e14dcfSSatish Balay   tao->IU               = IU;
1497721a36fSStefano Zampini   tao->ineq_doublesided = (PetscBool)(IL || IU);
1503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
151a7e14dcfSSatish Balay }
152a7e14dcfSSatish Balay 
1537721a36fSStefano Zampini /*@
15465ba42b6SBarry Smith   TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()`
1557721a36fSStefano Zampini 
156*20f4b53cSBarry Smith   Logically Collective
1577721a36fSStefano Zampini 
1587721a36fSStefano Zampini   Input Parameter:
15947450a7bSBarry Smith . tao - the `Tao` context
1607721a36fSStefano Zampini 
1617721a36fSStefano Zampini   Output Parameters:
1627721a36fSStefano Zampini + IL  - vector of lower bounds
1637721a36fSStefano Zampini - IU  - vector of upper bounds
1647721a36fSStefano Zampini 
1657721a36fSStefano Zampini   Level: beginner
1667721a36fSStefano Zampini 
16747450a7bSBarry Smith .seealso: [](chapter_tao), `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()`
1687721a36fSStefano Zampini @*/
169d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
170d71ae5a4SJacob Faibussowitsch {
171a7e14dcfSSatish Balay   PetscFunctionBegin;
172441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1737721a36fSStefano Zampini   if (IL) *IL = tao->IL;
1747721a36fSStefano Zampini   if (IU) *IU = tao->IU;
1753ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
176a7e14dcfSSatish Balay }
177a7e14dcfSSatish Balay 
178a7e14dcfSSatish Balay /*@C
179a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
18065ba42b6SBarry Smith    routine set by `TaoSetConstraintsRoutine()`.
181a7e14dcfSSatish Balay 
182c3339decSBarry Smith    Collective
183a7e14dcfSSatish Balay 
184a7e14dcfSSatish Balay    Input Parameters:
185*20f4b53cSBarry Smith +  tao - the `Tao` context
186*20f4b53cSBarry Smith -  X - location to evaluate the constraints
187*20f4b53cSBarry Smith 
188*20f4b53cSBarry Smith    Output Parameter:
189*20f4b53cSBarry Smith .  C - the constraints
190a7e14dcfSSatish Balay 
191a7e14dcfSSatish Balay    Level: developer
192a7e14dcfSSatish Balay 
19347450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()`
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++;
2073ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
208a7e14dcfSSatish Balay }
209a7e14dcfSSatish Balay 
210a7e14dcfSSatish Balay /*@C
211*20f4b53cSBarry Smith   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see [](chapter_tao) for details
212a7e14dcfSSatish Balay 
213*20f4b53cSBarry Smith   Logically Collective
214a7e14dcfSSatish Balay 
215a7e14dcfSSatish Balay   Input Parameters:
21647450a7bSBarry 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
219*20f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be `NULL`)
220a7e14dcfSSatish Balay 
221*20f4b53cSBarry Smith   Calling sequence of `func`:
222*20f4b53cSBarry Smith $ PetscErrorCode func(Tao tao, Vec x, Vec c, void *ctx);
22347450a7bSBarry Smith + tao - the `Tao` solver
224a7e14dcfSSatish Balay . x   - point to evaluate constraints
22547450a7bSBarry Smith . c   - vector constraints evaluated at `x`
226a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
227a7e14dcfSSatish Balay 
228a7e14dcfSSatish Balay   Level: intermediate
229a7e14dcfSSatish Balay 
23047450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()`
231a7e14dcfSSatish Balay @*/
232d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
233d71ae5a4SJacob Faibussowitsch {
234a7e14dcfSSatish Balay   PetscFunctionBegin;
235441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
2367721a36fSStefano Zampini   if (c) PetscValidHeaderSpecific(c, VEC_CLASSID, 2);
2379566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)c));
2389566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints));
2397721a36fSStefano Zampini   tao->constrained             = func ? PETSC_TRUE : PETSC_FALSE;
240a7e14dcfSSatish Balay   tao->constraints             = c;
241a7e14dcfSSatish Balay   tao->user_conP               = ctx;
242a7e14dcfSSatish Balay   tao->ops->computeconstraints = func;
2433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
244a7e14dcfSSatish Balay }
245a7e14dcfSSatish Balay 
246a7e14dcfSSatish Balay /*@
247a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
248a7e14dcfSSatish Balay   of the variables
249a7e14dcfSSatish Balay 
250c3339decSBarry Smith   Collective
251a7e14dcfSSatish Balay 
252f899ff85SJose E. Roman   Input Parameter:
25347450a7bSBarry Smith . tao - the `Tao` context
254a7e14dcfSSatish Balay 
255d8d19677SJose E. Roman   Output Parameters:
256a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
257a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
258a7e14dcfSSatish Balay 
259a7e14dcfSSatish Balay   Level: advanced
260a7e14dcfSSatish Balay 
261a7e14dcfSSatish Balay   Note:
262a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
263*20f4b53cSBarry Smith   this routine after using an unconstrained solver, `DL` and `DU` are set to all
264a7e14dcfSSatish Balay   zeros.
265a7e14dcfSSatish Balay 
26647450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()`
267a7e14dcfSSatish Balay @*/
268d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU)
269d71ae5a4SJacob Faibussowitsch {
270a7e14dcfSSatish Balay   PetscFunctionBegin;
271441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
272a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DL, VEC_CLASSID, 2);
273064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(DU, VEC_CLASSID, 3);
274a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, DL, 2);
275a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, DU, 3);
276a7e14dcfSSatish Balay   if (tao->ops->computedual) {
277dbbe0bcdSBarry Smith     PetscUseTypeMethod(tao, computedual, DL, DU);
278a7e14dcfSSatish Balay   } else {
2799566063dSJacob Faibussowitsch     PetscCall(VecSet(DL, 0.0));
2809566063dSJacob Faibussowitsch     PetscCall(VecSet(DU, 0.0));
281a7e14dcfSSatish Balay   }
2823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
283a7e14dcfSSatish Balay }
284a7e14dcfSSatish Balay 
285a7e14dcfSSatish Balay /*@
28665ba42b6SBarry Smith   TaoGetDualVariables - Gets the dual vectors
287a7e14dcfSSatish Balay 
288c3339decSBarry Smith   Collective
289a7e14dcfSSatish Balay 
290f899ff85SJose E. Roman   Input Parameter:
29147450a7bSBarry Smith . tao - the `Tao` context
292a7e14dcfSSatish Balay 
293d8d19677SJose E. Roman   Output Parameters:
294a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
295a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
296a7e14dcfSSatish Balay 
297a7e14dcfSSatish Balay   Level: advanced
298a7e14dcfSSatish Balay 
29947450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoComputeDualVariables()`
300a7e14dcfSSatish Balay @*/
301d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI)
302d71ae5a4SJacob Faibussowitsch {
303a7e14dcfSSatish Balay   PetscFunctionBegin;
304441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3057721a36fSStefano Zampini   if (DE) *DE = tao->DE;
3067721a36fSStefano Zampini   if (DI) *DI = tao->DI;
3073ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
308a7e14dcfSSatish Balay }
309a7e14dcfSSatish Balay 
310a7e14dcfSSatish Balay /*@C
311*20f4b53cSBarry Smith   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see [](chapter_tao) for details
312a7e14dcfSSatish Balay 
313*20f4b53cSBarry Smith   Logically Collective
314a7e14dcfSSatish Balay 
315a7e14dcfSSatish Balay   Input Parameters:
31647450a7bSBarry Smith + tao - the `Tao` context
317a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
318a7e14dcfSSatish Balay . func - the bounds computation routine
319*20f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be `NULL`)
320a7e14dcfSSatish Balay 
321*20f4b53cSBarry Smith   Calling sequence of `func`:
322*20f4b53cSBarry Smith $ PetscErrorCode func(Tao tao, Vec x, Vec ce, void *ctx);
32347450a7bSBarry Smith + tao - the `Tao` solver
324a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
325a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
326a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
327a7e14dcfSSatish Balay 
328a7e14dcfSSatish Balay   Level: intermediate
329a7e14dcfSSatish Balay 
33047450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
331a7e14dcfSSatish Balay @*/
332d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
333d71ae5a4SJacob Faibussowitsch {
334a7e14dcfSSatish Balay   PetscFunctionBegin;
335441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3367721a36fSStefano Zampini   if (ce) PetscValidHeaderSpecific(ce, VEC_CLASSID, 2);
3379566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ce));
3389566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_equality));
3397721a36fSStefano Zampini   tao->eq_constrained                  = func ? PETSC_TRUE : PETSC_FALSE;
340a7e14dcfSSatish Balay   tao->constraints_equality            = ce;
341a7e14dcfSSatish Balay   tao->user_con_equalityP              = ctx;
342a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
3433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
344a7e14dcfSSatish Balay }
345a7e14dcfSSatish Balay 
346a7e14dcfSSatish Balay /*@C
347*20f4b53cSBarry Smith   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see [](chapter_tao) for details
348a7e14dcfSSatish Balay 
349*20f4b53cSBarry Smith   Logically Collective
350a7e14dcfSSatish Balay 
351a7e14dcfSSatish Balay   Input Parameters:
35247450a7bSBarry Smith + tao - the `Tao` context
353a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
354a7e14dcfSSatish Balay . func - the bounds computation routine
355*20f4b53cSBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be `NULL`)
356a7e14dcfSSatish Balay 
357*20f4b53cSBarry Smith   Calling sequence of `func`:
358*20f4b53cSBarry Smith $ PetscErrorCode func(Tao tao, Vec x, Vec ci, void *ctx);
35947450a7bSBarry Smith + tao - the `Tao` solver
360a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
361a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
362a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
363a7e14dcfSSatish Balay 
364a7e14dcfSSatish Balay   Level: intermediate
365a7e14dcfSSatish Balay 
36647450a7bSBarry Smith .seealso: [](chapter_tao), `Tao, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
367a7e14dcfSSatish Balay @*/
368d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
369d71ae5a4SJacob Faibussowitsch {
370a7e14dcfSSatish Balay   PetscFunctionBegin;
371441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3727721a36fSStefano Zampini   if (ci) PetscValidHeaderSpecific(ci, VEC_CLASSID, 2);
3739566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ci));
3749566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_inequality));
375a7e14dcfSSatish Balay   tao->constraints_inequality            = ci;
3767721a36fSStefano Zampini   tao->ineq_constrained                  = func ? PETSC_TRUE : PETSC_FALSE;
377a7e14dcfSSatish Balay   tao->user_con_inequalityP              = ctx;
378a7e14dcfSSatish Balay   tao->ops->computeinequalityconstraints = func;
3793ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
380a7e14dcfSSatish Balay }
381a7e14dcfSSatish Balay 
382a7e14dcfSSatish Balay /*@C
383a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
38465ba42b6SBarry Smith    routine set by `TaoSetEqualityConstraintsRoutine()`.
385a7e14dcfSSatish Balay 
386c3339decSBarry Smith    Collective
387a7e14dcfSSatish Balay 
38865ba42b6SBarry Smith    Input Parameter:
38947450a7bSBarry Smith .  tao - the `Tao` context
390a7e14dcfSSatish Balay 
39165ba42b6SBarry Smith    Output Parameters:
392da81f932SPierre Jolivet +  X - point the equality constraints were evaluated on
39365ba42b6SBarry Smith -  CE   - vector of equality constraints evaluated at X
39465ba42b6SBarry Smith 
395a7e14dcfSSatish Balay    Level: developer
396a7e14dcfSSatish Balay 
39747450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()`
398a7e14dcfSSatish Balay @*/
399d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
400d71ae5a4SJacob Faibussowitsch {
401a7e14dcfSSatish Balay   PetscFunctionBegin;
402441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
403a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
404064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CE, VEC_CLASSID, 3);
405a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, X, 2);
406a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, CE, 3);
4079566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CE, NULL));
408792fecdfSBarry Smith   PetscCallBack("Tao callback equality constraints", (*tao->ops->computeequalityconstraints)(tao, X, CE, tao->user_con_equalityP));
4099566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CE, NULL));
410a7e14dcfSSatish Balay   tao->nconstraints++;
4113ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
412a7e14dcfSSatish Balay }
413a7e14dcfSSatish Balay 
414a7e14dcfSSatish Balay /*@C
415a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
41665ba42b6SBarry Smith    routine set by `TaoSetInequalityConstraintsRoutine()`.
417a7e14dcfSSatish Balay 
418c3339decSBarry Smith    Collective
419a7e14dcfSSatish Balay 
42065ba42b6SBarry Smith    Input Parameter:
42147450a7bSBarry Smith .  tao - the `Tao` context
422a7e14dcfSSatish Balay 
42365ba42b6SBarry Smith    Output Parameters:
424da81f932SPierre Jolivet +  X - point the inequality constraints were evaluated on
42565ba42b6SBarry Smith -  CE   - vector of inequality constraints evaluated at X
42665ba42b6SBarry Smith 
427a7e14dcfSSatish Balay    Level: developer
428a7e14dcfSSatish Balay 
42947450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()`
430a7e14dcfSSatish Balay @*/
431d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
432d71ae5a4SJacob Faibussowitsch {
433a7e14dcfSSatish Balay   PetscFunctionBegin;
434441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
435a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
436064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CI, VEC_CLASSID, 3);
437a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, X, 2);
438a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, CI, 3);
4399566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CI, NULL));
440792fecdfSBarry Smith   PetscCallBack("Tao callback inequality constraints", (*tao->ops->computeinequalityconstraints)(tao, X, CI, tao->user_con_inequalityP));
4419566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CI, NULL));
442a7e14dcfSSatish Balay   tao->nconstraints++;
4433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
444a7e14dcfSSatish Balay }
445