xref: /petsc/src/tao/interface/taosolver_fg.c (revision 0cbffdbab41105f922d7f0b513bec97e25973d7d)
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 
8441846f8SBarry Smith   Logically collective on Tao
9a7e14dcfSSatish Balay 
10a7e14dcfSSatish Balay   Input Parameters:
11441846f8SBarry 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 
18441846f8SBarry Smith PetscErrorCode TaoSetInitialVector(Tao tao, Vec x0)
1945cf516eSBarry Smith {
20a7e14dcfSSatish Balay   PetscErrorCode ierr;
21a7e14dcfSSatish Balay 
22a7e14dcfSSatish Balay   PetscFunctionBegin;
23441846f8SBarry 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 
38441846f8SBarry Smith   Collective on Tao
39a7e14dcfSSatish Balay 
40a7e14dcfSSatish Balay   Input Parameters:
41441846f8SBarry 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 @*/
54441846f8SBarry Smith PetscErrorCode TaoComputeGradient(Tao tao, Vec X, Vec G)
55a7e14dcfSSatish Balay {
56a7e14dcfSSatish Balay   PetscErrorCode ierr;
57a7e14dcfSSatish Balay   PetscReal      dummy;
5887f595a5SBarry Smith 
59a7e14dcfSSatish Balay   PetscFunctionBegin;
60441846f8SBarry 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) {
66441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
67441846f8SBarry Smith     PetscStackPush("Tao user gradient evaluation routine");
68a7e14dcfSSatish Balay     ierr = (*tao->ops->computegradient)(tao,X,G,tao->user_gradP);CHKERRQ(ierr);
69a7e14dcfSSatish Balay     PetscStackPop;
70441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
71a7e14dcfSSatish Balay     tao->ngrads++;
72a7e14dcfSSatish Balay   } else if (tao->ops->computeobjectiveandgradient) {
73441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
74a7e14dcfSSatish Balay     PetscStackPush("Tao user objective/gradient evaluation routine");
75a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjectiveandgradient)(tao,X,&dummy,G,tao->user_objgradP);CHKERRQ(ierr);
76a7e14dcfSSatish Balay     PetscStackPop;
77441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
78a7e14dcfSSatish Balay     tao->nfuncgrads++;
7987f595a5SBarry Smith   }  else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetGradientRoutine() has not been called");
80a7e14dcfSSatish Balay   PetscFunctionReturn(0);
81a7e14dcfSSatish Balay }
82a7e14dcfSSatish Balay 
83a7e14dcfSSatish Balay #undef __FUNCT__
84a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeObjective"
85a7e14dcfSSatish Balay /*@
86a7e14dcfSSatish Balay   TaoComputeObjective - Computes the objective function value at a given point
87a7e14dcfSSatish Balay 
88441846f8SBarry Smith   Collective on Tao
89a7e14dcfSSatish Balay 
90a7e14dcfSSatish Balay   Input Parameters:
91441846f8SBarry Smith + tao - the Tao context
92a7e14dcfSSatish Balay - X - input vector
93a7e14dcfSSatish Balay 
94a7e14dcfSSatish Balay   Output Parameter:
95a7e14dcfSSatish Balay . f - Objective value at X
96a7e14dcfSSatish Balay 
97a7e14dcfSSatish Balay   Notes: TaoComputeObjective() is typically used within minimization implementations,
98a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
99a7e14dcfSSatish Balay 
100a7e14dcfSSatish Balay   Level: advanced
101a7e14dcfSSatish Balay 
102a7e14dcfSSatish Balay .seealso: TaoComputeGradient(), TaoComputeObjectiveAndGradient(), TaoSetObjectiveRoutine()
103a7e14dcfSSatish Balay @*/
104441846f8SBarry Smith PetscErrorCode TaoComputeObjective(Tao tao, Vec X, PetscReal *f)
105a7e14dcfSSatish Balay {
106a7e14dcfSSatish Balay   PetscErrorCode ierr;
107a7e14dcfSSatish Balay   Vec            temp;
10887f595a5SBarry Smith 
109a7e14dcfSSatish Balay   PetscFunctionBegin;
110441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
111a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
112a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
113a7e14dcfSSatish Balay   if (tao->ops->computeobjective) {
114441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
115441846f8SBarry Smith     PetscStackPush("Tao user objective evaluation routine");
116a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjective)(tao,X,f,tao->user_objP);CHKERRQ(ierr);
117a7e14dcfSSatish Balay     PetscStackPop;
118441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
119a7e14dcfSSatish Balay     tao->nfuncs++;
120a7e14dcfSSatish Balay   } else if (tao->ops->computeobjectiveandgradient) {
121a7e14dcfSSatish Balay     ierr = PetscInfo(tao,"Duplicating variable vector in order to call func/grad routine");CHKERRQ(ierr);
122a7e14dcfSSatish Balay     ierr = VecDuplicate(X,&temp);CHKERRQ(ierr);
123441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjGradientEval,tao,X,NULL,NULL);CHKERRQ(ierr);
124441846f8SBarry Smith     PetscStackPush("Tao user objective/gradient evaluation routine");
125a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjectiveandgradient)(tao,X,f,temp,tao->user_objgradP);CHKERRQ(ierr);
126a7e14dcfSSatish Balay     PetscStackPop;
127441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjGradientEval,tao,X,NULL,NULL);CHKERRQ(ierr);
128a7e14dcfSSatish Balay     ierr = VecDestroy(&temp);CHKERRQ(ierr);
129a7e14dcfSSatish Balay     tao->nfuncgrads++;
13087f595a5SBarry Smith   }  else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetObjectiveRoutine() has not been called");
131335036cbSBarry Smith   ierr = PetscInfo1(tao,"TAO Function evaluation: %14.12e\n",(double)(*f));CHKERRQ(ierr);
132a7e14dcfSSatish Balay   PetscFunctionReturn(0);
133a7e14dcfSSatish Balay }
134a7e14dcfSSatish Balay 
135a7e14dcfSSatish Balay #undef __FUNCT__
136a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeObjectiveAndGradient"
137a7e14dcfSSatish Balay /*@
138a7e14dcfSSatish Balay   TaoComputeObjectiveAndGradient - Computes the objective function value at a given point
139a7e14dcfSSatish Balay 
140441846f8SBarry Smith   Collective on Tao
141a7e14dcfSSatish Balay 
142a7e14dcfSSatish Balay   Input Parameters:
143441846f8SBarry Smith + tao - the Tao context
144a7e14dcfSSatish Balay - X - input vector
145a7e14dcfSSatish Balay 
146a7e14dcfSSatish Balay   Output Parameter:
147a7e14dcfSSatish Balay + f - Objective value at X
148a7e14dcfSSatish Balay - g - Gradient vector at X
149a7e14dcfSSatish Balay 
150a7e14dcfSSatish Balay   Notes: TaoComputeObjectiveAndGradient() is typically used within minimization implementations,
151a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
152a7e14dcfSSatish Balay 
153a7e14dcfSSatish Balay   Level: advanced
154a7e14dcfSSatish Balay 
155a7e14dcfSSatish Balay .seealso: TaoComputeGradient(), TaoComputeObjectiveAndGradient(), TaoSetObjectiveRoutine()
156a7e14dcfSSatish Balay @*/
157441846f8SBarry Smith PetscErrorCode TaoComputeObjectiveAndGradient(Tao tao, Vec X, PetscReal *f, Vec G)
158a7e14dcfSSatish Balay {
159a7e14dcfSSatish Balay   PetscErrorCode ierr;
16087f595a5SBarry Smith 
161a7e14dcfSSatish Balay   PetscFunctionBegin;
162441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
163a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
164a7e14dcfSSatish Balay   PetscValidHeaderSpecific(G,VEC_CLASSID,4);
165a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
166a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,G,4);
167a7e14dcfSSatish Balay   if (tao->ops->computeobjectiveandgradient) {
168441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
169441846f8SBarry Smith     PetscStackPush("Tao user objective/gradient evaluation routine");
170a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjectiveandgradient)(tao,X,f,G,tao->user_objgradP);CHKERRQ(ierr);
171*0cbffdbaSBarry Smith     PetscStackPop;
172a7e14dcfSSatish Balay     if (tao->ops->computegradient == TaoDefaultComputeGradient) {
173a7e14dcfSSatish Balay       /* Overwrite gradient with finite difference gradient */
174a7e14dcfSSatish Balay       ierr = TaoDefaultComputeGradient(tao,X,G,tao->user_objgradP);CHKERRQ(ierr);
175a7e14dcfSSatish Balay     }
176441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
177a7e14dcfSSatish Balay     tao->nfuncgrads++;
178a7e14dcfSSatish Balay   } else if (tao->ops->computeobjective && tao->ops->computegradient) {
179441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
180441846f8SBarry Smith     PetscStackPush("Tao user objective evaluation routine");
181a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjective)(tao,X,f,tao->user_objP);CHKERRQ(ierr);
182a7e14dcfSSatish Balay     PetscStackPop;
183441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
184a7e14dcfSSatish Balay     tao->nfuncs++;
185441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
186441846f8SBarry Smith     PetscStackPush("Tao user gradient evaluation routine");
187a7e14dcfSSatish Balay     ierr = (*tao->ops->computegradient)(tao,X,G,tao->user_gradP);CHKERRQ(ierr);
188a7e14dcfSSatish Balay     PetscStackPop;
189441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
190a7e14dcfSSatish Balay     tao->ngrads++;
19187f595a5SBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetObjectiveRoutine() or TaoSetGradientRoutine() not set");
192335036cbSBarry Smith   ierr = PetscInfo1(tao,"TAO Function evaluation: %14.12e\n",(double)(*f));CHKERRQ(ierr);
193a7e14dcfSSatish Balay   PetscFunctionReturn(0);
194a7e14dcfSSatish Balay }
195a7e14dcfSSatish Balay 
196a7e14dcfSSatish Balay #undef __FUNCT__
197a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetObjectiveRoutine"
198a7e14dcfSSatish Balay /*@C
199a7e14dcfSSatish Balay   TaoSetObjectiveRoutine - Sets the function evaluation routine for minimization
200a7e14dcfSSatish Balay 
201441846f8SBarry Smith   Logically collective on Tao
202a7e14dcfSSatish Balay 
203a7e14dcfSSatish Balay   Input Parameter:
204441846f8SBarry Smith + tao - the Tao context
205a7e14dcfSSatish Balay . func - the objective function
206a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the function evaluation
2076c23d075SBarry Smith         routine (may be NULL)
208a7e14dcfSSatish Balay 
209a7e14dcfSSatish Balay   Calling sequence of func:
210441846f8SBarry Smith $      func (Tao tao, Vec x, PetscReal *f, void *ctx);
211a7e14dcfSSatish Balay 
212a7e14dcfSSatish Balay + x - input vector
213a7e14dcfSSatish Balay . f - function value
214a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
215a7e14dcfSSatish Balay 
216a7e14dcfSSatish Balay   Level: beginner
217a7e14dcfSSatish Balay 
218a7e14dcfSSatish Balay .seealso: TaoSetGradientRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
219a7e14dcfSSatish Balay @*/
220441846f8SBarry Smith PetscErrorCode TaoSetObjectiveRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, PetscReal*,void*),void *ctx)
221a7e14dcfSSatish Balay {
222a7e14dcfSSatish Balay   PetscFunctionBegin;
223441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
224a7e14dcfSSatish Balay   tao->user_objP = ctx;
225a7e14dcfSSatish Balay   tao->ops->computeobjective = func;
226a7e14dcfSSatish Balay   PetscFunctionReturn(0);
227a7e14dcfSSatish Balay }
228a7e14dcfSSatish Balay 
229a7e14dcfSSatish Balay #undef __FUNCT__
230a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetSeparableObjectiveRoutine"
231a7e14dcfSSatish Balay /*@C
232a7e14dcfSSatish Balay   TaoSetSeparableObjectiveRoutine - Sets the function evaluation routine for least-square applications
233a7e14dcfSSatish Balay 
234441846f8SBarry Smith   Logically collective on Tao
235a7e14dcfSSatish Balay 
236a7e14dcfSSatish Balay   Input Parameter:
237441846f8SBarry Smith + tao - the Tao context
238a7e14dcfSSatish Balay . func - the objective function evaluation routine
239a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the function evaluation
2406c23d075SBarry Smith         routine (may be NULL)
241a7e14dcfSSatish Balay 
242a7e14dcfSSatish Balay   Calling sequence of func:
243441846f8SBarry Smith $      func (Tao tao, Vec x, Vec f, void *ctx);
244a7e14dcfSSatish Balay 
245a7e14dcfSSatish Balay + x - input vector
246a7e14dcfSSatish Balay . f - function value vector
247a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
248a7e14dcfSSatish Balay 
249a7e14dcfSSatish Balay   Level: beginner
250a7e14dcfSSatish Balay 
251a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetJacobianRoutine()
252a7e14dcfSSatish Balay @*/
253441846f8SBarry Smith PetscErrorCode TaoSetSeparableObjectiveRoutine(Tao tao, Vec sepobj, PetscErrorCode (*func)(Tao, Vec, Vec, void*),void *ctx)
254a7e14dcfSSatish Balay {
255a7e14dcfSSatish Balay   PetscFunctionBegin;
256441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
257a7e14dcfSSatish Balay   PetscValidHeaderSpecific(sepobj, VEC_CLASSID,2);
258a7e14dcfSSatish Balay   tao->user_sepobjP = ctx;
259a7e14dcfSSatish Balay   tao->sep_objective = sepobj;
260a7e14dcfSSatish Balay   tao->ops->computeseparableobjective = func;
261a7e14dcfSSatish Balay   PetscFunctionReturn(0);
262a7e14dcfSSatish Balay }
263a7e14dcfSSatish Balay 
264a7e14dcfSSatish Balay #undef __FUNCT__
265a7e14dcfSSatish Balay #define __FUNCT__ "TaoComputeSeparableObjective"
266a7e14dcfSSatish Balay /*@
267a7e14dcfSSatish Balay   TaoComputeSeparableObjective - Computes a separable objective function vector at a given point (for least-square applications)
268a7e14dcfSSatish Balay 
269441846f8SBarry Smith   Collective on Tao
270a7e14dcfSSatish Balay 
271a7e14dcfSSatish Balay   Input Parameters:
272441846f8SBarry Smith + tao - the Tao context
273a7e14dcfSSatish Balay - X - input vector
274a7e14dcfSSatish Balay 
275a7e14dcfSSatish Balay   Output Parameter:
276a7e14dcfSSatish Balay . f - Objective vector at X
277a7e14dcfSSatish Balay 
278a7e14dcfSSatish Balay   Notes: TaoComputeSeparableObjective() is typically used within minimization implementations,
279a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
280a7e14dcfSSatish Balay 
281a7e14dcfSSatish Balay   Level: advanced
282a7e14dcfSSatish Balay 
283a7e14dcfSSatish Balay .seealso: TaoSetSeparableObjectiveRoutine()
284a7e14dcfSSatish Balay @*/
285441846f8SBarry Smith PetscErrorCode TaoComputeSeparableObjective(Tao tao, Vec X, Vec F)
286a7e14dcfSSatish Balay {
287a7e14dcfSSatish Balay   PetscErrorCode ierr;
28887f595a5SBarry Smith 
289a7e14dcfSSatish Balay   PetscFunctionBegin;
290441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
291a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
292a7e14dcfSSatish Balay   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
293a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
294a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,F,3);
295a7e14dcfSSatish Balay   if (tao->ops->computeseparableobjective) {
296441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
297441846f8SBarry Smith     PetscStackPush("Tao user separable objective evaluation routine");
298a7e14dcfSSatish Balay     ierr = (*tao->ops->computeseparableobjective)(tao,X,F,tao->user_sepobjP);CHKERRQ(ierr);
299a7e14dcfSSatish Balay     PetscStackPop;
300441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
301a7e14dcfSSatish Balay     tao->nfuncs++;
30287f595a5SBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetSeparableObjectiveRoutine() has not been called");
303a7e14dcfSSatish Balay   ierr = PetscInfo(tao,"TAO separable function evaluation.\n");CHKERRQ(ierr);
304a7e14dcfSSatish Balay   PetscFunctionReturn(0);
305a7e14dcfSSatish Balay }
306a7e14dcfSSatish Balay 
307a7e14dcfSSatish Balay #undef __FUNCT__
308a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetGradientRoutine"
309a7e14dcfSSatish Balay /*@C
310a7e14dcfSSatish Balay   TaoSetGradientRoutine - Sets the gradient evaluation routine for minimization
311a7e14dcfSSatish Balay 
312441846f8SBarry Smith   Logically collective on Tao
313a7e14dcfSSatish Balay 
314a7e14dcfSSatish Balay   Input Parameter:
315441846f8SBarry Smith + tao - the Tao context
316a7e14dcfSSatish Balay . func - the gradient function
317a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the gradient evaluation
3186c23d075SBarry Smith         routine (may be NULL)
319a7e14dcfSSatish Balay 
320a7e14dcfSSatish Balay   Calling sequence of func:
321441846f8SBarry Smith $      func (Tao tao, Vec x, Vec g, void *ctx);
322a7e14dcfSSatish Balay 
323a7e14dcfSSatish Balay + x - input vector
324a7e14dcfSSatish Balay . g - gradient value (output)
325a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
326a7e14dcfSSatish Balay 
327a7e14dcfSSatish Balay   Level: beginner
328a7e14dcfSSatish Balay 
329a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
330a7e14dcfSSatish Balay @*/
331441846f8SBarry Smith PetscErrorCode TaoSetGradientRoutine(Tao tao,  PetscErrorCode (*func)(Tao, Vec, Vec, void*),void *ctx)
332a7e14dcfSSatish Balay {
333a7e14dcfSSatish Balay   PetscFunctionBegin;
334441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
335a7e14dcfSSatish Balay   tao->user_gradP = ctx;
336a7e14dcfSSatish Balay   tao->ops->computegradient = func;
337a7e14dcfSSatish Balay   PetscFunctionReturn(0);
338a7e14dcfSSatish Balay }
339a7e14dcfSSatish Balay 
340a7e14dcfSSatish Balay 
341a7e14dcfSSatish Balay #undef __FUNCT__
342a7e14dcfSSatish Balay #define __FUNCT__ "TaoSetObjectiveAndGradientRoutine"
343a7e14dcfSSatish Balay /*@C
344a7e14dcfSSatish Balay   TaoSetObjectiveAndGradientRoutine - Sets a combined objective function and gradient evaluation routine for minimization
345a7e14dcfSSatish Balay 
346441846f8SBarry Smith   Logically collective on Tao
347a7e14dcfSSatish Balay 
348a7e14dcfSSatish Balay   Input Parameter:
349441846f8SBarry Smith + tao - the Tao context
350a7e14dcfSSatish Balay . func - the gradient function
351a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the gradient evaluation
3526c23d075SBarry Smith         routine (may be NULL)
353a7e14dcfSSatish Balay 
354a7e14dcfSSatish Balay   Calling sequence of func:
355441846f8SBarry Smith $      func (Tao tao, Vec x, Vec g, void *ctx);
356a7e14dcfSSatish Balay 
357a7e14dcfSSatish Balay + x - input vector
358a7e14dcfSSatish Balay . g - gradient value (output)
359a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
360a7e14dcfSSatish Balay 
361a7e14dcfSSatish Balay   Level: beginner
362a7e14dcfSSatish Balay 
363a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
364a7e14dcfSSatish Balay @*/
365441846f8SBarry Smith PetscErrorCode TaoSetObjectiveAndGradientRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, PetscReal *, Vec, void*), void *ctx)
366a7e14dcfSSatish Balay {
367a7e14dcfSSatish Balay   PetscFunctionBegin;
368441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
369a7e14dcfSSatish Balay   tao->user_objgradP = ctx;
370a7e14dcfSSatish Balay   tao->ops->computeobjectiveandgradient = func;
371a7e14dcfSSatish Balay   PetscFunctionReturn(0);
372a7e14dcfSSatish Balay }
373a7e14dcfSSatish Balay 
374a7e14dcfSSatish Balay #undef __FUNCT__
375a7e14dcfSSatish Balay #define __FUNCT__ "TaoIsObjectiveDefined"
376a7e14dcfSSatish Balay /*@
377a7e14dcfSSatish Balay   TaoIsObjectiveDefined -- Checks to see if the user has
378a7e14dcfSSatish Balay   declared an objective-only routine.  Useful for determining when
379a7e14dcfSSatish Balay   it is appropriate to call TaoComputeObjective() or
380a7e14dcfSSatish Balay   TaoComputeObjectiveAndGradient()
381a7e14dcfSSatish Balay 
382441846f8SBarry Smith   Collective on Tao
383a7e14dcfSSatish Balay 
384a7e14dcfSSatish Balay   Input Parameter:
385441846f8SBarry Smith + tao - the Tao context
386a7e14dcfSSatish Balay - ctx - PETSC_TRUE if objective function routine is set by user,
387a7e14dcfSSatish Balay         PETSC_FALSE otherwise
388a7e14dcfSSatish Balay   Level: developer
389a7e14dcfSSatish Balay 
390a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoIsGradientDefined(), TaoIsObjectiveAndGradientDefined()
391a7e14dcfSSatish Balay @*/
392441846f8SBarry Smith PetscErrorCode TaoIsObjectiveDefined(Tao tao, PetscBool *flg)
393a7e14dcfSSatish Balay {
394a7e14dcfSSatish Balay   PetscFunctionBegin;
395441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
39645cf516eSBarry Smith   if (tao->ops->computeobjective == 0) *flg = PETSC_FALSE;
39745cf516eSBarry Smith   else *flg = PETSC_TRUE;
398a7e14dcfSSatish Balay   PetscFunctionReturn(0);
399a7e14dcfSSatish Balay }
400a7e14dcfSSatish Balay 
401a7e14dcfSSatish Balay #undef __FUNCT__
402a7e14dcfSSatish Balay #define __FUNCT__ "TaoIsGradientDefined"
403a7e14dcfSSatish Balay /*@
404a7e14dcfSSatish Balay   TaoIsGradientDefined -- Checks to see if the user has
405a7e14dcfSSatish Balay   declared an objective-only routine.  Useful for determining when
406a7e14dcfSSatish Balay   it is appropriate to call TaoComputeGradient() or
407a7e14dcfSSatish Balay   TaoComputeGradientAndGradient()
408a7e14dcfSSatish Balay 
409a7e14dcfSSatish Balay   Not Collective
410a7e14dcfSSatish Balay 
411a7e14dcfSSatish Balay   Input Parameter:
412441846f8SBarry Smith + tao - the Tao context
413a7e14dcfSSatish Balay - ctx - PETSC_TRUE if gradient routine is set by user, PETSC_FALSE otherwise
414a7e14dcfSSatish Balay   Level: developer
415a7e14dcfSSatish Balay 
416a7e14dcfSSatish Balay .seealso: TaoSetGradientRoutine(), TaoIsObjectiveDefined(), TaoIsObjectiveAndGradientDefined()
417a7e14dcfSSatish Balay @*/
418441846f8SBarry Smith PetscErrorCode TaoIsGradientDefined(Tao tao, PetscBool *flg)
419a7e14dcfSSatish Balay {
420a7e14dcfSSatish Balay   PetscFunctionBegin;
421441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
42245cf516eSBarry Smith   if (tao->ops->computegradient == 0) *flg = PETSC_FALSE;
42345cf516eSBarry Smith   else *flg = PETSC_TRUE;
424a7e14dcfSSatish Balay   PetscFunctionReturn(0);
425a7e14dcfSSatish Balay }
426a7e14dcfSSatish Balay 
427a7e14dcfSSatish Balay 
428a7e14dcfSSatish Balay #undef __FUNCT__
429a7e14dcfSSatish Balay #define __FUNCT__ "TaoIsObjectiveAndGradientDefined"
430a7e14dcfSSatish Balay /*@
431a7e14dcfSSatish Balay   TaoIsObjectiveAndGradientDefined -- Checks to see if the user has
432a7e14dcfSSatish Balay   declared a joint objective/gradient routine.  Useful for determining when
433a7e14dcfSSatish Balay   it is appropriate to call TaoComputeObjective() or
434a7e14dcfSSatish Balay   TaoComputeObjectiveAndGradient()
435a7e14dcfSSatish Balay 
436a7e14dcfSSatish Balay   Not Collective
437a7e14dcfSSatish Balay 
438a7e14dcfSSatish Balay   Input Parameter:
439441846f8SBarry Smith + tao - the Tao context
440a7e14dcfSSatish Balay - ctx - PETSC_TRUE if objective/gradient routine is set by user, PETSC_FALSE otherwise
441a7e14dcfSSatish Balay   Level: developer
442a7e14dcfSSatish Balay 
443a7e14dcfSSatish Balay .seealso: TaoSetObjectiveAndGradientRoutine(), TaoIsObjectiveDefined(), TaoIsGradientDefined()
444a7e14dcfSSatish Balay @*/
445441846f8SBarry Smith PetscErrorCode TaoIsObjectiveAndGradientDefined(Tao tao, PetscBool *flg)
446a7e14dcfSSatish Balay {
447a7e14dcfSSatish Balay   PetscFunctionBegin;
448441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
44945cf516eSBarry Smith   if (tao->ops->computeobjectiveandgradient == 0) *flg = PETSC_FALSE;
45045cf516eSBarry Smith   else *flg = PETSC_TRUE;
451a7e14dcfSSatish Balay   PetscFunctionReturn(0);
452a7e14dcfSSatish Balay }
453a7e14dcfSSatish Balay 
454a7e14dcfSSatish Balay 
455a7e14dcfSSatish Balay 
456