xref: /petsc/src/tao/interface/taosolver_fg.c (revision 441846f8b2b1e3d12702032d495afa7e98f48493)
1ba92ff59SBarry Smith #include <petsc-private/taoimpl.h> /*I "petsctao.h" I*/
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay #undef __FUNCT__
4a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetInitialVector"
5a7e14dcfSSatish Balay /*@
6a7e14dcfSSatish Balay   TaoSetInitialVector - Sets the initial guess for the solve
7a7e14dcfSSatish Balay 
8*441846f8SBarry Smith   Logically collective on Tao
9a7e14dcfSSatish Balay 
10a7e14dcfSSatish Balay   Input Parameters:
11*441846f8SBarry Smith + tao - the Tao context
12a7e14dcfSSatish Balay - x0  - the initial guess
13a7e14dcfSSatish Balay 
14a7e14dcfSSatish Balay   Level: beginner
15a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoSolve()
16a7e14dcfSSatish Balay @*/
17a7e14dcfSSatish Balay 
18*441846f8SBarry Smith PetscErrorCode TaoSetInitialVector(Tao tao, Vec x0)
1945cf516eSBarry Smith {
20a7e14dcfSSatish Balay   PetscErrorCode ierr;
21a7e14dcfSSatish Balay 
22a7e14dcfSSatish Balay   PetscFunctionBegin;
23*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
24a7e14dcfSSatish Balay   if (x0) {
25a7e14dcfSSatish Balay     PetscValidHeaderSpecific(x0,VEC_CLASSID,2);
26a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)x0);
27a7e14dcfSSatish Balay   }
28a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->solution);CHKERRQ(ierr);
29a7e14dcfSSatish Balay   tao->solution = x0;
30a7e14dcfSSatish Balay   PetscFunctionReturn(0);
31a7e14dcfSSatish Balay }
32a7e14dcfSSatish Balay 
33a7e14dcfSSatish Balay #undef __FUNCT__
34a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeGradient"
35a7e14dcfSSatish Balay /*@
36a7e14dcfSSatish Balay   TaoComputeGradient - Computes the gradient of the objective function
37a7e14dcfSSatish Balay 
38*441846f8SBarry Smith   Collective on Tao
39a7e14dcfSSatish Balay 
40a7e14dcfSSatish Balay   Input Parameters:
41*441846f8SBarry Smith + tao - the Tao context
42a7e14dcfSSatish Balay - X - input vector
43a7e14dcfSSatish Balay 
44a7e14dcfSSatish Balay   Output Parameter:
45a7e14dcfSSatish Balay . G - gradient vector
46a7e14dcfSSatish Balay 
47a7e14dcfSSatish Balay   Notes: TaoComputeGradient() is typically used within minimization implementations,
48a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
49a7e14dcfSSatish Balay 
50a7e14dcfSSatish Balay   Level: advanced
51a7e14dcfSSatish Balay 
52a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetGradientRoutine()
53a7e14dcfSSatish Balay @*/
54*441846f8SBarry Smith PetscErrorCode TaoComputeGradient(Tao tao, Vec X, Vec G)
55a7e14dcfSSatish Balay {
56a7e14dcfSSatish Balay   PetscErrorCode ierr;
57a7e14dcfSSatish Balay   PetscReal      dummy;
5887f595a5SBarry Smith 
59a7e14dcfSSatish Balay   PetscFunctionBegin;
60*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
61a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
62a7e14dcfSSatish Balay   PetscValidHeaderSpecific(G,VEC_CLASSID,2);
63a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
64a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,G,3);
65a7e14dcfSSatish Balay   if (tao->ops->computegradient) {
66*441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
67*441846f8SBarry Smith     PetscStackPush("Tao user gradient evaluation routine");
68a7e14dcfSSatish Balay     CHKMEMQ;
69a7e14dcfSSatish Balay     ierr = (*tao->ops->computegradient)(tao,X,G,tao->user_gradP);CHKERRQ(ierr);
70a7e14dcfSSatish Balay     CHKMEMQ;
71a7e14dcfSSatish Balay     PetscStackPop;
72*441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
73a7e14dcfSSatish Balay     tao->ngrads++;
74a7e14dcfSSatish Balay   } else if (tao->ops->computeobjectiveandgradient) {
75*441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
76a7e14dcfSSatish Balay     PetscStackPush("Tao user objective/gradient evaluation routine");
77a7e14dcfSSatish Balay     CHKMEMQ;
78a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjectiveandgradient)(tao,X,&dummy,G,tao->user_objgradP);CHKERRQ(ierr);
79a7e14dcfSSatish Balay     CHKMEMQ;
80a7e14dcfSSatish Balay     PetscStackPop;
81*441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
82a7e14dcfSSatish Balay     tao->nfuncgrads++;
8387f595a5SBarry Smith   }  else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetGradientRoutine() has not been called");
84a7e14dcfSSatish Balay   PetscFunctionReturn(0);
85a7e14dcfSSatish Balay }
86a7e14dcfSSatish Balay 
87a7e14dcfSSatish Balay #undef __FUNCT__
88a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeObjective"
89a7e14dcfSSatish Balay /*@
90a7e14dcfSSatish Balay   TaoComputeObjective - Computes the objective function value at a given point
91a7e14dcfSSatish Balay 
92*441846f8SBarry Smith   Collective on Tao
93a7e14dcfSSatish Balay 
94a7e14dcfSSatish Balay   Input Parameters:
95*441846f8SBarry Smith + tao - the Tao context
96a7e14dcfSSatish Balay - X - input vector
97a7e14dcfSSatish Balay 
98a7e14dcfSSatish Balay   Output Parameter:
99a7e14dcfSSatish Balay . f - Objective value at X
100a7e14dcfSSatish Balay 
101a7e14dcfSSatish Balay   Notes: TaoComputeObjective() is typically used within minimization implementations,
102a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
103a7e14dcfSSatish Balay 
104a7e14dcfSSatish Balay   Level: advanced
105a7e14dcfSSatish Balay 
106a7e14dcfSSatish Balay .seealso: TaoComputeGradient(), TaoComputeObjectiveAndGradient(), TaoSetObjectiveRoutine()
107a7e14dcfSSatish Balay @*/
108*441846f8SBarry Smith PetscErrorCode TaoComputeObjective(Tao tao, Vec X, PetscReal *f)
109a7e14dcfSSatish Balay {
110a7e14dcfSSatish Balay   PetscErrorCode ierr;
111a7e14dcfSSatish Balay   Vec            temp;
11287f595a5SBarry Smith 
113a7e14dcfSSatish Balay   PetscFunctionBegin;
114*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
115a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
116a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
117a7e14dcfSSatish Balay   if (tao->ops->computeobjective) {
118*441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
119*441846f8SBarry Smith     PetscStackPush("Tao user objective evaluation routine");
120a7e14dcfSSatish Balay     CHKMEMQ;
121a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjective)(tao,X,f,tao->user_objP);CHKERRQ(ierr);
122a7e14dcfSSatish Balay     CHKMEMQ;
123a7e14dcfSSatish Balay     PetscStackPop;
124*441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
125a7e14dcfSSatish Balay     tao->nfuncs++;
126a7e14dcfSSatish Balay   } else if (tao->ops->computeobjectiveandgradient) {
127a7e14dcfSSatish Balay     ierr = PetscInfo(tao,"Duplicating variable vector in order to call func/grad routine");CHKERRQ(ierr);
128a7e14dcfSSatish Balay     ierr = VecDuplicate(X,&temp);CHKERRQ(ierr);
129*441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjGradientEval,tao,X,NULL,NULL);CHKERRQ(ierr);
130*441846f8SBarry Smith     PetscStackPush("Tao user objective/gradient evaluation routine");
131a7e14dcfSSatish Balay     CHKMEMQ;
132a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjectiveandgradient)(tao,X,f,temp,tao->user_objgradP);CHKERRQ(ierr);
133a7e14dcfSSatish Balay     CHKMEMQ;
134a7e14dcfSSatish Balay     PetscStackPop;
135*441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjGradientEval,tao,X,NULL,NULL);CHKERRQ(ierr);
136a7e14dcfSSatish Balay     ierr = VecDestroy(&temp);CHKERRQ(ierr);
137a7e14dcfSSatish Balay     tao->nfuncgrads++;
13887f595a5SBarry Smith   }  else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetObjectiveRoutine() has not been called");
139a7e14dcfSSatish Balay   ierr = PetscInfo1(tao,"TAO Function evaluation: %14.12e\n",*f);CHKERRQ(ierr);
140a7e14dcfSSatish Balay   PetscFunctionReturn(0);
141a7e14dcfSSatish Balay }
142a7e14dcfSSatish Balay 
143a7e14dcfSSatish Balay #undef __FUNCT__
144a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeObjectiveAndGradient"
145a7e14dcfSSatish Balay /*@
146a7e14dcfSSatish Balay   TaoComputeObjectiveAndGradient - Computes the objective function value at a given point
147a7e14dcfSSatish Balay 
148*441846f8SBarry Smith   Collective on Tao
149a7e14dcfSSatish Balay 
150a7e14dcfSSatish Balay   Input Parameters:
151*441846f8SBarry Smith + tao - the Tao context
152a7e14dcfSSatish Balay - X - input vector
153a7e14dcfSSatish Balay 
154a7e14dcfSSatish Balay   Output Parameter:
155a7e14dcfSSatish Balay + f - Objective value at X
156a7e14dcfSSatish Balay - g - Gradient vector at X
157a7e14dcfSSatish Balay 
158a7e14dcfSSatish Balay   Notes: TaoComputeObjectiveAndGradient() is typically used within minimization implementations,
159a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
160a7e14dcfSSatish Balay 
161a7e14dcfSSatish Balay   Level: advanced
162a7e14dcfSSatish Balay 
163a7e14dcfSSatish Balay .seealso: TaoComputeGradient(), TaoComputeObjectiveAndGradient(), TaoSetObjectiveRoutine()
164a7e14dcfSSatish Balay @*/
165*441846f8SBarry Smith PetscErrorCode TaoComputeObjectiveAndGradient(Tao tao, Vec X, PetscReal *f, Vec G)
166a7e14dcfSSatish Balay {
167a7e14dcfSSatish Balay   PetscErrorCode ierr;
16887f595a5SBarry Smith 
169a7e14dcfSSatish Balay   PetscFunctionBegin;
170*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
171a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
172a7e14dcfSSatish Balay   PetscValidHeaderSpecific(G,VEC_CLASSID,4);
173a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
174a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,G,4);
175a7e14dcfSSatish Balay   if (tao->ops->computeobjectiveandgradient) {
176*441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
177*441846f8SBarry Smith     PetscStackPush("Tao user objective/gradient evaluation routine");
178a7e14dcfSSatish Balay     CHKMEMQ;
179a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjectiveandgradient)(tao,X,f,G,tao->user_objgradP);CHKERRQ(ierr);
180a7e14dcfSSatish Balay     if (tao->ops->computegradient == TaoDefaultComputeGradient) {
181a7e14dcfSSatish Balay       /* Overwrite gradient with finite difference gradient */
182a7e14dcfSSatish Balay       ierr = TaoDefaultComputeGradient(tao,X,G,tao->user_objgradP);CHKERRQ(ierr);
183a7e14dcfSSatish Balay     }
184a7e14dcfSSatish Balay     CHKMEMQ;
185a7e14dcfSSatish Balay     PetscStackPop;
186*441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
187a7e14dcfSSatish Balay     tao->nfuncgrads++;
188a7e14dcfSSatish Balay   } else if (tao->ops->computeobjective && tao->ops->computegradient) {
189*441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
190*441846f8SBarry Smith     PetscStackPush("Tao user objective evaluation routine");
191a7e14dcfSSatish Balay     CHKMEMQ;
192a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjective)(tao,X,f,tao->user_objP);CHKERRQ(ierr);
193a7e14dcfSSatish Balay     CHKMEMQ;
194a7e14dcfSSatish Balay     PetscStackPop;
195*441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
196a7e14dcfSSatish Balay     tao->nfuncs++;
197*441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
198*441846f8SBarry Smith     PetscStackPush("Tao user gradient evaluation routine");
199a7e14dcfSSatish Balay     CHKMEMQ;
200a7e14dcfSSatish Balay     ierr = (*tao->ops->computegradient)(tao,X,G,tao->user_gradP);CHKERRQ(ierr);
201a7e14dcfSSatish Balay     CHKMEMQ;
202a7e14dcfSSatish Balay     PetscStackPop;
203*441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
204a7e14dcfSSatish Balay     tao->ngrads++;
20587f595a5SBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetObjectiveRoutine() or TaoSetGradientRoutine() not set");
206a7e14dcfSSatish Balay   ierr = PetscInfo1(tao,"TAO Function evaluation: %14.12e\n",*f);CHKERRQ(ierr);
207a7e14dcfSSatish Balay   PetscFunctionReturn(0);
208a7e14dcfSSatish Balay }
209a7e14dcfSSatish Balay 
210a7e14dcfSSatish Balay #undef __FUNCT__
211a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetObjectiveRoutine"
212a7e14dcfSSatish Balay /*@C
213a7e14dcfSSatish Balay   TaoSetObjectiveRoutine - Sets the function evaluation routine for minimization
214a7e14dcfSSatish Balay 
215*441846f8SBarry Smith   Logically collective on Tao
216a7e14dcfSSatish Balay 
217a7e14dcfSSatish Balay   Input Parameter:
218*441846f8SBarry Smith + tao - the Tao context
219a7e14dcfSSatish Balay . func - the objective function
220a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the function evaluation
2216c23d075SBarry Smith         routine (may be NULL)
222a7e14dcfSSatish Balay 
223a7e14dcfSSatish Balay   Calling sequence of func:
224*441846f8SBarry Smith $      func (Tao tao, Vec x, PetscReal *f, void *ctx);
225a7e14dcfSSatish Balay 
226a7e14dcfSSatish Balay + x - input vector
227a7e14dcfSSatish Balay . f - function value
228a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
229a7e14dcfSSatish Balay 
230a7e14dcfSSatish Balay   Level: beginner
231a7e14dcfSSatish Balay 
232a7e14dcfSSatish Balay .seealso: TaoSetGradientRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
233a7e14dcfSSatish Balay @*/
234*441846f8SBarry Smith PetscErrorCode TaoSetObjectiveRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, PetscReal*,void*),void *ctx)
235a7e14dcfSSatish Balay {
236a7e14dcfSSatish Balay   PetscFunctionBegin;
237*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
238a7e14dcfSSatish Balay   tao->user_objP = ctx;
239a7e14dcfSSatish Balay   tao->ops->computeobjective = func;
240a7e14dcfSSatish Balay   PetscFunctionReturn(0);
241a7e14dcfSSatish Balay }
242a7e14dcfSSatish Balay 
243a7e14dcfSSatish Balay #undef __FUNCT__
244a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetSeparableObjectiveRoutine"
245a7e14dcfSSatish Balay /*@C
246a7e14dcfSSatish Balay   TaoSetSeparableObjectiveRoutine - Sets the function evaluation routine for least-square applications
247a7e14dcfSSatish Balay 
248*441846f8SBarry Smith   Logically collective on Tao
249a7e14dcfSSatish Balay 
250a7e14dcfSSatish Balay   Input Parameter:
251*441846f8SBarry Smith + tao - the Tao context
252a7e14dcfSSatish Balay . func - the objective function evaluation routine
253a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the function evaluation
2546c23d075SBarry Smith         routine (may be NULL)
255a7e14dcfSSatish Balay 
256a7e14dcfSSatish Balay   Calling sequence of func:
257*441846f8SBarry Smith $      func (Tao tao, Vec x, Vec f, void *ctx);
258a7e14dcfSSatish Balay 
259a7e14dcfSSatish Balay + x - input vector
260a7e14dcfSSatish Balay . f - function value vector
261a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
262a7e14dcfSSatish Balay 
263a7e14dcfSSatish Balay   Level: beginner
264a7e14dcfSSatish Balay 
265a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetJacobianRoutine()
266a7e14dcfSSatish Balay @*/
267*441846f8SBarry Smith PetscErrorCode TaoSetSeparableObjectiveRoutine(Tao tao, Vec sepobj, PetscErrorCode (*func)(Tao, Vec, Vec, void*),void *ctx)
268a7e14dcfSSatish Balay {
269a7e14dcfSSatish Balay   PetscFunctionBegin;
270*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
271a7e14dcfSSatish Balay   PetscValidHeaderSpecific(sepobj, VEC_CLASSID,2);
272a7e14dcfSSatish Balay   tao->user_sepobjP = ctx;
273a7e14dcfSSatish Balay   tao->sep_objective = sepobj;
274a7e14dcfSSatish Balay   tao->ops->computeseparableobjective = func;
275a7e14dcfSSatish Balay   PetscFunctionReturn(0);
276a7e14dcfSSatish Balay }
277a7e14dcfSSatish Balay 
278a7e14dcfSSatish Balay #undef __FUNCT__
279a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeSeparableObjective"
280a7e14dcfSSatish Balay /*@
281a7e14dcfSSatish Balay   TaoComputeSeparableObjective - Computes a separable objective function vector at a given point (for least-square applications)
282a7e14dcfSSatish Balay 
283*441846f8SBarry Smith   Collective on Tao
284a7e14dcfSSatish Balay 
285a7e14dcfSSatish Balay   Input Parameters:
286*441846f8SBarry Smith + tao - the Tao context
287a7e14dcfSSatish Balay - X - input vector
288a7e14dcfSSatish Balay 
289a7e14dcfSSatish Balay   Output Parameter:
290a7e14dcfSSatish Balay . f - Objective vector at X
291a7e14dcfSSatish Balay 
292a7e14dcfSSatish Balay   Notes: TaoComputeSeparableObjective() is typically used within minimization implementations,
293a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
294a7e14dcfSSatish Balay 
295a7e14dcfSSatish Balay   Level: advanced
296a7e14dcfSSatish Balay 
297a7e14dcfSSatish Balay .seealso: TaoSetSeparableObjectiveRoutine()
298a7e14dcfSSatish Balay @*/
299*441846f8SBarry Smith PetscErrorCode TaoComputeSeparableObjective(Tao tao, Vec X, Vec F)
300a7e14dcfSSatish Balay {
301a7e14dcfSSatish Balay   PetscErrorCode ierr;
30287f595a5SBarry Smith 
303a7e14dcfSSatish Balay   PetscFunctionBegin;
304*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
305a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
306a7e14dcfSSatish Balay   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
307a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
308a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,F,3);
309a7e14dcfSSatish Balay   if (tao->ops->computeseparableobjective) {
310*441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
311*441846f8SBarry Smith     PetscStackPush("Tao user separable objective evaluation routine");
312a7e14dcfSSatish Balay     CHKMEMQ;
313a7e14dcfSSatish Balay     ierr = (*tao->ops->computeseparableobjective)(tao,X,F,tao->user_sepobjP);CHKERRQ(ierr);
314a7e14dcfSSatish Balay     CHKMEMQ;
315a7e14dcfSSatish Balay     PetscStackPop;
316*441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
317a7e14dcfSSatish Balay     tao->nfuncs++;
31887f595a5SBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetSeparableObjectiveRoutine() has not been called");
319a7e14dcfSSatish Balay   ierr = PetscInfo(tao,"TAO separable function evaluation.\n");CHKERRQ(ierr);
320a7e14dcfSSatish Balay   PetscFunctionReturn(0);
321a7e14dcfSSatish Balay }
322a7e14dcfSSatish Balay 
323a7e14dcfSSatish Balay #undef __FUNCT__
324a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetGradientRoutine"
325a7e14dcfSSatish Balay /*@C
326a7e14dcfSSatish Balay   TaoSetGradientRoutine - Sets the gradient evaluation routine for minimization
327a7e14dcfSSatish Balay 
328*441846f8SBarry Smith   Logically collective on Tao
329a7e14dcfSSatish Balay 
330a7e14dcfSSatish Balay   Input Parameter:
331*441846f8SBarry Smith + tao - the Tao context
332a7e14dcfSSatish Balay . func - the gradient function
333a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the gradient evaluation
3346c23d075SBarry Smith         routine (may be NULL)
335a7e14dcfSSatish Balay 
336a7e14dcfSSatish Balay   Calling sequence of func:
337*441846f8SBarry Smith $      func (Tao tao, Vec x, Vec g, void *ctx);
338a7e14dcfSSatish Balay 
339a7e14dcfSSatish Balay + x - input vector
340a7e14dcfSSatish Balay . g - gradient value (output)
341a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
342a7e14dcfSSatish Balay 
343a7e14dcfSSatish Balay   Level: beginner
344a7e14dcfSSatish Balay 
345a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
346a7e14dcfSSatish Balay @*/
347*441846f8SBarry Smith PetscErrorCode TaoSetGradientRoutine(Tao tao,  PetscErrorCode (*func)(Tao, Vec, Vec, void*),void *ctx)
348a7e14dcfSSatish Balay {
349a7e14dcfSSatish Balay   PetscFunctionBegin;
350*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
351a7e14dcfSSatish Balay   tao->user_gradP = ctx;
352a7e14dcfSSatish Balay   tao->ops->computegradient = func;
353a7e14dcfSSatish Balay   PetscFunctionReturn(0);
354a7e14dcfSSatish Balay }
355a7e14dcfSSatish Balay 
356a7e14dcfSSatish Balay 
357a7e14dcfSSatish Balay #undef __FUNCT__
358a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetObjectiveAndGradientRoutine"
359a7e14dcfSSatish Balay /*@C
360a7e14dcfSSatish Balay   TaoSetObjectiveAndGradientRoutine - Sets a combined objective function and gradient evaluation routine for minimization
361a7e14dcfSSatish Balay 
362*441846f8SBarry Smith   Logically collective on Tao
363a7e14dcfSSatish Balay 
364a7e14dcfSSatish Balay   Input Parameter:
365*441846f8SBarry Smith + tao - the Tao context
366a7e14dcfSSatish Balay . func - the gradient function
367a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the gradient evaluation
3686c23d075SBarry Smith         routine (may be NULL)
369a7e14dcfSSatish Balay 
370a7e14dcfSSatish Balay   Calling sequence of func:
371*441846f8SBarry Smith $      func (Tao tao, Vec x, Vec g, void *ctx);
372a7e14dcfSSatish Balay 
373a7e14dcfSSatish Balay + x - input vector
374a7e14dcfSSatish Balay . g - gradient value (output)
375a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
376a7e14dcfSSatish Balay 
377a7e14dcfSSatish Balay   Level: beginner
378a7e14dcfSSatish Balay 
379a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
380a7e14dcfSSatish Balay @*/
381*441846f8SBarry Smith PetscErrorCode TaoSetObjectiveAndGradientRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, PetscReal *, Vec, void*), void *ctx)
382a7e14dcfSSatish Balay {
383a7e14dcfSSatish Balay   PetscFunctionBegin;
384*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
385a7e14dcfSSatish Balay   tao->user_objgradP = ctx;
386a7e14dcfSSatish Balay   tao->ops->computeobjectiveandgradient = func;
387a7e14dcfSSatish Balay   PetscFunctionReturn(0);
388a7e14dcfSSatish Balay }
389a7e14dcfSSatish Balay 
390a7e14dcfSSatish Balay #undef __FUNCT__
391a7e14dcfSSatish Balay #define __FUNCT__ "TaoIsObjectiveDefined"
392a7e14dcfSSatish Balay /*@
393a7e14dcfSSatish Balay   TaoIsObjectiveDefined -- Checks to see if the user has
394a7e14dcfSSatish Balay   declared an objective-only routine.  Useful for determining when
395a7e14dcfSSatish Balay   it is appropriate to call TaoComputeObjective() or
396a7e14dcfSSatish Balay   TaoComputeObjectiveAndGradient()
397a7e14dcfSSatish Balay 
398*441846f8SBarry Smith   Collective on Tao
399a7e14dcfSSatish Balay 
400a7e14dcfSSatish Balay   Input Parameter:
401*441846f8SBarry Smith + tao - the Tao context
402a7e14dcfSSatish Balay - ctx - PETSC_TRUE if objective function routine is set by user,
403a7e14dcfSSatish Balay         PETSC_FALSE otherwise
404a7e14dcfSSatish Balay   Level: developer
405a7e14dcfSSatish Balay 
406a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoIsGradientDefined(), TaoIsObjectiveAndGradientDefined()
407a7e14dcfSSatish Balay @*/
408*441846f8SBarry Smith PetscErrorCode TaoIsObjectiveDefined(Tao tao, PetscBool *flg)
409a7e14dcfSSatish Balay {
410a7e14dcfSSatish Balay   PetscFunctionBegin;
411*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
41245cf516eSBarry Smith   if (tao->ops->computeobjective == 0) *flg = PETSC_FALSE;
41345cf516eSBarry Smith   else *flg = PETSC_TRUE;
414a7e14dcfSSatish Balay   PetscFunctionReturn(0);
415a7e14dcfSSatish Balay }
416a7e14dcfSSatish Balay 
417a7e14dcfSSatish Balay #undef __FUNCT__
418a7e14dcfSSatish Balay #define __FUNCT__ "TaoIsGradientDefined"
419a7e14dcfSSatish Balay /*@
420a7e14dcfSSatish Balay   TaoIsGradientDefined -- Checks to see if the user has
421a7e14dcfSSatish Balay   declared an objective-only routine.  Useful for determining when
422a7e14dcfSSatish Balay   it is appropriate to call TaoComputeGradient() or
423a7e14dcfSSatish Balay   TaoComputeGradientAndGradient()
424a7e14dcfSSatish Balay 
425a7e14dcfSSatish Balay   Not Collective
426a7e14dcfSSatish Balay 
427a7e14dcfSSatish Balay   Input Parameter:
428*441846f8SBarry Smith + tao - the Tao context
429a7e14dcfSSatish Balay - ctx - PETSC_TRUE if gradient routine is set by user, PETSC_FALSE otherwise
430a7e14dcfSSatish Balay   Level: developer
431a7e14dcfSSatish Balay 
432a7e14dcfSSatish Balay .seealso: TaoSetGradientRoutine(), TaoIsObjectiveDefined(), TaoIsObjectiveAndGradientDefined()
433a7e14dcfSSatish Balay @*/
434*441846f8SBarry Smith PetscErrorCode TaoIsGradientDefined(Tao tao, PetscBool *flg)
435a7e14dcfSSatish Balay {
436a7e14dcfSSatish Balay   PetscFunctionBegin;
437*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
43845cf516eSBarry Smith   if (tao->ops->computegradient == 0) *flg = PETSC_FALSE;
43945cf516eSBarry Smith   else *flg = PETSC_TRUE;
440a7e14dcfSSatish Balay   PetscFunctionReturn(0);
441a7e14dcfSSatish Balay }
442a7e14dcfSSatish Balay 
443a7e14dcfSSatish Balay 
444a7e14dcfSSatish Balay #undef __FUNCT__
445a7e14dcfSSatish Balay #define __FUNCT__ "TaoIsObjectiveAndGradientDefined"
446a7e14dcfSSatish Balay /*@
447a7e14dcfSSatish Balay   TaoIsObjectiveAndGradientDefined -- Checks to see if the user has
448a7e14dcfSSatish Balay   declared a joint objective/gradient routine.  Useful for determining when
449a7e14dcfSSatish Balay   it is appropriate to call TaoComputeObjective() or
450a7e14dcfSSatish Balay   TaoComputeObjectiveAndGradient()
451a7e14dcfSSatish Balay 
452a7e14dcfSSatish Balay   Not Collective
453a7e14dcfSSatish Balay 
454a7e14dcfSSatish Balay   Input Parameter:
455*441846f8SBarry Smith + tao - the Tao context
456a7e14dcfSSatish Balay - ctx - PETSC_TRUE if objective/gradient routine is set by user, PETSC_FALSE otherwise
457a7e14dcfSSatish Balay   Level: developer
458a7e14dcfSSatish Balay 
459a7e14dcfSSatish Balay .seealso: TaoSetObjectiveAndGradientRoutine(), TaoIsObjectiveDefined(), TaoIsGradientDefined()
460a7e14dcfSSatish Balay @*/
461*441846f8SBarry Smith PetscErrorCode TaoIsObjectiveAndGradientDefined(Tao tao, PetscBool *flg)
462a7e14dcfSSatish Balay {
463a7e14dcfSSatish Balay   PetscFunctionBegin;
464*441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
46545cf516eSBarry Smith   if (tao->ops->computeobjectiveandgradient == 0) *flg = PETSC_FALSE;
46645cf516eSBarry Smith   else *flg = PETSC_TRUE;
467a7e14dcfSSatish Balay   PetscFunctionReturn(0);
468a7e14dcfSSatish Balay }
469a7e14dcfSSatish Balay 
470a7e14dcfSSatish Balay 
471a7e14dcfSSatish Balay 
472