xref: /petsc/src/tao/interface/taosolver_bounds.c (revision 792fecdfe9134cce4d631112660ddd34f063bc17)
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 @*/
17441846f8SBarry Smith PetscErrorCode TaoSetVariableBounds(Tao tao, Vec XL, Vec XU)
18a7e14dcfSSatish Balay {
19a7e14dcfSSatish Balay   PetscFunctionBegin;
20441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
217721a36fSStefano Zampini   if (XL) PetscValidHeaderSpecific(XL,VEC_CLASSID,2);
227721a36fSStefano Zampini   if (XU) PetscValidHeaderSpecific(XU,VEC_CLASSID,3);
239566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)XL));
249566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)XU));
259566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->XL));
269566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->XU));
27a7e14dcfSSatish Balay   tao->XL = XL;
28a7e14dcfSSatish Balay   tao->XU = XU;
297721a36fSStefano Zampini   tao->bounded = (PetscBool)(XL || XU);
30a7e14dcfSSatish Balay   PetscFunctionReturn(0);
31a7e14dcfSSatish Balay }
3245cf516eSBarry Smith 
33a7e14dcfSSatish Balay /*@C
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 @*/
59441846f8SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
60a7e14dcfSSatish Balay {
61a7e14dcfSSatish Balay   PetscFunctionBegin;
62441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
63a7e14dcfSSatish Balay   tao->user_boundsP = ctx;
64a7e14dcfSSatish Balay   tao->ops->computebounds = func;
657721a36fSStefano Zampini   tao->bounded = func ? PETSC_TRUE : PETSC_FALSE;
66a7e14dcfSSatish Balay   PetscFunctionReturn(0);
67a7e14dcfSSatish Balay }
68a7e14dcfSSatish Balay 
697721a36fSStefano Zampini /*@
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 
777721a36fSStefano Zampini   Output Parametrs:
787721a36fSStefano Zampini + XL  - vector of lower bounds
797721a36fSStefano Zampini - XU  - vector of upper bounds
807721a36fSStefano Zampini 
817721a36fSStefano Zampini   Level: beginner
827721a36fSStefano Zampini 
8365ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
847721a36fSStefano Zampini @*/
85441846f8SBarry Smith PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU)
86a7e14dcfSSatish Balay {
87a7e14dcfSSatish Balay   PetscFunctionBegin;
88441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
897721a36fSStefano Zampini   if (XL) *XL = tao->XL;
907721a36fSStefano Zampini   if (XU) *XU = tao->XU;
91a7e14dcfSSatish Balay   PetscFunctionReturn(0);
92a7e14dcfSSatish Balay }
93a7e14dcfSSatish Balay 
94a7e14dcfSSatish Balay /*@C
95a7e14dcfSSatish Balay    TaoComputeVariableBounds - Compute the variable bounds using the
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 
108441846f8SBarry Smith PetscErrorCode TaoComputeVariableBounds(Tao tao)
109a7e14dcfSSatish Balay {
110a7e14dcfSSatish Balay   PetscFunctionBegin;
111441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
11276be6f4fSStefano Zampini   if (tao->ops->computebounds) {
11376be6f4fSStefano Zampini     if (!tao->XL) {
1149566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(tao->solution, &tao->XL));
1159566063dSJacob Faibussowitsch       PetscCall(VecSet(tao->XL, PETSC_NINFINITY));
11676be6f4fSStefano Zampini     }
11776be6f4fSStefano Zampini     if (!tao->XU) {
1189566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(tao->solution, &tao->XU));
1199566063dSJacob Faibussowitsch       PetscCall(VecSet(tao->XU, PETSC_INFINITY));
120a7e14dcfSSatish Balay     }
121*792fecdfSBarry 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 @*/
140441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
141a7e14dcfSSatish Balay {
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 @*/
172441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
173a7e14dcfSSatish Balay {
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 
195441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C)
196a7e14dcfSSatish Balay {
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);
2033c859ba3SBarry Smith   PetscCheck(tao->ops->computeconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called");
2049566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL));
205*792fecdfSBarry Smith   PetscCallBack("Tao callback constraints",(*tao->ops->computeconstraints)(tao,X,C,tao->user_conP));
2069566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL));
207a7e14dcfSSatish Balay   tao->nconstraints++;
208a7e14dcfSSatish Balay   PetscFunctionReturn(0);
209a7e14dcfSSatish Balay }
210a7e14dcfSSatish Balay 
211a7e14dcfSSatish Balay /*@C
21265ba42b6SBarry Smith   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
213a7e14dcfSSatish Balay 
21465ba42b6SBarry Smith   Logically collective on tao
215a7e14dcfSSatish Balay 
216a7e14dcfSSatish Balay   Input Parameters:
217441846f8SBarry Smith + tao - the Tao context
218a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
219a7e14dcfSSatish Balay . func - the bounds computation routine
2206c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
221a7e14dcfSSatish Balay 
222a7e14dcfSSatish Balay   Calling sequence of func:
223441846f8SBarry Smith $      func (Tao tao, Vec x, Vec c, void *ctx);
224a7e14dcfSSatish Balay 
225441846f8SBarry Smith + tao - the Tao
226a7e14dcfSSatish Balay . x   - point to evaluate constraints
227a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
228a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
229a7e14dcfSSatish Balay 
230a7e14dcfSSatish Balay   Level: intermediate
231a7e14dcfSSatish Balay 
23265ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()`
233a7e14dcfSSatish Balay 
234a7e14dcfSSatish Balay @*/
235441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
236a7e14dcfSSatish Balay {
237a7e14dcfSSatish Balay   PetscFunctionBegin;
238441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
2397721a36fSStefano Zampini   if (c) PetscValidHeaderSpecific(c,VEC_CLASSID,2);
2409566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)c));
2419566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints));
2427721a36fSStefano Zampini   tao->constrained = func ? PETSC_TRUE : PETSC_FALSE;
243a7e14dcfSSatish Balay   tao->constraints = c;
244a7e14dcfSSatish Balay   tao->user_conP = ctx;
245a7e14dcfSSatish Balay   tao->ops->computeconstraints = func;
246a7e14dcfSSatish Balay   PetscFunctionReturn(0);
247a7e14dcfSSatish Balay }
248a7e14dcfSSatish Balay 
249a7e14dcfSSatish Balay /*@
250a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
251a7e14dcfSSatish Balay   of the variables
252a7e14dcfSSatish Balay 
25365ba42b6SBarry Smith   Collective on tao
254a7e14dcfSSatish Balay 
255f899ff85SJose E. Roman   Input Parameter:
256441846f8SBarry Smith . tao - the Tao context
257a7e14dcfSSatish Balay 
258d8d19677SJose E. Roman   Output Parameters:
259a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
260a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
261a7e14dcfSSatish Balay 
262a7e14dcfSSatish Balay   Level: advanced
263a7e14dcfSSatish Balay 
264a7e14dcfSSatish Balay   Note:
265a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
266a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
267a7e14dcfSSatish Balay   zeros.
268a7e14dcfSSatish Balay 
269a7e14dcfSSatish Balay   Level: advanced
270a7e14dcfSSatish Balay 
27165ba42b6SBarry Smith  .seealso: `Tao`, `TaoComputeObjective()`, `TaoSetVariableBounds()`
272a7e14dcfSSatish Balay @*/
273441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU)
274a7e14dcfSSatish Balay {
275a7e14dcfSSatish Balay   PetscFunctionBegin;
276441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
277a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DL,VEC_CLASSID,2);
278064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(DU,VEC_CLASSID,3);
279a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DL,2);
280a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DU,3);
281a7e14dcfSSatish Balay   if (tao->ops->computedual) {
2829566063dSJacob Faibussowitsch     PetscCall((*tao->ops->computedual)(tao,DL,DU));
283a7e14dcfSSatish Balay   } else {
2849566063dSJacob Faibussowitsch     PetscCall(VecSet(DL,0.0));
2859566063dSJacob Faibussowitsch     PetscCall(VecSet(DU,0.0));
286a7e14dcfSSatish Balay   }
287a7e14dcfSSatish Balay   PetscFunctionReturn(0);
288a7e14dcfSSatish Balay }
289a7e14dcfSSatish Balay 
290a7e14dcfSSatish Balay /*@
29165ba42b6SBarry Smith   TaoGetDualVariables - Gets the dual vectors
292a7e14dcfSSatish Balay 
29365ba42b6SBarry Smith   Collective on tao
294a7e14dcfSSatish Balay 
295f899ff85SJose E. Roman   Input Parameter:
296441846f8SBarry Smith . tao - the Tao context
297a7e14dcfSSatish Balay 
298d8d19677SJose E. Roman   Output Parameters:
299a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
300a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
301a7e14dcfSSatish Balay 
302a7e14dcfSSatish Balay   Level: advanced
303a7e14dcfSSatish Balay 
30465ba42b6SBarry Smith .seealso: `Tao`, `TaoComputeDualVariables()`
305a7e14dcfSSatish Balay @*/
306441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI)
307a7e14dcfSSatish Balay {
308a7e14dcfSSatish Balay   PetscFunctionBegin;
309441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
3107721a36fSStefano Zampini   if (DE) *DE = tao->DE;
3117721a36fSStefano Zampini   if (DI) *DI = tao->DI;
312a7e14dcfSSatish Balay   PetscFunctionReturn(0);
313a7e14dcfSSatish Balay }
314a7e14dcfSSatish Balay 
315a7e14dcfSSatish Balay /*@C
31665ba42b6SBarry Smith   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
317a7e14dcfSSatish Balay 
31865ba42b6SBarry Smith   Logically collective on tao
319a7e14dcfSSatish Balay 
320a7e14dcfSSatish Balay   Input Parameters:
321441846f8SBarry Smith + tao - the Tao context
322a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
323a7e14dcfSSatish Balay . func - the bounds computation routine
3246c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
325a7e14dcfSSatish Balay 
326a7e14dcfSSatish Balay   Calling sequence of func:
327441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ce, void *ctx);
328a7e14dcfSSatish Balay 
329441846f8SBarry Smith + tao - the Tao
330a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
331a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
332a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
333a7e14dcfSSatish Balay 
334a7e14dcfSSatish Balay   Level: intermediate
335a7e14dcfSSatish Balay 
33665ba42b6SBarry Smith .seealso: `Tao`, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
337a7e14dcfSSatish Balay 
338a7e14dcfSSatish Balay @*/
339441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
340a7e14dcfSSatish Balay {
341a7e14dcfSSatish Balay   PetscFunctionBegin;
342441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
3437721a36fSStefano Zampini   if (ce) PetscValidHeaderSpecific(ce,VEC_CLASSID,2);
3449566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ce));
3459566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_equality));
3467721a36fSStefano Zampini   tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE;
347a7e14dcfSSatish Balay   tao->constraints_equality = ce;
348a7e14dcfSSatish Balay   tao->user_con_equalityP = ctx;
349a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
350a7e14dcfSSatish Balay   PetscFunctionReturn(0);
351a7e14dcfSSatish Balay }
352a7e14dcfSSatish Balay 
353a7e14dcfSSatish Balay /*@C
35465ba42b6SBarry Smith   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
355a7e14dcfSSatish Balay 
35665ba42b6SBarry Smith   Logically collective on tao
357a7e14dcfSSatish Balay 
358a7e14dcfSSatish Balay   Input Parameters:
359441846f8SBarry Smith + tao - the Tao context
360a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
361a7e14dcfSSatish Balay . func - the bounds computation routine
3626c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
363a7e14dcfSSatish Balay 
364a7e14dcfSSatish Balay   Calling sequence of func:
365441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ci, void *ctx);
366a7e14dcfSSatish Balay 
367441846f8SBarry Smith + tao - the Tao
368a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
369a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
370a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
371a7e14dcfSSatish Balay 
372a7e14dcfSSatish Balay   Level: intermediate
373a7e14dcfSSatish Balay 
37465ba42b6SBarry Smith  .seealso: `Tao, `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
375a7e14dcfSSatish Balay 
376a7e14dcfSSatish Balay @*/
377441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
378a7e14dcfSSatish Balay {
379a7e14dcfSSatish Balay   PetscFunctionBegin;
380441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
3817721a36fSStefano Zampini   if (ci) PetscValidHeaderSpecific(ci,VEC_CLASSID,2);
3829566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ci));
3839566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_inequality));
384a7e14dcfSSatish Balay   tao->constraints_inequality = ci;
3857721a36fSStefano Zampini   tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE;
386a7e14dcfSSatish Balay   tao->user_con_inequalityP = ctx;
387a7e14dcfSSatish Balay   tao->ops->computeinequalityconstraints = func;
388a7e14dcfSSatish Balay   PetscFunctionReturn(0);
389a7e14dcfSSatish Balay }
390a7e14dcfSSatish Balay 
391a7e14dcfSSatish Balay /*@C
392a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
39365ba42b6SBarry Smith    routine set by `TaoSetEqualityConstraintsRoutine()`.
394a7e14dcfSSatish Balay 
39565ba42b6SBarry Smith    Collective on tao
396a7e14dcfSSatish Balay 
39765ba42b6SBarry Smith    Input Parameter:
398441846f8SBarry Smith .  tao - the Tao context
399a7e14dcfSSatish Balay 
40065ba42b6SBarry Smith    Output Parameters:
40165ba42b6SBarry Smith +  X - point the equality constraints were evaluted on
40265ba42b6SBarry Smith -  CE   - vector of equality constraints evaluated at X
40365ba42b6SBarry Smith 
404a7e14dcfSSatish Balay    Level: developer
405a7e14dcfSSatish Balay 
40665ba42b6SBarry Smith .seealso: `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()`
407a7e14dcfSSatish Balay @*/
408a7e14dcfSSatish Balay 
409441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
410a7e14dcfSSatish Balay {
411a7e14dcfSSatish Balay   PetscFunctionBegin;
412441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
413a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
414064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CE,VEC_CLASSID,3);
415a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
416a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CE,3);
4173c859ba3SBarry Smith   PetscCheck(tao->ops->computeequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called");
4189566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL));
419*792fecdfSBarry Smith   PetscCallBack("Tao callback equality constraints",(*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP));
4209566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL));
421a7e14dcfSSatish Balay   tao->nconstraints++;
422a7e14dcfSSatish Balay   PetscFunctionReturn(0);
423a7e14dcfSSatish Balay }
424a7e14dcfSSatish Balay 
425a7e14dcfSSatish Balay /*@C
426a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
42765ba42b6SBarry Smith    routine set by `TaoSetInequalityConstraintsRoutine()`.
428a7e14dcfSSatish Balay 
42965ba42b6SBarry Smith    Collective on tao
430a7e14dcfSSatish Balay 
43165ba42b6SBarry Smith    Input Parameter:
432441846f8SBarry Smith .  tao - the Tao context
433a7e14dcfSSatish Balay 
43465ba42b6SBarry Smith    Output Parameters:
43565ba42b6SBarry Smith +  X - point the inequality constraints were evaluted on
43665ba42b6SBarry Smith -  CE   - vector of inequality constraints evaluated at X
43765ba42b6SBarry Smith 
438a7e14dcfSSatish Balay    Level: developer
439a7e14dcfSSatish Balay 
44065ba42b6SBarry Smith .seealso: `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()`
441a7e14dcfSSatish Balay @*/
442a7e14dcfSSatish Balay 
443441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
444a7e14dcfSSatish Balay {
445a7e14dcfSSatish Balay   PetscFunctionBegin;
446441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
447a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
448064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CI,VEC_CLASSID,3);
449a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
450a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CI,3);
4513c859ba3SBarry Smith   PetscCheck(tao->ops->computeinequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
4529566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL));
453*792fecdfSBarry Smith   PetscCallBack("Tao callback inequality constraints",(*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP));
4549566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL));
455a7e14dcfSSatish Balay   tao->nconstraints++;
456a7e14dcfSSatish Balay   PetscFunctionReturn(0);
457a7e14dcfSSatish Balay }
458