Actual source code: cg.c

  1: /*$Id: cg.c 1.94 05/02/11 14:10:19-06:00 benson@rockies.mcs.anl.gov $*/

  3: #include "cg.h"                           /*I "tao_solver.h" I*/

  5: /* ---------------------------------------------------------- */
  8: int TaoSetUp_CG(TAO_SOLVER tao,void *solver){

 10:   TAO_CG *cg = (TAO_CG *) solver;
 11:   TaoVec *xx;
 12:   int    info;

 14:   TaoFunctionBegin;
 15: 
 16:   info = TaoGetSolution(tao,&xx);CHKERRQ(info);
 17: 
 18:   info = xx->Clone(&cg->G); CHKERRQ(info);
 19:   info = xx->Clone(&cg->Work); CHKERRQ(info);
 20:   info = xx->Clone(&cg->DX); CHKERRQ(info);
 21:   info = xx->Clone(&cg->Gprev); CHKERRQ(info);

 23:   info = TaoSetLagrangianGradientVector(tao,cg->G);CHKERRQ(info);
 24:   info = TaoSetStepDirectionVector(tao,cg->DX);CHKERRQ(info);

 26:   TaoFunctionReturn(0);
 27: }

 29: /* ---------------------------------------------------------- */
 32: int TaoDestroy_CG(TAO_SOLVER tao, void *solver)
 33: {
 34:   TAO_CG *cg = (TAO_CG *) solver;
 35:   int    info;

 37:   TaoFunctionBegin;

 39:   info = TaoVecDestroy(cg->Work);CHKERRQ(info);
 40:   info = TaoVecDestroy(cg->DX);CHKERRQ(info);
 41:   info = TaoVecDestroy(cg->Gprev);CHKERRQ(info);
 42:   info = TaoVecDestroy(cg->G);CHKERRQ(info);

 44:   info = TaoSetLagrangianGradientVector(tao,0);CHKERRQ(info);
 45:   info = TaoSetStepDirectionVector(tao,0);CHKERRQ(info);

 47:   TaoFunctionReturn(0);
 48: }


 51: /*------------------------------------------------------------*/
 54: int TaoSetOptions_CG(TAO_SOLVER tao, void*solver)
 55: {
 56:   TAO_CG *cg = (TAO_CG *)solver;
 57:   double   dtmp;
 58:   int      info;
 59:   TaoTruth flg;

 61:   TaoFunctionBegin;

 63:   info = TaoOptionsHead("Nonlinear Conjugate Gradient method for unconstrained optimization");CHKERRQ(info);

 65:   info = TaoOptionDouble("-tao_cg_restart","Restart method based on orthogonality of successive gradients","TaoCGSetRestartTol",cg->eta,&dtmp, &flg);CHKERRQ(info);
 66:   if (flg){
 67:     info =TaoCGSetRestartTol(tao,dtmp);
 68:   }

 70:   info = TaoLineSearchSetFromOptions(tao);CHKERRQ(info);
 71:   info = TaoOptionsTail();CHKERRQ(info);

 73:   TaoFunctionReturn(0);
 74: }


 77: /*------------------------------------------------------------*/
 80: int TaoView_CG(TAO_SOLVER tao,void* solver)
 81: {
 82:   TAO_CG   *cg = (TAO_CG *)solver;
 83:   int      info;

 85:   TaoFunctionBegin;

 87:   info = TaoPrintInt(tao,"  cg restarts=%d,",cg->restarts);CHKERRQ(info);
 88:   info = TaoPrintDouble(tao,"   tao_cg_restart=%g\n",cg->eta);CHKERRQ(info);
 89:   info = TaoLineSearchView(tao);CHKERRQ(info);

 91:   TaoFunctionReturn(0);
 92: }


 95: /* ---------------------------------------------------------- */
 98: /*@C
 99:    TaoCGSetRestartTol - Set the nonlinear conjugate gradient restart
100:    tolerance.  The algorithm restarts when the gradient at the current 
101:    point, g(x^k), and the gradient of the previous point, g^{k-1}, 
102:    satisfy the following inequality: 
103:    | g(x^k)^T g(x^{k-1}) | / g(x^k)^T g(x^k) > eta.

105:    Collective on TAO_SOLVER

107:    Input Parameters:
108: +  tao - the TAO_SOLVER context
109: -  eta - the number of previous points and gradients to be used.

111:    Output Parameter:

113:    Level: intermediate

115:    Options Database Keys: 
116: .  -tao_cg_restart <eta> - sets the restart tolerance

118: @*/
119: int TaoCGSetRestartTol(TAO_SOLVER tao,double eta)
120: {
121:   TAO_CG *cg;
122:   int info;

124:   TaoFunctionBegin;
125:   info = TaoGetSolverContext(tao,"tao_cg_fr",(void**)&cg); CHKERRQ(info);
126:   if (!cg){
127:     info = TaoGetSolverContext(tao,"tao_cg_pr",(void**)&cg); CHKERRQ(info);
128:   }
129:   if (!cg){
130:     info = TaoGetSolverContext(tao,"tao_cg_prp",(void**)&cg); CHKERRQ(info);
131:   }
132:   if (cg){
133:     cg->eta=TaoMax(eta,0.0);
134:   }
135:   TaoFunctionReturn(0);
136: }