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