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