xref: /petsc/src/tao/interface/taosolver_bounds.c (revision 65ba42b6ab3ec006bc8f22d89b4121d18fc8be1b)
1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay /*@
4*65ba42b6SBarry Smith   TaoSetVariableBounds - Sets the upper and lower bounds for the optimization problem
5a7e14dcfSSatish Balay 
6*65ba42b6SBarry 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*65ba42b6SBarry 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
34*65ba42b6SBarry Smith   TaoSetVariableBoundsRoutine - Sets a function to be used to compute lower and upper variable bounds for the optimization
35a7e14dcfSSatish Balay 
36*65ba42b6SBarry 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*65ba42b6SBarry Smith   Note:
54*65ba42b6SBarry Smith   The func passed to `TaoSetVariableBoundsRoutine()` takes precedence over any values set in `TaoSetVariableBounds()`.
55a7e14dcfSSatish Balay 
56*65ba42b6SBarry 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 /*@
70*65ba42b6SBarry 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 
83*65ba42b6SBarry 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
96*65ba42b6SBarry Smith    routine set by `TaoSetVariableBoundsRoutine()`.
97a7e14dcfSSatish Balay 
98*65ba42b6SBarry 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*65ba42b6SBarry 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     }
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 
131*65ba42b6SBarry 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 
140*65ba42b6SBarry Smith .seealso: `Tao`, `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 /*@
159*65ba42b6SBarry Smith   TaoGetInequalityBounds - Gets the upper and lower bounds set via `TaoSetInequalityBounds()`
1607721a36fSStefano Zampini 
161*65ba42b6SBarry Smith   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
185*65ba42b6SBarry Smith    routine set by `TaoSetConstraintsRoutine()`.
186a7e14dcfSSatish Balay 
187*65ba42b6SBarry Smith    Collective on tao
188a7e14dcfSSatish Balay 
189a7e14dcfSSatish Balay    Input Parameters:
190441846f8SBarry Smith .  tao - the Tao context
191a7e14dcfSSatish Balay 
192a7e14dcfSSatish Balay    Level: developer
193a7e14dcfSSatish Balay 
194*65ba42b6SBarry Smith .seealso: `Tao`, `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
216*65ba42b6SBarry Smith   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
217a7e14dcfSSatish Balay 
218*65ba42b6SBarry 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 
236*65ba42b6SBarry Smith .seealso: `Tao`, `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 
257*65ba42b6SBarry 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 
275*65ba42b6SBarry Smith  .seealso: `Tao`, `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 /*@
295*65ba42b6SBarry Smith   TaoGetDualVariables - Gets the dual vectors
296a7e14dcfSSatish Balay 
297*65ba42b6SBarry 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 
308*65ba42b6SBarry Smith .seealso: `Tao`, `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
320*65ba42b6SBarry Smith   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
321a7e14dcfSSatish Balay 
322*65ba42b6SBarry 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 
340*65ba42b6SBarry Smith .seealso: `Tao`, `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
358*65ba42b6SBarry Smith   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  Tao only handles constraints under certain conditions, see manual for details
359a7e14dcfSSatish Balay 
360*65ba42b6SBarry 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 
378*65ba42b6SBarry Smith  .seealso: `Tao, `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
397*65ba42b6SBarry Smith    routine set by `TaoSetEqualityConstraintsRoutine()`.
398a7e14dcfSSatish Balay 
399*65ba42b6SBarry Smith    Collective on tao
400a7e14dcfSSatish Balay 
401*65ba42b6SBarry Smith    Input Parameter:
402441846f8SBarry Smith .  tao - the Tao context
403a7e14dcfSSatish Balay 
404*65ba42b6SBarry Smith    Output Parameters:
405*65ba42b6SBarry Smith +  X - point the equality constraints were evaluted on
406*65ba42b6SBarry Smith -  CE   - vector of equality constraints evaluated at X
407*65ba42b6SBarry Smith 
408a7e14dcfSSatish Balay    Level: developer
409a7e14dcfSSatish Balay 
410*65ba42b6SBarry Smith .seealso: `Tao`, `TaoSetEqualityConstraintsRoutine()`, `TaoComputeJacobianEquality()`, `TaoComputeInequalityConstraints()`
411a7e14dcfSSatish Balay @*/
412a7e14dcfSSatish Balay 
413441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
414a7e14dcfSSatish Balay {
415a7e14dcfSSatish Balay   PetscFunctionBegin;
416441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
417a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
418064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CE,VEC_CLASSID,3);
419a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
420a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CE,3);
4213c859ba3SBarry Smith   PetscCheck(tao->ops->computeequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called");
4229566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL));
423441846f8SBarry Smith   PetscStackPush("Tao equality constraints evaluation routine");
4249566063dSJacob Faibussowitsch   PetscCall((*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP));
425a7e14dcfSSatish Balay   PetscStackPop;
4269566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL));
427a7e14dcfSSatish Balay   tao->nconstraints++;
428a7e14dcfSSatish Balay   PetscFunctionReturn(0);
429a7e14dcfSSatish Balay }
430a7e14dcfSSatish Balay 
431a7e14dcfSSatish Balay /*@C
432a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
433*65ba42b6SBarry Smith    routine set by `TaoSetInequalityConstraintsRoutine()`.
434a7e14dcfSSatish Balay 
435*65ba42b6SBarry Smith    Collective on tao
436a7e14dcfSSatish Balay 
437*65ba42b6SBarry Smith    Input Parameter:
438441846f8SBarry Smith .  tao - the Tao context
439a7e14dcfSSatish Balay 
440*65ba42b6SBarry Smith    Output Parameters:
441*65ba42b6SBarry Smith +  X - point the inequality constraints were evaluted on
442*65ba42b6SBarry Smith -  CE   - vector of inequality constraints evaluated at X
443*65ba42b6SBarry Smith 
444a7e14dcfSSatish Balay    Level: developer
445a7e14dcfSSatish Balay 
446*65ba42b6SBarry Smith .seealso: `Tao`, `TaoSetInequalityConstraintsRoutine()`, `TaoComputeJacobianInequality()`, `TaoComputeEqualityConstraints()`
447a7e14dcfSSatish Balay @*/
448a7e14dcfSSatish Balay 
449441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
450a7e14dcfSSatish Balay {
451a7e14dcfSSatish Balay   PetscFunctionBegin;
452441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
453a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
454064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CI,VEC_CLASSID,3);
455a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
456a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CI,3);
4573c859ba3SBarry Smith   PetscCheck(tao->ops->computeinequalityconstraints,PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
4589566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL));
459441846f8SBarry Smith   PetscStackPush("Tao inequality constraints evaluation routine");
4609566063dSJacob Faibussowitsch   PetscCall((*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP));
461a7e14dcfSSatish Balay   PetscStackPop;
4629566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL));
463a7e14dcfSSatish Balay   tao->nconstraints++;
464a7e14dcfSSatish Balay   PetscFunctionReturn(0);
465a7e14dcfSSatish Balay }
466