Actual source code: unit.c
2: #include "tao_solver.h" /*I "tao_solver.h" I*/
3: #include "src/tao_impl.h"
5: static int TaoSetOptions_UnitStep(TAO_SOLVER,void*);
6: static int TaoView_UnitStep(TAO_SOLVER,void*);
7: static int TaoApply_UnitStep(TAO_SOLVER,TaoVec*,TaoVec*,TaoVec*,TaoVec*,
8: double*,double*,int*,void*);
9: static int TaoDestroy_UnitStep(TAO_SOLVER,void*);
11: /* ---------------------------------------------------------- */
14: static int TaoDestroy_UnitStep(TAO_SOLVER tao,void *linectx)
15: {
16: TaoFunctionBegin;
17: TaoFunctionReturn(0);
18: }
19: /*------------------------------------------------------------*/
22: static int TaoSetOptions_UnitStep(TAO_SOLVER tao,void *linectx)
23: {
24: int info;
25: TaoFunctionBegin;
26: info = TaoOptionsHead("No Unit line search options");CHKERRQ(info);
27: info = TaoOptionsTail();CHKERRQ(info);
28: TaoFunctionReturn(0);
29: }
30: /*------------------------------------------------------------*/
34: static int TaoView_UnitStep(TAO_SOLVER tao,void *ctx)
35: {
36: int info;
37: TaoFunctionBegin;
38: info=TaoPrintStatement(tao," Line Search: Unit Step.\n");CHKERRQ(info);
39: TaoFunctionReturn(0);
40: }
41: /* ---------------------------------------------------------- */
44: /* @ TaoApply_LineSearch - This routine takes step length of 1.0.
46: Input Parameters:
47: + tao - TAO_SOLVER context
48: . X - current iterate (on output X contains new iterate, X + step*S)
49: . S - search direction
50: . f - objective function evaluated at X
51: . G - gradient evaluated at X
52: . W - work vector
53: . gdx - inner product of gradient and the direction of the first linear manifold being searched
54: - step - initial estimate of step length
56: Output parameters:
57: + f - objective function evaluated at new iterate, X + step*S
58: . G - gradient evaluated at new iterate, X + step*S
59: . X - new iterate
60: - step - final step length
62: Info is set to 0.
64: @ */
65: static int TaoApply_UnitStep(TAO_SOLVER tao,TaoVec* X,TaoVec* G,TaoVec* S,TaoVec* Gold,double *f,
66: double *step,int *info2,void*ctx)
67: {
68: int info;
69: double fnew;
70: TaoVec *XL,*XU;
72: TaoFunctionBegin;
73: info = X->Axpy(*step,S);CHKERRQ(info);
74: info = TaoGetVariableBounds(tao,&XL,&XU); CHKERRQ(info);
75: if (XL && XU){
76: info = X->Median(XL,X,XU);CHKERRQ(info);
77: }
78: info = TaoComputeMeritFunctionGradient(tao,X,&fnew,G); CHKERRQ(info);
79: info = PetscLogInfo((tao,"Tao Apply Unit Step: %4.4e\n",*step));
80: CHKERRQ(info);
81: if (*f<fnew){
82: info = PetscLogInfo((tao,"Tao Apply Unit Step, FINCREASE: F old:= %12.10e, F new: %12.10e\n",*f,fnew)); CHKERRQ(info);
83: }
84: *f=fnew;
85: *info2 = 0;
86: TaoFunctionReturn(0);
87: }
90: /* ---------------------------------------------------------- */
94: /*@C
95: TaoCreateUnitLineSearch - Always use step length of 1.0
97: Input Parameters:
98: . tao - TAO_SOLVER context
100: Note:
101: This routine is never used by default.
103: Level: advanced
105: .keywords: TAO_SOLVER, linesearch
106: @*/
107: int TaoCreateUnitLineSearch(TAO_SOLVER tao)
108: {
109: int info;
111: TaoFunctionBegin;
112: info = TaoSetLineSearch(tao,0,
113: TaoSetOptions_UnitStep,
114: TaoApply_UnitStep,
115: TaoView_UnitStep,
116: TaoDestroy_UnitStep,
117: 0);CHKERRQ(info);
119: TaoFunctionReturn(0);
120: }