EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "TaoCreate_OWLQN" PetscErrorCode TaoCreate_OWLQN(Tao tao) { TAO_OWLQN *lmP; const char *owarmijo_type = TAOLINESEARCHOWARMIJO; PetscErrorCode ierr; PetscFunctionBegin; tao->ops->setup = TaoSetUp_OWLQN; tao->ops->solve = TaoSolve_OWLQN; tao->ops->view = TaoView_OWLQN; tao->ops->setfromoptions = TaoSetFromOptions_OWLQN; tao->ops->destroy = TaoDestroy_OWLQN; ierr = PetscNewLog(tao,&lmP);CHKERRQ(ierr); lmP->D = 0; lmP->M = 0; lmP->GV = 0; lmP->Xold = 0; lmP->Gold = 0; lmP->lambda = 1.0; tao->data = (void*)lmP; tao->max_it = 2000; tao->max_funcs = 4000; tao->fatol = 1e-4; tao->frtol = 1e-4; ierr = TaoLineSearchCreate(((PetscObject)tao)->comm,&tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch,owarmijo_type);CHKERRQ(ierr); ierr = TaoLineSearchUseTaoRoutines(tao->linesearch,tao);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode TaoCreate_BLMVM(Tao tao) { TAO_BLMVM *blmP; const char *morethuente_type = TAOLINESEARCHMT; PetscErrorCode ierr; PetscFunctionBegin; tao->ops->setup = TaoSetup_BLMVM; tao->ops->solve = TaoSolve_BLMVM; tao->ops->view = TaoView_BLMVM; tao->ops->setfromoptions = TaoSetFromOptions_BLMVM; tao->ops->destroy = TaoDestroy_BLMVM; tao->ops->computedual = TaoComputeDual_BLMVM; ierr = PetscNewLog(tao,&blmP);CHKERRQ(ierr); blmP->H0 = NULL; tao->data = (void*)blmP; /* Override default settings (unless already changed) */ if (!tao->max_it_changed) tao->max_it = 2000; if (!tao->max_funcs_changed) tao->max_funcs = 4000; ierr = TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch, morethuente_type);CHKERRQ(ierr); ierr = TaoLineSearchUseTaoRoutines(tao->linesearch,tao);CHKERRQ(ierr); ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,tao->hdr.prefix);CHKERRQ(ierr); PetscFunctionReturn(0); }
EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "TaoCreate_SQPCON" PetscErrorCode TaoCreate_SQPCON(Tao tao) { TAO_SQPCON *sqpconP; PetscErrorCode ierr; const char *morethuente_type = TAOLINESEARCHMT; PetscFunctionBegin; tao->ops->setup = TaoSetup_SQPCON; tao->ops->solve = TaoSolve_SQPCON; tao->ops->view = TaoView_SQPCON; tao->ops->setfromoptions = TaoSetFromOptions_SQPCON; tao->ops->destroy = TaoDestroy_SQPCON; ierr = PetscNewLog(tao,&sqpconP);CHKERRQ(ierr); tao->data = (void*)sqpconP; tao->max_it=200; tao->fatol=1e-4; tao->frtol=1e-4; tao->gatol=1e-4; tao->grtol=1e-4; ierr = TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch, morethuente_type);CHKERRQ(ierr); ierr = TaoLineSearchUseTaoRoutines(tao->linesearch,tao);CHKERRQ(ierr); PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode TaoCreate_GPCG(Tao tao) { TAO_GPCG *gpcg; PetscErrorCode ierr; PetscFunctionBegin; tao->ops->setup = TaoSetup_GPCG; tao->ops->solve = TaoSolve_GPCG; tao->ops->view = TaoView_GPCG; tao->ops->setfromoptions = TaoSetFromOptions_GPCG; tao->ops->destroy = TaoDestroy_GPCG; tao->ops->computedual = TaoComputeDual_GPCG; ierr = PetscNewLog(tao,&gpcg);CHKERRQ(ierr); tao->data = (void*)gpcg; /* Override default settings (unless already changed) */ if (!tao->max_it_changed) tao->max_it=500; if (!tao->max_funcs_changed) tao->max_funcs = 100000; #if defined(PETSC_USE_REAL_SINGLE) if (!tao->fatol_changed) tao->fatol=1e-6; if (!tao->frtol_changed) tao->frtol=1e-6; if (!tao->gatol_changed) tao->grtol=1e-6; if (!tao->grtol_changed) tao->grtol=1e-6; #else if (!tao->fatol_changed) tao->fatol=1e-12; if (!tao->frtol_changed) tao->frtol=1e-12; if (!tao->gatol_changed) tao->grtol=1e-12; if (!tao->grtol_changed) tao->grtol=1e-12; #endif /* Initialize pointers and variables */ gpcg->n=0; gpcg->maxgpits = 8; gpcg->pg_ftol = 0.1; gpcg->gp_iterates=0; /* Cumulative number */ gpcg->total_gp_its = 0; /* Initialize pointers and variables */ gpcg->n_bind=0; gpcg->n_free = 0; gpcg->n_upper=0; gpcg->n_lower=0; gpcg->subset_type = TAO_SUBSET_MASK; gpcg->Hsub=NULL; gpcg->Hsub_pre=NULL; ierr = KSPCreate(((PetscObject)tao)->comm, &tao->ksp);CHKERRQ(ierr); ierr = KSPSetOptionsPrefix(tao->ksp, tao->hdr.prefix);CHKERRQ(ierr); ierr = KSPSetType(tao->ksp,KSPNASH);CHKERRQ(ierr); ierr = TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch, TAOLINESEARCHGPCG);CHKERRQ(ierr); ierr = TaoLineSearchSetObjectiveAndGradientRoutine(tao->linesearch, GPCGObjectiveAndGradient, tao);CHKERRQ(ierr); ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,tao->hdr.prefix);CHKERRQ(ierr); PetscFunctionReturn(0); }
/* ---------------------------------------------------------- */ EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "TaoCreate_ASILS" PetscErrorCode TaoCreate_ASILS(Tao tao) { TAO_SSLS *asls; PetscErrorCode ierr; const char *armijo_type = TAOLINESEARCHARMIJO; PetscFunctionBegin; ierr = PetscNewLog(tao,&asls);CHKERRQ(ierr); tao->data = (void*)asls; tao->ops->solve = TaoSolve_ASILS; tao->ops->setup = TaoSetUp_ASILS; tao->ops->view = TaoView_SSLS; tao->ops->setfromoptions = TaoSetFromOptions_SSLS; tao->ops->destroy = TaoDestroy_ASILS; tao->subset_type = TAO_SUBSET_SUBVEC; asls->delta = 1e-10; asls->rho = 2.1; asls->fixed = NULL; asls->free = NULL; asls->J_sub = NULL; asls->Jpre_sub = NULL; asls->w = NULL; asls->r1 = NULL; asls->r2 = NULL; asls->r3 = NULL; asls->t1 = NULL; asls->t2 = NULL; asls->dxfree = NULL; asls->identifier = 1e-5; ierr = TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch, armijo_type);CHKERRQ(ierr); ierr = TaoLineSearchSetFromOptions(tao->linesearch);CHKERRQ(ierr); ierr = KSPCreate(((PetscObject)tao)->comm, &tao->ksp);CHKERRQ(ierr); ierr = KSPSetFromOptions(tao->ksp);CHKERRQ(ierr); tao->max_it = 2000; tao->max_funcs = 4000; tao->fatol = 0; tao->frtol = 0; tao->gttol = 0; tao->grtol = 0; #if defined(PETSC_USE_REAL_SINGLE) tao->gatol = 1.0e-6; tao->fmin = 1.0e-4; #else tao->gatol = 1.0e-16; tao->fmin = 1.0e-8; #endif PetscFunctionReturn(0); }
/*MC TAOGPCG - gradient projected conjugate gradient algorithm is an active-set conjugate-gradient based method for bound-constrained minimization Options Database Keys: + -tao_gpcg_maxpgits - maximum number of gradient projections for GPCG iterate - -tao_subset_type - "subvec","mask","matrix-free", strategies for handling active-sets Level: beginner M*/ EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "TaoCreate_GPCG" PetscErrorCode TaoCreate_GPCG(Tao tao) { TAO_GPCG *gpcg; PetscErrorCode ierr; PetscFunctionBegin; tao->ops->setup = TaoSetup_GPCG; tao->ops->solve = TaoSolve_GPCG; tao->ops->view = TaoView_GPCG; tao->ops->setfromoptions = TaoSetFromOptions_GPCG; tao->ops->destroy = TaoDestroy_GPCG; tao->ops->computedual = TaoComputeDual_GPCG; ierr = PetscNewLog(tao,&gpcg);CHKERRQ(ierr); tao->data = (void*)gpcg; tao->max_it = 500; tao->max_funcs = 100000; #if defined(PETSC_USE_REAL_SINGLE) tao->fatol = 1e-6; tao->frtol = 1e-6; #else tao->fatol = 1e-12; tao->frtol = 1e-12; #endif /* Initialize pointers and variables */ gpcg->n=0; gpcg->maxgpits = 8; gpcg->pg_ftol = 0.1; gpcg->gp_iterates=0; /* Cumulative number */ gpcg->total_gp_its = 0; /* Initialize pointers and variables */ gpcg->n_bind=0; gpcg->n_free = 0; gpcg->n_upper=0; gpcg->n_lower=0; gpcg->subset_type = TAO_SUBSET_MASK; /* gpcg->ksp_type = GPCG_KSP_STCG; */ ierr = KSPCreate(((PetscObject)tao)->comm, &tao->ksp);CHKERRQ(ierr); ierr = KSPSetType(tao->ksp,KSPNASH);CHKERRQ(ierr); ierr = TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch, TAOLINESEARCHGPCG);CHKERRQ(ierr); ierr = TaoLineSearchSetObjectiveAndGradientRoutine(tao->linesearch, GPCGObjectiveAndGradient, tao);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@ TaoLineSearchSetFromOptions - Sets various TaoLineSearch parameters from user options. Collective on TaoLineSearch Input Paremeter: . ls - the TaoLineSearch context Options Database Keys: + -tao_ls_type <type> - The algorithm that TAO uses (more-thuente, gpcg, unit) . -tao_ls_ftol <tol> - tolerance for sufficient decrease . -tao_ls_gtol <tol> - tolerance for curvature condition . -tao_ls_rtol <tol> - relative tolerance for acceptable step . -tao_ls_stepmin <step> - minimum steplength allowed . -tao_ls_stepmax <step> - maximum steplength allowed . -tao_ls_max_funcs <n> - maximum number of function evaluations allowed - -tao_ls_view - display line-search results to standard output Level: beginner @*/ PetscErrorCode TaoLineSearchSetFromOptions(TaoLineSearch ls) { PetscErrorCode ierr; const char *default_type=TAOLINESEARCHMT; char type[256]; PetscBool flg; PetscFunctionBegin; PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); ierr = PetscObjectOptionsBegin((PetscObject)ls);CHKERRQ(ierr); if (!TaoLineSearchInitialized) { ierr = TaoLineSearchInitializePackage();CHKERRQ(ierr); } if (((PetscObject)ls)->type_name) { default_type = ((PetscObject)ls)->type_name; } /* Check for type from options */ ierr = PetscOptionsFList("-tao_ls_type","Tao Line Search type","TaoLineSearchSetType",TaoLineSearchList,default_type,type,256,&flg);CHKERRQ(ierr); if (flg) { ierr = TaoLineSearchSetType(ls,type);CHKERRQ(ierr); } else if (!((PetscObject)ls)->type_name) { ierr = TaoLineSearchSetType(ls,default_type); } ierr = PetscOptionsInt("-tao_ls_max_funcs","max function evals in line search","",ls->max_funcs,&ls->max_funcs,0);CHKERRQ(ierr); ierr = PetscOptionsReal("-tao_ls_ftol","tol for sufficient decrease","",ls->ftol,&ls->ftol,0);CHKERRQ(ierr); ierr = PetscOptionsReal("-tao_ls_gtol","tol for curvature condition","",ls->gtol,&ls->gtol,0);CHKERRQ(ierr); ierr = PetscOptionsReal("-tao_ls_rtol","relative tol for acceptable step","",ls->rtol,&ls->rtol,0);CHKERRQ(ierr); ierr = PetscOptionsReal("-tao_ls_stepmin","lower bound for step","",ls->stepmin,&ls->stepmin,0);CHKERRQ(ierr); ierr = PetscOptionsReal("-tao_ls_stepmax","upper bound for step","",ls->stepmax,&ls->stepmax,0);CHKERRQ(ierr); ierr = PetscOptionsBool("-tao_ls_view","view TaoLineSearch info after each line search has completed","TaoLineSearchView",PETSC_FALSE,&ls->viewls,NULL);CHKERRQ(ierr); if (ls->ops->setfromoptions) { ierr = (*ls->ops->setfromoptions)(ls);CHKERRQ(ierr); } ierr = PetscOptionsEnd();CHKERRQ(ierr); PetscFunctionReturn(0); }
EXTERN_C_BEGIN #undef __FUNCT__ #define __FUNCT__ "TaoCreate_SSFLS" PetscErrorCode TaoCreate_SSFLS(Tao tao) { TAO_SSLS *ssls; PetscErrorCode ierr; const char *armijo_type = TAOLINESEARCHARMIJO; PetscFunctionBegin; ierr = PetscNewLog(tao,&ssls);CHKERRQ(ierr); tao->data = (void*)ssls; tao->ops->solve=TaoSolve_SSFLS; tao->ops->setup=TaoSetUp_SSFLS; tao->ops->view=TaoView_SSLS; tao->ops->setfromoptions=TaoSetFromOptions_SSLS; tao->ops->destroy = TaoDestroy_SSFLS; ssls->delta = 1e-10; ssls->rho = 2.1; ierr = TaoLineSearchCreate(((PetscObject)tao)->comm,&tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch,armijo_type);CHKERRQ(ierr); ierr = TaoLineSearchSetFromOptions(tao->linesearch); /* Linesearch objective and objectivegradient routines are set in solve routine */ ierr = KSPCreate(((PetscObject)tao)->comm,&tao->ksp);CHKERRQ(ierr); tao->max_it = 2000; tao->max_funcs = 4000; tao->fatol = 0; tao->frtol = 0; tao->grtol=0; tao->grtol=0; #if defined(PETSC_USE_REAL_SINGLE) tao->gatol = 1.0e-6; tao->fmin = 1.0e-4; #else tao->gatol = 1.0e-16; tao->fmin = 1.0e-8; #endif PetscFunctionReturn(0); }
PetscErrorCode TaoLineSearchSetUp(TaoLineSearch ls) { PetscErrorCode ierr; const char *default_type=TAOLINESEARCHMT; PetscBool flg; PetscFunctionBegin; PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); if (ls->setupcalled) PetscFunctionReturn(0); if (!((PetscObject)ls)->type_name) { ierr = TaoLineSearchSetType(ls,default_type);CHKERRQ(ierr); } if (ls->ops->setup) { ierr = (*ls->ops->setup)(ls);CHKERRQ(ierr); } if (ls->usetaoroutines) { ierr = TaoIsObjectiveDefined(ls->tao,&flg);CHKERRQ(ierr); ls->hasobjective = flg; ierr = TaoIsGradientDefined(ls->tao,&flg);CHKERRQ(ierr); ls->hasgradient = flg; ierr = TaoIsObjectiveAndGradientDefined(ls->tao,&flg);CHKERRQ(ierr); ls->hasobjectiveandgradient = flg; } else { if (ls->ops->computeobjective) { ls->hasobjective = PETSC_TRUE; } else { ls->hasobjective = PETSC_FALSE; } if (ls->ops->computegradient) { ls->hasgradient = PETSC_TRUE; } else { ls->hasgradient = PETSC_FALSE; } if (ls->ops->computeobjectiveandgradient) { ls->hasobjectiveandgradient = PETSC_TRUE; } else { ls->hasobjectiveandgradient = PETSC_FALSE; } } ls->setupcalled = PETSC_TRUE; PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode TaoCreate_SSFLS(Tao tao) { TAO_SSLS *ssls; PetscErrorCode ierr; const char *armijo_type = TAOLINESEARCHARMIJO; PetscFunctionBegin; ierr = PetscNewLog(tao,&ssls);CHKERRQ(ierr); tao->data = (void*)ssls; tao->ops->solve=TaoSolve_SSFLS; tao->ops->setup=TaoSetUp_SSFLS; tao->ops->view=TaoView_SSLS; tao->ops->setfromoptions = TaoSetFromOptions_SSLS; tao->ops->destroy = TaoDestroy_SSFLS; ssls->delta = 1e-10; ssls->rho = 2.1; ierr = TaoLineSearchCreate(((PetscObject)tao)->comm,&tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch,armijo_type);CHKERRQ(ierr); ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,tao->hdr.prefix);CHKERRQ(ierr); ierr = TaoLineSearchSetFromOptions(tao->linesearch);CHKERRQ(ierr); /* Linesearch objective and objectivegradient routines are set in solve routine */ ierr = KSPCreate(((PetscObject)tao)->comm,&tao->ksp);CHKERRQ(ierr); ierr = KSPSetOptionsPrefix(tao->ksp,tao->hdr.prefix);CHKERRQ(ierr); /* Override default settings (unless already changed) */ if (!tao->max_it_changed) tao->max_it = 2000; if (!tao->max_funcs_changed) tao->max_funcs = 4000; if (!tao->fatol_changed) tao->fatol = 0; if (!tao->frtol_changed) tao->frtol = 0; if (!tao->gttol_changed) tao->gttol = 0; if (!tao->grtol_changed) tao->grtol = 0; #if defined(PETSC_USE_REAL_SINGLE) if (!tao->gatol_changed) tao->gatol = 1.0e-6; if (!tao->fmin_changed) tao->fmin = 1.0e-4; #else if (!tao->gatol_changed) tao->gatol = 1.0e-16; if (!tao->fmin_changed) tao->fmin = 1.0e-8; #endif PetscFunctionReturn(0); }
PETSC_EXTERN PetscErrorCode TaoCreate_TRON(Tao tao) { TAO_TRON *tron; PetscErrorCode ierr; const char *morethuente_type = TAOLINESEARCHMT; PetscFunctionBegin; tao->ops->setup = TaoSetup_TRON; tao->ops->solve = TaoSolve_TRON; tao->ops->view = TaoView_TRON; tao->ops->setfromoptions = TaoSetFromOptions_TRON; tao->ops->destroy = TaoDestroy_TRON; tao->ops->computedual = TaoComputeDual_TRON; ierr = PetscNewLog(tao,&tron);CHKERRQ(ierr); tao->data = (void*)tron; /* Override default settings (unless already changed) */ if (!tao->max_it_changed) tao->max_it = 50; #if defined(PETSC_USE_REAL_SINGLE) if (!tao->steptol_changed) tao->steptol = 1.0e-6; #else if (!tao->steptol_changed) tao->steptol = 1.0e-12; #endif if (!tao->trust0_changed) tao->trust0 = 1.0; /* Initialize pointers and variables */ tron->n = 0; tron->maxgpits = 3; tron->pg_ftol = 0.001; tron->eta1 = 1.0e-4; tron->eta2 = 0.25; tron->eta3 = 0.50; tron->eta4 = 0.90; tron->sigma1 = 0.5; tron->sigma2 = 2.0; tron->sigma3 = 4.0; tron->gp_iterates = 0; /* Cumulative number */ tron->total_gp_its = 0; tron->n_free = 0; tron->DXFree=NULL; tron->R=NULL; tron->X_New=NULL; tron->G_New=NULL; tron->Work=NULL; tron->Free_Local=NULL; tron->H_sub=NULL; tron->Hpre_sub=NULL; tao->subset_type = TAO_SUBSET_SUBVEC; ierr = TaoLineSearchCreate(((PetscObject)tao)->comm, &tao->linesearch);CHKERRQ(ierr); ierr = TaoLineSearchSetType(tao->linesearch,morethuente_type);CHKERRQ(ierr); ierr = TaoLineSearchUseTaoRoutines(tao->linesearch,tao);CHKERRQ(ierr); ierr = TaoLineSearchSetOptionsPrefix(tao->linesearch,tao->hdr.prefix);CHKERRQ(ierr); ierr = KSPCreate(((PetscObject)tao)->comm, &tao->ksp);CHKERRQ(ierr); ierr = KSPSetOptionsPrefix(tao->ksp, tao->hdr.prefix);CHKERRQ(ierr); ierr = KSPSetType(tao->ksp,KSPSTCG);CHKERRQ(ierr); PetscFunctionReturn(0); }
PetscObjectAllocateFortranPointers(*ls,NFUNCS); if (!func) { *ierr = TaoLineSearchSetObjectiveAndGTSRoutine(*ls,0,ctx); } else { ((PetscObject)*ls)->fortran_func_pointers[OBJGTS] = (PetscVoidFunction)func; *ierr = TaoLineSearchSetObjectiveAndGTSRoutine(*ls, ourtaolinesearchobjectiveandgtsroutine,ctx); } } PETSC_EXTERN void PETSC_STDCALL taolinesearchsettype_(TaoLineSearch *ls, CHAR type_name PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) { char *t; FIXCHAR(type_name,len,t); *ierr = TaoLineSearchSetType(*ls,t); FREECHAR(type_name,t); } PETSC_EXTERN void PETSC_STDCALL taolinesearchview_(TaoLineSearch *ls, PetscViewer *viewer, PetscErrorCode *ierr) { PetscViewer v; PetscPatchDefaultViewers_Fortran(viewer,v); *ierr = TaoLineSearchView(*ls,v); } PETSC_EXTERN void PETSC_STDCALL taolinesearchgetoptionsprefix_(TaoLineSearch *ls, CHAR prefix PETSC_MIXED_LEN(len), PetscErrorCode *ierr PETSC_END_LEN(len)) { const char *name; *ierr = TaoLineSearchGetOptionsPrefix(*ls,&name);