xref: /petsc/src/tao/interface/taosolver_bounds.c (revision 76be6f4ff3bd4e251c19fc00ebbebfd58b6e7589)
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 
15db781477SPatrick 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 
53db781477SPatrick 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 
83db781477SPatrick 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 
105db781477SPatrick 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);
112*76be6f4fSStefano Zampini   if (tao->ops->computebounds) {
113*76be6f4fSStefano Zampini     if (!tao->XL) {
1149566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(tao->solution, &tao->XL));
1159566063dSJacob Faibussowitsch       PetscCall(VecSet(tao->XL, PETSC_NINFINITY));
116*76be6f4fSStefano Zampini     }
117*76be6f4fSStefano Zampini     if (!tao->XU) {
1189566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(tao->solution, &tao->XU));
1199566063dSJacob Faibussowitsch       PetscCall(VecSet(tao->XU, PETSC_INFINITY));
120a7e14dcfSSatish Balay     }
1217721a36fSStefano Zampini     PetscStackPush("Tao compute variable bounds");
1229566063dSJacob Faibussowitsch     PetscCall((*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP));
1230cbffdbaSBarry Smith     PetscStackPop;
1247721a36fSStefano Zampini   }
125a7e14dcfSSatish Balay   PetscFunctionReturn(0);
126a7e14dcfSSatish Balay }
127a7e14dcfSSatish Balay 
128a7e14dcfSSatish Balay /*@
129a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
130a7e14dcfSSatish Balay 
131441846f8SBarry Smith   Logically collective on Tao
132a7e14dcfSSatish Balay 
133a7e14dcfSSatish Balay   Input Parameters:
134441846f8SBarry Smith + tao - the Tao context
135a7e14dcfSSatish Balay . IL  - vector of lower bounds
136a7e14dcfSSatish Balay - IU  - vector of upper bounds
137a7e14dcfSSatish Balay 
138a7e14dcfSSatish Balay   Level: beginner
139a7e14dcfSSatish Balay 
140db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoGetInequalityBounds()`
141a7e14dcfSSatish Balay @*/
142441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
143a7e14dcfSSatish Balay {
144a7e14dcfSSatish Balay   PetscFunctionBegin;
145441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
1467721a36fSStefano Zampini   if (IL) PetscValidHeaderSpecific(IL,VEC_CLASSID,2);
1477721a36fSStefano Zampini   if (IU) PetscValidHeaderSpecific(IU,VEC_CLASSID,3);
1489566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IL));
1499566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)IU));
1509566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IL));
1519566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->IU));
152a7e14dcfSSatish Balay   tao->IL = IL;
153a7e14dcfSSatish Balay   tao->IU = IU;
1547721a36fSStefano Zampini   tao->ineq_doublesided = (PetscBool)(IL || IU);
155a7e14dcfSSatish Balay   PetscFunctionReturn(0);
156a7e14dcfSSatish Balay }
157a7e14dcfSSatish Balay 
1587721a36fSStefano Zampini /*@
1597721a36fSStefano Zampini   TaoGetInequalityBounds - Gets the upper and lower bounds set via TaoSetInequalityBounds
1607721a36fSStefano Zampini 
1617721a36fSStefano Zampini   Logically collective on Tao
1627721a36fSStefano Zampini 
1637721a36fSStefano Zampini   Input Parameter:
164f1a722f8SMatthew G. Knepley . tao - the Tao context
1657721a36fSStefano Zampini 
1667721a36fSStefano Zampini   Output Parameters:
1677721a36fSStefano Zampini + IL  - vector of lower bounds
1687721a36fSStefano Zampini - IU  - vector of upper bounds
1697721a36fSStefano Zampini 
1707721a36fSStefano Zampini   Level: beginner
1717721a36fSStefano Zampini 
172db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetInequalityBounds()`
1737721a36fSStefano Zampini @*/
174441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
175a7e14dcfSSatish Balay {
176a7e14dcfSSatish Balay   PetscFunctionBegin;
177441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
1787721a36fSStefano Zampini   if (IL) *IL = tao->IL;
1797721a36fSStefano Zampini   if (IU) *IU = tao->IU;
180a7e14dcfSSatish Balay   PetscFunctionReturn(0);
181a7e14dcfSSatish Balay }
182a7e14dcfSSatish Balay 
183a7e14dcfSSatish Balay /*@C
184a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
185a7e14dcfSSatish Balay    routine set by TaoSetConstraintsRoutine().
186a7e14dcfSSatish Balay 
187441846f8SBarry Smith    Collective on Tao
188a7e14dcfSSatish Balay 
189a7e14dcfSSatish Balay    Input Parameters:
190441846f8SBarry Smith .  tao - the Tao context
191a7e14dcfSSatish Balay 
192a7e14dcfSSatish Balay    Level: developer
193a7e14dcfSSatish Balay 
194db781477SPatrick Sanan .seealso: `TaoSetConstraintsRoutine()`, `TaoComputeJacobian()`
195a7e14dcfSSatish Balay @*/
196a7e14dcfSSatish Balay 
197441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C)
198a7e14dcfSSatish Balay {
199a7e14dcfSSatish Balay   PetscFunctionBegin;
200441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
201a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
202064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(C,VEC_CLASSID,3);
203a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
204a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,C,3);
2053c859ba3SBarry Smith   PetscCheck(tao->ops->computeconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called");
2069566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL));
207441846f8SBarry Smith   PetscStackPush("Tao constraints evaluation routine");
2089566063dSJacob Faibussowitsch   PetscCall((*tao->ops->computeconstraints)(tao,X,C,tao->user_conP));
209a7e14dcfSSatish Balay   PetscStackPop;
2109566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL));
211a7e14dcfSSatish Balay   tao->nconstraints++;
212a7e14dcfSSatish Balay   PetscFunctionReturn(0);
213a7e14dcfSSatish Balay }
214a7e14dcfSSatish Balay 
215a7e14dcfSSatish Balay /*@C
216a7e14dcfSSatish Balay   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
217a7e14dcfSSatish Balay 
218441846f8SBarry Smith   Logically collective on Tao
219a7e14dcfSSatish Balay 
220a7e14dcfSSatish Balay   Input Parameters:
221441846f8SBarry Smith + tao - the Tao context
222a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
223a7e14dcfSSatish Balay . func - the bounds computation routine
2246c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
225a7e14dcfSSatish Balay 
226a7e14dcfSSatish Balay   Calling sequence of func:
227441846f8SBarry Smith $      func (Tao tao, Vec x, Vec c, void *ctx);
228a7e14dcfSSatish Balay 
229441846f8SBarry Smith + tao - the Tao
230a7e14dcfSSatish Balay . x   - point to evaluate constraints
231a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
232a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
233a7e14dcfSSatish Balay 
234a7e14dcfSSatish Balay   Level: intermediate
235a7e14dcfSSatish Balay 
236db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariablevBounds()`
237a7e14dcfSSatish Balay 
238a7e14dcfSSatish Balay @*/
239441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
240a7e14dcfSSatish Balay {
241a7e14dcfSSatish Balay   PetscFunctionBegin;
242441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
2437721a36fSStefano Zampini   if (c) PetscValidHeaderSpecific(c,VEC_CLASSID,2);
2449566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)c));
2459566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints));
2467721a36fSStefano Zampini   tao->constrained = func ? PETSC_TRUE : PETSC_FALSE;
247a7e14dcfSSatish Balay   tao->constraints = c;
248a7e14dcfSSatish Balay   tao->user_conP = ctx;
249a7e14dcfSSatish Balay   tao->ops->computeconstraints = func;
250a7e14dcfSSatish Balay   PetscFunctionReturn(0);
251a7e14dcfSSatish Balay }
252a7e14dcfSSatish Balay 
253a7e14dcfSSatish Balay /*@
254a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
255a7e14dcfSSatish Balay   of the variables
256a7e14dcfSSatish Balay 
257441846f8SBarry Smith   Collective on Tao
258a7e14dcfSSatish Balay 
259f899ff85SJose E. Roman   Input Parameter:
260441846f8SBarry Smith . tao - the Tao context
261a7e14dcfSSatish Balay 
262d8d19677SJose E. Roman   Output Parameters:
263a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
264a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
265a7e14dcfSSatish Balay 
266a7e14dcfSSatish Balay   Level: advanced
267a7e14dcfSSatish Balay 
268a7e14dcfSSatish Balay   Note:
269a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
270a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
271a7e14dcfSSatish Balay   zeros.
272a7e14dcfSSatish Balay 
273a7e14dcfSSatish Balay   Level: advanced
274a7e14dcfSSatish Balay 
275db781477SPatrick Sanan .seealso: `TaoComputeObjective()`, `TaoSetVariableBounds()`
276a7e14dcfSSatish Balay @*/
277441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU)
278a7e14dcfSSatish Balay {
279a7e14dcfSSatish Balay   PetscFunctionBegin;
280441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
281a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DL,VEC_CLASSID,2);
282064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(DU,VEC_CLASSID,3);
283a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DL,2);
284a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DU,3);
285a7e14dcfSSatish Balay   if (tao->ops->computedual) {
2869566063dSJacob Faibussowitsch     PetscCall((*tao->ops->computedual)(tao,DL,DU));
287a7e14dcfSSatish Balay   } else {
2889566063dSJacob Faibussowitsch     PetscCall(VecSet(DL,0.0));
2899566063dSJacob Faibussowitsch     PetscCall(VecSet(DU,0.0));
290a7e14dcfSSatish Balay   }
291a7e14dcfSSatish Balay   PetscFunctionReturn(0);
292a7e14dcfSSatish Balay }
293a7e14dcfSSatish Balay 
294a7e14dcfSSatish Balay /*@
295a7e14dcfSSatish Balay   TaoGetDualVariables - Gets pointers to the dual vectors
296a7e14dcfSSatish Balay 
297441846f8SBarry Smith   Collective on Tao
298a7e14dcfSSatish Balay 
299f899ff85SJose E. Roman   Input Parameter:
300441846f8SBarry Smith . tao - the Tao context
301a7e14dcfSSatish Balay 
302d8d19677SJose E. Roman   Output Parameters:
303a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
304a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
305a7e14dcfSSatish Balay 
306a7e14dcfSSatish Balay   Level: advanced
307a7e14dcfSSatish Balay 
308db781477SPatrick Sanan .seealso: `TaoComputeDualVariables()`
309a7e14dcfSSatish Balay @*/
310441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI)
311a7e14dcfSSatish Balay {
312a7e14dcfSSatish Balay   PetscFunctionBegin;
313441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
3147721a36fSStefano Zampini   if (DE) *DE = tao->DE;
3157721a36fSStefano Zampini   if (DI) *DI = tao->DI;
316a7e14dcfSSatish Balay   PetscFunctionReturn(0);
317a7e14dcfSSatish Balay }
318a7e14dcfSSatish Balay 
319a7e14dcfSSatish Balay /*@C
320a7e14dcfSSatish Balay   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
321a7e14dcfSSatish Balay 
322441846f8SBarry Smith   Logically collective on Tao
323a7e14dcfSSatish Balay 
324a7e14dcfSSatish Balay   Input Parameters:
325441846f8SBarry Smith + tao - the Tao context
326a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
327a7e14dcfSSatish Balay . func - the bounds computation routine
3286c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
329a7e14dcfSSatish Balay 
330a7e14dcfSSatish Balay   Calling sequence of func:
331441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ce, void *ctx);
332a7e14dcfSSatish Balay 
333441846f8SBarry Smith + tao - the Tao
334a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
335a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
336a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
337a7e14dcfSSatish Balay 
338a7e14dcfSSatish Balay   Level: intermediate
339a7e14dcfSSatish Balay 
340db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
341a7e14dcfSSatish Balay 
342a7e14dcfSSatish Balay @*/
343441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
344a7e14dcfSSatish Balay {
345a7e14dcfSSatish Balay   PetscFunctionBegin;
346441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
3477721a36fSStefano Zampini   if (ce) PetscValidHeaderSpecific(ce,VEC_CLASSID,2);
3489566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ce));
3499566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_equality));
3507721a36fSStefano Zampini   tao->eq_constrained = func ? PETSC_TRUE : PETSC_FALSE;
351a7e14dcfSSatish Balay   tao->constraints_equality = ce;
352a7e14dcfSSatish Balay   tao->user_con_equalityP = ctx;
353a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
354a7e14dcfSSatish Balay   PetscFunctionReturn(0);
355a7e14dcfSSatish Balay }
356a7e14dcfSSatish Balay 
357a7e14dcfSSatish Balay /*@C
358a7e14dcfSSatish Balay   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
359a7e14dcfSSatish Balay 
360441846f8SBarry Smith   Logically collective on Tao
361a7e14dcfSSatish Balay 
362a7e14dcfSSatish Balay   Input Parameters:
363441846f8SBarry Smith + tao - the Tao context
364a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
365a7e14dcfSSatish Balay . func - the bounds computation routine
3666c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
367a7e14dcfSSatish Balay 
368a7e14dcfSSatish Balay   Calling sequence of func:
369441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ci, void *ctx);
370a7e14dcfSSatish Balay 
371441846f8SBarry Smith + tao - the Tao
372a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
373a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
374a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
375a7e14dcfSSatish Balay 
376a7e14dcfSSatish Balay   Level: intermediate
377a7e14dcfSSatish Balay 
378db781477SPatrick Sanan .seealso: `TaoSetObjective()`, `TaoSetHessian()`, `TaoSetObjectiveAndGradient()`, `TaoSetVariableBounds()`
379a7e14dcfSSatish Balay 
380a7e14dcfSSatish Balay @*/
381441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
382a7e14dcfSSatish Balay {
383a7e14dcfSSatish Balay   PetscFunctionBegin;
384441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
3857721a36fSStefano Zampini   if (ci) PetscValidHeaderSpecific(ci,VEC_CLASSID,2);
3869566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)ci));
3879566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&tao->constraints_inequality));
388a7e14dcfSSatish Balay   tao->constraints_inequality = ci;
3897721a36fSStefano Zampini   tao->ineq_constrained = func ? PETSC_TRUE : PETSC_FALSE;
390a7e14dcfSSatish Balay   tao->user_con_inequalityP = ctx;
391a7e14dcfSSatish Balay   tao->ops->computeinequalityconstraints = func;
392a7e14dcfSSatish Balay   PetscFunctionReturn(0);
393a7e14dcfSSatish Balay }
394a7e14dcfSSatish Balay 
395a7e14dcfSSatish Balay /*@C
396a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
397a7e14dcfSSatish Balay    routine set by TaoSetEqualityConstraintsRoutine().
398a7e14dcfSSatish Balay 
399441846f8SBarry Smith    Collective on Tao
400a7e14dcfSSatish Balay 
401a7e14dcfSSatish Balay    Input Parameters:
402441846f8SBarry Smith .  tao - the Tao context
403a7e14dcfSSatish Balay 
404a7e14dcfSSatish Balay    Level: developer
405a7e14dcfSSatish Balay 
406db781477SPatrick Sanan .seealso: `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`
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));
419441846f8SBarry Smith   PetscStackPush("Tao equality constraints evaluation routine");
4209566063dSJacob Faibussowitsch   PetscCall((*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP));
421a7e14dcfSSatish Balay   PetscStackPop;
4229566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL));
423a7e14dcfSSatish Balay   tao->nconstraints++;
424a7e14dcfSSatish Balay   PetscFunctionReturn(0);
425a7e14dcfSSatish Balay }
426a7e14dcfSSatish Balay 
427a7e14dcfSSatish Balay /*@C
428a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
429a7e14dcfSSatish Balay    routine set by TaoSetInequalityConstraintsRoutine().
430a7e14dcfSSatish Balay 
431441846f8SBarry Smith    Collective on Tao
432a7e14dcfSSatish Balay 
433a7e14dcfSSatish Balay    Input Parameters:
434441846f8SBarry Smith .  tao - the Tao context
435a7e14dcfSSatish Balay 
436a7e14dcfSSatish Balay    Level: developer
437a7e14dcfSSatish Balay 
438db781477SPatrick Sanan .seealso: `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`
439a7e14dcfSSatish Balay @*/
440a7e14dcfSSatish Balay 
441441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
442a7e14dcfSSatish Balay {
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);
4493c859ba3SBarry Smith   PetscCheck(tao->ops->computeinequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
4509566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL));
451441846f8SBarry Smith   PetscStackPush("Tao inequality constraints evaluation routine");
4529566063dSJacob Faibussowitsch   PetscCall((*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP));
453a7e14dcfSSatish Balay   PetscStackPop;
4549566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL));
455a7e14dcfSSatish Balay   tao->nconstraints++;
456a7e14dcfSSatish Balay   PetscFunctionReturn(0);
457a7e14dcfSSatish Balay }
458