xref: /petsc/src/tao/interface/taosolver_bounds.c (revision db7814771ca77b190574494e87b584e981451db0)
1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay /*@
4a7e14dcfSSatish Balay   TaoSetVariableBounds - Sets the upper and lower bounds
5a7e14dcfSSatish Balay 
6441846f8SBarry 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 
15*db781477SPatrick Sanan .seealso: `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
34a7e14dcfSSatish Balay   TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds
35a7e14dcfSSatish Balay 
36441846f8SBarry 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 
53*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
54a7e14dcfSSatish Balay 
55a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes
56a7e14dcfSSatish Balay precedence over any values set in 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 /*@
707721a36fSStefano Zampini   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 
83*db781477SPatrick Sanan .seealso: `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
96a7e14dcfSSatish Balay    routine set by TaoSetVariableBoundsRoutine().
97a7e14dcfSSatish Balay 
98441846f8SBarry Smith    Collective on Tao
99a7e14dcfSSatish Balay 
1007721a36fSStefano Zampini    Input Parameter:
101441846f8SBarry Smith .  tao - the Tao context
102a7e14dcfSSatish Balay 
103a7e14dcfSSatish Balay    Level: developer
104a7e14dcfSSatish Balay 
105*db781477SPatrick Sanan .seealso: `TaoSetVariableBoundsRoutine()`, `TaoSetVariableBounds()`
106a7e14dcfSSatish Balay @*/
107a7e14dcfSSatish Balay 
108441846f8SBarry Smith PetscErrorCode TaoComputeVariableBounds(Tao tao)
109a7e14dcfSSatish Balay {
110a7e14dcfSSatish Balay   PetscFunctionBegin;
111441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
11287f595a5SBarry Smith   if (!tao->XL || !tao->XU) {
1133c859ba3SBarry Smith     PetscCheck(tao->solution,PetscObjectComm((PetscObject)tao),PETSC_ERR_ORDER,"TaoSetSolution must be called before TaoComputeVariableBounds");
1149566063dSJacob Faibussowitsch     PetscCall(VecDuplicate(tao->solution, &tao->XL));
1159566063dSJacob Faibussowitsch     PetscCall(VecSet(tao->XL, PETSC_NINFINITY));
1169566063dSJacob Faibussowitsch     PetscCall(VecDuplicate(tao->solution, &tao->XU));
1179566063dSJacob Faibussowitsch     PetscCall(VecSet(tao->XU, PETSC_INFINITY));
118a7e14dcfSSatish Balay   }
1192b97c8d8SAlp Dener   if (tao->ops->computebounds) {
1207721a36fSStefano Zampini     PetscStackPush("Tao compute variable bounds");
1219566063dSJacob Faibussowitsch     PetscCall((*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP));
1220cbffdbaSBarry Smith     PetscStackPop;
1237721a36fSStefano Zampini   }
124a7e14dcfSSatish Balay   PetscFunctionReturn(0);
125a7e14dcfSSatish Balay }
126a7e14dcfSSatish Balay 
127a7e14dcfSSatish Balay /*@
128a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
129a7e14dcfSSatish Balay 
130441846f8SBarry Smith   Logically collective on Tao
131a7e14dcfSSatish Balay 
132a7e14dcfSSatish Balay   Input Parameters:
133441846f8SBarry Smith + tao - the Tao context
134a7e14dcfSSatish Balay . IL  - vector of lower bounds
135a7e14dcfSSatish Balay - IU  - vector of upper bounds
136a7e14dcfSSatish Balay 
137a7e14dcfSSatish Balay   Level: beginner
138a7e14dcfSSatish Balay 
139*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()`
140a7e14dcfSSatish Balay @*/
141441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
142a7e14dcfSSatish Balay {
143a7e14dcfSSatish Balay   PetscFunctionBegin;
144441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
1457721a36fSStefano Zampini   if (IL) PetscValidHeaderSpecific(IL,VEC_CLASSID,2);
1467721a36fSStefano Zampini   if (IU) PetscValidHeaderSpecific(IU,VEC_CLASSID,3);
1479566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IL));
1489566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IU));
1499566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IL));
1509566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IU));
151a7e14dcfSSatish Balay   tao->IL = IL;
152a7e14dcfSSatish Balay   tao->IU = IU;
1537721a36fSStefano Zampini   tao->ineq_doublesided = (PetscBool)(IL || IU);
154a7e14dcfSSatish Balay   PetscFunctionReturn(0);
155a7e14dcfSSatish Balay }
156a7e14dcfSSatish Balay 
1577721a36fSStefano Zampini /*@
1587721a36fSStefano Zampini   TaoGetInequalityBounds - Gets the upper and lower bounds set via TaoSetInequalityBounds
1597721a36fSStefano Zampini 
1607721a36fSStefano Zampini   Logically collective on Tao
1617721a36fSStefano Zampini 
1627721a36fSStefano Zampini   Input Parameter:
163f1a722f8SMatthew G. Knepley . tao - the Tao context
1647721a36fSStefano Zampini 
1657721a36fSStefano Zampini   Output Parameters:
1667721a36fSStefano Zampini + IL  - vector of lower bounds
1677721a36fSStefano Zampini - IU  - vector of upper bounds
1687721a36fSStefano Zampini 
1697721a36fSStefano Zampini   Level: beginner
1707721a36fSStefano Zampini 
171*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()`
1727721a36fSStefano Zampini @*/
173441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
174a7e14dcfSSatish Balay {
175a7e14dcfSSatish Balay   PetscFunctionBegin;
176441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
1777721a36fSStefano Zampini   if (IL) *IL = tao->IL;
1787721a36fSStefano Zampini   if (IU) *IU = tao->IU;
179a7e14dcfSSatish Balay   PetscFunctionReturn(0);
180a7e14dcfSSatish Balay }
181a7e14dcfSSatish Balay 
182a7e14dcfSSatish Balay /*@C
183a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
184a7e14dcfSSatish Balay    routine set by TaoSetConstraintsRoutine().
185a7e14dcfSSatish Balay 
186441846f8SBarry Smith    Collective on Tao
187a7e14dcfSSatish Balay 
188a7e14dcfSSatish Balay    Input Parameters:
189441846f8SBarry Smith .  tao - the Tao context
190a7e14dcfSSatish Balay 
191a7e14dcfSSatish Balay    Level: developer
192a7e14dcfSSatish Balay 
193*db781477SPatrick Sanan .seealso: `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()`
194a7e14dcfSSatish Balay @*/
195a7e14dcfSSatish Balay 
196441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C)
197a7e14dcfSSatish Balay {
198a7e14dcfSSatish Balay   PetscFunctionBegin;
199441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
200a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
201064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(C,VEC_CLASSID,3);
202a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
203a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,C,3);
2043c859ba3SBarry Smith   PetscCheck(tao->ops->computeconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called");
2059566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL));
206441846f8SBarry Smith   PetscStackPush("Tao constraints evaluation routine");
2079566063dSJacob Faibussowitsch   PetscCall((*tao->ops->computeconstraints)(tao,X,C,tao->user_conP));
208a7e14dcfSSatish Balay   PetscStackPop;
2099566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL));
210a7e14dcfSSatish Balay   tao->nconstraints++;
211a7e14dcfSSatish Balay   PetscFunctionReturn(0);
212a7e14dcfSSatish Balay }
213a7e14dcfSSatish Balay 
214a7e14dcfSSatish Balay /*@C
215a7e14dcfSSatish Balay   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
216a7e14dcfSSatish Balay 
217441846f8SBarry Smith   Logically collective on Tao
218a7e14dcfSSatish Balay 
219a7e14dcfSSatish Balay   Input Parameters:
220441846f8SBarry Smith + tao - the Tao context
221a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
222a7e14dcfSSatish Balay . func - the bounds computation routine
2236c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
224a7e14dcfSSatish Balay 
225a7e14dcfSSatish Balay   Calling sequence of func:
226441846f8SBarry Smith $      func (Tao tao, Vec x, Vec c, void *ctx);
227a7e14dcfSSatish Balay 
228441846f8SBarry Smith + tao - the Tao
229a7e14dcfSSatish Balay . x   - point to evaluate constraints
230a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
231a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
232a7e14dcfSSatish Balay 
233a7e14dcfSSatish Balay   Level: intermediate
234a7e14dcfSSatish Balay 
235*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()`
236a7e14dcfSSatish Balay 
237a7e14dcfSSatish Balay @*/
238441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
239a7e14dcfSSatish Balay {
240a7e14dcfSSatish Balay   PetscFunctionBegin;
241441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
2427721a36fSStefano Zampini   if (c) PetscValidHeaderSpecific(c,VEC_CLASSID,2);
2439566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)c));
2449566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints));
2457721a36fSStefano Zampini   tao->constrained = func ? PETSC_TRUE : PETSC_FALSE;
246a7e14dcfSSatish Balay   tao->constraints = c;
247a7e14dcfSSatish Balay   tao->user_conP = ctx;
248a7e14dcfSSatish Balay   tao->ops->computeconstraints = func;
249a7e14dcfSSatish Balay   PetscFunctionReturn(0);
250a7e14dcfSSatish Balay }
251a7e14dcfSSatish Balay 
252a7e14dcfSSatish Balay /*@
253a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
254a7e14dcfSSatish Balay   of the variables
255a7e14dcfSSatish Balay 
256441846f8SBarry Smith   Collective on Tao
257a7e14dcfSSatish Balay 
258f899ff85SJose E. Roman   Input Parameter:
259441846f8SBarry Smith . tao - the Tao context
260a7e14dcfSSatish Balay 
261d8d19677SJose E. Roman   Output Parameters:
262a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
263a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
264a7e14dcfSSatish Balay 
265a7e14dcfSSatish Balay   Level: advanced
266a7e14dcfSSatish Balay 
267a7e14dcfSSatish Balay   Note:
268a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
269a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
270a7e14dcfSSatish Balay   zeros.
271a7e14dcfSSatish Balay 
272a7e14dcfSSatish Balay   Level: advanced
273a7e14dcfSSatish Balay 
274*db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoSetVariableBounds()`
275a7e14dcfSSatish Balay @*/
276441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU)
277a7e14dcfSSatish Balay {
278a7e14dcfSSatish Balay   PetscFunctionBegin;
279441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
280a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DL,VEC_CLASSID,2);
281064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(DU,VEC_CLASSID,3);
282a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DL,2);
283a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DU,3);
284a7e14dcfSSatish Balay   if (tao->ops->computedual) {
2859566063dSJacob Faibussowitsch     PetscCall((*tao->ops->computedual)(tao,DL,DU));
286a7e14dcfSSatish Balay   } else {
2879566063dSJacob Faibussowitsch     PetscCall(VecSet(DL,0.0));
2889566063dSJacob Faibussowitsch     PetscCall(VecSet(DU,0.0));
289a7e14dcfSSatish Balay   }
290a7e14dcfSSatish Balay   PetscFunctionReturn(0);
291a7e14dcfSSatish Balay }
292a7e14dcfSSatish Balay 
293a7e14dcfSSatish Balay /*@
294a7e14dcfSSatish Balay   TaoGetDualVariables - Gets pointers to the dual vectors
295a7e14dcfSSatish Balay 
296441846f8SBarry Smith   Collective on Tao
297a7e14dcfSSatish Balay 
298f899ff85SJose E. Roman   Input Parameter:
299441846f8SBarry Smith . tao - the Tao context
300a7e14dcfSSatish Balay 
301d8d19677SJose E. Roman   Output Parameters:
302a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
303a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
304a7e14dcfSSatish Balay 
305a7e14dcfSSatish Balay   Level: advanced
306a7e14dcfSSatish Balay 
307*db781477SPatrick Sanan .seealso: `TaoComputeDualVariables()`
308a7e14dcfSSatish Balay @*/
309441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI)
310a7e14dcfSSatish Balay {
311a7e14dcfSSatish Balay   PetscFunctionBegin;
312441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
3137721a36fSStefano Zampini   if (DE) *DE = tao->DE;
3147721a36fSStefano Zampini   if (DI) *DI = tao->DI;
315a7e14dcfSSatish Balay   PetscFunctionReturn(0);
316a7e14dcfSSatish Balay }
317a7e14dcfSSatish Balay 
318a7e14dcfSSatish Balay /*@C
319a7e14dcfSSatish Balay   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
320a7e14dcfSSatish Balay 
321441846f8SBarry Smith   Logically collective on Tao
322a7e14dcfSSatish Balay 
323a7e14dcfSSatish Balay   Input Parameters:
324441846f8SBarry Smith + tao - the Tao context
325a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
326a7e14dcfSSatish Balay . func - the bounds computation routine
3276c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
328a7e14dcfSSatish Balay 
329a7e14dcfSSatish Balay   Calling sequence of func:
330441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ce, void *ctx);
331a7e14dcfSSatish Balay 
332441846f8SBarry Smith + tao - the Tao
333a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
334a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
335a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
336a7e14dcfSSatish Balay 
337a7e14dcfSSatish Balay   Level: intermediate
338a7e14dcfSSatish Balay 
339*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
340a7e14dcfSSatish Balay 
341a7e14dcfSSatish Balay @*/
342441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
343a7e14dcfSSatish Balay {
344a7e14dcfSSatish Balay   PetscFunctionBegin;
345441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
3467721a36fSStefano Zampini   if (ce) PetscValidHeaderSpecific(ce,VEC_CLASSID,2);
3479566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ce));
3489566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_equality));
3497721a36fSStefano Zampini   tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE;
350a7e14dcfSSatish Balay   tao->constraints_equality = ce;
351a7e14dcfSSatish Balay   tao->user_con_equalityP = ctx;
352a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
353a7e14dcfSSatish Balay   PetscFunctionReturn(0);
354a7e14dcfSSatish Balay }
355a7e14dcfSSatish Balay 
356a7e14dcfSSatish Balay /*@C
357a7e14dcfSSatish Balay   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
358a7e14dcfSSatish Balay 
359441846f8SBarry Smith   Logically collective on Tao
360a7e14dcfSSatish Balay 
361a7e14dcfSSatish Balay   Input Parameters:
362441846f8SBarry Smith + tao - the Tao context
363a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
364a7e14dcfSSatish Balay . func - the bounds computation routine
3656c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
366a7e14dcfSSatish Balay 
367a7e14dcfSSatish Balay   Calling sequence of func:
368441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ci, void *ctx);
369a7e14dcfSSatish Balay 
370441846f8SBarry Smith + tao - the Tao
371a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
372a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
373a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
374a7e14dcfSSatish Balay 
375a7e14dcfSSatish Balay   Level: intermediate
376a7e14dcfSSatish Balay 
377*db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
378a7e14dcfSSatish Balay 
379a7e14dcfSSatish Balay @*/
380441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
381a7e14dcfSSatish Balay {
382a7e14dcfSSatish Balay   PetscFunctionBegin;
383441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
3847721a36fSStefano Zampini   if (ci) PetscValidHeaderSpecific(ci,VEC_CLASSID,2);
3859566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ci));
3869566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_inequality));
387a7e14dcfSSatish Balay   tao->constraints_inequality = ci;
3887721a36fSStefano Zampini   tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE;
389a7e14dcfSSatish Balay   tao->user_con_inequalityP = ctx;
390a7e14dcfSSatish Balay   tao->ops->computeinequalityconstraints = func;
391a7e14dcfSSatish Balay   PetscFunctionReturn(0);
392a7e14dcfSSatish Balay }
393a7e14dcfSSatish Balay 
394a7e14dcfSSatish Balay /*@C
395a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
396a7e14dcfSSatish Balay    routine set by TaoSetEqualityConstraintsRoutine().
397a7e14dcfSSatish Balay 
398441846f8SBarry Smith    Collective on Tao
399a7e14dcfSSatish Balay 
400a7e14dcfSSatish Balay    Input Parameters:
401441846f8SBarry Smith .  tao - the Tao context
402a7e14dcfSSatish Balay 
403a7e14dcfSSatish Balay    Level: developer
404a7e14dcfSSatish Balay 
405*db781477SPatrick Sanan .seealso: `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`
406a7e14dcfSSatish Balay @*/
407a7e14dcfSSatish Balay 
408441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
409a7e14dcfSSatish Balay {
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);
4163c859ba3SBarry Smith   PetscCheck(tao->ops->computeequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called");
4179566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL));
418441846f8SBarry Smith   PetscStackPush("Tao equality constraints evaluation routine");
4199566063dSJacob Faibussowitsch   PetscCall((*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP));
420a7e14dcfSSatish Balay   PetscStackPop;
4219566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL));
422a7e14dcfSSatish Balay   tao->nconstraints++;
423a7e14dcfSSatish Balay   PetscFunctionReturn(0);
424a7e14dcfSSatish Balay }
425a7e14dcfSSatish Balay 
426a7e14dcfSSatish Balay /*@C
427a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
428a7e14dcfSSatish Balay    routine set by TaoSetInequalityConstraintsRoutine().
429a7e14dcfSSatish Balay 
430441846f8SBarry Smith    Collective on Tao
431a7e14dcfSSatish Balay 
432a7e14dcfSSatish Balay    Input Parameters:
433441846f8SBarry Smith .  tao - the Tao context
434a7e14dcfSSatish Balay 
435a7e14dcfSSatish Balay    Level: developer
436a7e14dcfSSatish Balay 
437*db781477SPatrick Sanan .seealso: `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`
438a7e14dcfSSatish Balay @*/
439a7e14dcfSSatish Balay 
440441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
441a7e14dcfSSatish Balay {
442a7e14dcfSSatish Balay   PetscFunctionBegin;
443441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
444a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
445064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CI,VEC_CLASSID,3);
446a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
447a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CI,3);
4483c859ba3SBarry Smith   PetscCheck(tao->ops->computeinequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
4499566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL));
450441846f8SBarry Smith   PetscStackPush("Tao inequality constraints evaluation routine");
4519566063dSJacob Faibussowitsch   PetscCall((*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP));
452a7e14dcfSSatish Balay   PetscStackPop;
4539566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL));
454a7e14dcfSSatish Balay   tao->nconstraints++;
455a7e14dcfSSatish Balay   PetscFunctionReturn(0);
456a7e14dcfSSatish Balay }
457