xref: /petsc/src/tao/interface/taosolver_fg.c (revision 95452b02e12c0ee11232c7ff2b24b568a8e07e43)
1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/
2a7e14dcfSSatish Balay 
3a7e14dcfSSatish Balay /*@
4a7e14dcfSSatish Balay   TaoSetInitialVector - Sets the initial guess for the solve
5a7e14dcfSSatish Balay 
6441846f8SBarry Smith   Logically collective on Tao
7a7e14dcfSSatish Balay 
8a7e14dcfSSatish Balay   Input Parameters:
9441846f8SBarry Smith + tao - the Tao context
10a7e14dcfSSatish Balay - x0  - the initial guess
11a7e14dcfSSatish Balay 
12a7e14dcfSSatish Balay   Level: beginner
13a7e14dcfSSatish Balay .seealso: TaoCreate(), TaoSolve()
14a7e14dcfSSatish Balay @*/
15a7e14dcfSSatish Balay 
16441846f8SBarry Smith PetscErrorCode TaoSetInitialVector(Tao tao, Vec x0)
1745cf516eSBarry Smith {
18a7e14dcfSSatish Balay   PetscErrorCode ierr;
19a7e14dcfSSatish Balay 
20a7e14dcfSSatish Balay   PetscFunctionBegin;
21441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
22a7e14dcfSSatish Balay   if (x0) {
23a7e14dcfSSatish Balay     PetscValidHeaderSpecific(x0,VEC_CLASSID,2);
24a7e14dcfSSatish Balay     PetscObjectReference((PetscObject)x0);
25a7e14dcfSSatish Balay   }
26a7e14dcfSSatish Balay   ierr = VecDestroy(&tao->solution);CHKERRQ(ierr);
27a7e14dcfSSatish Balay   tao->solution = x0;
28a7e14dcfSSatish Balay   PetscFunctionReturn(0);
29a7e14dcfSSatish Balay }
30a7e14dcfSSatish Balay 
31a7e14dcfSSatish Balay /*@
32a7e14dcfSSatish Balay   TaoComputeGradient - Computes the gradient of the objective function
33a7e14dcfSSatish Balay 
34441846f8SBarry Smith   Collective on Tao
35a7e14dcfSSatish Balay 
36a7e14dcfSSatish Balay   Input Parameters:
37441846f8SBarry Smith + tao - the Tao context
38a7e14dcfSSatish Balay - X - input vector
39a7e14dcfSSatish Balay 
40a7e14dcfSSatish Balay   Output Parameter:
41a7e14dcfSSatish Balay . G - gradient vector
42a7e14dcfSSatish Balay 
43*95452b02SPatrick Sanan   Notes:
44*95452b02SPatrick Sanan     TaoComputeGradient() is typically used within minimization implementations,
45a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
46a7e14dcfSSatish Balay 
47a7e14dcfSSatish Balay   Level: advanced
48a7e14dcfSSatish Balay 
49a7e14dcfSSatish Balay .seealso: TaoComputeObjective(), TaoComputeObjectiveAndGradient(), TaoSetGradientRoutine()
50a7e14dcfSSatish Balay @*/
51441846f8SBarry Smith PetscErrorCode TaoComputeGradient(Tao tao, Vec X, Vec G)
52a7e14dcfSSatish Balay {
53a7e14dcfSSatish Balay   PetscErrorCode ierr;
54a7e14dcfSSatish Balay   PetscReal      dummy;
5587f595a5SBarry Smith 
56a7e14dcfSSatish Balay   PetscFunctionBegin;
57441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
58a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
59a7e14dcfSSatish Balay   PetscValidHeaderSpecific(G,VEC_CLASSID,2);
60a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
61a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,G,3);
62f4c1ad5cSStefano Zampini   ierr = VecLockPush(X);CHKERRQ(ierr);
63a7e14dcfSSatish Balay   if (tao->ops->computegradient) {
64441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
65441846f8SBarry Smith     PetscStackPush("Tao user gradient evaluation routine");
66a7e14dcfSSatish Balay     ierr = (*tao->ops->computegradient)(tao,X,G,tao->user_gradP);CHKERRQ(ierr);
67a7e14dcfSSatish Balay     PetscStackPop;
68441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
69a7e14dcfSSatish Balay     tao->ngrads++;
70a7e14dcfSSatish Balay   } else if (tao->ops->computeobjectiveandgradient) {
71441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
72a7e14dcfSSatish Balay     PetscStackPush("Tao user objective/gradient evaluation routine");
73a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjectiveandgradient)(tao,X,&dummy,G,tao->user_objgradP);CHKERRQ(ierr);
74a7e14dcfSSatish Balay     PetscStackPop;
75441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
76a7e14dcfSSatish Balay     tao->nfuncgrads++;
7787f595a5SBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetGradientRoutine() has not been called");
78f4c1ad5cSStefano Zampini   ierr = VecLockPop(X);CHKERRQ(ierr);
79a7e14dcfSSatish Balay   PetscFunctionReturn(0);
80a7e14dcfSSatish Balay }
81a7e14dcfSSatish Balay 
82a7e14dcfSSatish Balay /*@
83a7e14dcfSSatish Balay   TaoComputeObjective - Computes the objective function value at a given point
84a7e14dcfSSatish Balay 
85441846f8SBarry Smith   Collective on Tao
86a7e14dcfSSatish Balay 
87a7e14dcfSSatish Balay   Input Parameters:
88441846f8SBarry Smith + tao - the Tao context
89a7e14dcfSSatish Balay - X - input vector
90a7e14dcfSSatish Balay 
91a7e14dcfSSatish Balay   Output Parameter:
92a7e14dcfSSatish Balay . f - Objective value at X
93a7e14dcfSSatish Balay 
94*95452b02SPatrick Sanan   Notes:
95*95452b02SPatrick Sanan     TaoComputeObjective() is typically used within minimization implementations,
96a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
97a7e14dcfSSatish Balay 
98a7e14dcfSSatish Balay   Level: advanced
99a7e14dcfSSatish Balay 
100a7e14dcfSSatish Balay .seealso: TaoComputeGradient(), TaoComputeObjectiveAndGradient(), TaoSetObjectiveRoutine()
101a7e14dcfSSatish Balay @*/
102441846f8SBarry Smith PetscErrorCode TaoComputeObjective(Tao tao, Vec X, PetscReal *f)
103a7e14dcfSSatish Balay {
104a7e14dcfSSatish Balay   PetscErrorCode ierr;
105a7e14dcfSSatish Balay   Vec            temp;
10687f595a5SBarry Smith 
107a7e14dcfSSatish Balay   PetscFunctionBegin;
108441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
109a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
110a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
111f4c1ad5cSStefano Zampini   ierr = VecLockPush(X);CHKERRQ(ierr);
112a7e14dcfSSatish Balay   if (tao->ops->computeobjective) {
113441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
114441846f8SBarry Smith     PetscStackPush("Tao user objective evaluation routine");
115a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjective)(tao,X,f,tao->user_objP);CHKERRQ(ierr);
116a7e14dcfSSatish Balay     PetscStackPop;
117441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
118a7e14dcfSSatish Balay     tao->nfuncs++;
119a7e14dcfSSatish Balay   } else if (tao->ops->computeobjectiveandgradient) {
120955c1f14SBarry Smith     ierr = PetscInfo(tao,"Duplicating variable vector in order to call func/grad routine\n");CHKERRQ(ierr);
121a7e14dcfSSatish Balay     ierr = VecDuplicate(X,&temp);CHKERRQ(ierr);
122441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjGradientEval,tao,X,NULL,NULL);CHKERRQ(ierr);
123441846f8SBarry Smith     PetscStackPush("Tao user objective/gradient evaluation routine");
124a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjectiveandgradient)(tao,X,f,temp,tao->user_objgradP);CHKERRQ(ierr);
125a7e14dcfSSatish Balay     PetscStackPop;
126441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjGradientEval,tao,X,NULL,NULL);CHKERRQ(ierr);
127a7e14dcfSSatish Balay     ierr = VecDestroy(&temp);CHKERRQ(ierr);
128a7e14dcfSSatish Balay     tao->nfuncgrads++;
12987f595a5SBarry Smith   }  else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetObjectiveRoutine() has not been called");
130e356b196STodd Munson   ierr = PetscInfo1(tao,"TAO Function evaluation: %20.19e\n",(double)(*f));CHKERRQ(ierr);
131f4c1ad5cSStefano Zampini   ierr = VecLockPop(X);CHKERRQ(ierr);
132a7e14dcfSSatish Balay   PetscFunctionReturn(0);
133a7e14dcfSSatish Balay }
134a7e14dcfSSatish Balay 
135a7e14dcfSSatish Balay /*@
136a7e14dcfSSatish Balay   TaoComputeObjectiveAndGradient - Computes the objective function value at a given point
137a7e14dcfSSatish Balay 
138441846f8SBarry Smith   Collective on Tao
139a7e14dcfSSatish Balay 
140a7e14dcfSSatish Balay   Input Parameters:
141441846f8SBarry Smith + tao - the Tao context
142a7e14dcfSSatish Balay - X - input vector
143a7e14dcfSSatish Balay 
144a7e14dcfSSatish Balay   Output Parameter:
145a7e14dcfSSatish Balay + f - Objective value at X
146a7e14dcfSSatish Balay - g - Gradient vector at X
147a7e14dcfSSatish Balay 
148*95452b02SPatrick Sanan   Notes:
149*95452b02SPatrick Sanan     TaoComputeObjectiveAndGradient() is typically used within minimization implementations,
150a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
151a7e14dcfSSatish Balay 
152a7e14dcfSSatish Balay   Level: advanced
153a7e14dcfSSatish Balay 
154a7e14dcfSSatish Balay .seealso: TaoComputeGradient(), TaoComputeObjectiveAndGradient(), TaoSetObjectiveRoutine()
155a7e14dcfSSatish Balay @*/
156441846f8SBarry Smith PetscErrorCode TaoComputeObjectiveAndGradient(Tao tao, Vec X, PetscReal *f, Vec G)
157a7e14dcfSSatish Balay {
158a7e14dcfSSatish Balay   PetscErrorCode ierr;
15987f595a5SBarry Smith 
160a7e14dcfSSatish Balay   PetscFunctionBegin;
161441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
162a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
163a7e14dcfSSatish Balay   PetscValidHeaderSpecific(G,VEC_CLASSID,4);
164a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
165a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,G,4);
166f4c1ad5cSStefano Zampini   ierr = VecLockPush(X);CHKERRQ(ierr);
167a7e14dcfSSatish Balay   if (tao->ops->computeobjectiveandgradient) {
168441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
169f4c1ad5cSStefano Zampini     if (tao->ops->computegradient == TaoDefaultComputeGradient) {
170f4c1ad5cSStefano Zampini       ierr = TaoComputeObjective(tao,X,f);CHKERRQ(ierr);
171f4c1ad5cSStefano Zampini       ierr = TaoDefaultComputeGradient(tao,X,G,NULL);CHKERRQ(ierr);
172f4c1ad5cSStefano Zampini     } else {
173441846f8SBarry Smith       PetscStackPush("Tao user objective/gradient evaluation routine");
174a7e14dcfSSatish Balay       ierr = (*tao->ops->computeobjectiveandgradient)(tao,X,f,G,tao->user_objgradP);CHKERRQ(ierr);
1750cbffdbaSBarry Smith       PetscStackPop;
176a7e14dcfSSatish Balay     }
177441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjGradientEval,tao,X,G,NULL);CHKERRQ(ierr);
178a7e14dcfSSatish Balay     tao->nfuncgrads++;
179a7e14dcfSSatish Balay   } else if (tao->ops->computeobjective && tao->ops->computegradient) {
180441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
181441846f8SBarry Smith     PetscStackPush("Tao user objective evaluation routine");
182a7e14dcfSSatish Balay     ierr = (*tao->ops->computeobjective)(tao,X,f,tao->user_objP);CHKERRQ(ierr);
183a7e14dcfSSatish Balay     PetscStackPop;
184441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
185a7e14dcfSSatish Balay     tao->nfuncs++;
186441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
187441846f8SBarry Smith     PetscStackPush("Tao user gradient evaluation routine");
188a7e14dcfSSatish Balay     ierr = (*tao->ops->computegradient)(tao,X,G,tao->user_gradP);CHKERRQ(ierr);
189a7e14dcfSSatish Balay     PetscStackPop;
190441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_GradientEval,tao,X,G,NULL);CHKERRQ(ierr);
191a7e14dcfSSatish Balay     tao->ngrads++;
19287f595a5SBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetObjectiveRoutine() or TaoSetGradientRoutine() not set");
193e356b196STodd Munson   ierr = PetscInfo1(tao,"TAO Function evaluation: %20.19e\n",(double)(*f));CHKERRQ(ierr);
194f4c1ad5cSStefano Zampini   ierr = VecLockPop(X);CHKERRQ(ierr);
195a7e14dcfSSatish Balay   PetscFunctionReturn(0);
196a7e14dcfSSatish Balay }
197a7e14dcfSSatish Balay 
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 /*@C
230a7e14dcfSSatish Balay   TaoSetSeparableObjectiveRoutine - Sets the function evaluation routine for least-square applications
231a7e14dcfSSatish Balay 
232441846f8SBarry Smith   Logically collective on Tao
233a7e14dcfSSatish Balay 
234a7e14dcfSSatish Balay   Input Parameter:
235441846f8SBarry Smith + tao - the Tao context
236a7e14dcfSSatish Balay . func - the objective function evaluation routine
237a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the function evaluation
2386c23d075SBarry Smith         routine (may be NULL)
239a7e14dcfSSatish Balay 
240a7e14dcfSSatish Balay   Calling sequence of func:
241441846f8SBarry Smith $      func (Tao tao, Vec x, Vec f, void *ctx);
242a7e14dcfSSatish Balay 
243a7e14dcfSSatish Balay + x - input vector
244a7e14dcfSSatish Balay . f - function value vector
245a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
246a7e14dcfSSatish Balay 
247a7e14dcfSSatish Balay   Level: beginner
248a7e14dcfSSatish Balay 
249a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetJacobianRoutine()
250a7e14dcfSSatish Balay @*/
251441846f8SBarry Smith PetscErrorCode TaoSetSeparableObjectiveRoutine(Tao tao, Vec sepobj, PetscErrorCode (*func)(Tao, Vec, Vec, void*),void *ctx)
252a7e14dcfSSatish Balay {
253a7e14dcfSSatish Balay   PetscFunctionBegin;
254441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
255a7e14dcfSSatish Balay   PetscValidHeaderSpecific(sepobj, VEC_CLASSID,2);
256a7e14dcfSSatish Balay   tao->user_sepobjP = ctx;
257a7e14dcfSSatish Balay   tao->sep_objective = sepobj;
258a7e14dcfSSatish Balay   tao->ops->computeseparableobjective = func;
259a7e14dcfSSatish Balay   PetscFunctionReturn(0);
260a7e14dcfSSatish Balay }
261a7e14dcfSSatish Balay 
2628b7a9b22SJason Sarich /*@
2638b7a9b22SJason Sarich   TaoSetSeparableObjectiveWeights - Give weights for the separable objective values. A vector can be used if only diagonal terms are used, otherwise a matrix can be give. If this function is not used, or if sigma_v and sigma_w are both NULL, then the default identity matrix will be used for weights.
2648b7a9b22SJason Sarich 
2658b7a9b22SJason Sarich   Collective on Tao
2668b7a9b22SJason Sarich 
2678b7a9b22SJason Sarich   Input Parameters:
2688b7a9b22SJason Sarich + tao - the Tao context
2698b7a9b22SJason Sarich . sigma_v - vector of weights (diagonal terms only)
2708b7a9b22SJason Sarich . n       - the number of weights (if using off-diagonal)
2718b7a9b22SJason Sarich . rows    - index list of rows for sigma_w
2728b7a9b22SJason Sarich . cols    - index list of columns for sigma_w
2738b7a9b22SJason Sarich - vals - array of weights
2748b7a9b22SJason Sarich 
2758b7a9b22SJason Sarich 
2768b7a9b22SJason Sarich 
2778b7a9b22SJason Sarich   Note: Either sigma_v or sigma_w (or both) should be NULL
2788b7a9b22SJason Sarich 
2798b7a9b22SJason Sarich   Level: intermediate
2808b7a9b22SJason Sarich 
2818b7a9b22SJason Sarich .seealso: TaoSetSeparableObjectiveRoutine()
2828b7a9b22SJason Sarich @*/
2838b7a9b22SJason Sarich PetscErrorCode TaoSetSeparableObjectiveWeights(Tao tao, Vec sigma_v, PetscInt n, PetscInt *rows, PetscInt *cols, PetscReal *vals)
2848b7a9b22SJason Sarich {
2858b7a9b22SJason Sarich   PetscErrorCode ierr;
2868b7a9b22SJason Sarich   PetscInt       i;
2878b7a9b22SJason Sarich   PetscFunctionBegin;
2888b7a9b22SJason Sarich   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
2898b7a9b22SJason Sarich   ierr = VecDestroy(&tao->sep_weights_v);CHKERRQ(ierr);
2908b7a9b22SJason Sarich   tao->sep_weights_v=sigma_v;
2918b7a9b22SJason Sarich   if (sigma_v) {
2928b7a9b22SJason Sarich     ierr = PetscObjectReference((PetscObject)sigma_v);CHKERRQ(ierr);
2938b7a9b22SJason Sarich   }
2948b7a9b22SJason Sarich   if (vals) {
2958b7a9b22SJason Sarich     if (tao->sep_weights_n) {
2968b7a9b22SJason Sarich       ierr = PetscFree(tao->sep_weights_rows);CHKERRQ(ierr);
2978b7a9b22SJason Sarich       ierr = PetscFree(tao->sep_weights_cols);CHKERRQ(ierr);
2988b7a9b22SJason Sarich       ierr = PetscFree(tao->sep_weights_w);CHKERRQ(ierr);
2998b7a9b22SJason Sarich     }
3008b7a9b22SJason Sarich     ierr = PetscMalloc1(n,&tao->sep_weights_rows);CHKERRQ(ierr);
3018b7a9b22SJason Sarich     ierr = PetscMalloc1(n,&tao->sep_weights_cols);CHKERRQ(ierr);
3028b7a9b22SJason Sarich     ierr = PetscMalloc1(n,&tao->sep_weights_w);CHKERRQ(ierr);
3038b7a9b22SJason Sarich     tao->sep_weights_n=n;
3048b7a9b22SJason Sarich     for (i=0;i<n;i++) {
3058b7a9b22SJason Sarich       tao->sep_weights_rows[i]=rows[i];
3068b7a9b22SJason Sarich       tao->sep_weights_cols[i]=cols[i];
3078b7a9b22SJason Sarich       tao->sep_weights_w[i]=vals[i];
3088b7a9b22SJason Sarich     }
3098b7a9b22SJason Sarich   } else {
3108b7a9b22SJason Sarich     tao->sep_weights_n=0;
3118b7a9b22SJason Sarich     tao->sep_weights_rows=0;
3128b7a9b22SJason Sarich     tao->sep_weights_cols=0;
3138b7a9b22SJason Sarich   }
3148b7a9b22SJason Sarich   PetscFunctionReturn(0);
3158b7a9b22SJason Sarich }
316a7e14dcfSSatish Balay /*@
317a7e14dcfSSatish Balay   TaoComputeSeparableObjective - Computes a separable objective function vector at a given point (for least-square applications)
318a7e14dcfSSatish Balay 
319441846f8SBarry Smith   Collective on Tao
320a7e14dcfSSatish Balay 
321a7e14dcfSSatish Balay   Input Parameters:
322441846f8SBarry Smith + tao - the Tao context
323a7e14dcfSSatish Balay - X - input vector
324a7e14dcfSSatish Balay 
325a7e14dcfSSatish Balay   Output Parameter:
326a7e14dcfSSatish Balay . f - Objective vector at X
327a7e14dcfSSatish Balay 
328*95452b02SPatrick Sanan   Notes:
329*95452b02SPatrick Sanan     TaoComputeSeparableObjective() is typically used within minimization implementations,
330a7e14dcfSSatish Balay   so most users would not generally call this routine themselves.
331a7e14dcfSSatish Balay 
332a7e14dcfSSatish Balay   Level: advanced
333a7e14dcfSSatish Balay 
334a7e14dcfSSatish Balay .seealso: TaoSetSeparableObjectiveRoutine()
335a7e14dcfSSatish Balay @*/
336441846f8SBarry Smith PetscErrorCode TaoComputeSeparableObjective(Tao tao, Vec X, Vec F)
337a7e14dcfSSatish Balay {
338a7e14dcfSSatish Balay   PetscErrorCode ierr;
33987f595a5SBarry Smith 
340a7e14dcfSSatish Balay   PetscFunctionBegin;
341441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
342a7e14dcfSSatish Balay   PetscValidHeaderSpecific(X,VEC_CLASSID,2);
343a7e14dcfSSatish Balay   PetscValidHeaderSpecific(F,VEC_CLASSID,3);
344a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,X,2);
345a7e14dcfSSatish Balay   PetscCheckSameComm(tao,1,F,3);
346a7e14dcfSSatish Balay   if (tao->ops->computeseparableobjective) {
347441846f8SBarry Smith     ierr = PetscLogEventBegin(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
348441846f8SBarry Smith     PetscStackPush("Tao user separable objective evaluation routine");
349a7e14dcfSSatish Balay     ierr = (*tao->ops->computeseparableobjective)(tao,X,F,tao->user_sepobjP);CHKERRQ(ierr);
350a7e14dcfSSatish Balay     PetscStackPop;
351441846f8SBarry Smith     ierr = PetscLogEventEnd(Tao_ObjectiveEval,tao,X,NULL,NULL);CHKERRQ(ierr);
352a7e14dcfSSatish Balay     tao->nfuncs++;
35387f595a5SBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"TaoSetSeparableObjectiveRoutine() has not been called");
354a7e14dcfSSatish Balay   ierr = PetscInfo(tao,"TAO separable function evaluation.\n");CHKERRQ(ierr);
355a7e14dcfSSatish Balay   PetscFunctionReturn(0);
356a7e14dcfSSatish Balay }
357a7e14dcfSSatish Balay 
358a7e14dcfSSatish Balay /*@C
359a7e14dcfSSatish Balay   TaoSetGradientRoutine - Sets the gradient evaluation routine for minimization
360a7e14dcfSSatish Balay 
361441846f8SBarry Smith   Logically collective on Tao
362a7e14dcfSSatish Balay 
363a7e14dcfSSatish Balay   Input Parameter:
364441846f8SBarry Smith + tao - the Tao context
365a7e14dcfSSatish Balay . func - the gradient function
366a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the gradient evaluation
3676c23d075SBarry Smith         routine (may be NULL)
368a7e14dcfSSatish Balay 
369a7e14dcfSSatish Balay   Calling sequence of func:
370441846f8SBarry Smith $      func (Tao tao, Vec x, Vec g, void *ctx);
371a7e14dcfSSatish Balay 
372a7e14dcfSSatish Balay + x - input vector
373a7e14dcfSSatish Balay . g - gradient value (output)
374a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
375a7e14dcfSSatish Balay 
376a7e14dcfSSatish Balay   Level: beginner
377a7e14dcfSSatish Balay 
378a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
379a7e14dcfSSatish Balay @*/
380441846f8SBarry Smith PetscErrorCode TaoSetGradientRoutine(Tao tao,  PetscErrorCode (*func)(Tao, Vec, Vec, void*),void *ctx)
381a7e14dcfSSatish Balay {
382a7e14dcfSSatish Balay   PetscFunctionBegin;
383441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
384a7e14dcfSSatish Balay   tao->user_gradP = ctx;
385a7e14dcfSSatish Balay   tao->ops->computegradient = func;
386a7e14dcfSSatish Balay   PetscFunctionReturn(0);
387a7e14dcfSSatish Balay }
388a7e14dcfSSatish Balay 
389a7e14dcfSSatish Balay /*@C
390a7e14dcfSSatish Balay   TaoSetObjectiveAndGradientRoutine - Sets a combined objective function and gradient evaluation routine for minimization
391a7e14dcfSSatish Balay 
392441846f8SBarry Smith   Logically collective on Tao
393a7e14dcfSSatish Balay 
394a7e14dcfSSatish Balay   Input Parameter:
395441846f8SBarry Smith + tao - the Tao context
396a7e14dcfSSatish Balay . func - the gradient function
397a7e14dcfSSatish Balay - ctx - [optional] user-defined context for private data for the gradient evaluation
3986c23d075SBarry Smith         routine (may be NULL)
399a7e14dcfSSatish Balay 
400a7e14dcfSSatish Balay   Calling sequence of func:
40117477c02SJason Sarich $      func (Tao tao, Vec x, PetscReal *f, Vec g, void *ctx);
402a7e14dcfSSatish Balay 
403a7e14dcfSSatish Balay + x - input vector
40417477c02SJason Sarich . f - objective value (output)
405a7e14dcfSSatish Balay . g - gradient value (output)
406a7e14dcfSSatish Balay - ctx - [optional] user-defined function context
407a7e14dcfSSatish Balay 
408a7e14dcfSSatish Balay   Level: beginner
409a7e14dcfSSatish Balay 
410a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoSetHessianRoutine() TaoSetObjectiveAndGradientRoutine()
411a7e14dcfSSatish Balay @*/
412441846f8SBarry Smith PetscErrorCode TaoSetObjectiveAndGradientRoutine(Tao tao, PetscErrorCode (*func)(Tao, Vec, PetscReal *, Vec, void*), void *ctx)
413a7e14dcfSSatish Balay {
414a7e14dcfSSatish Balay   PetscFunctionBegin;
415441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
416a7e14dcfSSatish Balay   tao->user_objgradP = ctx;
417a7e14dcfSSatish Balay   tao->ops->computeobjectiveandgradient = func;
418a7e14dcfSSatish Balay   PetscFunctionReturn(0);
419a7e14dcfSSatish Balay }
420a7e14dcfSSatish Balay 
421a7e14dcfSSatish Balay /*@
422a7e14dcfSSatish Balay   TaoIsObjectiveDefined -- Checks to see if the user has
423a7e14dcfSSatish Balay   declared an objective-only routine.  Useful for determining when
424a7e14dcfSSatish Balay   it is appropriate to call TaoComputeObjective() or
425a7e14dcfSSatish Balay   TaoComputeObjectiveAndGradient()
426a7e14dcfSSatish Balay 
427441846f8SBarry Smith   Collective on Tao
428a7e14dcfSSatish Balay 
429a7e14dcfSSatish Balay   Input Parameter:
430441846f8SBarry Smith + tao - the Tao context
431a7e14dcfSSatish Balay - ctx - PETSC_TRUE if objective function routine is set by user,
432a7e14dcfSSatish Balay         PETSC_FALSE otherwise
433a7e14dcfSSatish Balay   Level: developer
434a7e14dcfSSatish Balay 
435a7e14dcfSSatish Balay .seealso: TaoSetObjectiveRoutine(), TaoIsGradientDefined(), TaoIsObjectiveAndGradientDefined()
436a7e14dcfSSatish Balay @*/
437441846f8SBarry Smith PetscErrorCode TaoIsObjectiveDefined(Tao tao, PetscBool *flg)
438a7e14dcfSSatish Balay {
439a7e14dcfSSatish Balay   PetscFunctionBegin;
440441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
44145cf516eSBarry Smith   if (tao->ops->computeobjective == 0) *flg = PETSC_FALSE;
44245cf516eSBarry Smith   else *flg = PETSC_TRUE;
443a7e14dcfSSatish Balay   PetscFunctionReturn(0);
444a7e14dcfSSatish Balay }
445a7e14dcfSSatish Balay 
446a7e14dcfSSatish Balay /*@
447a7e14dcfSSatish Balay   TaoIsGradientDefined -- Checks to see if the user has
448a7e14dcfSSatish Balay   declared an objective-only routine.  Useful for determining when
449a7e14dcfSSatish Balay   it is appropriate to call TaoComputeGradient() or
450a7e14dcfSSatish Balay   TaoComputeGradientAndGradient()
451a7e14dcfSSatish Balay 
452a7e14dcfSSatish Balay   Not Collective
453a7e14dcfSSatish Balay 
454a7e14dcfSSatish Balay   Input Parameter:
455441846f8SBarry Smith + tao - the Tao context
456a7e14dcfSSatish Balay - ctx - PETSC_TRUE if gradient routine is set by user, PETSC_FALSE otherwise
457a7e14dcfSSatish Balay   Level: developer
458a7e14dcfSSatish Balay 
459a7e14dcfSSatish Balay .seealso: TaoSetGradientRoutine(), TaoIsObjectiveDefined(), TaoIsObjectiveAndGradientDefined()
460a7e14dcfSSatish Balay @*/
461441846f8SBarry Smith PetscErrorCode TaoIsGradientDefined(Tao tao, PetscBool *flg)
462a7e14dcfSSatish Balay {
463a7e14dcfSSatish Balay   PetscFunctionBegin;
464441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
46545cf516eSBarry Smith   if (tao->ops->computegradient == 0) *flg = PETSC_FALSE;
46645cf516eSBarry Smith   else *flg = PETSC_TRUE;
467a7e14dcfSSatish Balay   PetscFunctionReturn(0);
468a7e14dcfSSatish Balay }
469a7e14dcfSSatish Balay 
470a7e14dcfSSatish Balay /*@
471a7e14dcfSSatish Balay   TaoIsObjectiveAndGradientDefined -- Checks to see if the user has
472a7e14dcfSSatish Balay   declared a joint objective/gradient routine.  Useful for determining when
473a7e14dcfSSatish Balay   it is appropriate to call TaoComputeObjective() or
474a7e14dcfSSatish Balay   TaoComputeObjectiveAndGradient()
475a7e14dcfSSatish Balay 
476a7e14dcfSSatish Balay   Not Collective
477a7e14dcfSSatish Balay 
478a7e14dcfSSatish Balay   Input Parameter:
479441846f8SBarry Smith + tao - the Tao context
480a7e14dcfSSatish Balay - ctx - PETSC_TRUE if objective/gradient routine is set by user, PETSC_FALSE otherwise
481a7e14dcfSSatish Balay   Level: developer
482a7e14dcfSSatish Balay 
483a7e14dcfSSatish Balay .seealso: TaoSetObjectiveAndGradientRoutine(), TaoIsObjectiveDefined(), TaoIsGradientDefined()
484a7e14dcfSSatish Balay @*/
485441846f8SBarry Smith PetscErrorCode TaoIsObjectiveAndGradientDefined(Tao tao, PetscBool *flg)
486a7e14dcfSSatish Balay {
487a7e14dcfSSatish Balay   PetscFunctionBegin;
488441846f8SBarry Smith   PetscValidHeaderSpecific(tao,TAO_CLASSID,1);
48945cf516eSBarry Smith   if (tao->ops->computeobjectiveandgradient == 0) *flg = PETSC_FALSE;
49045cf516eSBarry Smith   else *flg = PETSC_TRUE;
491a7e14dcfSSatish Balay   PetscFunctionReturn(0);
492a7e14dcfSSatish Balay }
493