xref: /petsc/src/tao/interface/taosolver_bounds.c (revision 47450a7baf26d24688d7bf4590d13280814a31c3)
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 
6c3339decSBarry Smith   Logically collective
7a7e14dcfSSatish Balay 
8a7e14dcfSSatish Balay   Input Parameters:
9*47450a7bSBarry 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*47450a7bSBarry 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 
36c3339decSBarry Smith   Logically collective
37a7e14dcfSSatish Balay 
38a7e14dcfSSatish Balay   Input Parameters:
39*47450a7bSBarry Smith + tao - the `Tao` context
40a7e14dcfSSatish Balay . func - the bounds computation routine
41*47450a7bSBarry 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 
46*47450a7bSBarry Smith + tao - the `Tao` solver
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 
56*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
57a7e14dcfSSatish Balay @*/
58d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
59d71ae5a4SJacob Faibussowitsch {
60a7e14dcfSSatish Balay   PetscFunctionBegin;
61441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
62a7e14dcfSSatish Balay   tao->user_boundsP       = ctx;
63a7e14dcfSSatish Balay   tao->ops->computebounds = func;
647721a36fSStefano Zampini   tao->bounded            = func ? PETSC_TRUE : PETSC_FALSE;
653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
66a7e14dcfSSatish Balay }
67a7e14dcfSSatish Balay 
687721a36fSStefano Zampini /*@
6965ba42b6SBarry Smith   TaoGetVariableBounds - Gets the upper and lower bounds vectors set with `TaoSetVariableBounds()`
707721a36fSStefano Zampini 
717721a36fSStefano Zampini   Not collective
727721a36fSStefano Zampini 
737721a36fSStefano Zampini   Input Parameter:
74*47450a7bSBarry Smith . tao - the `Tao` context
757721a36fSStefano Zampini 
76d5b43468SJose E. Roman   Output Parameters:
777721a36fSStefano Zampini + XL  - vector of lower bounds
787721a36fSStefano Zampini - XU  - vector of upper bounds
797721a36fSStefano Zampini 
807721a36fSStefano Zampini   Level: beginner
817721a36fSStefano Zampini 
82*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
837721a36fSStefano Zampini @*/
84d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU)
85d71ae5a4SJacob Faibussowitsch {
86a7e14dcfSSatish Balay   PetscFunctionBegin;
87441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
887721a36fSStefano Zampini   if (XL) *XL = tao->XL;
897721a36fSStefano Zampini   if (XU) *XU = tao->XU;
903ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
91a7e14dcfSSatish Balay }
92a7e14dcfSSatish Balay 
93a7e14dcfSSatish Balay /*@C
94a7e14dcfSSatish Balay    TaoComputeVariableBounds - Compute the variable bounds using the
9565ba42b6SBarry Smith    routine set by `TaoSetVariableBoundsRoutine()`.
96a7e14dcfSSatish Balay 
97c3339decSBarry Smith    Collective
98a7e14dcfSSatish Balay 
997721a36fSStefano Zampini    Input Parameter:
100*47450a7bSBarry Smith .  tao - the `Tao` context
101a7e14dcfSSatish Balay 
102a7e14dcfSSatish Balay    Level: developer
103a7e14dcfSSatish Balay 
104*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()`
105a7e14dcfSSatish Balay @*/
106d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeVariableBounds(Tao tao)
107d71ae5a4SJacob Faibussowitsch {
108a7e14dcfSSatish Balay   PetscFunctionBegin;
109441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
11076be6f4fSStefano Zampini   if (tao->ops->computebounds) {
11176be6f4fSStefano Zampini     if (!tao->XL) {
1129566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(tao->solution, &tao->XL));
1139566063dSJacob Faibussowitsch       PetscCall(VecSet(tao->XL, PETSC_NINFINITY));
11476be6f4fSStefano Zampini     }
11576be6f4fSStefano Zampini     if (!tao->XU) {
1169566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(tao->solution, &tao->XU));
1179566063dSJacob Faibussowitsch       PetscCall(VecSet(tao->XU, PETSC_INFINITY));
118a7e14dcfSSatish Balay     }
119792fecdfSBarry Smith     PetscCallBack("Tao callback variable bounds", (*tao->ops->computebounds)(tao, tao->XL, tao->XU, tao->user_boundsP));
1207721a36fSStefano Zampini   }
1213ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
122a7e14dcfSSatish Balay }
123a7e14dcfSSatish Balay 
124a7e14dcfSSatish Balay /*@
125a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
126a7e14dcfSSatish Balay 
127c3339decSBarry Smith   Logically collective
128a7e14dcfSSatish Balay 
129a7e14dcfSSatish Balay   Input Parameters:
130*47450a7bSBarry Smith + tao - the `Tao` context
131a7e14dcfSSatish Balay . IL  - vector of lower bounds
132a7e14dcfSSatish Balay - IU  - vector of upper bounds
133a7e14dcfSSatish Balay 
134a7e14dcfSSatish Balay   Level: beginner
135a7e14dcfSSatish Balay 
136*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()`
137a7e14dcfSSatish Balay @*/
138d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
139d71ae5a4SJacob Faibussowitsch {
140a7e14dcfSSatish Balay   PetscFunctionBegin;
141441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1427721a36fSStefano Zampini   if (IL) PetscValidHeaderSpecific(IL, VEC_CLASSID, 2);
1437721a36fSStefano Zampini   if (IU) PetscValidHeaderSpecific(IU, VEC_CLASSID, 3);
1449566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IL));
1459566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IU));
1469566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IL));
1479566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IU));
148a7e14dcfSSatish Balay   tao->IL               = IL;
149a7e14dcfSSatish Balay   tao->IU               = IU;
1507721a36fSStefano Zampini   tao->ineq_doublesided = (PetscBool)(IL || IU);
1513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
152a7e14dcfSSatish Balay }
153a7e14dcfSSatish Balay 
1547721a36fSStefano Zampini /*@
15565ba42b6SBarry Smith   TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()`
1567721a36fSStefano Zampini 
157c3339decSBarry Smith   Logically collective
1587721a36fSStefano Zampini 
1597721a36fSStefano Zampini   Input Parameter:
160*47450a7bSBarry Smith . tao - the `Tao` context
1617721a36fSStefano Zampini 
1627721a36fSStefano Zampini   Output Parameters:
1637721a36fSStefano Zampini + IL  - vector of lower bounds
1647721a36fSStefano Zampini - IU  - vector of upper bounds
1657721a36fSStefano Zampini 
1667721a36fSStefano Zampini   Level: beginner
1677721a36fSStefano Zampini 
168*47450a7bSBarry Smith .seealso: [](chapter_tao), `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()`
1697721a36fSStefano Zampini @*/
170d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
171d71ae5a4SJacob Faibussowitsch {
172a7e14dcfSSatish Balay   PetscFunctionBegin;
173441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1747721a36fSStefano Zampini   if (IL) *IL = tao->IL;
1757721a36fSStefano Zampini   if (IU) *IU = tao->IU;
1763ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
177a7e14dcfSSatish Balay }
178a7e14dcfSSatish Balay 
179a7e14dcfSSatish Balay /*@C
180a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
18165ba42b6SBarry Smith    routine set by `TaoSetConstraintsRoutine()`.
182a7e14dcfSSatish Balay 
183c3339decSBarry Smith    Collective
184a7e14dcfSSatish Balay 
185a7e14dcfSSatish Balay    Input Parameters:
186*47450a7bSBarry Smith .  tao - the `Tao` context
187a7e14dcfSSatish Balay 
188a7e14dcfSSatish Balay    Level: developer
189a7e14dcfSSatish Balay 
190*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()`
191a7e14dcfSSatish Balay @*/
192d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C)
193d71ae5a4SJacob Faibussowitsch {
194a7e14dcfSSatish Balay   PetscFunctionBegin;
195441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
196a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
197064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(C, VEC_CLASSID, 3);
198a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, X, 2);
199a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, C, 3);
2009566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, C, NULL));
201792fecdfSBarry Smith   PetscCallBack("Tao callback constraints", (*tao->ops->computeconstraints)(tao, X, C, tao->user_conP));
2029566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, C, NULL));
203a7e14dcfSSatish Balay   tao->nconstraints++;
2043ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
205a7e14dcfSSatish Balay }
206a7e14dcfSSatish Balay 
207a7e14dcfSSatish Balay /*@C
20865ba42b6SBarry Smith   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
209a7e14dcfSSatish Balay 
210c3339decSBarry Smith   Logically collective
211a7e14dcfSSatish Balay 
212a7e14dcfSSatish Balay   Input Parameters:
213*47450a7bSBarry Smith + tao - the `Tao` context
214a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
215a7e14dcfSSatish Balay . func - the bounds computation routine
2166c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
217a7e14dcfSSatish Balay 
218a7e14dcfSSatish Balay   Calling sequence of func:
219441846f8SBarry Smith $      func (Tao tao, Vec x, Vec c, void *ctx);
220a7e14dcfSSatish Balay 
221*47450a7bSBarry Smith + tao - the `Tao` solver
222a7e14dcfSSatish Balay . x   - point to evaluate constraints
223*47450a7bSBarry Smith . c   - vector constraints evaluated at `x`
224a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
225a7e14dcfSSatish Balay 
226a7e14dcfSSatish Balay   Level: intermediate
227a7e14dcfSSatish Balay 
228*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()`
229a7e14dcfSSatish Balay @*/
230d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *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:
251*47450a7bSBarry 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
261a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
262a7e14dcfSSatish Balay   zeros.
263a7e14dcfSSatish Balay 
264*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()`
265a7e14dcfSSatish Balay @*/
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:
289*47450a7bSBarry 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 
297*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoComputeDualVariables()`
298a7e14dcfSSatish Balay @*/
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
30965ba42b6SBarry Smith   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
310a7e14dcfSSatish Balay 
311c3339decSBarry Smith   Logically collective
312a7e14dcfSSatish Balay 
313a7e14dcfSSatish Balay   Input Parameters:
314*47450a7bSBarry 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
3176c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
318a7e14dcfSSatish Balay 
319a7e14dcfSSatish Balay   Calling sequence of func:
320441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ce, void *ctx);
321a7e14dcfSSatish Balay 
322*47450a7bSBarry Smith + tao - the `Tao` solver
323a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
324a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
325a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
326a7e14dcfSSatish Balay 
327a7e14dcfSSatish Balay   Level: intermediate
328a7e14dcfSSatish Balay 
329*47450a7bSBarry Smith .seealso: [](chapter_tao), `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
330a7e14dcfSSatish Balay @*/
331d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
332d71ae5a4SJacob Faibussowitsch {
333a7e14dcfSSatish Balay   PetscFunctionBegin;
334441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3357721a36fSStefano Zampini   if (ce) PetscValidHeaderSpecific(ce, VEC_CLASSID, 2);
3369566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ce));
3379566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_equality));
3387721a36fSStefano Zampini   tao->eq_constrained                  = func ? PETSC_TRUE : PETSC_FALSE;
339a7e14dcfSSatish Balay   tao->constraints_equality            = ce;
340a7e14dcfSSatish Balay   tao->user_con_equalityP              = ctx;
341a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
3423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
343a7e14dcfSSatish Balay }
344a7e14dcfSSatish Balay 
345a7e14dcfSSatish Balay /*@C
34665ba42b6SBarry Smith   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
347a7e14dcfSSatish Balay 
348c3339decSBarry Smith   Logically collective
349a7e14dcfSSatish Balay 
350a7e14dcfSSatish Balay   Input Parameters:
351*47450a7bSBarry Smith + tao - the `Tao` context
352a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
353a7e14dcfSSatish Balay . func - the bounds computation routine
3546c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
355a7e14dcfSSatish Balay 
356a7e14dcfSSatish Balay   Calling sequence of func:
357441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ci, void *ctx);
358a7e14dcfSSatish Balay 
359*47450a7bSBarry 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 
366*47450a7bSBarry 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:
389*47450a7bSBarry 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 
397*47450a7bSBarry 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:
421*47450a7bSBarry 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 
429*47450a7bSBarry 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