xref: /petsc/src/tao/interface/taosolver_bounds.c (revision a7e14dcfba0d07adf6226a919460249440ec94c7)
1*a7e14dcfSSatish Balay #include "tao-private/taosolver_impl.h" /*I "taosolver.h" I*/
2*a7e14dcfSSatish Balay 
3*a7e14dcfSSatish Balay #undef __FUNCT__
4*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetVariableBounds"
5*a7e14dcfSSatish Balay /*@
6*a7e14dcfSSatish Balay   TaoSetVariableBounds - Sets the upper and lower bounds
7*a7e14dcfSSatish Balay 
8*a7e14dcfSSatish Balay   Logically collective on TaoSolver
9*a7e14dcfSSatish Balay 
10*a7e14dcfSSatish Balay   Input Parameters:
11*a7e14dcfSSatish Balay + tao - the TaoSolver context
12*a7e14dcfSSatish Balay . XL  - vector of lower bounds
13*a7e14dcfSSatish Balay - XU  - vector of upper bounds
14*a7e14dcfSSatish Balay 
15*a7e14dcfSSatish Balay   Level: beginner
16*a7e14dcfSSatish Balay 
17*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
18*a7e14dcfSSatish Balay @*/
19*a7e14dcfSSatish Balay 
20*a7e14dcfSSatish Balay PetscErrorCode TaoSetVariableBounds(TaoSolver tao, Vec XL, Vec XU)
21*a7e14dcfSSatish Balay {
22*a7e14dcfSSatish Balay     PetscErrorCode ierr;
23*a7e14dcfSSatish Balay     PetscFunctionBegin;
24*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
25*a7e14dcfSSatish Balay     if (XL) {
26*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(XL,VEC_CLASSID,2);
27*a7e14dcfSSatish Balay 	PetscObjectReference((PetscObject)XL);
28*a7e14dcfSSatish Balay     }
29*a7e14dcfSSatish Balay     if (XU) {
30*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(XU,VEC_CLASSID,3);
31*a7e14dcfSSatish Balay 	PetscObjectReference((PetscObject)XU);
32*a7e14dcfSSatish Balay     }
33*a7e14dcfSSatish Balay     if (tao->XL) {
34*a7e14dcfSSatish Balay 	ierr = VecDestroy(&tao->XL); CHKERRQ(ierr);
35*a7e14dcfSSatish Balay     }
36*a7e14dcfSSatish Balay     if (tao->XU) {
37*a7e14dcfSSatish Balay 	ierr = VecDestroy(&tao->XU); CHKERRQ(ierr);
38*a7e14dcfSSatish Balay     }
39*a7e14dcfSSatish Balay 
40*a7e14dcfSSatish Balay     tao->XL = XL;
41*a7e14dcfSSatish Balay     tao->XU = XU;
42*a7e14dcfSSatish Balay 
43*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
44*a7e14dcfSSatish Balay }
45*a7e14dcfSSatish Balay #undef __FUNCT__
46*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetVariableBoundsRoutine"
47*a7e14dcfSSatish Balay /*@C
48*a7e14dcfSSatish Balay   TaoSetVariableBoundsRoutine - Sets a function to be used to compute variable bounds
49*a7e14dcfSSatish Balay 
50*a7e14dcfSSatish Balay   Logically collective on TaoSolver
51*a7e14dcfSSatish Balay 
52*a7e14dcfSSatish Balay   Input Parameters:
53*a7e14dcfSSatish Balay + tao - the TaoSolver context
54*a7e14dcfSSatish Balay . func - the bounds computation routine
55*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the bounds computation (may be PETSC_NULL)
56*a7e14dcfSSatish Balay 
57*a7e14dcfSSatish Balay   Calling sequence of func:
58*a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec xl, Vec xu);
59*a7e14dcfSSatish Balay 
60*a7e14dcfSSatish Balay + tao - the TaoSolver
61*a7e14dcfSSatish Balay . xl  - vector of lower bounds
62*a7e14dcfSSatish Balay . xu  - vector of upper bounds
63*a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
64*a7e14dcfSSatish Balay 
65*a7e14dcfSSatish Balay   Level: beginner
66*a7e14dcfSSatish Balay 
67*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
68*a7e14dcfSSatish Balay 
69*a7e14dcfSSatish Balay Note: The func passed in to TaoSetVariableBoundsRoutine() takes
70*a7e14dcfSSatish Balay precedence over any values set in TaoSetVariableBounds().
71*a7e14dcfSSatish Balay 
72*a7e14dcfSSatish Balay @*/
73*a7e14dcfSSatish Balay PetscErrorCode TaoSetVariableBoundsRoutine(TaoSolver tao, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
74*a7e14dcfSSatish Balay {
75*a7e14dcfSSatish Balay     PetscFunctionBegin;
76*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
77*a7e14dcfSSatish Balay     tao->user_boundsP = ctx;
78*a7e14dcfSSatish Balay     tao->ops->computebounds = func;
79*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
80*a7e14dcfSSatish Balay }
81*a7e14dcfSSatish Balay 
82*a7e14dcfSSatish Balay #undef __FUNCT__
83*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetVariableBounds"
84*a7e14dcfSSatish Balay PetscErrorCode TaoGetVariableBounds(TaoSolver tao, Vec *XL, Vec *XU)
85*a7e14dcfSSatish Balay {
86*a7e14dcfSSatish Balay     PetscFunctionBegin;
87*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
88*a7e14dcfSSatish Balay     if (XL) {
89*a7e14dcfSSatish Balay 	*XL=tao->XL;
90*a7e14dcfSSatish Balay     }
91*a7e14dcfSSatish Balay     if (XU) {
92*a7e14dcfSSatish Balay 	*XU=tao->XU;
93*a7e14dcfSSatish Balay     }
94*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
95*a7e14dcfSSatish Balay }
96*a7e14dcfSSatish Balay 
97*a7e14dcfSSatish Balay #undef __FUNCT__
98*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeVariableBounds"
99*a7e14dcfSSatish Balay /*@C
100*a7e14dcfSSatish Balay    TaoComputeVariableBounds - Compute the variable bounds using the
101*a7e14dcfSSatish Balay    routine set by TaoSetVariableBoundsRoutine().
102*a7e14dcfSSatish Balay 
103*a7e14dcfSSatish Balay    Collective on TaoSolver
104*a7e14dcfSSatish Balay 
105*a7e14dcfSSatish Balay    Input Parameters:
106*a7e14dcfSSatish Balay .  tao - the TaoSolver context
107*a7e14dcfSSatish Balay 
108*a7e14dcfSSatish Balay    Level: developer
109*a7e14dcfSSatish Balay 
110*a7e14dcfSSatish Balay .seealso: TaoSetVariableBoundsRoutine(), TaoSetVariableBounds()
111*a7e14dcfSSatish Balay @*/
112*a7e14dcfSSatish Balay 
113*a7e14dcfSSatish Balay PetscErrorCode TaoComputeVariableBounds(TaoSolver tao)
114*a7e14dcfSSatish Balay {
115*a7e14dcfSSatish Balay     PetscErrorCode ierr;
116*a7e14dcfSSatish Balay 
117*a7e14dcfSSatish Balay     PetscFunctionBegin;
118*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
119*a7e14dcfSSatish Balay     if (tao->ops->computebounds == PETSC_NULL) {
120*a7e14dcfSSatish Balay 	PetscFunctionReturn(0);
121*a7e14dcfSSatish Balay     }
122*a7e14dcfSSatish Balay     if (tao->XL == PETSC_NULL || tao->XU == PETSC_NULL) {
123*a7e14dcfSSatish Balay 	if (tao->solution == PETSC_NULL) {
124*a7e14dcfSSatish Balay 	    SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeVariableBounds");
125*a7e14dcfSSatish Balay 	}
126*a7e14dcfSSatish Balay 	ierr = VecDuplicate(tao->solution, &tao->XL); CHKERRQ(ierr);
127*a7e14dcfSSatish Balay 	ierr = VecSet(tao->XL, TAO_NINFINITY); CHKERRQ(ierr);
128*a7e14dcfSSatish Balay 	ierr = VecDuplicate(tao->solution, &tao->XU); CHKERRQ(ierr);
129*a7e14dcfSSatish Balay 	ierr = VecSet(tao->XU, TAO_INFINITY); CHKERRQ(ierr);
130*a7e14dcfSSatish Balay     }
131*a7e14dcfSSatish Balay     CHKMEMQ;
132*a7e14dcfSSatish Balay     ierr = (*tao->ops->computebounds)(tao,tao->XL,tao->XU,tao->user_boundsP);
133*a7e14dcfSSatish Balay     CHKERRQ(ierr);
134*a7e14dcfSSatish Balay     CHKMEMQ;
135*a7e14dcfSSatish Balay 
136*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
137*a7e14dcfSSatish Balay }
138*a7e14dcfSSatish Balay 
139*a7e14dcfSSatish Balay #undef __FUNCT__
140*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetInequalityBounds"
141*a7e14dcfSSatish Balay /*@
142*a7e14dcfSSatish Balay   TaoSetInequalityBounds - Sets the upper and lower bounds
143*a7e14dcfSSatish Balay 
144*a7e14dcfSSatish Balay   Logically collective on TaoSolver
145*a7e14dcfSSatish Balay 
146*a7e14dcfSSatish Balay   Input Parameters:
147*a7e14dcfSSatish Balay + tao - the TaoSolver context
148*a7e14dcfSSatish Balay . IL  - vector of lower bounds
149*a7e14dcfSSatish Balay - IU  - vector of upper bounds
150*a7e14dcfSSatish Balay 
151*a7e14dcfSSatish Balay   Level: beginner
152*a7e14dcfSSatish Balay 
153*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
154*a7e14dcfSSatish Balay @*/
155*a7e14dcfSSatish Balay 
156*a7e14dcfSSatish Balay PetscErrorCode TaoSetInequalityBounds(TaoSolver tao, Vec IL, Vec IU)
157*a7e14dcfSSatish Balay {
158*a7e14dcfSSatish Balay     PetscErrorCode ierr;
159*a7e14dcfSSatish Balay     PetscFunctionBegin;
160*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
161*a7e14dcfSSatish Balay     if (IL) {
162*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(IL,VEC_CLASSID,2);
163*a7e14dcfSSatish Balay 	PetscObjectReference((PetscObject)IL);
164*a7e14dcfSSatish Balay     }
165*a7e14dcfSSatish Balay     if (IU) {
166*a7e14dcfSSatish Balay 	PetscValidHeaderSpecific(IU,VEC_CLASSID,3);
167*a7e14dcfSSatish Balay 	PetscObjectReference((PetscObject)IU);
168*a7e14dcfSSatish Balay     }
169*a7e14dcfSSatish Balay     if (tao->IL) {
170*a7e14dcfSSatish Balay 	ierr = VecDestroy(&tao->IL); CHKERRQ(ierr);
171*a7e14dcfSSatish Balay     }
172*a7e14dcfSSatish Balay     if (tao->IU) {
173*a7e14dcfSSatish Balay 	ierr = VecDestroy(&tao->IU); CHKERRQ(ierr);
174*a7e14dcfSSatish Balay     }
175*a7e14dcfSSatish Balay 
176*a7e14dcfSSatish Balay     tao->IL = IL;
177*a7e14dcfSSatish Balay     tao->IU = IU;
178*a7e14dcfSSatish Balay 
179*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
180*a7e14dcfSSatish Balay }
181*a7e14dcfSSatish Balay 
182*a7e14dcfSSatish Balay 
183*a7e14dcfSSatish Balay #undef __FUNCT__
184*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetInequalityBounds"
185*a7e14dcfSSatish Balay PetscErrorCode TaoGetInequalityBounds(TaoSolver tao, Vec *IL, Vec *IU)
186*a7e14dcfSSatish Balay {
187*a7e14dcfSSatish Balay     PetscFunctionBegin;
188*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
189*a7e14dcfSSatish Balay     if (IL) {
190*a7e14dcfSSatish Balay 	*IL=tao->IL;
191*a7e14dcfSSatish Balay     }
192*a7e14dcfSSatish Balay     if (IU) {
193*a7e14dcfSSatish Balay 	*IU=tao->IU;
194*a7e14dcfSSatish Balay     }
195*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
196*a7e14dcfSSatish Balay }
197*a7e14dcfSSatish Balay 
198*a7e14dcfSSatish Balay #undef __FUNCT__
199*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeConstraints"
200*a7e14dcfSSatish Balay /*@C
201*a7e14dcfSSatish Balay    TaoComputeConstraints - Compute the variable bounds using the
202*a7e14dcfSSatish Balay    routine set by TaoSetConstraintsRoutine().
203*a7e14dcfSSatish Balay 
204*a7e14dcfSSatish Balay    Collective on TaoSolver
205*a7e14dcfSSatish Balay 
206*a7e14dcfSSatish Balay    Input Parameters:
207*a7e14dcfSSatish Balay .  tao - the TaoSolver context
208*a7e14dcfSSatish Balay 
209*a7e14dcfSSatish Balay    Level: developer
210*a7e14dcfSSatish Balay 
211*a7e14dcfSSatish Balay .seealso: TaoSetConstraintsRoutine(), TaoComputeJacobian()
212*a7e14dcfSSatish Balay @*/
213*a7e14dcfSSatish Balay 
214*a7e14dcfSSatish Balay PetscErrorCode TaoComputeConstraints(TaoSolver tao, Vec X, Vec C)
215*a7e14dcfSSatish Balay {
216*a7e14dcfSSatish Balay     PetscErrorCode ierr;
217*a7e14dcfSSatish Balay 
218*a7e14dcfSSatish Balay     PetscFunctionBegin;
219*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
220*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
221*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(C,VEC_CLASSID,2);
222*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,X,2);
223*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,C,3);
224*a7e14dcfSSatish Balay 
225*a7e14dcfSSatish Balay     if (tao->ops->computeconstraints == PETSC_NULL) {
226*a7e14dcfSSatish Balay       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetConstraintsRoutine() has not been called");
227*a7e14dcfSSatish Balay     }
228*a7e14dcfSSatish Balay     if (tao->solution == PETSC_NULL) {
229*a7e14dcfSSatish Balay       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeConstraints");
230*a7e14dcfSSatish Balay     }
231*a7e14dcfSSatish Balay     ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,C,PETSC_NULL); CHKERRQ(ierr);
232*a7e14dcfSSatish Balay     PetscStackPush("TaoSolver constraints evaluation routine");
233*a7e14dcfSSatish Balay     CHKMEMQ;
234*a7e14dcfSSatish Balay     ierr = (*tao->ops->computeconstraints)(tao,X,C,tao->user_conP);
235*a7e14dcfSSatish Balay     CHKERRQ(ierr);
236*a7e14dcfSSatish Balay     CHKMEMQ;
237*a7e14dcfSSatish Balay     PetscStackPop;
238*a7e14dcfSSatish Balay     ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,C,PETSC_NULL); CHKERRQ(ierr);
239*a7e14dcfSSatish Balay     tao->nconstraints++;
240*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
241*a7e14dcfSSatish Balay }
242*a7e14dcfSSatish Balay 
243*a7e14dcfSSatish Balay 
244*a7e14dcfSSatish Balay #undef __FUNCT__
245*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetConstraintsRoutine"
246*a7e14dcfSSatish Balay /*@C
247*a7e14dcfSSatish Balay   TaoSetConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
248*a7e14dcfSSatish Balay 
249*a7e14dcfSSatish Balay   Logically collective on TaoSolver
250*a7e14dcfSSatish Balay 
251*a7e14dcfSSatish Balay   Input Parameters:
252*a7e14dcfSSatish Balay + tao - the TaoSolver context
253*a7e14dcfSSatish Balay . c   - A vector that will be used to store constraint evaluation
254*a7e14dcfSSatish Balay . func - the bounds computation routine
255*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the constraints computation (may be PETSC_NULL)
256*a7e14dcfSSatish Balay 
257*a7e14dcfSSatish Balay   Calling sequence of func:
258*a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec x, Vec c, void *ctx);
259*a7e14dcfSSatish Balay 
260*a7e14dcfSSatish Balay + tao - the TaoSolver
261*a7e14dcfSSatish Balay . x   - point to evaluate constraints
262*a7e14dcfSSatish Balay . c   - vector constraints evaluated at x
263*a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
264*a7e14dcfSSatish Balay 
265*a7e14dcfSSatish Balay   Level: intermediate
266*a7e14dcfSSatish Balay 
267*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariablevBounds()
268*a7e14dcfSSatish Balay 
269*a7e14dcfSSatish Balay @*/
270*a7e14dcfSSatish Balay PetscErrorCode TaoSetConstraintsRoutine(TaoSolver tao, Vec c, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
271*a7e14dcfSSatish Balay {
272*a7e14dcfSSatish Balay     PetscFunctionBegin;
273*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
274*a7e14dcfSSatish Balay     tao->constraints = c;
275*a7e14dcfSSatish Balay     tao->user_conP = ctx;
276*a7e14dcfSSatish Balay     tao->ops->computeconstraints = func;
277*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
278*a7e14dcfSSatish Balay }
279*a7e14dcfSSatish Balay 
280*a7e14dcfSSatish Balay #undef __FUNCT__
281*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeDualVariables"
282*a7e14dcfSSatish Balay /*@
283*a7e14dcfSSatish Balay   TaoComputeDualVariables - Computes the dual vectors corresponding to the bounds
284*a7e14dcfSSatish Balay   of the variables
285*a7e14dcfSSatish Balay 
286*a7e14dcfSSatish Balay   Collective on TaoSolver
287*a7e14dcfSSatish Balay 
288*a7e14dcfSSatish Balay   Input Parameters:
289*a7e14dcfSSatish Balay . tao - the TaoSolver context
290*a7e14dcfSSatish Balay 
291*a7e14dcfSSatish Balay   Output Parameter:
292*a7e14dcfSSatish Balay + DL - dual variable vector for the lower bounds
293*a7e14dcfSSatish Balay - DU - dual variable vector for the upper bounds
294*a7e14dcfSSatish Balay 
295*a7e14dcfSSatish Balay   Level: advanced
296*a7e14dcfSSatish Balay 
297*a7e14dcfSSatish Balay   Note:
298*a7e14dcfSSatish Balay   DL and DU should be created before calling this routine.  If calling
299*a7e14dcfSSatish Balay   this routine after using an unconstrained solver, DL and DU are set to all
300*a7e14dcfSSatish Balay   zeros.
301*a7e14dcfSSatish Balay 
302*a7e14dcfSSatish Balay   Level: advanced
303*a7e14dcfSSatish Balay 
304*a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoSetVariableBounds()
305*a7e14dcfSSatish Balay @*/
306*a7e14dcfSSatish Balay PetscErrorCode TaoComputeDualVariables(TaoSolver tao, Vec DL, Vec DU)
307*a7e14dcfSSatish Balay {
308*a7e14dcfSSatish Balay     PetscErrorCode ierr;
309*a7e14dcfSSatish Balay     PetscFunctionBegin;
310*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
311*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(DL,VEC_CLASSID,2);
312*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(DU,VEC_CLASSID,2);
313*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,DL,2);
314*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,DU,3);
315*a7e14dcfSSatish Balay     if (tao->ops->computedual) {
316*a7e14dcfSSatish Balay       ierr = (*tao->ops->computedual)(tao,DL,DU); CHKERRQ(ierr);
317*a7e14dcfSSatish Balay     }  else {
318*a7e14dcfSSatish Balay       ierr = VecSet(DL,0.0); CHKERRQ(ierr);
319*a7e14dcfSSatish Balay       ierr = VecSet(DU,0.0); CHKERRQ(ierr);
320*a7e14dcfSSatish Balay     }
321*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
322*a7e14dcfSSatish Balay }
323*a7e14dcfSSatish Balay 
324*a7e14dcfSSatish Balay #undef __FUNCT__
325*a7e14dcfSSatish Balay #define __FUNCT__ "TaoGetDualVariables"
326*a7e14dcfSSatish Balay /*@
327*a7e14dcfSSatish Balay   TaoGetDualVariables - Gets pointers to the dual vectors
328*a7e14dcfSSatish Balay 
329*a7e14dcfSSatish Balay   Collective on TaoSolver
330*a7e14dcfSSatish Balay 
331*a7e14dcfSSatish Balay   Input Parameters:
332*a7e14dcfSSatish Balay . tao - the TaoSolver context
333*a7e14dcfSSatish Balay 
334*a7e14dcfSSatish Balay   Output Parameter:
335*a7e14dcfSSatish Balay + DE - dual variable vector for the lower bounds
336*a7e14dcfSSatish Balay - DI - dual variable vector for the upper bounds
337*a7e14dcfSSatish Balay 
338*a7e14dcfSSatish Balay   Level: advanced
339*a7e14dcfSSatish Balay 
340*a7e14dcfSSatish Balay .seealso: TaoComputeDualVariables()
341*a7e14dcfSSatish Balay @*/
342*a7e14dcfSSatish Balay PetscErrorCode TaoGetDualVariables(TaoSolver tao, Vec *DE, Vec *DI)
343*a7e14dcfSSatish Balay {
344*a7e14dcfSSatish Balay     PetscFunctionBegin;
345*a7e14dcfSSatish Balay      PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
346*a7e14dcfSSatish Balay     if (DE) {
347*a7e14dcfSSatish Balay       *DE = tao->DE;
348*a7e14dcfSSatish Balay     }
349*a7e14dcfSSatish Balay     if (DI) {
350*a7e14dcfSSatish Balay       *DI = tao->DI;
351*a7e14dcfSSatish Balay     }
352*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
353*a7e14dcfSSatish Balay }
354*a7e14dcfSSatish Balay 
355*a7e14dcfSSatish Balay #undef __FUNCT__
356*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetEqualityConstraintsRoutine"
357*a7e14dcfSSatish Balay /*@C
358*a7e14dcfSSatish Balay   TaoSetEqualityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
359*a7e14dcfSSatish Balay 
360*a7e14dcfSSatish Balay   Logically collective on TaoSolver
361*a7e14dcfSSatish Balay 
362*a7e14dcfSSatish Balay   Input Parameters:
363*a7e14dcfSSatish Balay + tao - the TaoSolver context
364*a7e14dcfSSatish Balay . ce   - A vector that will be used to store equality constraint evaluation
365*a7e14dcfSSatish Balay . func - the bounds computation routine
366*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the equality constraints computation (may be PETSC_NULL)
367*a7e14dcfSSatish Balay 
368*a7e14dcfSSatish Balay   Calling sequence of func:
369*a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec x, Vec ce, void *ctx);
370*a7e14dcfSSatish Balay 
371*a7e14dcfSSatish Balay + tao - the TaoSolver
372*a7e14dcfSSatish Balay . x   - point to evaluate equality constraints
373*a7e14dcfSSatish Balay . ce   - vector of equality constraints evaluated at x
374*a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
375*a7e14dcfSSatish Balay 
376*a7e14dcfSSatish Balay   Level: intermediate
377*a7e14dcfSSatish Balay 
378*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
379*a7e14dcfSSatish Balay 
380*a7e14dcfSSatish Balay @*/
381*a7e14dcfSSatish Balay PetscErrorCode TaoSetEqualityConstraintsRoutine(TaoSolver tao, Vec ce, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
382*a7e14dcfSSatish Balay {
383*a7e14dcfSSatish Balay     PetscErrorCode ierr;
384*a7e14dcfSSatish Balay 
385*a7e14dcfSSatish Balay     PetscFunctionBegin;
386*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
387*a7e14dcfSSatish Balay     if (ce) {
388*a7e14dcfSSatish Balay       PetscValidHeaderSpecific(ce,VEC_CLASSID,2);
389*a7e14dcfSSatish Balay       PetscObjectReference((PetscObject)ce);
390*a7e14dcfSSatish Balay     }
391*a7e14dcfSSatish Balay     ierr = VecDestroy(&tao->constraints_equality); CHKERRQ(ierr);
392*a7e14dcfSSatish Balay 
393*a7e14dcfSSatish Balay     tao->constraints_equality = ce;
394*a7e14dcfSSatish Balay     tao->user_con_equalityP = ctx;
395*a7e14dcfSSatish Balay     tao->ops->computeequalityconstraints = func;
396*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
397*a7e14dcfSSatish Balay }
398*a7e14dcfSSatish Balay 
399*a7e14dcfSSatish Balay 
400*a7e14dcfSSatish Balay #undef __FUNCT__
401*a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetInequalityConstraintsRoutine"
402*a7e14dcfSSatish Balay /*@C
403*a7e14dcfSSatish Balay   TaoSetInequalityConstraintsRoutine - Sets a function to be used to compute constraints.  TAO only handles constraints under certain conditions, see manual for details
404*a7e14dcfSSatish Balay 
405*a7e14dcfSSatish Balay   Logically collective on TaoSolver
406*a7e14dcfSSatish Balay 
407*a7e14dcfSSatish Balay   Input Parameters:
408*a7e14dcfSSatish Balay + tao - the TaoSolver context
409*a7e14dcfSSatish Balay . ci   - A vector that will be used to store inequality constraint evaluation
410*a7e14dcfSSatish Balay . func - the bounds computation routine
411*a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the inequality constraints computation (may be PETSC_NULL)
412*a7e14dcfSSatish Balay 
413*a7e14dcfSSatish Balay   Calling sequence of func:
414*a7e14dcfSSatish Balay $      func (TaoSolver tao, Vec x, Vec ci, void *ctx);
415*a7e14dcfSSatish Balay 
416*a7e14dcfSSatish Balay + tao - the TaoSolver
417*a7e14dcfSSatish Balay . x   - point to evaluate inequality constraints
418*a7e14dcfSSatish Balay . ci   - vector of inequality constraints evaluated at x
419*a7e14dcfSSatish Balay - ctx - the (optional) user-defined function context
420*a7e14dcfSSatish Balay 
421*a7e14dcfSSatish Balay   Level: intermediate
422*a7e14dcfSSatish Balay 
423*a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine(), TaoSetVariableBounds()
424*a7e14dcfSSatish Balay 
425*a7e14dcfSSatish Balay @*/
426*a7e14dcfSSatish Balay PetscErrorCode TaoSetInequalityConstraintsRoutine(TaoSolver tao, Vec ci, PetscErrorCode (*func)(TaoSolver, Vec, Vec, void*), void *ctx)
427*a7e14dcfSSatish Balay {
428*a7e14dcfSSatish Balay     PetscErrorCode ierr;
429*a7e14dcfSSatish Balay 
430*a7e14dcfSSatish Balay     PetscFunctionBegin;
431*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
432*a7e14dcfSSatish Balay     if (ci) {
433*a7e14dcfSSatish Balay       PetscValidHeaderSpecific(ci,VEC_CLASSID,2);
434*a7e14dcfSSatish Balay       PetscObjectReference((PetscObject)ci);
435*a7e14dcfSSatish Balay     }
436*a7e14dcfSSatish Balay     ierr = VecDestroy(&tao->constraints_inequality); CHKERRQ(ierr);
437*a7e14dcfSSatish Balay     tao->constraints_inequality = ci;
438*a7e14dcfSSatish Balay 
439*a7e14dcfSSatish Balay     tao->user_con_inequalityP = ctx;
440*a7e14dcfSSatish Balay     tao->ops->computeinequalityconstraints = func;
441*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
442*a7e14dcfSSatish Balay }
443*a7e14dcfSSatish Balay 
444*a7e14dcfSSatish Balay 
445*a7e14dcfSSatish Balay #undef __FUNCT__
446*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeEqualityConstraints"
447*a7e14dcfSSatish Balay /*@C
448*a7e14dcfSSatish Balay    TaoComputeEqualityConstraints - Compute the variable bounds using the
449*a7e14dcfSSatish Balay    routine set by TaoSetEqualityConstraintsRoutine().
450*a7e14dcfSSatish Balay 
451*a7e14dcfSSatish Balay    Collective on TaoSolver
452*a7e14dcfSSatish Balay 
453*a7e14dcfSSatish Balay    Input Parameters:
454*a7e14dcfSSatish Balay .  tao - the TaoSolver context
455*a7e14dcfSSatish Balay 
456*a7e14dcfSSatish Balay    Level: developer
457*a7e14dcfSSatish Balay 
458*a7e14dcfSSatish Balay .seealso: TaoSetEqualityConstraintsRoutine(), TaoComputeJacobianEquality()
459*a7e14dcfSSatish Balay @*/
460*a7e14dcfSSatish Balay 
461*a7e14dcfSSatish Balay PetscErrorCode TaoComputeEqualityConstraints(TaoSolver tao, Vec X, Vec CE)
462*a7e14dcfSSatish Balay {
463*a7e14dcfSSatish Balay     PetscErrorCode ierr;
464*a7e14dcfSSatish Balay 
465*a7e14dcfSSatish Balay     PetscFunctionBegin;
466*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
467*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
468*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(CE,VEC_CLASSID,2);
469*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,X,2);
470*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,CE,3);
471*a7e14dcfSSatish Balay 
472*a7e14dcfSSatish Balay     if (tao->ops->computeequalityconstraints == PETSC_NULL) {
473*a7e14dcfSSatish Balay       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetEqualityConstraintsRoutine() has not been called");
474*a7e14dcfSSatish Balay     }
475*a7e14dcfSSatish Balay     if (tao->solution == PETSC_NULL) {
476*a7e14dcfSSatish Balay       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeEqualityConstraints");
477*a7e14dcfSSatish Balay     }
478*a7e14dcfSSatish Balay     ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,CE,PETSC_NULL); CHKERRQ(ierr);
479*a7e14dcfSSatish Balay     PetscStackPush("TaoSolver equality constraints evaluation routine");
480*a7e14dcfSSatish Balay     CHKMEMQ;
481*a7e14dcfSSatish Balay     ierr = (*tao->ops->computeequalityconstraints)(tao,X,CE,tao->user_con_equalityP);
482*a7e14dcfSSatish Balay     CHKERRQ(ierr);
483*a7e14dcfSSatish Balay     CHKMEMQ;
484*a7e14dcfSSatish Balay     PetscStackPop;
485*a7e14dcfSSatish Balay     ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,CE,PETSC_NULL); CHKERRQ(ierr);
486*a7e14dcfSSatish Balay     tao->nconstraints++;
487*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
488*a7e14dcfSSatish Balay }
489*a7e14dcfSSatish Balay 
490*a7e14dcfSSatish Balay 
491*a7e14dcfSSatish Balay #undef __FUNCT__
492*a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeInequalityConstraints"
493*a7e14dcfSSatish Balay /*@C
494*a7e14dcfSSatish Balay    TaoComputeInequalityConstraints - Compute the variable bounds using the
495*a7e14dcfSSatish Balay    routine set by TaoSetInequalityConstraintsRoutine().
496*a7e14dcfSSatish Balay 
497*a7e14dcfSSatish Balay    Collective on TaoSolver
498*a7e14dcfSSatish Balay 
499*a7e14dcfSSatish Balay    Input Parameters:
500*a7e14dcfSSatish Balay .  tao - the TaoSolver context
501*a7e14dcfSSatish Balay 
502*a7e14dcfSSatish Balay    Level: developer
503*a7e14dcfSSatish Balay 
504*a7e14dcfSSatish Balay .seealso: TaoSetInequalityConstraintsRoutine(), TaoComputeJacobianInequality()
505*a7e14dcfSSatish Balay @*/
506*a7e14dcfSSatish Balay 
507*a7e14dcfSSatish Balay PetscErrorCode TaoComputeInequalityConstraints(TaoSolver tao, Vec X, Vec CI)
508*a7e14dcfSSatish Balay {
509*a7e14dcfSSatish Balay     PetscErrorCode ierr;
510*a7e14dcfSSatish Balay 
511*a7e14dcfSSatish Balay     PetscFunctionBegin;
512*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(tao,TAOSOLVER_CLASSID,1);
513*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(X,VEC_CLASSID,2);
514*a7e14dcfSSatish Balay     PetscValidHeaderSpecific(CI,VEC_CLASSID,2);
515*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,X,2);
516*a7e14dcfSSatish Balay     PetscCheckSameComm(tao,1,CI,3);
517*a7e14dcfSSatish Balay 
518*a7e14dcfSSatish Balay     if (tao->ops->computeinequalityconstraints == PETSC_NULL) {
519*a7e14dcfSSatish Balay       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInequalityConstraintsRoutine() has not been called");
520*a7e14dcfSSatish Balay     }
521*a7e14dcfSSatish Balay     if (tao->solution == PETSC_NULL) {
522*a7e14dcfSSatish Balay       SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetInitialVector must be called before TaoComputeInequalityConstraints");
523*a7e14dcfSSatish Balay     }
524*a7e14dcfSSatish Balay     ierr = PetscLogEventBegin(TaoSolver_ConstraintsEval,tao,X,CI,PETSC_NULL); CHKERRQ(ierr);
525*a7e14dcfSSatish Balay     PetscStackPush("TaoSolver inequality constraints evaluation routine");
526*a7e14dcfSSatish Balay     CHKMEMQ;
527*a7e14dcfSSatish Balay     ierr = (*tao->ops->computeinequalityconstraints)(tao,X,CI,tao->user_con_inequalityP);
528*a7e14dcfSSatish Balay     CHKERRQ(ierr);
529*a7e14dcfSSatish Balay     CHKMEMQ;
530*a7e14dcfSSatish Balay     PetscStackPop;
531*a7e14dcfSSatish Balay     ierr = PetscLogEventEnd(TaoSolver_ConstraintsEval,tao,X,CI,PETSC_NULL); CHKERRQ(ierr);
532*a7e14dcfSSatish Balay     tao->nconstraints++;
533*a7e14dcfSSatish Balay     PetscFunctionReturn(0);
534*a7e14dcfSSatish Balay }
535