xref: /petsc/src/tao/interface/taosolver_bounds.c (revision d5b43468fb8780a8feea140ccd6fa3e6a50411cc)
1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay /*@
465ba42b6SBarry Smith   TaoSetVariableBounds - Sets the upper and lower bounds for the optimization problem
5a7e14dcfSSatish Balay 
665ba42b6SBarry Smith   Logically collective on tao
7a7e14dcfSSatish Balay 
8a7e14dcfSSatish Balay   Input Parameters:
9441846f8SBarry Smith + tao - the Tao context
10a7e14dcfSSatish Balay . XL  - vector of lower bounds
11a7e14dcfSSatish Balay - XU  - vector of upper bounds
12a7e14dcfSSatish Balay 
13a7e14dcfSSatish Balay   Level: beginner
14a7e14dcfSSatish Balay 
1565ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetVariableBounds()`
16a7e14dcfSSatish Balay @*/
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);
30a7e14dcfSSatish Balay   PetscFunctionReturn(0);
31a7e14dcfSSatish Balay }
3245cf516eSBarry Smith 
33a7e14dcfSSatish Balay /*@C
3465ba42b6SBarry Smith   TaoSetVariableBoundsRoutine - Sets a function to be used to compute lower and upper variable bounds for the optimization
35a7e14dcfSSatish Balay 
3665ba42b6SBarry Smith   Logically collective on tao
37a7e14dcfSSatish Balay 
38a7e14dcfSSatish Balay   Input Parameters:
39441846f8SBarry Smith + tao - the Tao context
40a7e14dcfSSatish Balay . func - the bounds computation routine
416c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be NULL)
42a7e14dcfSSatish Balay 
43a7e14dcfSSatish Balay   Calling sequence of func:
44441846f8SBarry Smith $      func (Tao tao, Vec xl, Vec xu);
45a7e14dcfSSatish Balay 
46441846f8SBarry Smith + tao - the Tao
47a7e14dcfSSatish Balay . xl  - vector of lower bounds
48a7e14dcfSSatish Balay . xu  - vector of upper bounds
49a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
50a7e14dcfSSatish Balay 
51a7e14dcfSSatish Balay   Level: beginner
52a7e14dcfSSatish Balay 
5365ba42b6SBarry Smith   Note:
5465ba42b6SBarry Smith   The func passed to `TaoSetVariableBoundsRoutine()` takes precedence over any values set in `TaoSetVariableBounds()`.
55a7e14dcfSSatish Balay 
5665ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
57a7e14dcfSSatish Balay 
58a7e14dcfSSatish Balay @*/
59d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
60d71ae5a4SJacob Faibussowitsch {
61a7e14dcfSSatish Balay   PetscFunctionBegin;
62441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
63a7e14dcfSSatish Balay   tao->user_boundsP       = ctx;
64a7e14dcfSSatish Balay   tao->ops->computebounds = func;
657721a36fSStefano Zampini   tao->bounded            = func ? PETSC_TRUE : PETSC_FALSE;
66a7e14dcfSSatish Balay   PetscFunctionReturn(0);
67a7e14dcfSSatish Balay }
68a7e14dcfSSatish Balay 
697721a36fSStefano Zampini /*@
7065ba42b6SBarry Smith   TaoGetVariableBounds - Gets the upper and lower bounds vectors set with `TaoSetVariableBounds()`
717721a36fSStefano Zampini 
727721a36fSStefano Zampini   Not collective
737721a36fSStefano Zampini 
747721a36fSStefano Zampini   Input Parameter:
757721a36fSStefano Zampini . tao - the Tao context
767721a36fSStefano Zampini 
77*d5b43468SJose E. Roman   Output Parameters:
787721a36fSStefano Zampini + XL  - vector of lower bounds
797721a36fSStefano Zampini - XU  - vector of upper bounds
807721a36fSStefano Zampini 
817721a36fSStefano Zampini   Level: beginner
827721a36fSStefano Zampini 
8365ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
847721a36fSStefano Zampini @*/
85d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU)
86d71ae5a4SJacob Faibussowitsch {
87a7e14dcfSSatish Balay   PetscFunctionBegin;
88441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
897721a36fSStefano Zampini   if (XL) *XL = tao->XL;
907721a36fSStefano Zampini   if (XU) *XU = tao->XU;
91a7e14dcfSSatish Balay   PetscFunctionReturn(0);
92a7e14dcfSSatish Balay }
93a7e14dcfSSatish Balay 
94a7e14dcfSSatish Balay /*@C
95a7e14dcfSSatish Balay    TaoComputeVariableBounds - Compute the variable bounds using the
9665ba42b6SBarry Smith    routine set by `TaoSetVariableBoundsRoutine()`.
97a7e14dcfSSatish Balay 
9865ba42b6SBarry Smith    Collective on tao
99a7e14dcfSSatish Balay 
1007721a36fSStefano Zampini    Input Parameter:
101441846f8SBarry Smith .  tao - the Tao context
102a7e14dcfSSatish Balay 
103a7e14dcfSSatish Balay    Level: developer
104a7e14dcfSSatish Balay 
10565ba42b6SBarry Smith .seealso: `Tao`, `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()`
106a7e14dcfSSatish Balay @*/
107a7e14dcfSSatish Balay 
108d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeVariableBounds(Tao tao)
109d71ae5a4SJacob Faibussowitsch {
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     }
121792fecdfSBarry Smith     PetscCallBack("Tao callback variable bounds", (*tao->ops->computebounds)(tao, tao->XL, tao->XU, tao->user_boundsP));
1227721a36fSStefano Zampini   }
123a7e14dcfSSatish Balay   PetscFunctionReturn(0);
124a7e14dcfSSatish Balay }
125a7e14dcfSSatish Balay 
126a7e14dcfSSatish Balay /*@
127a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
128a7e14dcfSSatish Balay 
12965ba42b6SBarry Smith   Logically collective on tao
130a7e14dcfSSatish Balay 
131a7e14dcfSSatish Balay   Input Parameters:
132441846f8SBarry Smith + tao - the Tao context
133a7e14dcfSSatish Balay . IL  - vector of lower bounds
134a7e14dcfSSatish Balay - IU  - vector of upper bounds
135a7e14dcfSSatish Balay 
136a7e14dcfSSatish Balay   Level: beginner
137a7e14dcfSSatish Balay 
13865ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()`
139a7e14dcfSSatish Balay @*/
140d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
141d71ae5a4SJacob Faibussowitsch {
142a7e14dcfSSatish Balay   PetscFunctionBegin;
143441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1447721a36fSStefano Zampini   if (IL) PetscValidHeaderSpecific(IL, VEC_CLASSID, 2);
1457721a36fSStefano Zampini   if (IU) PetscValidHeaderSpecific(IU, VEC_CLASSID, 3);
1469566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IL));
1479566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IU));
1489566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IL));
1499566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IU));
150a7e14dcfSSatish Balay   tao->IL               = IL;
151a7e14dcfSSatish Balay   tao->IU               = IU;
1527721a36fSStefano Zampini   tao->ineq_doublesided = (PetscBool)(IL || IU);
153a7e14dcfSSatish Balay   PetscFunctionReturn(0);
154a7e14dcfSSatish Balay }
155a7e14dcfSSatish Balay 
1567721a36fSStefano Zampini /*@
15765ba42b6SBarry Smith   TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()`
1587721a36fSStefano Zampini 
15965ba42b6SBarry Smith   Logically collective on tao
1607721a36fSStefano Zampini 
1617721a36fSStefano Zampini   Input Parameter:
162f1a722f8SMatthew G. Knepley . tao - the Tao context
1637721a36fSStefano Zampini 
1647721a36fSStefano Zampini   Output Parameters:
1657721a36fSStefano Zampini + IL  - vector of lower bounds
1667721a36fSStefano Zampini - IU  - vector of upper bounds
1677721a36fSStefano Zampini 
1687721a36fSStefano Zampini   Level: beginner
1697721a36fSStefano Zampini 
170db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()`
1717721a36fSStefano Zampini @*/
172d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
173d71ae5a4SJacob Faibussowitsch {
174a7e14dcfSSatish Balay   PetscFunctionBegin;
175441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1767721a36fSStefano Zampini   if (IL) *IL = tao->IL;
1777721a36fSStefano Zampini   if (IU) *IU = tao->IU;
178a7e14dcfSSatish Balay   PetscFunctionReturn(0);
179a7e14dcfSSatish Balay }
180a7e14dcfSSatish Balay 
181a7e14dcfSSatish Balay /*@C
182a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
18365ba42b6SBarry Smith    routine set by `TaoSetConstraintsRoutine()`.
184a7e14dcfSSatish Balay 
18565ba42b6SBarry Smith    Collective on tao
186a7e14dcfSSatish Balay 
187a7e14dcfSSatish Balay    Input Parameters:
188441846f8SBarry Smith .  tao - the Tao context
189a7e14dcfSSatish Balay 
190a7e14dcfSSatish Balay    Level: developer
191a7e14dcfSSatish Balay 
19265ba42b6SBarry Smith .seealso: `Tao`, `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()`
193a7e14dcfSSatish Balay @*/
194a7e14dcfSSatish Balay 
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++;
207a7e14dcfSSatish Balay   PetscFunctionReturn(0);
208a7e14dcfSSatish Balay }
209a7e14dcfSSatish Balay 
210a7e14dcfSSatish Balay /*@C
21165ba42b6SBarry Smith   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
212a7e14dcfSSatish Balay 
21365ba42b6SBarry Smith   Logically collective on tao
214a7e14dcfSSatish Balay 
215a7e14dcfSSatish Balay   Input Parameters:
216441846f8SBarry 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
2196c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
220a7e14dcfSSatish Balay 
221a7e14dcfSSatish Balay   Calling sequence of func:
222441846f8SBarry Smith $      func (Tao tao, Vec x, Vec c, void *ctx);
223a7e14dcfSSatish Balay 
224441846f8SBarry Smith + tao - the Tao
225a7e14dcfSSatish Balay . x   - point to evaluate constraints
226a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
227a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
228a7e14dcfSSatish Balay 
229a7e14dcfSSatish Balay   Level: intermediate
230a7e14dcfSSatish Balay 
23165ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()`
232a7e14dcfSSatish Balay 
233a7e14dcfSSatish Balay @*/
234d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
235d71ae5a4SJacob Faibussowitsch {
236a7e14dcfSSatish Balay   PetscFunctionBegin;
237441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
2387721a36fSStefano Zampini   if (c) PetscValidHeaderSpecific(c, VEC_CLASSID, 2);
2399566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)c));
2409566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints));
2417721a36fSStefano Zampini   tao->constrained             = func ? PETSC_TRUE : PETSC_FALSE;
242a7e14dcfSSatish Balay   tao->constraints             = c;
243a7e14dcfSSatish Balay   tao->user_conP               = ctx;
244a7e14dcfSSatish Balay   tao->ops->computeconstraints = func;
245a7e14dcfSSatish Balay   PetscFunctionReturn(0);
246a7e14dcfSSatish Balay }
247a7e14dcfSSatish Balay 
248a7e14dcfSSatish Balay /*@
249a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
250a7e14dcfSSatish Balay   of the variables
251a7e14dcfSSatish Balay 
25265ba42b6SBarry Smith   Collective on tao
253a7e14dcfSSatish Balay 
254f899ff85SJose E. Roman   Input Parameter:
255441846f8SBarry Smith . tao - the Tao context
256a7e14dcfSSatish Balay 
257d8d19677SJose E. Roman   Output Parameters:
258a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
259a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
260a7e14dcfSSatish Balay 
261a7e14dcfSSatish Balay   Level: advanced
262a7e14dcfSSatish Balay 
263a7e14dcfSSatish Balay   Note:
264a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
265a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
266a7e14dcfSSatish Balay   zeros.
267a7e14dcfSSatish Balay 
268a7e14dcfSSatish Balay   Level: advanced
269a7e14dcfSSatish Balay 
27065ba42b6SBarry Smith  .seealso: `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()`
271a7e14dcfSSatish Balay @*/
272d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU)
273d71ae5a4SJacob Faibussowitsch {
274a7e14dcfSSatish Balay   PetscFunctionBegin;
275441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
276a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DL, VEC_CLASSID, 2);
277064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(DU, VEC_CLASSID, 3);
278a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, DL, 2);
279a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, DU, 3);
280a7e14dcfSSatish Balay   if (tao->ops->computedual) {
281dbbe0bcdSBarry Smith     PetscUseTypeMethod(tao, computedual, DL, DU);
282a7e14dcfSSatish Balay   } else {
2839566063dSJacob Faibussowitsch     PetscCall(VecSet(DL, 0.0));
2849566063dSJacob Faibussowitsch     PetscCall(VecSet(DU, 0.0));
285a7e14dcfSSatish Balay   }
286a7e14dcfSSatish Balay   PetscFunctionReturn(0);
287a7e14dcfSSatish Balay }
288a7e14dcfSSatish Balay 
289a7e14dcfSSatish Balay /*@
29065ba42b6SBarry Smith   TaoGetDualVariables - Gets the dual vectors
291a7e14dcfSSatish Balay 
29265ba42b6SBarry Smith   Collective on tao
293a7e14dcfSSatish Balay 
294f899ff85SJose E. Roman   Input Parameter:
295441846f8SBarry Smith . tao - the Tao context
296a7e14dcfSSatish Balay 
297d8d19677SJose E. Roman   Output Parameters:
298a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
299a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
300a7e14dcfSSatish Balay 
301a7e14dcfSSatish Balay   Level: advanced
302a7e14dcfSSatish Balay 
30365ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeDualVariables()`
304a7e14dcfSSatish Balay @*/
305d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI)
306d71ae5a4SJacob Faibussowitsch {
307a7e14dcfSSatish Balay   PetscFunctionBegin;
308441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3097721a36fSStefano Zampini   if (DE) *DE = tao->DE;
3107721a36fSStefano Zampini   if (DI) *DI = tao->DI;
311a7e14dcfSSatish Balay   PetscFunctionReturn(0);
312a7e14dcfSSatish Balay }
313a7e14dcfSSatish Balay 
314a7e14dcfSSatish Balay /*@C
31565ba42b6SBarry Smith   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
316a7e14dcfSSatish Balay 
31765ba42b6SBarry Smith   Logically collective on tao
318a7e14dcfSSatish Balay 
319a7e14dcfSSatish Balay   Input Parameters:
320441846f8SBarry Smith + tao - the Tao context
321a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
322a7e14dcfSSatish Balay . func - the bounds computation routine
3236c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
324a7e14dcfSSatish Balay 
325a7e14dcfSSatish Balay   Calling sequence of func:
326441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ce, void *ctx);
327a7e14dcfSSatish Balay 
328441846f8SBarry Smith + tao - the Tao
329a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
330a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
331a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
332a7e14dcfSSatish Balay 
333a7e14dcfSSatish Balay   Level: intermediate
334a7e14dcfSSatish Balay 
33565ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
336a7e14dcfSSatish Balay 
337a7e14dcfSSatish Balay @*/
338d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
339d71ae5a4SJacob Faibussowitsch {
340a7e14dcfSSatish Balay   PetscFunctionBegin;
341441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3427721a36fSStefano Zampini   if (ce) PetscValidHeaderSpecific(ce, VEC_CLASSID, 2);
3439566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ce));
3449566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_equality));
3457721a36fSStefano Zampini   tao->eq_constrained                  = func ? PETSC_TRUE : PETSC_FALSE;
346a7e14dcfSSatish Balay   tao->constraints_equality            = ce;
347a7e14dcfSSatish Balay   tao->user_con_equalityP              = ctx;
348a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
349a7e14dcfSSatish Balay   PetscFunctionReturn(0);
350a7e14dcfSSatish Balay }
351a7e14dcfSSatish Balay 
352a7e14dcfSSatish Balay /*@C
35365ba42b6SBarry Smith   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
354a7e14dcfSSatish Balay 
35565ba42b6SBarry Smith   Logically collective on tao
356a7e14dcfSSatish Balay 
357a7e14dcfSSatish Balay   Input Parameters:
358441846f8SBarry Smith + tao - the Tao context
359a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
360a7e14dcfSSatish Balay . func - the bounds computation routine
3616c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
362a7e14dcfSSatish Balay 
363a7e14dcfSSatish Balay   Calling sequence of func:
364441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ci, void *ctx);
365a7e14dcfSSatish Balay 
366441846f8SBarry Smith + tao - the Tao
367a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
368a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
369a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
370a7e14dcfSSatish Balay 
371a7e14dcfSSatish Balay   Level: intermediate
372a7e14dcfSSatish Balay 
37365ba42b6SBarry Smith  .seealso: `Tao, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
374a7e14dcfSSatish Balay 
375a7e14dcfSSatish Balay @*/
376d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
377d71ae5a4SJacob Faibussowitsch {
378a7e14dcfSSatish Balay   PetscFunctionBegin;
379441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3807721a36fSStefano Zampini   if (ci) PetscValidHeaderSpecific(ci, VEC_CLASSID, 2);
3819566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ci));
3829566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_inequality));
383a7e14dcfSSatish Balay   tao->constraints_inequality            = ci;
3847721a36fSStefano Zampini   tao->ineq_constrained                  = func ? PETSC_TRUE : PETSC_FALSE;
385a7e14dcfSSatish Balay   tao->user_con_inequalityP              = ctx;
386a7e14dcfSSatish Balay   tao->ops->computeinequalityconstraints = func;
387a7e14dcfSSatish Balay   PetscFunctionReturn(0);
388a7e14dcfSSatish Balay }
389a7e14dcfSSatish Balay 
390a7e14dcfSSatish Balay /*@C
391a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
39265ba42b6SBarry Smith    routine set by `TaoSetEqualityConstraintsRoutine()`.
393a7e14dcfSSatish Balay 
39465ba42b6SBarry Smith    Collective on tao
395a7e14dcfSSatish Balay 
39665ba42b6SBarry Smith    Input Parameter:
397441846f8SBarry Smith .  tao - the Tao context
398a7e14dcfSSatish Balay 
39965ba42b6SBarry Smith    Output Parameters:
40065ba42b6SBarry Smith +  X - point the equality constraints were evaluted on
40165ba42b6SBarry Smith -  CE   - vector of equality constraints evaluated at X
40265ba42b6SBarry Smith 
403a7e14dcfSSatish Balay    Level: developer
404a7e14dcfSSatish Balay 
40565ba42b6SBarry Smith .seealso: `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()`
406a7e14dcfSSatish Balay @*/
407a7e14dcfSSatish Balay 
408d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
409d71ae5a4SJacob Faibussowitsch {
410a7e14dcfSSatish Balay   PetscFunctionBegin;
411441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
412a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
413064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CE, VEC_CLASSID, 3);
414a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, X, 2);
415a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, CE, 3);
4169566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CE, NULL));
417792fecdfSBarry Smith   PetscCallBack("Tao callback equality constraints", (*tao->ops->computeequalityconstraints)(tao, X, CE, tao->user_con_equalityP));
4189566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CE, NULL));
419a7e14dcfSSatish Balay   tao->nconstraints++;
420a7e14dcfSSatish Balay   PetscFunctionReturn(0);
421a7e14dcfSSatish Balay }
422a7e14dcfSSatish Balay 
423a7e14dcfSSatish Balay /*@C
424a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
42565ba42b6SBarry Smith    routine set by `TaoSetInequalityConstraintsRoutine()`.
426a7e14dcfSSatish Balay 
42765ba42b6SBarry Smith    Collective on tao
428a7e14dcfSSatish Balay 
42965ba42b6SBarry Smith    Input Parameter:
430441846f8SBarry Smith .  tao - the Tao context
431a7e14dcfSSatish Balay 
43265ba42b6SBarry Smith    Output Parameters:
43365ba42b6SBarry Smith +  X - point the inequality constraints were evaluted on
43465ba42b6SBarry Smith -  CE   - vector of inequality constraints evaluated at X
43565ba42b6SBarry Smith 
436a7e14dcfSSatish Balay    Level: developer
437a7e14dcfSSatish Balay 
43865ba42b6SBarry Smith .seealso: `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()`
439a7e14dcfSSatish Balay @*/
440a7e14dcfSSatish Balay 
441d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
442d71ae5a4SJacob Faibussowitsch {
443a7e14dcfSSatish Balay   PetscFunctionBegin;
444441846f8SBarry Smith   PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
445a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X, VEC_CLASSID, 2);
446064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CI, VEC_CLASSID, 3);
447a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, X, 2);
448a7e14dcfSSatish Balay   PetscCheckSameComm(tao, 1, CI, 3);
4499566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval, tao, X, CI, NULL));
450792fecdfSBarry Smith   PetscCallBack("Tao callback inequality constraints", (*tao->ops->computeinequalityconstraints)(tao, X, CI, tao->user_con_inequalityP));
4519566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval, tao, X, CI, NULL));
452a7e14dcfSSatish Balay   tao->nconstraints++;
453a7e14dcfSSatish Balay   PetscFunctionReturn(0);
454a7e14dcfSSatish Balay }
455