xref: /petsc/src/tao/interface/taosolver_bounds.c (revision d8d19677bbccf95218448bee62e6b87f4513e133)
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 
15a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
16a7e14dcfSSatish Balay @*/
17a7e14dcfSSatish Balay 
18441846f8SBarry Smith PetscErrorCode TaoSetVariableBounds(Tao tao, Vec XL, Vec XU)
19a7e14dcfSSatish Balay {
20a7e14dcfSSatish Balay   PetscErrorCode ierr;
215ca45b2bSBarry Smith 
22a7e14dcfSSatish Balay   PetscFunctionBegin;
23441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
24a7e14dcfSSatish Balay   if (XL) {
25a7e14dcfSSatish Balay     PetscValidHeaderSpecific(XL,VEC_CLASSID,2);
26a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)XL);
27a7e14dcfSSatish Balay   }
28a7e14dcfSSatish Balay   if (XU) {
29a7e14dcfSSatish Balay     PetscValidHeaderSpecific(XU,VEC_CLASSID,3);
30a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)XU);
31a7e14dcfSSatish Balay   }
32a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->XL);CHKERRQ(ierr);
33a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->XU);CHKERRQ(ierr);
34a7e14dcfSSatish Balay   tao->XL = XL;
35a7e14dcfSSatish Balay   tao->XU = XU;
36cd929ea3SAlp Dener   tao->bounded = PETSC_TRUE;
37a7e14dcfSSatish Balay   PetscFunctionReturn(0);
38a7e14dcfSSatish Balay }
3945cf516eSBarry Smith 
40a7e14dcfSSatish Balay /*@C
41a7e14dcfSSatish Balay   TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds
42a7e14dcfSSatish Balay 
43441846f8SBarry Smith   Logically collective on Tao
44a7e14dcfSSatish Balay 
45a7e14dcfSSatish Balay   Input Parameters:
46441846f8SBarry Smith + tao - the Tao context
47a7e14dcfSSatish Balay . func - the bounds computation routine
486c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the bounds computation (may be NULL)
49a7e14dcfSSatish Balay 
50a7e14dcfSSatish Balay   Calling sequence of func:
51441846f8SBarry Smith $      func (Tao tao, Vec xl, Vec xu);
52a7e14dcfSSatish Balay 
53441846f8SBarry Smith + tao - the Tao
54a7e14dcfSSatish Balay . xl  - vector of lower bounds
55a7e14dcfSSatish Balay . xu  - vector of upper bounds
56a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
57a7e14dcfSSatish Balay 
58a7e14dcfSSatish Balay   Level: beginner
59a7e14dcfSSatish Balay 
60a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
61a7e14dcfSSatish Balay 
62a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes
63a7e14dcfSSatish Balay precedence over any values set in TaoSetVariableBounds().
64a7e14dcfSSatish Balay 
65a7e14dcfSSatish Balay @*/
66441846f8SBarry Smith PetscErrorCode TaoSetVariableBoundsRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
67a7e14dcfSSatish Balay {
68a7e14dcfSSatish Balay   PetscFunctionBegin;
69441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
70a7e14dcfSSatish Balay   tao->user_boundsP = ctx;
71a7e14dcfSSatish Balay   tao->ops->computebounds = func;
72cd929ea3SAlp Dener   tao->bounded = PETSC_TRUE;
73a7e14dcfSSatish Balay   PetscFunctionReturn(0);
74a7e14dcfSSatish Balay }
75a7e14dcfSSatish Balay 
76441846f8SBarry Smith PetscErrorCode TaoGetVariableBounds(Tao tao, Vec *XL, Vec *XU)
77a7e14dcfSSatish Balay {
78a7e14dcfSSatish Balay   PetscFunctionBegin;
79441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
80a7e14dcfSSatish Balay   if (XL) {
81a7e14dcfSSatish Balay     *XL=tao->XL;
82a7e14dcfSSatish Balay   }
83a7e14dcfSSatish Balay   if (XU) {
84a7e14dcfSSatish Balay     *XU=tao->XU;
85a7e14dcfSSatish Balay   }
86a7e14dcfSSatish Balay   PetscFunctionReturn(0);
87a7e14dcfSSatish Balay }
88a7e14dcfSSatish Balay 
89a7e14dcfSSatish Balay /*@C
90a7e14dcfSSatish Balay    TaoComputeVariableBounds - Compute the variable bounds using the
91a7e14dcfSSatish Balay    routine set by TaoSetVariableBoundsRoutine().
92a7e14dcfSSatish Balay 
93441846f8SBarry Smith    Collective on Tao
94a7e14dcfSSatish Balay 
95a7e14dcfSSatish Balay    Input Parameters:
96441846f8SBarry Smith .  tao - the Tao context
97a7e14dcfSSatish Balay 
98a7e14dcfSSatish Balay    Level: developer
99a7e14dcfSSatish Balay 
100a7e14dcfSSatish Balay .seealso: TaoSetVariableBoundsRoutine(), TaoSetVariableBounds()
101a7e14dcfSSatish Balay @*/
102a7e14dcfSSatish Balay 
103441846f8SBarry Smith PetscErrorCode TaoComputeVariableBounds(Tao tao)
104a7e14dcfSSatish Balay {
105a7e14dcfSSatish Balay   PetscErrorCode ierr;
106a7e14dcfSSatish Balay 
107a7e14dcfSSatish Balay   PetscFunctionBegin;
108441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
1092b97c8d8SAlp Dener   PetscStackPush("Tao compute variable bounds");
11087f595a5SBarry Smith   if (!tao->XL || !tao->XU) {
111691b26d3SBarry Smith     if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ORDER,"TaoSetInitialVector must be called before TaoComputeVariableBounds");
112a7e14dcfSSatish Balay     ierr = VecDuplicate(tao->solution, &tao->XL);CHKERRQ(ierr);
113e270355aSBarry Smith     ierr = VecSet(tao->XL, PETSC_NINFINITY);CHKERRQ(ierr);
114a7e14dcfSSatish Balay     ierr = VecDuplicate(tao->solution, &tao->XU);CHKERRQ(ierr);
115e270355aSBarry Smith     ierr = VecSet(tao->XU, PETSC_INFINITY);CHKERRQ(ierr);
116a7e14dcfSSatish Balay   }
1172b97c8d8SAlp Dener   if (tao->ops->computebounds) {
11887f595a5SBarry Smith     ierr = (*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP);CHKERRQ(ierr);
1192b97c8d8SAlp Dener   }
1200cbffdbaSBarry Smith   PetscStackPop;
121a7e14dcfSSatish Balay   PetscFunctionReturn(0);
122a7e14dcfSSatish Balay }
123a7e14dcfSSatish Balay 
124a7e14dcfSSatish Balay /*@
125a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
126a7e14dcfSSatish Balay 
127441846f8SBarry Smith   Logically collective on Tao
128a7e14dcfSSatish Balay 
129a7e14dcfSSatish Balay   Input Parameters:
130441846f8SBarry Smith + tao - the Tao context
131a7e14dcfSSatish Balay . IL  - vector of lower bounds
132a7e14dcfSSatish Balay - IU  - vector of upper bounds
133a7e14dcfSSatish Balay 
134a7e14dcfSSatish Balay   Level: beginner
135a7e14dcfSSatish Balay 
136a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
137a7e14dcfSSatish Balay @*/
138a7e14dcfSSatish Balay 
139441846f8SBarry Smith PetscErrorCode TaoSetInequalityBounds(Tao tao, Vec IL, Vec IU)
140a7e14dcfSSatish Balay {
141a7e14dcfSSatish Balay   PetscErrorCode ierr;
1425ca45b2bSBarry Smith 
143a7e14dcfSSatish Balay   PetscFunctionBegin;
144441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
145a7e14dcfSSatish Balay   if (IL) {
146a7e14dcfSSatish Balay     PetscValidHeaderSpecific(IL,VEC_CLASSID,2);
147a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)IL);
148a7e14dcfSSatish Balay   }
149a7e14dcfSSatish Balay   if (IU) {
150a7e14dcfSSatish Balay     PetscValidHeaderSpecific(IU,VEC_CLASSID,3);
151a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)IU);
152a7e14dcfSSatish Balay   }
153a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->IL);CHKERRQ(ierr);
154a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->IU);CHKERRQ(ierr);
155a7e14dcfSSatish Balay   tao->IL = IL;
156a7e14dcfSSatish Balay   tao->IU = IU;
157661095bbSAlp Dener   tao->ineq_doublesided = PETSC_TRUE;
158a7e14dcfSSatish Balay   PetscFunctionReturn(0);
159a7e14dcfSSatish Balay }
160a7e14dcfSSatish Balay 
161441846f8SBarry Smith PetscErrorCode TaoGetInequalityBounds(Tao tao, Vec *IL, Vec *IU)
162a7e14dcfSSatish Balay {
163a7e14dcfSSatish Balay   PetscFunctionBegin;
164441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
165a7e14dcfSSatish Balay   if (IL) {
166a7e14dcfSSatish Balay     *IL=tao->IL;
167a7e14dcfSSatish Balay   }
168a7e14dcfSSatish Balay   if (IU) {
169a7e14dcfSSatish Balay     *IU=tao->IU;
170a7e14dcfSSatish Balay   }
171a7e14dcfSSatish Balay   PetscFunctionReturn(0);
172a7e14dcfSSatish Balay }
173a7e14dcfSSatish Balay 
174a7e14dcfSSatish Balay /*@C
175a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
176a7e14dcfSSatish Balay    routine set by TaoSetConstraintsRoutine().
177a7e14dcfSSatish Balay 
178441846f8SBarry Smith    Collective on Tao
179a7e14dcfSSatish Balay 
180a7e14dcfSSatish Balay    Input Parameters:
181441846f8SBarry Smith .  tao - the Tao context
182a7e14dcfSSatish Balay 
183a7e14dcfSSatish Balay    Level: developer
184a7e14dcfSSatish Balay 
185a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian()
186a7e14dcfSSatish Balay @*/
187a7e14dcfSSatish Balay 
188441846f8SBarry Smith PetscErrorCode TaoComputeConstraints(Tao tao, Vec X, Vec C)
189a7e14dcfSSatish Balay {
190a7e14dcfSSatish Balay   PetscErrorCode ierr;
191a7e14dcfSSatish Balay 
192a7e14dcfSSatish Balay   PetscFunctionBegin;
193441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
194a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
195064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(C,VEC_CLASSID,3);
196a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
197a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,C,3);
198a7e14dcfSSatish Balay 
199691b26d3SBarry Smith   if (!tao->ops->computeconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called");
200691b26d3SBarry Smith   if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints");
2010ebee16dSLisandro Dalcin   ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr);
202441846f8SBarry Smith   PetscStackPush("Tao constraints evaluation routine");
20353506e15SBarry Smith   ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);CHKERRQ(ierr);
204a7e14dcfSSatish Balay   PetscStackPop;
2050ebee16dSLisandro Dalcin   ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,C,NULL);CHKERRQ(ierr);
206a7e14dcfSSatish Balay   tao->nconstraints++;
207a7e14dcfSSatish Balay   PetscFunctionReturn(0);
208a7e14dcfSSatish Balay }
209a7e14dcfSSatish Balay 
210a7e14dcfSSatish Balay /*@C
211a7e14dcfSSatish Balay   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
212a7e14dcfSSatish Balay 
213441846f8SBarry Smith   Logically collective on Tao
214a7e14dcfSSatish Balay 
215a7e14dcfSSatish Balay   Input Parameters:
216441846f8SBarry Smith + tao - the Tao context
217a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
218a7e14dcfSSatish Balay . func - the bounds computation routine
2196c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the constraints computation (may be NULL)
220a7e14dcfSSatish Balay 
221a7e14dcfSSatish Balay   Calling sequence of func:
222441846f8SBarry Smith $      func (Tao tao, Vec x, Vec c, void *ctx);
223a7e14dcfSSatish Balay 
224441846f8SBarry Smith + tao - the Tao
225a7e14dcfSSatish Balay . x   - point to evaluate constraints
226a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
227a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
228a7e14dcfSSatish Balay 
229a7e14dcfSSatish Balay   Level: intermediate
230a7e14dcfSSatish Balay 
231a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds()
232a7e14dcfSSatish Balay 
233a7e14dcfSSatish Balay @*/
234441846f8SBarry Smith PetscErrorCode TaoSetConstraintsRoutine(Tao tao, Vec c, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
235a7e14dcfSSatish Balay {
236a7e14dcfSSatish Balay     PetscFunctionBegin;
237441846f8SBarry Smith     PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
2386246e8cdSAlp Dener     tao->constrained = PETSC_TRUE;
239a7e14dcfSSatish Balay     tao->constraints = c;
240a7e14dcfSSatish Balay     tao->user_conP = ctx;
241a7e14dcfSSatish Balay     tao->ops->computeconstraints = func;
242a7e14dcfSSatish Balay     PetscFunctionReturn(0);
243a7e14dcfSSatish Balay }
244a7e14dcfSSatish Balay 
245a7e14dcfSSatish Balay /*@
246a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
247a7e14dcfSSatish Balay   of the variables
248a7e14dcfSSatish Balay 
249441846f8SBarry Smith   Collective on Tao
250a7e14dcfSSatish Balay 
251a7e14dcfSSatish Balay   Input Parameters:
252441846f8SBarry Smith . tao - the Tao context
253a7e14dcfSSatish Balay 
254*d8d19677SJose E. Roman   Output Parameters:
255a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
256a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
257a7e14dcfSSatish Balay 
258a7e14dcfSSatish Balay   Level: advanced
259a7e14dcfSSatish Balay 
260a7e14dcfSSatish Balay   Note:
261a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
262a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
263a7e14dcfSSatish Balay   zeros.
264a7e14dcfSSatish Balay 
265a7e14dcfSSatish Balay   Level: advanced
266a7e14dcfSSatish Balay 
267a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds()
268a7e14dcfSSatish Balay @*/
269441846f8SBarry Smith PetscErrorCode TaoComputeDualVariables(Tao tao, Vec DL, Vec DU)
270a7e14dcfSSatish Balay {
271a7e14dcfSSatish Balay   PetscErrorCode ierr;
272a7e14dcfSSatish Balay   PetscFunctionBegin;
273441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
274a7e14dcfSSatish Balay   PetscValidHeaderSpecific(DL,VEC_CLASSID,2);
275064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(DU,VEC_CLASSID,3);
276a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DL,2);
277a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,DU,3);
278a7e14dcfSSatish Balay   if (tao->ops->computedual) {
279a7e14dcfSSatish Balay     ierr = (*tao->ops->computedual)(tao,DL,DU);CHKERRQ(ierr);
280a7e14dcfSSatish Balay   }  else {
281a7e14dcfSSatish Balay     ierr = VecSet(DL,0.0);CHKERRQ(ierr);
282a7e14dcfSSatish Balay     ierr = VecSet(DU,0.0);CHKERRQ(ierr);
283a7e14dcfSSatish Balay   }
284a7e14dcfSSatish Balay   PetscFunctionReturn(0);
285a7e14dcfSSatish Balay }
286a7e14dcfSSatish Balay 
287a7e14dcfSSatish Balay /*@
288a7e14dcfSSatish Balay   TaoGetDualVariables - Gets pointers to the dual vectors
289a7e14dcfSSatish Balay 
290441846f8SBarry Smith   Collective on Tao
291a7e14dcfSSatish Balay 
292a7e14dcfSSatish Balay   Input Parameters:
293441846f8SBarry Smith . tao - the Tao context
294a7e14dcfSSatish Balay 
295*d8d19677SJose E. Roman   Output Parameters:
296a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
297a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
298a7e14dcfSSatish Balay 
299a7e14dcfSSatish Balay   Level: advanced
300a7e14dcfSSatish Balay 
301a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables()
302a7e14dcfSSatish Balay @*/
303441846f8SBarry Smith PetscErrorCode TaoGetDualVariables(Tao tao, Vec *DE, Vec *DI)
304a7e14dcfSSatish Balay {
305a7e14dcfSSatish Balay   PetscFunctionBegin;
306441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
307a7e14dcfSSatish Balay   if (DE) {
308a7e14dcfSSatish Balay     *DE = tao->DE;
309a7e14dcfSSatish Balay   }
310a7e14dcfSSatish Balay   if (DI) {
311a7e14dcfSSatish Balay     *DI = tao->DI;
312a7e14dcfSSatish Balay   }
313a7e14dcfSSatish Balay   PetscFunctionReturn(0);
314a7e14dcfSSatish Balay }
315a7e14dcfSSatish Balay 
316a7e14dcfSSatish Balay /*@C
317a7e14dcfSSatish Balay   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
318a7e14dcfSSatish Balay 
319441846f8SBarry Smith   Logically collective on Tao
320a7e14dcfSSatish Balay 
321a7e14dcfSSatish Balay   Input Parameters:
322441846f8SBarry Smith + tao - the Tao context
323a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
324a7e14dcfSSatish Balay . func - the bounds computation routine
3256c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the equality constraints computation (may be NULL)
326a7e14dcfSSatish Balay 
327a7e14dcfSSatish Balay   Calling sequence of func:
328441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ce, void *ctx);
329a7e14dcfSSatish Balay 
330441846f8SBarry Smith + tao - the Tao
331a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
332a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
333a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
334a7e14dcfSSatish Balay 
335a7e14dcfSSatish Balay   Level: intermediate
336a7e14dcfSSatish Balay 
337a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
338a7e14dcfSSatish Balay 
339a7e14dcfSSatish Balay @*/
340441846f8SBarry Smith PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao tao, Vec ce, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
341a7e14dcfSSatish Balay {
342a7e14dcfSSatish Balay   PetscErrorCode ierr;
343a7e14dcfSSatish Balay 
344a7e14dcfSSatish Balay   PetscFunctionBegin;
345441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
346a7e14dcfSSatish Balay   if (ce) {
347a7e14dcfSSatish Balay     PetscValidHeaderSpecific(ce,VEC_CLASSID,2);
348a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)ce);
349a7e14dcfSSatish Balay   }
350a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->constraints_equality);CHKERRQ(ierr);
351661095bbSAlp Dener   tao->eq_constrained = PETSC_TRUE;
352a7e14dcfSSatish Balay   tao->constraints_equality = ce;
353a7e14dcfSSatish Balay   tao->user_con_equalityP = ctx;
354a7e14dcfSSatish Balay   tao->ops->computeequalityconstraints = func;
355a7e14dcfSSatish Balay   PetscFunctionReturn(0);
356a7e14dcfSSatish Balay }
357a7e14dcfSSatish Balay 
358a7e14dcfSSatish Balay /*@C
359a7e14dcfSSatish Balay   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
360a7e14dcfSSatish Balay 
361441846f8SBarry Smith   Logically collective on Tao
362a7e14dcfSSatish Balay 
363a7e14dcfSSatish Balay   Input Parameters:
364441846f8SBarry Smith + tao - the Tao context
365a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
366a7e14dcfSSatish Balay . func - the bounds computation routine
3676c23d075SBarry Smith - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be NULL)
368a7e14dcfSSatish Balay 
369a7e14dcfSSatish Balay   Calling sequence of func:
370441846f8SBarry Smith $      func (Tao tao, Vec x, Vec ci, void *ctx);
371a7e14dcfSSatish Balay 
372441846f8SBarry Smith + tao - the Tao
373a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
374a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
375a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
376a7e14dcfSSatish Balay 
377a7e14dcfSSatish Balay   Level: intermediate
378a7e14dcfSSatish Balay 
379a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
380a7e14dcfSSatish Balay 
381a7e14dcfSSatish Balay @*/
382441846f8SBarry Smith PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao tao, Vec ci, PetscErrorCode (*func)(Tao, Vec, Vec, void*), void *ctx)
383a7e14dcfSSatish Balay {
384a7e14dcfSSatish Balay   PetscErrorCode ierr;
385a7e14dcfSSatish Balay 
386a7e14dcfSSatish Balay   PetscFunctionBegin;
387441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
388a7e14dcfSSatish Balay   if (ci) {
389a7e14dcfSSatish Balay     PetscValidHeaderSpecific(ci,VEC_CLASSID,2);
390a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)ci);
391a7e14dcfSSatish Balay   }
392a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->constraints_inequality);CHKERRQ(ierr);
393a7e14dcfSSatish Balay   tao->constraints_inequality = ci;
394661095bbSAlp Dener   tao->ineq_constrained = PETSC_TRUE;
395a7e14dcfSSatish Balay   tao->user_con_inequalityP = ctx;
396a7e14dcfSSatish Balay   tao->ops->computeinequalityconstraints = func;
397a7e14dcfSSatish Balay   PetscFunctionReturn(0);
398a7e14dcfSSatish Balay }
399a7e14dcfSSatish Balay 
400a7e14dcfSSatish Balay /*@C
401a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
402a7e14dcfSSatish Balay    routine set by TaoSetEqualityConstraintsRoutine().
403a7e14dcfSSatish Balay 
404441846f8SBarry Smith    Collective on Tao
405a7e14dcfSSatish Balay 
406a7e14dcfSSatish Balay    Input Parameters:
407441846f8SBarry Smith .  tao - the Tao context
408a7e14dcfSSatish Balay 
409a7e14dcfSSatish Balay    Level: developer
410a7e14dcfSSatish Balay 
411a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality()
412a7e14dcfSSatish Balay @*/
413a7e14dcfSSatish Balay 
414441846f8SBarry Smith PetscErrorCode TaoComputeEqualityConstraints(Tao tao, Vec X, Vec CE)
415a7e14dcfSSatish Balay {
416a7e14dcfSSatish Balay   PetscErrorCode ierr;
417a7e14dcfSSatish Balay 
418a7e14dcfSSatish Balay   PetscFunctionBegin;
419441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
420a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
421064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CE,VEC_CLASSID,3);
422a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
423a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CE,3);
424a7e14dcfSSatish Balay 
425691b26d3SBarry Smith   if (!tao->ops->computeequalityconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called");
426691b26d3SBarry Smith   if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints");
4270ebee16dSLisandro Dalcin   ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr);
428441846f8SBarry Smith   PetscStackPush("Tao equality constraints evaluation routine");
42953506e15SBarry Smith   ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);CHKERRQ(ierr);
430a7e14dcfSSatish Balay   PetscStackPop;
4310ebee16dSLisandro Dalcin   ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CE,NULL);CHKERRQ(ierr);
432a7e14dcfSSatish Balay   tao->nconstraints++;
433a7e14dcfSSatish Balay   PetscFunctionReturn(0);
434a7e14dcfSSatish Balay }
435a7e14dcfSSatish Balay 
436a7e14dcfSSatish Balay /*@C
437a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
438a7e14dcfSSatish Balay    routine set by TaoSetInequalityConstraintsRoutine().
439a7e14dcfSSatish Balay 
440441846f8SBarry Smith    Collective on Tao
441a7e14dcfSSatish Balay 
442a7e14dcfSSatish Balay    Input Parameters:
443441846f8SBarry Smith .  tao - the Tao context
444a7e14dcfSSatish Balay 
445a7e14dcfSSatish Balay    Level: developer
446a7e14dcfSSatish Balay 
447a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality()
448a7e14dcfSSatish Balay @*/
449a7e14dcfSSatish Balay 
450441846f8SBarry Smith PetscErrorCode TaoComputeInequalityConstraints(Tao tao, Vec X, Vec CI)
451a7e14dcfSSatish Balay {
452a7e14dcfSSatish Balay   PetscErrorCode ierr;
453a7e14dcfSSatish Balay 
454a7e14dcfSSatish Balay   PetscFunctionBegin;
455441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
456a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
457064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(CI,VEC_CLASSID,3);
458a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
459a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,CI,3);
460a7e14dcfSSatish Balay 
461691b26d3SBarry Smith   if (!tao->ops->computeinequalityconstraints) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
462691b26d3SBarry Smith   if (!tao->solution) SETERRQ(PetscObjectComm((PetscObject)tao),PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints");
4630ebee16dSLisandro Dalcin   ierr = PetscLogEventBegin(TAO_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr);
464441846f8SBarry Smith   PetscStackPush("Tao inequality constraints evaluation routine");
46587f595a5SBarry Smith   ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);CHKERRQ(ierr);
466a7e14dcfSSatish Balay   PetscStackPop;
4670ebee16dSLisandro Dalcin   ierr = PetscLogEventEnd(TAO_ConstraintsEval,tao,X,CI,NULL);CHKERRQ(ierr);
468a7e14dcfSSatish Balay   tao->nconstraints++;
469a7e14dcfSSatish Balay   PetscFunctionReturn(0);
470a7e14dcfSSatish Balay }
471