static int TaoView_BNLS(TAO_SOLVER tao,void*solver) { int info; TaoFunctionBegin; info = TaoLineSearchView(tao);CHKERRQ(info); TaoFunctionReturn(0); }
static int TaoView_GPCG(TAO_SOLVER tao,void*solver) { TAO_GPCG *gpcg = (TAO_GPCG *)solver; int info; TaoFunctionBegin; info = TaoPrintInt(tao," Total PG its: %d,",gpcg->total_gp_its);CHKERRQ(info); info = TaoPrintDouble(tao," PG tolerance: %4.3f \n",gpcg->pg_ftol);CHKERRQ(info); info = TaoLineSearchView(tao);CHKERRQ(info); TaoFunctionReturn(0); }
static PetscErrorCode TaoView_GPCG(Tao tao, PetscViewer viewer) { TAO_GPCG *gpcg = (TAO_GPCG *)tao->data; PetscBool isascii; PetscErrorCode ierr; PetscFunctionBegin; ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii);CHKERRQ(ierr); if (isascii) { ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); ierr = PetscViewerASCIIPrintf(viewer,"Total PG its: %D,",gpcg->total_gp_its);CHKERRQ(ierr); ierr = PetscViewerASCIIPrintf(viewer,"PG tolerance: %g \n",(double)gpcg->pg_ftol);CHKERRQ(ierr); ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); } ierr = TaoLineSearchView(tao->linesearch,viewer);CHKERRQ(ierr); PetscFunctionReturn(0); }
static int TaoView_BCG(TAO_SOLVER tao,void* solver) { TAO_BCG *cg = (TAO_BCG *)solver; int info; TaoFunctionBegin; if (cg->type == TAO_CG_PolakRibiere){ info = TaoPrintf(tao," tao_cg_type=polak-ribiere\n");CHKERRQ(info); } else if (cg->type == TAO_CG_PRplus){ info = TaoPrintf(tao," tao_cg_type=polak-ribiere-plus\n");CHKERRQ(info); } else if (cg->type == TAO_CG_FletcherReeves){ info = TaoPrintf(tao," tao_cg_type=fletcher-reeves\n");CHKERRQ(info); } info = TaoPrintf2(tao," cg restarts=%d, tao_cg_restart=%g\n", cg->restarts,cg->eta);CHKERRQ(info); info = TaoLineSearchView(tao);CHKERRQ(info); TaoFunctionReturn(0); }
PetscErrorCode TaoLineSearchApply(TaoLineSearch ls, Vec x, PetscReal *f, Vec g, Vec s, PetscReal *steplength, TaoLineSearchConvergedReason *reason) { PetscErrorCode ierr; PetscViewer viewer; PetscInt low1,low2,low3,high1,high2,high3; PetscBool flg; char filename[PETSC_MAX_PATH_LEN]; PetscFunctionBegin; *reason = TAOLINESEARCH_CONTINUE_ITERATING; PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); PetscValidHeaderSpecific(x,VEC_CLASSID,2); PetscValidScalarPointer(f,3); PetscValidHeaderSpecific(g,VEC_CLASSID,4); PetscValidHeaderSpecific(s,VEC_CLASSID,5); PetscValidPointer(reason,7); PetscCheckSameComm(ls,1,x,2); PetscCheckSameTypeAndComm(x,2,g,4); PetscCheckSameTypeAndComm(x,2,s,5); ierr = VecGetOwnershipRange(x, &low1, &high1);CHKERRQ(ierr); ierr = VecGetOwnershipRange(g, &low2, &high2);CHKERRQ(ierr); ierr = VecGetOwnershipRange(s, &low3, &high3);CHKERRQ(ierr); if ( low1!= low2 || low1!= low3 || high1!= high2 || high1!= high3) SETERRQ(PETSC_COMM_SELF,1,"InCompatible vector local lengths"); ierr = PetscObjectReference((PetscObject)s);CHKERRQ(ierr); ierr = VecDestroy(&ls->stepdirection);CHKERRQ(ierr); ls->stepdirection = s; ierr = TaoLineSearchSetUp(ls);CHKERRQ(ierr); if (!ls->ops->apply) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Line Search Object does not have 'apply' routine"); ls->nfeval=0; ls->ngeval=0; ls->nfgeval=0; /* Check parameter values */ if (ls->ftol < 0.0) { ierr = PetscInfo1(ls,"Bad Line Search Parameter: ftol (%g) < 0\n",(double)ls->ftol);CHKERRQ(ierr); *reason=TAOLINESEARCH_FAILED_BADPARAMETER; } if (ls->rtol < 0.0) { ierr = PetscInfo1(ls,"Bad Line Search Parameter: rtol (%g) < 0\n",(double)ls->rtol);CHKERRQ(ierr); *reason=TAOLINESEARCH_FAILED_BADPARAMETER; } if (ls->gtol < 0.0) { ierr = PetscInfo1(ls,"Bad Line Search Parameter: gtol (%g) < 0\n",(double)ls->gtol);CHKERRQ(ierr); *reason=TAOLINESEARCH_FAILED_BADPARAMETER; } if (ls->stepmin < 0.0) { ierr = PetscInfo1(ls,"Bad Line Search Parameter: stepmin (%g) < 0\n",(double)ls->stepmin);CHKERRQ(ierr); *reason=TAOLINESEARCH_FAILED_BADPARAMETER; } if (ls->stepmax < ls->stepmin) { ierr = PetscInfo2(ls,"Bad Line Search Parameter: stepmin (%g) > stepmax (%g)\n",(double)ls->stepmin,(double)ls->stepmax);CHKERRQ(ierr); *reason=TAOLINESEARCH_FAILED_BADPARAMETER; } if (ls->max_funcs < 0) { ierr = PetscInfo1(ls,"Bad Line Search Parameter: max_funcs (%D) < 0\n",ls->max_funcs);CHKERRQ(ierr); *reason=TAOLINESEARCH_FAILED_BADPARAMETER; } if (PetscIsInfOrNanReal(*f)) { ierr = PetscInfo1(ls,"Initial Line Search Function Value is Inf or Nan (%g)\n",(double)*f);CHKERRQ(ierr); *reason=TAOLINESEARCH_FAILED_INFORNAN; } ierr = PetscObjectReference((PetscObject)x); ierr = VecDestroy(&ls->start_x);CHKERRQ(ierr); ls->start_x = x; ierr = PetscLogEventBegin(TaoLineSearch_ApplyEvent,ls,0,0,0);CHKERRQ(ierr); ierr = (*ls->ops->apply)(ls,x,f,g,s);CHKERRQ(ierr); ierr = PetscLogEventEnd(TaoLineSearch_ApplyEvent, ls, 0,0,0);CHKERRQ(ierr); *reason=ls->reason; ls->new_f = *f; if (steplength) { *steplength=ls->step; } ierr = PetscOptionsGetString(((PetscObject)ls)->prefix,"-tao_ls_view",filename,PETSC_MAX_PATH_LEN,&flg);CHKERRQ(ierr); if (ls->viewls && !PetscPreLoadingOn) { ierr = PetscViewerASCIIOpen(((PetscObject)ls)->comm,filename,&viewer);CHKERRQ(ierr); ierr = TaoLineSearchView(ls,viewer);CHKERRQ(ierr); ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); } PetscFunctionReturn(0); }