1ba92ff59SBarry Smith #include <petsctaolinesearch.h> /*I "petsctaolinesearch.h" I*/ 2af0996ceSBarry Smith #include <petsc/private/taolinesearchimpl.h> 30c52818fSSatish Balay 46c23d075SBarry Smith PetscFunctionList TaoLineSearchList = NULL; 50c52818fSSatish Balay 60c52818fSSatish Balay PetscClassId TAOLINESEARCH_CLASSID=0; 70ebee16dSLisandro Dalcin 80ebee16dSLisandro Dalcin PetscLogEvent TAOLINESEARCH_Apply; 90ebee16dSLisandro Dalcin PetscLogEvent TAOLINESEARCH_Eval; 100c52818fSSatish Balay 110c52818fSSatish Balay /*@C 12fe2efc57SMark TaoLineSearchViewFromOptions - View from Options 13fe2efc57SMark 14fe2efc57SMark Collective on TaoLineSearch 15fe2efc57SMark 16fe2efc57SMark Input Parameters: 17fe2efc57SMark + A - the Tao context 18736c3998SJose E. Roman . obj - Optional object 19736c3998SJose E. Roman - name - command line option 20fe2efc57SMark 21fe2efc57SMark Level: intermediate 22db781477SPatrick Sanan .seealso: `TaoLineSearch`, `TaoLineSearchView`, `PetscObjectViewFromOptions()`, `TaoLineSearchCreate()` 23fe2efc57SMark @*/ 24fe2efc57SMark PetscErrorCode TaoLineSearchViewFromOptions(TaoLineSearch A,PetscObject obj,const char name[]) 25fe2efc57SMark { 26fe2efc57SMark PetscFunctionBegin; 27fe2efc57SMark PetscValidHeaderSpecific(A,TAOLINESEARCH_CLASSID,1); 289566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A,obj,name)); 29fe2efc57SMark PetscFunctionReturn(0); 30fe2efc57SMark } 31fe2efc57SMark 32fe2efc57SMark /*@C 330c52818fSSatish Balay TaoLineSearchView - Prints information about the TaoLineSearch 340c52818fSSatish Balay 350c52818fSSatish Balay Collective on TaoLineSearch 360c52818fSSatish Balay 370c52818fSSatish Balay InputParameters: 38441846f8SBarry Smith + ls - the Tao context 390c52818fSSatish Balay - viewer - visualization context 400c52818fSSatish Balay 410c52818fSSatish Balay Options Database Key: 420c52818fSSatish Balay . -tao_ls_view - Calls TaoLineSearchView() at the end of each line search 430c52818fSSatish Balay 440c52818fSSatish Balay Notes: 450c52818fSSatish Balay The available visualization contexts include 460c52818fSSatish Balay + PETSC_VIEWER_STDOUT_SELF - standard output (default) 470c52818fSSatish Balay - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 480c52818fSSatish Balay output where only the first processor opens 490c52818fSSatish Balay the file. All other processors send their 500c52818fSSatish Balay data to the first processor to print. 510c52818fSSatish Balay 520c52818fSSatish Balay Level: beginner 530c52818fSSatish Balay 54db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()` 550c52818fSSatish Balay @*/ 560c52818fSSatish Balay 570c52818fSSatish Balay PetscErrorCode TaoLineSearchView(TaoLineSearch ls, PetscViewer viewer) 580c52818fSSatish Balay { 590c52818fSSatish Balay PetscBool isascii, isstring; 60dedfbcbeSJed Brown TaoLineSearchType type; 61f06e3bfaSBarry Smith 620c52818fSSatish Balay PetscFunctionBegin; 630c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 640c52818fSSatish Balay if (!viewer) { 659566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetStdout(((PetscObject)ls)->comm, &viewer)); 660c52818fSSatish Balay } 670c52818fSSatish Balay PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 680c52818fSSatish Balay PetscCheckSameComm(ls,1,viewer,2); 690c52818fSSatish Balay 709566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&isascii)); 719566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSTRING,&isstring)); 720c52818fSSatish Balay if (isascii) { 739566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)ls, viewer)); 7463b15415SAlp Dener if (ls->ops->view) { 759566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 769566063dSJacob Faibussowitsch PetscCall((*ls->ops->view)(ls,viewer)); 779566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 780c52818fSSatish Balay } 799566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer)); 8063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"maximum function evaluations=%" PetscInt_FMT "\n",ls->max_funcs)); 819566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"tolerances: ftol=%g, rtol=%g, gtol=%g\n",(double)ls->ftol,(double)ls->rtol,(double)ls->gtol)); 8263a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"total number of function evaluations=%" PetscInt_FMT "\n",ls->nfeval)); 8363a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"total number of gradient evaluations=%" PetscInt_FMT "\n",ls->ngeval)); 8463a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"total number of function/gradient evaluations=%" PetscInt_FMT "\n",ls->nfgeval)); 850c52818fSSatish Balay 860c52818fSSatish Balay if (ls->bounded) { 879566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"using variable bounds\n")); 880c52818fSSatish Balay } 899566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"Termination reason: %d\n",(int)ls->reason)); 909566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer)); 910c52818fSSatish Balay } else if (isstring) { 929566063dSJacob Faibussowitsch PetscCall(TaoLineSearchGetType(ls,&type)); 939566063dSJacob Faibussowitsch PetscCall(PetscViewerStringSPrintf(viewer," %-3.3s",type)); 940c52818fSSatish Balay } 950c52818fSSatish Balay PetscFunctionReturn(0); 960c52818fSSatish Balay } 970c52818fSSatish Balay 980c52818fSSatish Balay /*@C 990c52818fSSatish Balay TaoLineSearchCreate - Creates a TAO Line Search object. Algorithms in TAO that use 1000c52818fSSatish Balay line-searches will automatically create one. 1010c52818fSSatish Balay 102d083f849SBarry Smith Collective 1030c52818fSSatish Balay 1040c52818fSSatish Balay Input Parameter: 1050c52818fSSatish Balay . comm - MPI communicator 1060c52818fSSatish Balay 1070c52818fSSatish Balay Output Parameter: 1080c52818fSSatish Balay . newls - the new TaoLineSearch context 1090c52818fSSatish Balay 1100c52818fSSatish Balay Available methods include: 111147403d9SBarry Smith + more-thuente - the More-Thuente method 112147403d9SBarry Smith . gpcg - the GPCG method 1130c52818fSSatish Balay - unit - Do not perform any line search 1140c52818fSSatish Balay 1150c52818fSSatish Balay Options Database Keys: 1160c52818fSSatish Balay . -tao_ls_type - select which method TAO should use 1170c52818fSSatish Balay 1180c52818fSSatish Balay Level: beginner 1190c52818fSSatish Balay 120db781477SPatrick Sanan .seealso: `TaoLineSearchSetType()`, `TaoLineSearchApply()`, `TaoLineSearchDestroy()` 1210c52818fSSatish Balay @*/ 1220c52818fSSatish Balay 1230c52818fSSatish Balay PetscErrorCode TaoLineSearchCreate(MPI_Comm comm, TaoLineSearch *newls) 1240c52818fSSatish Balay { 1250c52818fSSatish Balay TaoLineSearch ls; 1260c52818fSSatish Balay 1270c52818fSSatish Balay PetscFunctionBegin; 1280c52818fSSatish Balay PetscValidPointer(newls,2); 1299566063dSJacob Faibussowitsch PetscCall(TaoLineSearchInitializePackage()); 1300c52818fSSatish Balay 1319566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(ls,TAOLINESEARCH_CLASSID,"TaoLineSearch","Linesearch","Tao",comm,TaoLineSearchDestroy,TaoLineSearchView)); 1320c52818fSSatish Balay ls->max_funcs = 30; 1330c52818fSSatish Balay ls->ftol = 0.0001; 1340c52818fSSatish Balay ls->gtol = 0.9; 1356f4723b1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 1366f4723b1SBarry Smith ls->rtol = 1.0e-5; 1376f4723b1SBarry Smith #else 1380c52818fSSatish Balay ls->rtol = 1.0e-10; 1396f4723b1SBarry Smith #endif 1400c52818fSSatish Balay ls->stepmin = 1.0e-20; 1410c52818fSSatish Balay ls->stepmax = 1.0e+20; 1420c52818fSSatish Balay ls->step = 1.0; 143a39c8e28SStefano Zampini ls->initstep = 1.0; 1440c52818fSSatish Balay *newls = ls; 1450c52818fSSatish Balay PetscFunctionReturn(0); 1460c52818fSSatish Balay } 1470c52818fSSatish Balay 1480c52818fSSatish Balay /*@ 1490c52818fSSatish Balay TaoLineSearchSetUp - Sets up the internal data structures for the later use 1500c52818fSSatish Balay of a Tao solver 1510c52818fSSatish Balay 1520c52818fSSatish Balay Collective on ls 1530c52818fSSatish Balay 1540c52818fSSatish Balay Input Parameters: 1550c52818fSSatish Balay . ls - the TaoLineSearch context 1560c52818fSSatish Balay 1570c52818fSSatish Balay Notes: 1580c52818fSSatish Balay The user will not need to explicitly call TaoLineSearchSetUp(), as it will 1590c52818fSSatish Balay automatically be called in TaoLineSearchSolve(). However, if the user 1600c52818fSSatish Balay desires to call it explicitly, it should come after TaoLineSearchCreate() 1610c52818fSSatish Balay but before TaoLineSearchApply(). 1620c52818fSSatish Balay 1630c52818fSSatish Balay Level: developer 1640c52818fSSatish Balay 165db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchApply()` 1660c52818fSSatish Balay @*/ 1670c52818fSSatish Balay 1680c52818fSSatish Balay PetscErrorCode TaoLineSearchSetUp(TaoLineSearch ls) 1690c52818fSSatish Balay { 1708caf6e8cSBarry Smith const char *default_type=TAOLINESEARCHMT; 1710c52818fSSatish Balay PetscBool flg; 172f06e3bfaSBarry Smith 1730c52818fSSatish Balay PetscFunctionBegin; 1740c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 1750c52818fSSatish Balay if (ls->setupcalled) PetscFunctionReturn(0); 1760c52818fSSatish Balay if (!((PetscObject)ls)->type_name) { 1779566063dSJacob Faibussowitsch PetscCall(TaoLineSearchSetType(ls,default_type)); 1780c52818fSSatish Balay } 179*1baa6e33SBarry Smith if (ls->ops->setup) PetscCall((*ls->ops->setup)(ls)); 1800c52818fSSatish Balay if (ls->usetaoroutines) { 1819566063dSJacob Faibussowitsch PetscCall(TaoIsObjectiveDefined(ls->tao,&flg)); 1820c52818fSSatish Balay ls->hasobjective = flg; 1839566063dSJacob Faibussowitsch PetscCall(TaoIsGradientDefined(ls->tao,&flg)); 1840c52818fSSatish Balay ls->hasgradient = flg; 1859566063dSJacob Faibussowitsch PetscCall(TaoIsObjectiveAndGradientDefined(ls->tao,&flg)); 1860c52818fSSatish Balay ls->hasobjectiveandgradient = flg; 1870c52818fSSatish Balay } else { 1880c52818fSSatish Balay if (ls->ops->computeobjective) { 1890c52818fSSatish Balay ls->hasobjective = PETSC_TRUE; 1900c52818fSSatish Balay } else { 1910c52818fSSatish Balay ls->hasobjective = PETSC_FALSE; 1920c52818fSSatish Balay } 1930c52818fSSatish Balay if (ls->ops->computegradient) { 1940c52818fSSatish Balay ls->hasgradient = PETSC_TRUE; 1950c52818fSSatish Balay } else { 1960c52818fSSatish Balay ls->hasgradient = PETSC_FALSE; 1970c52818fSSatish Balay } 1980c52818fSSatish Balay if (ls->ops->computeobjectiveandgradient) { 1990c52818fSSatish Balay ls->hasobjectiveandgradient = PETSC_TRUE; 2000c52818fSSatish Balay } else { 2010c52818fSSatish Balay ls->hasobjectiveandgradient = PETSC_FALSE; 2020c52818fSSatish Balay } 2030c52818fSSatish Balay } 2040c52818fSSatish Balay ls->setupcalled = PETSC_TRUE; 2050c52818fSSatish Balay PetscFunctionReturn(0); 2060c52818fSSatish Balay } 2070c52818fSSatish Balay 2080c52818fSSatish Balay /*@ 2090c52818fSSatish Balay TaoLineSearchReset - Some line searches may carry state information 2100c52818fSSatish Balay from one TaoLineSearchApply() to the next. This function resets this 2110c52818fSSatish Balay state information. 2120c52818fSSatish Balay 2130c52818fSSatish Balay Collective on TaoLineSearch 2140c52818fSSatish Balay 2150c52818fSSatish Balay Input Parameter: 2160c52818fSSatish Balay . ls - the TaoLineSearch context 2170c52818fSSatish Balay 2180c52818fSSatish Balay Level: developer 2190c52818fSSatish Balay 220db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchApply()` 2210c52818fSSatish Balay @*/ 2220c52818fSSatish Balay PetscErrorCode TaoLineSearchReset(TaoLineSearch ls) 2230c52818fSSatish Balay { 2240c52818fSSatish Balay PetscFunctionBegin; 2250c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 226*1baa6e33SBarry Smith if (ls->ops->reset) PetscCall((*ls->ops->reset)(ls)); 2270c52818fSSatish Balay PetscFunctionReturn(0); 2280c52818fSSatish Balay } 229f06e3bfaSBarry Smith 2300c52818fSSatish Balay /*@ 2310c52818fSSatish Balay TaoLineSearchDestroy - Destroys the TAO context that was created with 2320c52818fSSatish Balay TaoLineSearchCreate() 2330c52818fSSatish Balay 2340c52818fSSatish Balay Collective on TaoLineSearch 2350c52818fSSatish Balay 2367a7aea1fSJed Brown Input Parameter: 2370c52818fSSatish Balay . ls - the TaoLineSearch context 2380c52818fSSatish Balay 2390c52818fSSatish Balay Level: beginner 2400c52818fSSatish Balay 2410c52818fSSatish Balay .seealse: TaoLineSearchCreate(), TaoLineSearchSolve() 2420c52818fSSatish Balay @*/ 2430c52818fSSatish Balay PetscErrorCode TaoLineSearchDestroy(TaoLineSearch *ls) 2440c52818fSSatish Balay { 2450c52818fSSatish Balay PetscFunctionBegin; 2460c52818fSSatish Balay if (!*ls) PetscFunctionReturn(0); 2470c52818fSSatish Balay PetscValidHeaderSpecific(*ls,TAOLINESEARCH_CLASSID,1); 24883c8fe1dSLisandro Dalcin if (--((PetscObject)*ls)->refct > 0) {*ls = NULL; PetscFunctionReturn(0);} 2499566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*ls)->stepdirection)); 2509566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*ls)->start_x)); 2519566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*ls)->upper)); 2529566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*ls)->lower)); 2530c52818fSSatish Balay if ((*ls)->ops->destroy) { 2549566063dSJacob Faibussowitsch PetscCall((*(*ls)->ops->destroy)(*ls)); 2550c52818fSSatish Balay } 2562a0dac07SAlp Dener if ((*ls)->usemonitor) { 2579566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&(*ls)->viewer)); 2582a0dac07SAlp Dener } 2599566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(ls)); 2600c52818fSSatish Balay PetscFunctionReturn(0); 2610c52818fSSatish Balay } 2620c52818fSSatish Balay 2630c52818fSSatish Balay /*@ 2640c52818fSSatish Balay TaoLineSearchApply - Performs a line-search in a given step direction. Criteria for acceptable step length depends on the line-search algorithm chosen 2650c52818fSSatish Balay 2660c52818fSSatish Balay Collective on TaoLineSearch 2670c52818fSSatish Balay 2680c52818fSSatish Balay Input Parameters: 269441846f8SBarry Smith + ls - the Tao context 2700c52818fSSatish Balay - s - search direction 2710c52818fSSatish Balay 2726b867d5aSJose E. Roman Input/Output Parameters: 2736b867d5aSJose E. Roman 2740c52818fSSatish Balay Output Parameters: 275f1a722f8SMatthew G. Knepley + x - On input the current solution, on output x contains the new solution determined by the line search 276f1a722f8SMatthew G. Knepley . f - On input the objective function value at current solution, on output contains the objective function value at new solution 277f1a722f8SMatthew G. Knepley . g - On input the gradient evaluated at x, on output contains the gradient at new solution 278f1a722f8SMatthew G. Knepley . steplength - scalar multiplier of s used ( x = x0 + steplength * x) 2790c52818fSSatish Balay - reason - reason why the line-search stopped 2800c52818fSSatish Balay 28197bb3fdcSJose E. Roman Notes: 2820c52818fSSatish Balay reason will be set to one of: 2830c52818fSSatish Balay 2840c52818fSSatish Balay + TAOLINESEARCH_FAILED_ASCENT - initial line search step * g is not descent direction 2850c52818fSSatish Balay . TAOLINESEARCH_FAILED_INFORNAN - function evaluation gives Inf or Nan value 2860c52818fSSatish Balay . TAOLINESEARCH_FAILED_BADPARAMETER - negative value set as parameter 2870c52818fSSatish Balay . TAOLINESEARCH_HALTED_MAXFCN - maximum number of function evaluation reached 2880c52818fSSatish Balay . TAOLINESEARCH_HALTED_UPPERBOUND - step is at upper bound 2890c52818fSSatish Balay . TAOLINESEARCH_HALTED_LOWERBOUND - step is at lower bound 2900c52818fSSatish Balay . TAOLINESEARCH_HALTED_RTOL - range of uncertainty is smaller than given tolerance 2910c52818fSSatish Balay . TAOLINESEARCH_HALTED_USER - user can set this reason to stop line search 2920c52818fSSatish Balay . TAOLINESEARCH_HALTED_OTHER - any other reason 2930c52818fSSatish Balay - TAOLINESEARCH_SUCCESS - successful line search 2940c52818fSSatish Balay 2950c52818fSSatish Balay The algorithm developer must set up the TaoLineSearch with calls to 296441846f8SBarry Smith TaoLineSearchSetObjectiveRoutine() and TaoLineSearchSetGradientRoutine(), TaoLineSearchSetObjectiveAndGradientRoutine(), or TaoLineSearchUseTaoRoutines() 2970c52818fSSatish Balay 2980c52818fSSatish Balay You may or may not need to follow this with a call to 2990c52818fSSatish Balay TaoAddLineSearchCounts(), depending on whether you want these 3000c52818fSSatish Balay evaluations to count toward the total function/gradient evaluations. 3010c52818fSSatish Balay 3020c52818fSSatish Balay Level: beginner 3030c52818fSSatish Balay 304db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchSetType()`, `TaoLineSearchSetInitialStepLength()`, `TaoAddLineSearchCounts()` 3050c52818fSSatish Balay @*/ 3060c52818fSSatish Balay 307e4cb33bbSBarry Smith PetscErrorCode TaoLineSearchApply(TaoLineSearch ls, Vec x, PetscReal *f, Vec g, Vec s, PetscReal *steplength, TaoLineSearchConvergedReason *reason) 3080c52818fSSatish Balay { 3090c52818fSSatish Balay PetscInt low1,low2,low3,high1,high2,high3; 3100c52818fSSatish Balay 3110c52818fSSatish Balay PetscFunctionBegin; 3120c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 3130c52818fSSatish Balay PetscValidHeaderSpecific(x,VEC_CLASSID,2); 3143f6ba705SLisandro Dalcin PetscValidRealPointer(f,3); 3150c52818fSSatish Balay PetscValidHeaderSpecific(g,VEC_CLASSID,4); 3160c52818fSSatish Balay PetscValidHeaderSpecific(s,VEC_CLASSID,5); 3170c52818fSSatish Balay PetscValidPointer(reason,7); 3180c52818fSSatish Balay PetscCheckSameComm(ls,1,x,2); 3190c52818fSSatish Balay PetscCheckSameTypeAndComm(x,2,g,4); 3200c52818fSSatish Balay PetscCheckSameTypeAndComm(x,2,s,5); 3219566063dSJacob Faibussowitsch PetscCall(VecGetOwnershipRange(x, &low1, &high1)); 3229566063dSJacob Faibussowitsch PetscCall(VecGetOwnershipRange(g, &low2, &high2)); 3239566063dSJacob Faibussowitsch PetscCall(VecGetOwnershipRange(s, &low3, &high3)); 3243c859ba3SBarry Smith PetscCheck(low1 == low2 && low1 == low3 && high1 == high2 && high1 == high3,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Incompatible vector local lengths"); 3250c52818fSSatish Balay 32697ab8e72SStefano Zampini *reason = TAOLINESEARCH_CONTINUE_ITERATING; 3279566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)s)); 3289566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ls->stepdirection)); 329050fc7a3SBarry Smith ls->stepdirection = s; 3300c52818fSSatish Balay 3319566063dSJacob Faibussowitsch PetscCall(TaoLineSearchSetUp(ls)); 3323c859ba3SBarry Smith PetscCheck(ls->ops->apply,PetscObjectComm((PetscObject)ls),PETSC_ERR_ARG_WRONGSTATE,"Line Search Object does not have 'apply' routine"); 3330c52818fSSatish Balay ls->nfeval = 0; 3340c52818fSSatish Balay ls->ngeval = 0; 3350c52818fSSatish Balay ls->nfgeval = 0; 3360c52818fSSatish Balay /* Check parameter values */ 3370c52818fSSatish Balay if (ls->ftol < 0.0) { 3389566063dSJacob Faibussowitsch PetscCall(PetscInfo(ls,"Bad Line Search Parameter: ftol (%g) < 0\n",(double)ls->ftol)); 3390c52818fSSatish Balay *reason = TAOLINESEARCH_FAILED_BADPARAMETER; 3400c52818fSSatish Balay } 3410c52818fSSatish Balay if (ls->rtol < 0.0) { 3429566063dSJacob Faibussowitsch PetscCall(PetscInfo(ls,"Bad Line Search Parameter: rtol (%g) < 0\n",(double)ls->rtol)); 3430c52818fSSatish Balay *reason = TAOLINESEARCH_FAILED_BADPARAMETER; 3440c52818fSSatish Balay } 3450c52818fSSatish Balay if (ls->gtol < 0.0) { 3469566063dSJacob Faibussowitsch PetscCall(PetscInfo(ls,"Bad Line Search Parameter: gtol (%g) < 0\n",(double)ls->gtol)); 3470c52818fSSatish Balay *reason = TAOLINESEARCH_FAILED_BADPARAMETER; 3480c52818fSSatish Balay } 3490c52818fSSatish Balay if (ls->stepmin < 0.0) { 3509566063dSJacob Faibussowitsch PetscCall(PetscInfo(ls,"Bad Line Search Parameter: stepmin (%g) < 0\n",(double)ls->stepmin)); 3510c52818fSSatish Balay *reason = TAOLINESEARCH_FAILED_BADPARAMETER; 3520c52818fSSatish Balay } 3530c52818fSSatish Balay if (ls->stepmax < ls->stepmin) { 3549566063dSJacob Faibussowitsch PetscCall(PetscInfo(ls,"Bad Line Search Parameter: stepmin (%g) > stepmax (%g)\n",(double)ls->stepmin,(double)ls->stepmax)); 3550c52818fSSatish Balay *reason = TAOLINESEARCH_FAILED_BADPARAMETER; 3560c52818fSSatish Balay } 3570c52818fSSatish Balay if (ls->max_funcs < 0) { 3589566063dSJacob Faibussowitsch PetscCall(PetscInfo(ls,"Bad Line Search Parameter: max_funcs (%" PetscInt_FMT ") < 0\n",ls->max_funcs)); 3590c52818fSSatish Balay *reason = TAOLINESEARCH_FAILED_BADPARAMETER; 3600c52818fSSatish Balay } 3610c52818fSSatish Balay if (PetscIsInfOrNanReal(*f)) { 3629566063dSJacob Faibussowitsch PetscCall(PetscInfo(ls,"Initial Line Search Function Value is Inf or Nan (%g)\n",(double)*f)); 3630c52818fSSatish Balay *reason = TAOLINESEARCH_FAILED_INFORNAN; 3640c52818fSSatish Balay } 3650c52818fSSatish Balay 3669566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)x)); 3679566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ls->start_x)); 3680c52818fSSatish Balay ls->start_x = x; 369050fc7a3SBarry Smith 3709566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAOLINESEARCH_Apply,ls,0,0,0)); 3719566063dSJacob Faibussowitsch PetscCall((*ls->ops->apply)(ls,x,f,g,s)); 3729566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAOLINESEARCH_Apply, ls, 0,0,0)); 3730c52818fSSatish Balay *reason = ls->reason; 3740c52818fSSatish Balay ls->new_f = *f; 3750c52818fSSatish Balay 37697ab8e72SStefano Zampini if (steplength) *steplength = ls->step; 3770c52818fSSatish Balay 3789566063dSJacob Faibussowitsch PetscCall(TaoLineSearchViewFromOptions(ls,NULL,"-tao_ls_view")); 3790c52818fSSatish Balay PetscFunctionReturn(0); 3800c52818fSSatish Balay } 3810c52818fSSatish Balay 3820c52818fSSatish Balay /*@C 3830c52818fSSatish Balay TaoLineSearchSetType - Sets the algorithm used in a line search 3840c52818fSSatish Balay 3850c52818fSSatish Balay Collective on TaoLineSearch 3860c52818fSSatish Balay 3870c52818fSSatish Balay Input Parameters: 3880c52818fSSatish Balay + ls - the TaoLineSearch context 389820824deSAlp Dener - type - the TaoLineSearchType selection 3900c52818fSSatish Balay 3910c52818fSSatish Balay Available methods include: 392820824deSAlp Dener + more-thuente - line search with a cubic model enforcing the strong Wolfe/curvature condition 393820824deSAlp Dener . armijo - simple backtracking line search enforcing only the sufficient decrease condition 394820824deSAlp Dener - unit - do not perform a line search and always accept unit step length 3950c52818fSSatish Balay 3960c52818fSSatish Balay Options Database Keys: 397820824deSAlp Dener . -tao_ls_type <more-thuente, armijo, unit> - select which method TAO should use at runtime 3980c52818fSSatish Balay 3990c52818fSSatish Balay Level: beginner 4000c52818fSSatish Balay 401db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchGetType()`, `TaoLineSearchApply()` 4020c52818fSSatish Balay 4030c52818fSSatish Balay @*/ 4040c52818fSSatish Balay 405dedfbcbeSJed Brown PetscErrorCode TaoLineSearchSetType(TaoLineSearch ls, TaoLineSearchType type) 4060c52818fSSatish Balay { 4070c52818fSSatish Balay PetscErrorCode (*r)(TaoLineSearch); 4080c52818fSSatish Balay PetscBool flg; 4090c52818fSSatish Balay 4100c52818fSSatish Balay PetscFunctionBegin; 4110c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 4120c52818fSSatish Balay PetscValidCharPointer(type,2); 4139566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)ls, type, &flg)); 4140c52818fSSatish Balay if (flg) PetscFunctionReturn(0); 4150c52818fSSatish Balay 4169566063dSJacob Faibussowitsch PetscCall(PetscFunctionListFind(TaoLineSearchList,type, (void (**)(void)) &r)); 4173c859ba3SBarry Smith PetscCheck(r,PetscObjectComm((PetscObject)ls),PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested TaoLineSearch type %s",type); 418*1baa6e33SBarry Smith if (ls->ops->destroy) PetscCall((*(ls)->ops->destroy)(ls)); 4190c52818fSSatish Balay ls->max_funcs = 30; 4200c52818fSSatish Balay ls->ftol = 0.0001; 4210c52818fSSatish Balay ls->gtol = 0.9; 4226f4723b1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE) 4236f4723b1SBarry Smith ls->rtol = 1.0e-5; 4246f4723b1SBarry Smith #else 4250c52818fSSatish Balay ls->rtol = 1.0e-10; 4266f4723b1SBarry Smith #endif 4270c52818fSSatish Balay ls->stepmin = 1.0e-20; 4280c52818fSSatish Balay ls->stepmax = 1.0e+20; 4290c52818fSSatish Balay 4300c52818fSSatish Balay ls->nfeval = 0; 4310c52818fSSatish Balay ls->ngeval = 0; 4320c52818fSSatish Balay ls->nfgeval = 0; 43383c8fe1dSLisandro Dalcin ls->ops->setup = NULL; 43483c8fe1dSLisandro Dalcin ls->ops->apply = NULL; 43583c8fe1dSLisandro Dalcin ls->ops->view = NULL; 43683c8fe1dSLisandro Dalcin ls->ops->setfromoptions = NULL; 43783c8fe1dSLisandro Dalcin ls->ops->destroy = NULL; 4380c52818fSSatish Balay ls->setupcalled = PETSC_FALSE; 4399566063dSJacob Faibussowitsch PetscCall((*r)(ls)); 4409566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)ls, type)); 4410c52818fSSatish Balay PetscFunctionReturn(0); 4420c52818fSSatish Balay } 4430c52818fSSatish Balay 4442a0dac07SAlp Dener /*@C 4452a0dac07SAlp Dener TaoLineSearchMonitor - Monitor the line search steps. This routine will otuput the 4462a0dac07SAlp Dener iteration number, step length, and function value before calling the implementation 4472a0dac07SAlp Dener specific monitor. 4482a0dac07SAlp Dener 4492a0dac07SAlp Dener Input Parameters: 4502a0dac07SAlp Dener + ls - the TaoLineSearch context 4512a0dac07SAlp Dener . its - the current iterate number (>=0) 4522a0dac07SAlp Dener . f - the current objective function value 4532a0dac07SAlp Dener - step - the step length 4542a0dac07SAlp Dener 4552a0dac07SAlp Dener Options Database Key: 4562a0dac07SAlp Dener . -tao_ls_monitor - Use the default monitor, which prints statistics to standard output 4572a0dac07SAlp Dener 4582a0dac07SAlp Dener Level: developer 4592a0dac07SAlp Dener 4602a0dac07SAlp Dener @*/ 4612a0dac07SAlp Dener PetscErrorCode TaoLineSearchMonitor(TaoLineSearch ls, PetscInt its, PetscReal f, PetscReal step) 4622a0dac07SAlp Dener { 4632a0dac07SAlp Dener PetscInt tabs; 4642a0dac07SAlp Dener 4652a0dac07SAlp Dener PetscFunctionBegin; 4662a0dac07SAlp Dener PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 4672a0dac07SAlp Dener if (ls->usemonitor) { 4689566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetTab(ls->viewer, &tabs)); 4699566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(ls->viewer, ((PetscObject)ls)->tablevel)); 47063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(ls->viewer, "%3" PetscInt_FMT " LS", its)); 4719566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(ls->viewer, " Function value: %g,", (double)f)); 4729566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(ls->viewer, " Step length: %g\n", (double)step)); 4732a0dac07SAlp Dener if (ls->ops->monitor && its > 0) { 4749566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(ls->viewer, ((PetscObject)ls)->tablevel + 3)); 4759566063dSJacob Faibussowitsch PetscCall((*ls->ops->monitor)(ls)); 4762a0dac07SAlp Dener } 4779566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(ls->viewer, tabs)); 4782a0dac07SAlp Dener } 4792a0dac07SAlp Dener PetscFunctionReturn(0); 4802a0dac07SAlp Dener } 4812a0dac07SAlp Dener 4820c52818fSSatish Balay /*@ 4830c52818fSSatish Balay TaoLineSearchSetFromOptions - Sets various TaoLineSearch parameters from user 4840c52818fSSatish Balay options. 4850c52818fSSatish Balay 4860c52818fSSatish Balay Collective on TaoLineSearch 4870c52818fSSatish Balay 48801d2d390SJose E. Roman Input Parameter: 4890c52818fSSatish Balay . ls - the TaoLineSearch context 4900c52818fSSatish Balay 4910c52818fSSatish Balay Options Database Keys: 4920c52818fSSatish Balay + -tao_ls_type <type> - The algorithm that TAO uses (more-thuente, gpcg, unit) 4930c52818fSSatish Balay . -tao_ls_ftol <tol> - tolerance for sufficient decrease 4940c52818fSSatish Balay . -tao_ls_gtol <tol> - tolerance for curvature condition 4950c52818fSSatish Balay . -tao_ls_rtol <tol> - relative tolerance for acceptable step 496a39c8e28SStefano Zampini . -tao_ls_stepinit <step> - initial steplength allowed 4970c52818fSSatish Balay . -tao_ls_stepmin <step> - minimum steplength allowed 4980c52818fSSatish Balay . -tao_ls_stepmax <step> - maximum steplength allowed 4990c52818fSSatish Balay . -tao_ls_max_funcs <n> - maximum number of function evaluations allowed 5000c52818fSSatish Balay - -tao_ls_view - display line-search results to standard output 5010c52818fSSatish Balay 5020c52818fSSatish Balay Level: beginner 5030c52818fSSatish Balay @*/ 5040c52818fSSatish Balay PetscErrorCode TaoLineSearchSetFromOptions(TaoLineSearch ls) 5050c52818fSSatish Balay { 5068caf6e8cSBarry Smith const char *default_type=TAOLINESEARCHMT; 5072a0dac07SAlp Dener char type[256],monfilename[PETSC_MAX_PATH_LEN]; 5082a0dac07SAlp Dener PetscViewer monviewer; 5090c52818fSSatish Balay PetscBool flg; 510f06e3bfaSBarry Smith 5110c52818fSSatish Balay PetscFunctionBegin; 5120c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 513d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)ls); 5140c52818fSSatish Balay if (((PetscObject)ls)->type_name) { 5150c52818fSSatish Balay default_type = ((PetscObject)ls)->type_name; 5160c52818fSSatish Balay } 5170c52818fSSatish Balay /* Check for type from options */ 5189566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-tao_ls_type","Tao Line Search type","TaoLineSearchSetType",TaoLineSearchList,default_type,type,256,&flg)); 5190c52818fSSatish Balay if (flg) { 5209566063dSJacob Faibussowitsch PetscCall(TaoLineSearchSetType(ls,type)); 5210c52818fSSatish Balay } else if (!((PetscObject)ls)->type_name) { 5229566063dSJacob Faibussowitsch PetscCall(TaoLineSearchSetType(ls,default_type)); 5230c52818fSSatish Balay } 5240c52818fSSatish Balay 5259566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-tao_ls_max_funcs","max function evals in line search","",ls->max_funcs,&ls->max_funcs,NULL)); 5269566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-tao_ls_ftol","tol for sufficient decrease","",ls->ftol,&ls->ftol,NULL)); 5279566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-tao_ls_gtol","tol for curvature condition","",ls->gtol,&ls->gtol,NULL)); 5289566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-tao_ls_rtol","relative tol for acceptable step","",ls->rtol,&ls->rtol,NULL)); 5299566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-tao_ls_stepmin","lower bound for step","",ls->stepmin,&ls->stepmin,NULL)); 5309566063dSJacob Faibussowitsch PetscCall(PetscOptionsReal("-tao_ls_stepmax","upper bound for step","",ls->stepmax,&ls->stepmax,NULL)); 531a39c8e28SStefano Zampini PetscCall(PetscOptionsReal("-tao_ls_stepinit","initial step","",ls->initstep,&ls->initstep,NULL)); 5329566063dSJacob Faibussowitsch PetscCall(PetscOptionsString("-tao_ls_monitor","enable the basic monitor","TaoLineSearchSetMonitor","stdout",monfilename,sizeof(monfilename),&flg)); 5332a0dac07SAlp Dener if (flg) { 5349566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIOpen(PetscObjectComm((PetscObject)ls),monfilename,&monviewer)); 5352a0dac07SAlp Dener ls->viewer = monviewer; 5362a0dac07SAlp Dener ls->usemonitor = PETSC_TRUE; 5372a0dac07SAlp Dener } 538*1baa6e33SBarry Smith if (ls->ops->setfromoptions) PetscCall((*ls->ops->setfromoptions)(PetscOptionsObject,ls)); 539d0609cedSBarry Smith PetscOptionsEnd(); 5400c52818fSSatish Balay PetscFunctionReturn(0); 5410c52818fSSatish Balay } 5420c52818fSSatish Balay 5430c52818fSSatish Balay /*@C 5440c52818fSSatish Balay TaoLineSearchGetType - Gets the current line search algorithm 5450c52818fSSatish Balay 5460c52818fSSatish Balay Not Collective 5470c52818fSSatish Balay 5480c52818fSSatish Balay Input Parameter: 5490c52818fSSatish Balay . ls - the TaoLineSearch context 5500c52818fSSatish Balay 551fd292e60Sprj- Output Parameter: 5520c52818fSSatish Balay . type - the line search algorithm in effect 5530c52818fSSatish Balay 5540c52818fSSatish Balay Level: developer 5550c52818fSSatish Balay 5560c52818fSSatish Balay @*/ 557dedfbcbeSJed Brown PetscErrorCode TaoLineSearchGetType(TaoLineSearch ls, TaoLineSearchType *type) 5580c52818fSSatish Balay { 5590c52818fSSatish Balay PetscFunctionBegin; 5600c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 5610c52818fSSatish Balay PetscValidPointer(type,2); 5620c52818fSSatish Balay *type = ((PetscObject)ls)->type_name; 5630c52818fSSatish Balay PetscFunctionReturn(0); 5640c52818fSSatish Balay } 5650c52818fSSatish Balay 5660c52818fSSatish Balay /*@ 5670c52818fSSatish Balay TaoLineSearchGetNumberFunctionEvaluations - Gets the number of function and gradient evaluation 5680c52818fSSatish Balay routines used by the line search in last application (not cumulative). 5690c52818fSSatish Balay 5700c52818fSSatish Balay Not Collective 5710c52818fSSatish Balay 5720c52818fSSatish Balay Input Parameter: 5730c52818fSSatish Balay . ls - the TaoLineSearch context 5740c52818fSSatish Balay 5750c52818fSSatish Balay Output Parameters: 5760c52818fSSatish Balay + nfeval - number of function evaluations 5770c52818fSSatish Balay . ngeval - number of gradient evaluations 5780c52818fSSatish Balay - nfgeval - number of function/gradient evaluations 5790c52818fSSatish Balay 5800c52818fSSatish Balay Level: intermediate 5810c52818fSSatish Balay 5820c52818fSSatish Balay Note: 583441846f8SBarry Smith If the line search is using the Tao objective and gradient 584441846f8SBarry Smith routines directly (see TaoLineSearchUseTaoRoutines()), then TAO 5850c52818fSSatish Balay is already counting the number of evaluations. 5860c52818fSSatish Balay 5870c52818fSSatish Balay @*/ 5880c52818fSSatish Balay PetscErrorCode TaoLineSearchGetNumberFunctionEvaluations(TaoLineSearch ls, PetscInt *nfeval, PetscInt *ngeval, PetscInt *nfgeval) 5890c52818fSSatish Balay { 5900c52818fSSatish Balay PetscFunctionBegin; 5910c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 5920c52818fSSatish Balay *nfeval = ls->nfeval; 5930c52818fSSatish Balay *ngeval = ls->ngeval; 5940c52818fSSatish Balay *nfgeval = ls->nfgeval; 5950c52818fSSatish Balay PetscFunctionReturn(0); 5960c52818fSSatish Balay } 5970c52818fSSatish Balay 5980c52818fSSatish Balay /*@ 599441846f8SBarry Smith TaoLineSearchIsUsingTaoRoutines - Checks whether the line search is using 600441846f8SBarry Smith Tao evaluation routines. 6010c52818fSSatish Balay 6020c52818fSSatish Balay Not Collective 6030c52818fSSatish Balay 6040c52818fSSatish Balay Input Parameter: 6050c52818fSSatish Balay . ls - the TaoLineSearch context 6060c52818fSSatish Balay 6070c52818fSSatish Balay Output Parameter: 608441846f8SBarry Smith . flg - PETSC_TRUE if the line search is using Tao evaluation routines, 6090c52818fSSatish Balay otherwise PETSC_FALSE 6100c52818fSSatish Balay 6110c52818fSSatish Balay Level: developer 6120c52818fSSatish Balay @*/ 613441846f8SBarry Smith PetscErrorCode TaoLineSearchIsUsingTaoRoutines(TaoLineSearch ls, PetscBool *flg) 6140c52818fSSatish Balay { 6150c52818fSSatish Balay PetscFunctionBegin; 6160c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 617f06e3bfaSBarry Smith *flg = ls->usetaoroutines; 6180c52818fSSatish Balay PetscFunctionReturn(0); 6190c52818fSSatish Balay } 6200c52818fSSatish Balay 6210c52818fSSatish Balay /*@C 6220c52818fSSatish Balay TaoLineSearchSetObjectiveRoutine - Sets the function evaluation routine for the line search 6230c52818fSSatish Balay 6240c52818fSSatish Balay Logically Collective on TaoLineSearch 6250c52818fSSatish Balay 626d8d19677SJose E. Roman Input Parameters: 6270c52818fSSatish Balay + ls - the TaoLineSearch context 6280c52818fSSatish Balay . func - the objective function evaluation routine 6290c52818fSSatish Balay - ctx - the (optional) user-defined context for private data 6300c52818fSSatish Balay 6310c52818fSSatish Balay Calling sequence of func: 6320c52818fSSatish Balay $ func (TaoLinesearch ls, Vec x, PetscReal *f, void *ctx); 6330c52818fSSatish Balay 6340c52818fSSatish Balay + x - input vector 6350c52818fSSatish Balay . f - function value 6360c52818fSSatish Balay - ctx (optional) user-defined context 6370c52818fSSatish Balay 6380c52818fSSatish Balay Level: beginner 6390c52818fSSatish Balay 6400c52818fSSatish Balay Note: 6410c52818fSSatish Balay Use this routine only if you want the line search objective 642441846f8SBarry Smith evaluation routine to be different from the Tao's objective 6430c52818fSSatish Balay evaluation routine. If you use this routine you must also set 6440c52818fSSatish Balay the line search gradient and/or function/gradient routine. 6450c52818fSSatish Balay 6460c52818fSSatish Balay Note: 6470c52818fSSatish Balay Some algorithms (lcl, gpcg) set their own objective routine for the 6480c52818fSSatish Balay line search, application programmers should be wary of overriding the 6490c52818fSSatish Balay default objective routine. 6500c52818fSSatish Balay 651db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchSetGradientRoutine()`, `TaoLineSearchSetObjectiveAndGradientRoutine()`, `TaoLineSearchUseTaoRoutines()` 6520c52818fSSatish Balay @*/ 6530c52818fSSatish Balay PetscErrorCode TaoLineSearchSetObjectiveRoutine(TaoLineSearch ls, PetscErrorCode(*func)(TaoLineSearch ls, Vec x, PetscReal*, void*), void *ctx) 6540c52818fSSatish Balay { 6550c52818fSSatish Balay PetscFunctionBegin; 6560c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 6570c52818fSSatish Balay 6580c52818fSSatish Balay ls->ops->computeobjective=func; 6590c52818fSSatish Balay if (ctx) ls->userctx_func=ctx; 6600c52818fSSatish Balay ls->usetaoroutines=PETSC_FALSE; 6610c52818fSSatish Balay PetscFunctionReturn(0); 6620c52818fSSatish Balay } 6630c52818fSSatish Balay 6640c52818fSSatish Balay /*@C 6650c52818fSSatish Balay TaoLineSearchSetGradientRoutine - Sets the gradient evaluation routine for the line search 6660c52818fSSatish Balay 6670c52818fSSatish Balay Logically Collective on TaoLineSearch 6680c52818fSSatish Balay 669d8d19677SJose E. Roman Input Parameters: 6700c52818fSSatish Balay + ls - the TaoLineSearch context 6710c52818fSSatish Balay . func - the gradient evaluation routine 6720c52818fSSatish Balay - ctx - the (optional) user-defined context for private data 6730c52818fSSatish Balay 6740c52818fSSatish Balay Calling sequence of func: 6750c52818fSSatish Balay $ func (TaoLinesearch ls, Vec x, Vec g, void *ctx); 6760c52818fSSatish Balay 6770c52818fSSatish Balay + x - input vector 6780c52818fSSatish Balay . g - gradient vector 6790c52818fSSatish Balay - ctx (optional) user-defined context 6800c52818fSSatish Balay 6810c52818fSSatish Balay Level: beginner 6820c52818fSSatish Balay 6830c52818fSSatish Balay Note: 6840c52818fSSatish Balay Use this routine only if you want the line search gradient 685441846f8SBarry Smith evaluation routine to be different from the Tao's gradient 6860c52818fSSatish Balay evaluation routine. If you use this routine you must also set 6870c52818fSSatish Balay the line search function and/or function/gradient routine. 6880c52818fSSatish Balay 6890c52818fSSatish Balay Note: 6900c52818fSSatish Balay Some algorithms (lcl, gpcg) set their own gradient routine for the 6910c52818fSSatish Balay line search, application programmers should be wary of overriding the 6920c52818fSSatish Balay default gradient routine. 6930c52818fSSatish Balay 694db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchSetObjectiveRoutine()`, `TaoLineSearchSetObjectiveAndGradientRoutine()`, `TaoLineSearchUseTaoRoutines()` 6950c52818fSSatish Balay @*/ 6960c52818fSSatish Balay PetscErrorCode TaoLineSearchSetGradientRoutine(TaoLineSearch ls, PetscErrorCode(*func)(TaoLineSearch ls, Vec x, Vec g, void*), void *ctx) 6970c52818fSSatish Balay { 6980c52818fSSatish Balay PetscFunctionBegin; 6990c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 7000c52818fSSatish Balay ls->ops->computegradient=func; 7010c52818fSSatish Balay if (ctx) ls->userctx_grad=ctx; 7020c52818fSSatish Balay ls->usetaoroutines=PETSC_FALSE; 7030c52818fSSatish Balay PetscFunctionReturn(0); 7040c52818fSSatish Balay } 7050c52818fSSatish Balay 7060c52818fSSatish Balay /*@C 7070c52818fSSatish Balay TaoLineSearchSetObjectiveAndGradientRoutine - Sets the objective/gradient evaluation routine for the line search 7080c52818fSSatish Balay 7090c52818fSSatish Balay Logically Collective on TaoLineSearch 7100c52818fSSatish Balay 711d8d19677SJose E. Roman Input Parameters: 7120c52818fSSatish Balay + ls - the TaoLineSearch context 7130c52818fSSatish Balay . func - the objective and gradient evaluation routine 7140c52818fSSatish Balay - ctx - the (optional) user-defined context for private data 7150c52818fSSatish Balay 7160c52818fSSatish Balay Calling sequence of func: 7170c52818fSSatish Balay $ func (TaoLinesearch ls, Vec x, PetscReal *f, Vec g, void *ctx); 7180c52818fSSatish Balay 7190c52818fSSatish Balay + x - input vector 7200c52818fSSatish Balay . f - function value 7210c52818fSSatish Balay . g - gradient vector 7220c52818fSSatish Balay - ctx (optional) user-defined context 7230c52818fSSatish Balay 7240c52818fSSatish Balay Level: beginner 7250c52818fSSatish Balay 7260c52818fSSatish Balay Note: 7270c52818fSSatish Balay Use this routine only if you want the line search objective and gradient 728441846f8SBarry Smith evaluation routines to be different from the Tao's objective 7290c52818fSSatish Balay and gradient evaluation routines. 7300c52818fSSatish Balay 7310c52818fSSatish Balay Note: 7320c52818fSSatish Balay Some algorithms (lcl, gpcg) set their own objective routine for the 7330c52818fSSatish Balay line search, application programmers should be wary of overriding the 7340c52818fSSatish Balay default objective routine. 7350c52818fSSatish Balay 736db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchSetObjectiveRoutine()`, `TaoLineSearchSetGradientRoutine()`, `TaoLineSearchUseTaoRoutines()` 7370c52818fSSatish Balay @*/ 7380c52818fSSatish Balay PetscErrorCode TaoLineSearchSetObjectiveAndGradientRoutine(TaoLineSearch ls, PetscErrorCode(*func)(TaoLineSearch ls, Vec x, PetscReal *, Vec g, void*), void *ctx) 7390c52818fSSatish Balay { 7400c52818fSSatish Balay PetscFunctionBegin; 7410c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 7420c52818fSSatish Balay ls->ops->computeobjectiveandgradient=func; 7430c52818fSSatish Balay if (ctx) ls->userctx_funcgrad=ctx; 7440c52818fSSatish Balay ls->usetaoroutines = PETSC_FALSE; 7450c52818fSSatish Balay PetscFunctionReturn(0); 7460c52818fSSatish Balay } 7470c52818fSSatish Balay 7480c52818fSSatish Balay /*@C 7490c52818fSSatish Balay TaoLineSearchSetObjectiveAndGTSRoutine - Sets the objective and 7500c52818fSSatish Balay (gradient'*stepdirection) evaluation routine for the line search. 7510c52818fSSatish Balay Sometimes it is more efficient to compute the inner product of the gradient 7520c52818fSSatish Balay and the step direction than it is to compute the gradient, and this is all 7530c52818fSSatish Balay the line search typically needs of the gradient. 7540c52818fSSatish Balay 7550c52818fSSatish Balay Logically Collective on TaoLineSearch 7560c52818fSSatish Balay 757d8d19677SJose E. Roman Input Parameters: 7580c52818fSSatish Balay + ls - the TaoLineSearch context 7590c52818fSSatish Balay . func - the objective and gradient evaluation routine 7600c52818fSSatish Balay - ctx - the (optional) user-defined context for private data 7610c52818fSSatish Balay 7620c52818fSSatish Balay Calling sequence of func: 7630c52818fSSatish Balay $ func (TaoLinesearch ls, Vec x, PetscReal *f, PetscReal *gts, void *ctx); 7640c52818fSSatish Balay 7650c52818fSSatish Balay + x - input vector 7660c52818fSSatish Balay . s - step direction 7670c52818fSSatish Balay . f - function value 7680c52818fSSatish Balay . gts - inner product of gradient and step direction vectors 7690c52818fSSatish Balay - ctx (optional) user-defined context 7700c52818fSSatish Balay 7710c52818fSSatish Balay Note: The gradient will still need to be computed at the end of the line 7720c52818fSSatish Balay search, so you will still need to set a line search gradient evaluation 7730c52818fSSatish Balay routine 7740c52818fSSatish Balay 7750c52818fSSatish Balay Note: Bounded line searches (those used in bounded optimization algorithms) 7760c52818fSSatish Balay don't use g's directly, but rather (g'x - g'x0)/steplength. You can get the 7770c52818fSSatish Balay x0 and steplength with TaoLineSearchGetStartingVector() and TaoLineSearchGetStepLength() 7780c52818fSSatish Balay 7790c52818fSSatish Balay Level: advanced 7800c52818fSSatish Balay 7810c52818fSSatish Balay Note: 7820c52818fSSatish Balay Some algorithms (lcl, gpcg) set their own objective routine for the 7830c52818fSSatish Balay line search, application programmers should be wary of overriding the 7840c52818fSSatish Balay default objective routine. 7850c52818fSSatish Balay 786db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchSetObjective()`, `TaoLineSearchSetGradient()`, `TaoLineSearchUseTaoRoutines()` 7870c52818fSSatish Balay @*/ 7880c52818fSSatish Balay PetscErrorCode TaoLineSearchSetObjectiveAndGTSRoutine(TaoLineSearch ls, PetscErrorCode(*func)(TaoLineSearch ls, Vec x, Vec s, PetscReal *, PetscReal *, void*), void *ctx) 7890c52818fSSatish Balay { 7900c52818fSSatish Balay PetscFunctionBegin; 7910c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 7920c52818fSSatish Balay ls->ops->computeobjectiveandgts=func; 7930c52818fSSatish Balay if (ctx) ls->userctx_funcgts=ctx; 7940c52818fSSatish Balay ls->usegts = PETSC_TRUE; 7950c52818fSSatish Balay ls->usetaoroutines = PETSC_FALSE; 7960c52818fSSatish Balay PetscFunctionReturn(0); 7970c52818fSSatish Balay } 7980c52818fSSatish Balay 7990c52818fSSatish Balay /*@C 800441846f8SBarry Smith TaoLineSearchUseTaoRoutines - Informs the TaoLineSearch to use the 801441846f8SBarry Smith objective and gradient evaluation routines from the given Tao object. 8020c52818fSSatish Balay 8030c52818fSSatish Balay Logically Collective on TaoLineSearch 8040c52818fSSatish Balay 805d8d19677SJose E. Roman Input Parameters: 8060c52818fSSatish Balay + ls - the TaoLineSearch context 807441846f8SBarry Smith - ts - the Tao context with defined objective/gradient evaluation routines 8080c52818fSSatish Balay 8090c52818fSSatish Balay Level: developer 8100c52818fSSatish Balay 811db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()` 8120c52818fSSatish Balay @*/ 813441846f8SBarry Smith PetscErrorCode TaoLineSearchUseTaoRoutines(TaoLineSearch ls, Tao ts) 8140c52818fSSatish Balay { 8150c52818fSSatish Balay PetscFunctionBegin; 8160c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 817064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(ts,TAO_CLASSID,2); 818441846f8SBarry Smith ls->tao = ts; 8190c52818fSSatish Balay ls->usetaoroutines = PETSC_TRUE; 8200c52818fSSatish Balay PetscFunctionReturn(0); 8210c52818fSSatish Balay } 8220c52818fSSatish Balay 8230c52818fSSatish Balay /*@ 8240c52818fSSatish Balay TaoLineSearchComputeObjective - Computes the objective function value at a given point 8250c52818fSSatish Balay 8260c52818fSSatish Balay Collective on TaoLineSearch 8270c52818fSSatish Balay 8280c52818fSSatish Balay Input Parameters: 8290c52818fSSatish Balay + ls - the TaoLineSearch context 8300c52818fSSatish Balay - x - input vector 8310c52818fSSatish Balay 8320c52818fSSatish Balay Output Parameter: 8330c52818fSSatish Balay . f - Objective value at X 8340c52818fSSatish Balay 83595452b02SPatrick Sanan Notes: 83695452b02SPatrick Sanan TaoLineSearchComputeObjective() is typically used within line searches 8370c52818fSSatish Balay so most users would not generally call this routine themselves. 8380c52818fSSatish Balay 8390c52818fSSatish Balay Level: developer 8400c52818fSSatish Balay 841db781477SPatrick Sanan .seealso: `TaoLineSearchComputeGradient()`, `TaoLineSearchComputeObjectiveAndGradient()`, `TaoLineSearchSetObjectiveRoutine()` 8420c52818fSSatish Balay @*/ 8430c52818fSSatish Balay PetscErrorCode TaoLineSearchComputeObjective(TaoLineSearch ls, Vec x, PetscReal *f) 8440c52818fSSatish Balay { 8450c52818fSSatish Balay Vec gdummy; 8460c52818fSSatish Balay PetscReal gts; 847f06e3bfaSBarry Smith 8480c52818fSSatish Balay PetscFunctionBegin; 8490c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 8500c52818fSSatish Balay PetscValidHeaderSpecific(x,VEC_CLASSID,2); 851dadcf809SJacob Faibussowitsch PetscValidRealPointer(f,3); 8520c52818fSSatish Balay PetscCheckSameComm(ls,1,x,2); 8530c52818fSSatish Balay if (ls->usetaoroutines) { 8549566063dSJacob Faibussowitsch PetscCall(TaoComputeObjective(ls->tao,x,f)); 8550c52818fSSatish Balay } else { 8563c859ba3SBarry Smith PetscCheck(ls->ops->computeobjective || ls->ops->computeobjectiveandgradient || ls->ops->computeobjectiveandgts,PetscObjectComm((PetscObject)ls),PETSC_ERR_ARG_WRONGSTATE,"Line Search does not have objective function set"); 8579566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAOLINESEARCH_Eval,ls,0,0,0)); 8580c52818fSSatish Balay PetscStackPush("TaoLineSearch user objective routine"); 8590c52818fSSatish Balay if (ls->ops->computeobjective) { 8609566063dSJacob Faibussowitsch PetscCall((*ls->ops->computeobjective)(ls,x,f,ls->userctx_func)); 8610c52818fSSatish Balay } else if (ls->ops->computeobjectiveandgradient) { 8629566063dSJacob Faibussowitsch PetscCall(VecDuplicate(x,&gdummy)); 8639566063dSJacob Faibussowitsch PetscCall((*ls->ops->computeobjectiveandgradient)(ls,x,f,gdummy,ls->userctx_funcgrad)); 8649566063dSJacob Faibussowitsch PetscCall(VecDestroy(&gdummy)); 8650c52818fSSatish Balay } else { 8669566063dSJacob Faibussowitsch PetscCall((*ls->ops->computeobjectiveandgts)(ls,x,ls->stepdirection,f,>s,ls->userctx_funcgts)); 8670c52818fSSatish Balay } 8680c52818fSSatish Balay PetscStackPop; 8699566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAOLINESEARCH_Eval,ls,0,0,0)); 8700c52818fSSatish Balay } 8710c52818fSSatish Balay ls->nfeval++; 8720c52818fSSatish Balay PetscFunctionReturn(0); 8730c52818fSSatish Balay } 8740c52818fSSatish Balay 8750c52818fSSatish Balay /*@ 8760c52818fSSatish Balay TaoLineSearchComputeObjectiveAndGradient - Computes the objective function value at a given point 8770c52818fSSatish Balay 878441846f8SBarry Smith Collective on Tao 8790c52818fSSatish Balay 8800c52818fSSatish Balay Input Parameters: 8810c52818fSSatish Balay + ls - the TaoLineSearch context 8820c52818fSSatish Balay - x - input vector 8830c52818fSSatish Balay 884d8d19677SJose E. Roman Output Parameters: 8850c52818fSSatish Balay + f - Objective value at X 8860c52818fSSatish Balay - g - Gradient vector at X 8870c52818fSSatish Balay 88895452b02SPatrick Sanan Notes: 88995452b02SPatrick Sanan TaoLineSearchComputeObjectiveAndGradient() is typically used within line searches 8900c52818fSSatish Balay so most users would not generally call this routine themselves. 8910c52818fSSatish Balay 8920c52818fSSatish Balay Level: developer 8930c52818fSSatish Balay 894db781477SPatrick Sanan .seealso: `TaoLineSearchComputeGradient()`, `TaoLineSearchComputeObjectiveAndGradient()`, `TaoLineSearchSetObjectiveRoutine()` 8950c52818fSSatish Balay @*/ 8960c52818fSSatish Balay PetscErrorCode TaoLineSearchComputeObjectiveAndGradient(TaoLineSearch ls, Vec x, PetscReal *f, Vec g) 8970c52818fSSatish Balay { 8980c52818fSSatish Balay PetscFunctionBegin; 8990c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 9000c52818fSSatish Balay PetscValidHeaderSpecific(x,VEC_CLASSID,2); 901dadcf809SJacob Faibussowitsch PetscValidRealPointer(f,3); 9020c52818fSSatish Balay PetscValidHeaderSpecific(g,VEC_CLASSID,4); 9030c52818fSSatish Balay PetscCheckSameComm(ls,1,x,2); 9040c52818fSSatish Balay PetscCheckSameComm(ls,1,g,4); 9050c52818fSSatish Balay if (ls->usetaoroutines) { 9069566063dSJacob Faibussowitsch PetscCall(TaoComputeObjectiveAndGradient(ls->tao,x,f,g)); 9070c52818fSSatish Balay } else { 9089566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAOLINESEARCH_Eval,ls,0,0,0)); 9090c52818fSSatish Balay if (ls->ops->computeobjectiveandgradient) { 910362febeeSStefano Zampini PetscStackPush("TaoLineSearch user objective/gradient routine"); 9119566063dSJacob Faibussowitsch PetscCall((*ls->ops->computeobjectiveandgradient)(ls,x,f,g,ls->userctx_funcgrad)); 9120c52818fSSatish Balay PetscStackPop; 913362febeeSStefano Zampini } else { 9143c859ba3SBarry Smith PetscCheck(ls->ops->computeobjective,PetscObjectComm((PetscObject)ls),PETSC_ERR_ARG_WRONGSTATE,"Line Search does not have objective function set"); 915362febeeSStefano Zampini PetscStackPush("TaoLineSearch user objective routine"); 9169566063dSJacob Faibussowitsch PetscCall((*ls->ops->computeobjective)(ls,x,f,ls->userctx_func)); 917362febeeSStefano Zampini PetscStackPop; 9183c859ba3SBarry Smith PetscCheck(ls->ops->computegradient,PetscObjectComm((PetscObject)ls),PETSC_ERR_ARG_WRONGSTATE,"Line Search does not have gradient function set"); 919362febeeSStefano Zampini PetscStackPush("TaoLineSearch user gradient routine"); 9209566063dSJacob Faibussowitsch PetscCall((*ls->ops->computegradient)(ls,x,g,ls->userctx_grad)); 921362febeeSStefano Zampini PetscStackPop; 922362febeeSStefano Zampini } 9239566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAOLINESEARCH_Eval,ls,0,0,0)); 9249566063dSJacob Faibussowitsch PetscCall(PetscInfo(ls,"TaoLineSearch Function evaluation: %14.12e\n",(double)(*f))); 925f06e3bfaSBarry Smith } 926fbe0838dSJason Sarich ls->nfgeval++; 9270c52818fSSatish Balay PetscFunctionReturn(0); 9280c52818fSSatish Balay } 9290c52818fSSatish Balay 9300c52818fSSatish Balay /*@ 9310c52818fSSatish Balay TaoLineSearchComputeGradient - Computes the gradient of the objective function 9320c52818fSSatish Balay 9330c52818fSSatish Balay Collective on TaoLineSearch 9340c52818fSSatish Balay 9350c52818fSSatish Balay Input Parameters: 9360c52818fSSatish Balay + ls - the TaoLineSearch context 9370c52818fSSatish Balay - x - input vector 9380c52818fSSatish Balay 9390c52818fSSatish Balay Output Parameter: 9400c52818fSSatish Balay . g - gradient vector 9410c52818fSSatish Balay 94295452b02SPatrick Sanan Notes: 94395452b02SPatrick Sanan TaoComputeGradient() is typically used within line searches 9440c52818fSSatish Balay so most users would not generally call this routine themselves. 9450c52818fSSatish Balay 9460c52818fSSatish Balay Level: developer 9470c52818fSSatish Balay 948db781477SPatrick Sanan .seealso: `TaoLineSearchComputeObjective()`, `TaoLineSearchComputeObjectiveAndGradient()`, `TaoLineSearchSetGradient()` 9490c52818fSSatish Balay @*/ 9500c52818fSSatish Balay PetscErrorCode TaoLineSearchComputeGradient(TaoLineSearch ls, Vec x, Vec g) 9510c52818fSSatish Balay { 9520c52818fSSatish Balay PetscReal fdummy; 953f06e3bfaSBarry Smith 9540c52818fSSatish Balay PetscFunctionBegin; 9550c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 9560c52818fSSatish Balay PetscValidHeaderSpecific(x,VEC_CLASSID,2); 9570c52818fSSatish Balay PetscValidHeaderSpecific(g,VEC_CLASSID,3); 9580c52818fSSatish Balay PetscCheckSameComm(ls,1,x,2); 9590c52818fSSatish Balay PetscCheckSameComm(ls,1,g,3); 9600c52818fSSatish Balay if (ls->usetaoroutines) { 9619566063dSJacob Faibussowitsch PetscCall(TaoComputeGradient(ls->tao,x,g)); 9620c52818fSSatish Balay } else { 9639566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAOLINESEARCH_Eval,ls,0,0,0)); 9640c52818fSSatish Balay PetscStackPush("TaoLineSearch user gradient routine"); 9650c52818fSSatish Balay if (ls->ops->computegradient) { 9669566063dSJacob Faibussowitsch PetscCall((*ls->ops->computegradient)(ls,x,g,ls->userctx_grad)); 9670c52818fSSatish Balay } else { 9683c859ba3SBarry Smith PetscCheck(ls->ops->computeobjectiveandgradient,PetscObjectComm((PetscObject)ls),PETSC_ERR_ARG_WRONGSTATE,"Line Search does not have gradient functions set"); 9699566063dSJacob Faibussowitsch PetscCall((*ls->ops->computeobjectiveandgradient)(ls,x,&fdummy,g,ls->userctx_funcgrad)); 9700c52818fSSatish Balay } 9710c52818fSSatish Balay PetscStackPop; 9729566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAOLINESEARCH_Eval,ls,0,0,0)); 9730c52818fSSatish Balay } 9740c52818fSSatish Balay ls->ngeval++; 9750c52818fSSatish Balay PetscFunctionReturn(0); 9760c52818fSSatish Balay } 9770c52818fSSatish Balay 9780c52818fSSatish Balay /*@ 9790c52818fSSatish Balay TaoLineSearchComputeObjectiveAndGTS - Computes the objective function value and inner product of gradient and step direction at a given point 9800c52818fSSatish Balay 981441846f8SBarry Smith Collective on Tao 9820c52818fSSatish Balay 9830c52818fSSatish Balay Input Parameters: 9840c52818fSSatish Balay + ls - the TaoLineSearch context 9850c52818fSSatish Balay - x - input vector 9860c52818fSSatish Balay 987d8d19677SJose E. Roman Output Parameters: 9880c52818fSSatish Balay + f - Objective value at X 9890c52818fSSatish Balay - gts - inner product of gradient and step direction at X 9900c52818fSSatish Balay 99195452b02SPatrick Sanan Notes: 99295452b02SPatrick Sanan TaoLineSearchComputeObjectiveAndGTS() is typically used within line searches 9930c52818fSSatish Balay so most users would not generally call this routine themselves. 9940c52818fSSatish Balay 9950c52818fSSatish Balay Level: developer 9960c52818fSSatish Balay 997db781477SPatrick Sanan .seealso: `TaoLineSearchComputeGradient()`, `TaoLineSearchComputeObjectiveAndGradient()`, `TaoLineSearchSetObjectiveRoutine()` 9980c52818fSSatish Balay @*/ 9990c52818fSSatish Balay PetscErrorCode TaoLineSearchComputeObjectiveAndGTS(TaoLineSearch ls, Vec x, PetscReal *f, PetscReal *gts) 10000c52818fSSatish Balay { 10010c52818fSSatish Balay PetscFunctionBegin; 10020c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 10030c52818fSSatish Balay PetscValidHeaderSpecific(x,VEC_CLASSID,2); 1004dadcf809SJacob Faibussowitsch PetscValidRealPointer(f,3); 1005dadcf809SJacob Faibussowitsch PetscValidRealPointer(gts,4); 10060c52818fSSatish Balay PetscCheckSameComm(ls,1,x,2); 10073c859ba3SBarry Smith PetscCheck(ls->ops->computeobjectiveandgts,PetscObjectComm((PetscObject)ls),PETSC_ERR_ARG_WRONGSTATE,"Line Search does not have objective and gts function set"); 10089566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAOLINESEARCH_Eval,ls,0,0,0)); 10090c52818fSSatish Balay PetscStackPush("TaoLineSearch user objective/gts routine"); 10109566063dSJacob Faibussowitsch PetscCall((*ls->ops->computeobjectiveandgts)(ls,x,ls->stepdirection,f,gts,ls->userctx_funcgts)); 10110c52818fSSatish Balay PetscStackPop; 10129566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAOLINESEARCH_Eval,ls,0,0,0)); 10139566063dSJacob Faibussowitsch PetscCall(PetscInfo(ls,"TaoLineSearch Function evaluation: %14.12e\n",(double)(*f))); 10140c52818fSSatish Balay ls->nfeval++; 10150c52818fSSatish Balay PetscFunctionReturn(0); 10160c52818fSSatish Balay } 10170c52818fSSatish Balay 10180c52818fSSatish Balay /*@ 10190c52818fSSatish Balay TaoLineSearchGetSolution - Returns the solution to the line search 10200c52818fSSatish Balay 10210c52818fSSatish Balay Collective on TaoLineSearch 10220c52818fSSatish Balay 10230c52818fSSatish Balay Input Parameter: 10240c52818fSSatish Balay . ls - the TaoLineSearch context 10250c52818fSSatish Balay 1026d8d19677SJose E. Roman Output Parameters: 10270c52818fSSatish Balay + x - the new solution 10280c52818fSSatish Balay . f - the objective function value at x 10290c52818fSSatish Balay . g - the gradient at x 10300c52818fSSatish Balay . steplength - the multiple of the step direction taken by the line search 10310c52818fSSatish Balay - reason - the reason why the line search terminated 10320c52818fSSatish Balay 10330c52818fSSatish Balay reason will be set to one of: 10340c52818fSSatish Balay 10350c52818fSSatish Balay + TAOLINESEARCH_FAILED_INFORNAN - function evaluation gives Inf or Nan value 10360c52818fSSatish Balay . TAOLINESEARCH_FAILED_BADPARAMETER - negative value set as parameter 10370c52818fSSatish Balay . TAOLINESEARCH_FAILED_ASCENT - initial line search step * g is not descent direction 10380c52818fSSatish Balay . TAOLINESEARCH_HALTED_MAXFCN - maximum number of function evaluation reached 10390c52818fSSatish Balay . TAOLINESEARCH_HALTED_UPPERBOUND - step is at upper bound 10400c52818fSSatish Balay . TAOLINESEARCH_HALTED_LOWERBOUND - step is at lower bound 10410c52818fSSatish Balay . TAOLINESEARCH_HALTED_RTOL - range of uncertainty is smaller than given tolerance 10420c52818fSSatish Balay 10430c52818fSSatish Balay . TAOLINESEARCH_HALTED_USER - user can set this reason to stop line search 10440c52818fSSatish Balay . TAOLINESEARCH_HALTED_OTHER - any other reason 10450c52818fSSatish Balay 1046a2b725a8SWilliam Gropp - TAOLINESEARCH_SUCCESS - successful line search 10470c52818fSSatish Balay 10480c52818fSSatish Balay Level: developer 10490c52818fSSatish Balay 10500c52818fSSatish Balay @*/ 1051e4cb33bbSBarry Smith PetscErrorCode TaoLineSearchGetSolution(TaoLineSearch ls, Vec x, PetscReal *f, Vec g, PetscReal *steplength, TaoLineSearchConvergedReason *reason) 10520c52818fSSatish Balay { 10530c52818fSSatish Balay PetscFunctionBegin; 10540c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 10550c52818fSSatish Balay PetscValidHeaderSpecific(x,VEC_CLASSID,2); 1056dadcf809SJacob Faibussowitsch PetscValidRealPointer(f,3); 10570c52818fSSatish Balay PetscValidHeaderSpecific(g,VEC_CLASSID,4); 10580c52818fSSatish Balay PetscValidIntPointer(reason,6); 1059*1baa6e33SBarry Smith if (ls->new_x) PetscCall(VecCopy(ls->new_x,x)); 10600c52818fSSatish Balay *f = ls->new_f; 1061*1baa6e33SBarry Smith if (ls->new_g) PetscCall(VecCopy(ls->new_g,g)); 106297ab8e72SStefano Zampini if (steplength) *steplength = ls->step; 10630c52818fSSatish Balay *reason = ls->reason; 10640c52818fSSatish Balay PetscFunctionReturn(0); 10650c52818fSSatish Balay } 10660c52818fSSatish Balay 10670c52818fSSatish Balay /*@ 10680c52818fSSatish Balay TaoLineSearchGetStartingVector - Gets a the initial point of the line 10690c52818fSSatish Balay search. 10700c52818fSSatish Balay 10710c52818fSSatish Balay Not Collective 10720c52818fSSatish Balay 10730c52818fSSatish Balay Input Parameter: 10740c52818fSSatish Balay . ls - the TaoLineSearch context 10750c52818fSSatish Balay 10760c52818fSSatish Balay Output Parameter: 10770c52818fSSatish Balay . x - The initial point of the line search 10780c52818fSSatish Balay 10790c52818fSSatish Balay Level: intermediate 10800c52818fSSatish Balay @*/ 10810c52818fSSatish Balay PetscErrorCode TaoLineSearchGetStartingVector(TaoLineSearch ls, Vec *x) 10820c52818fSSatish Balay { 10830c52818fSSatish Balay PetscFunctionBegin; 10840c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 108597ab8e72SStefano Zampini if (x) *x = ls->start_x; 10860c52818fSSatish Balay PetscFunctionReturn(0); 10870c52818fSSatish Balay } 10880c52818fSSatish Balay 10890c52818fSSatish Balay /*@ 10900c52818fSSatish Balay TaoLineSearchGetStepDirection - Gets the step direction of the line 10910c52818fSSatish Balay search. 10920c52818fSSatish Balay 10930c52818fSSatish Balay Not Collective 10940c52818fSSatish Balay 10950c52818fSSatish Balay Input Parameter: 10960c52818fSSatish Balay . ls - the TaoLineSearch context 10970c52818fSSatish Balay 10980c52818fSSatish Balay Output Parameter: 10990c52818fSSatish Balay . s - the step direction of the line search 11000c52818fSSatish Balay 11010c52818fSSatish Balay Level: advanced 11020c52818fSSatish Balay @*/ 11030c52818fSSatish Balay PetscErrorCode TaoLineSearchGetStepDirection(TaoLineSearch ls, Vec *s) 11040c52818fSSatish Balay { 11050c52818fSSatish Balay PetscFunctionBegin; 11060c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 110797ab8e72SStefano Zampini if (s) *s = ls->stepdirection; 11080c52818fSSatish Balay PetscFunctionReturn(0); 11090c52818fSSatish Balay } 11100c52818fSSatish Balay 11110c52818fSSatish Balay /*@ 11120c52818fSSatish Balay TaoLineSearchGetFullStepObjective - Returns the objective function value at the full step. Useful for some minimization algorithms. 11130c52818fSSatish Balay 11140c52818fSSatish Balay Not Collective 11150c52818fSSatish Balay 11160c52818fSSatish Balay Input Parameter: 11170c52818fSSatish Balay . ls - the TaoLineSearch context 11180c52818fSSatish Balay 11190c52818fSSatish Balay Output Parameter: 11200c52818fSSatish Balay . f - the objective value at the full step length 11210c52818fSSatish Balay 11220c52818fSSatish Balay Level: developer 11230c52818fSSatish Balay @*/ 11240c52818fSSatish Balay 11250c52818fSSatish Balay PetscErrorCode TaoLineSearchGetFullStepObjective(TaoLineSearch ls, PetscReal *f_fullstep) 11260c52818fSSatish Balay { 11270c52818fSSatish Balay PetscFunctionBegin; 11280c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 11290c52818fSSatish Balay *f_fullstep = ls->f_fullstep; 11300c52818fSSatish Balay PetscFunctionReturn(0); 11310c52818fSSatish Balay } 11320c52818fSSatish Balay 11330c52818fSSatish Balay /*@ 11340c52818fSSatish Balay TaoLineSearchSetVariableBounds - Sets the upper and lower bounds. 11350c52818fSSatish Balay 1136441846f8SBarry Smith Logically Collective on Tao 11370c52818fSSatish Balay 11380c52818fSSatish Balay Input Parameters: 11390c52818fSSatish Balay + ls - the TaoLineSearch context 11400c52818fSSatish Balay . xl - vector of lower bounds 11410c52818fSSatish Balay - xu - vector of upper bounds 11420c52818fSSatish Balay 11430c52818fSSatish Balay Note: If the variable bounds are not set with this routine, then 1144e270355aSBarry Smith PETSC_NINFINITY and PETSC_INFINITY are assumed 11450c52818fSSatish Balay 11460c52818fSSatish Balay Level: beginner 11470c52818fSSatish Balay 1148db781477SPatrick Sanan .seealso: `TaoSetVariableBounds()`, `TaoLineSearchCreate()` 11490c52818fSSatish Balay @*/ 11500c52818fSSatish Balay PetscErrorCode TaoLineSearchSetVariableBounds(TaoLineSearch ls,Vec xl, Vec xu) 11510c52818fSSatish Balay { 11520c52818fSSatish Balay PetscFunctionBegin; 11530c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 115476be6f4fSStefano Zampini if (xl) PetscValidHeaderSpecific(xl,VEC_CLASSID,2); 115576be6f4fSStefano Zampini if (xu) PetscValidHeaderSpecific(xu,VEC_CLASSID,3); 11569566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)xl)); 11579566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)xu)); 11589566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ls->lower)); 11599566063dSJacob Faibussowitsch PetscCall(VecDestroy(&ls->upper)); 11600c52818fSSatish Balay ls->lower = xl; 11610c52818fSSatish Balay ls->upper = xu; 116276be6f4fSStefano Zampini ls->bounded = (PetscBool)(xl || xu); 11630c52818fSSatish Balay PetscFunctionReturn(0); 11640c52818fSSatish Balay } 11650c52818fSSatish Balay 11660c52818fSSatish Balay /*@ 11670c52818fSSatish Balay TaoLineSearchSetInitialStepLength - Sets the initial step length of a line 11680c52818fSSatish Balay search. If this value is not set then 1.0 is assumed. 11690c52818fSSatish Balay 11700c52818fSSatish Balay Logically Collective on TaoLineSearch 11710c52818fSSatish Balay 11720c52818fSSatish Balay Input Parameters: 11730c52818fSSatish Balay + ls - the TaoLineSearch context 11740c52818fSSatish Balay - s - the initial step size 11750c52818fSSatish Balay 11760c52818fSSatish Balay Level: intermediate 11770c52818fSSatish Balay 1178db781477SPatrick Sanan .seealso: `TaoLineSearchGetStepLength()`, `TaoLineSearchApply()` 11790c52818fSSatish Balay @*/ 11800c52818fSSatish Balay PetscErrorCode TaoLineSearchSetInitialStepLength(TaoLineSearch ls,PetscReal s) 11810c52818fSSatish Balay { 11820c52818fSSatish Balay PetscFunctionBegin; 11830c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 1184a39c8e28SStefano Zampini PetscValidLogicalCollectiveReal(ls,s,2); 11850c52818fSSatish Balay ls->initstep = s; 11860c52818fSSatish Balay PetscFunctionReturn(0); 11870c52818fSSatish Balay } 11880c52818fSSatish Balay 11890c52818fSSatish Balay /*@ 11900c52818fSSatish Balay TaoLineSearchGetStepLength - Get the current step length 11910c52818fSSatish Balay 11920c52818fSSatish Balay Not Collective 11930c52818fSSatish Balay 11940c52818fSSatish Balay Input Parameters: 11950c52818fSSatish Balay . ls - the TaoLineSearch context 11960c52818fSSatish Balay 11977a7aea1fSJed Brown Output Parameters: 11980c52818fSSatish Balay . s - the current step length 11990c52818fSSatish Balay 12000c52818fSSatish Balay Level: beginner 12010c52818fSSatish Balay 1202db781477SPatrick Sanan .seealso: `TaoLineSearchSetInitialStepLength()`, `TaoLineSearchApply()` 12030c52818fSSatish Balay @*/ 12040c52818fSSatish Balay PetscErrorCode TaoLineSearchGetStepLength(TaoLineSearch ls,PetscReal *s) 12050c52818fSSatish Balay { 12060c52818fSSatish Balay PetscFunctionBegin; 12070c52818fSSatish Balay PetscValidHeaderSpecific(ls,TAOLINESEARCH_CLASSID,1); 12080c52818fSSatish Balay *s = ls->step; 12090c52818fSSatish Balay PetscFunctionReturn(0); 12100c52818fSSatish Balay } 12110c52818fSSatish Balay 12120ebee16dSLisandro Dalcin /*@C 12130c52818fSSatish Balay TaoLineSearchRegister - Adds a line-search algorithm to the registry 12140c52818fSSatish Balay 12150c52818fSSatish Balay Not collective 12160c52818fSSatish Balay 12170c52818fSSatish Balay Input Parameters: 12180c52818fSSatish Balay + sname - name of a new user-defined solver 12190c52818fSSatish Balay - func - routine to Create method context 12200c52818fSSatish Balay 12210c52818fSSatish Balay Notes: 12220c52818fSSatish Balay TaoLineSearchRegister() may be called multiple times to add several user-defined solvers. 12230c52818fSSatish Balay 12240c52818fSSatish Balay Sample usage: 12250c52818fSSatish Balay .vb 12260c52818fSSatish Balay TaoLineSearchRegister("my_linesearch",MyLinesearchCreate); 12270c52818fSSatish Balay .ve 12280c52818fSSatish Balay 12290c52818fSSatish Balay Then, your solver can be chosen with the procedural interface via 12300c52818fSSatish Balay $ TaoLineSearchSetType(ls,"my_linesearch") 12310c52818fSSatish Balay or at runtime via the option 12320c52818fSSatish Balay $ -tao_ls_type my_linesearch 12330c52818fSSatish Balay 12340c52818fSSatish Balay Level: developer 12350c52818fSSatish Balay 12360ebee16dSLisandro Dalcin @*/ 12370c52818fSSatish Balay PetscErrorCode TaoLineSearchRegister(const char sname[], PetscErrorCode (*func)(TaoLineSearch)) 12380c52818fSSatish Balay { 12390c52818fSSatish Balay PetscFunctionBegin; 12409566063dSJacob Faibussowitsch PetscCall(TaoLineSearchInitializePackage()); 12419566063dSJacob Faibussowitsch PetscCall(PetscFunctionListAdd(&TaoLineSearchList, sname, (void (*)(void))func)); 12420c52818fSSatish Balay PetscFunctionReturn(0); 12430c52818fSSatish Balay } 12440c52818fSSatish Balay 12450c52818fSSatish Balay /*@C 12460c52818fSSatish Balay TaoLineSearchAppendOptionsPrefix - Appends to the prefix used for searching 12470c52818fSSatish Balay for all TaoLineSearch options in the database. 12480c52818fSSatish Balay 12490c52818fSSatish Balay Collective on TaoLineSearch 12500c52818fSSatish Balay 12510c52818fSSatish Balay Input Parameters: 12520c52818fSSatish Balay + ls - the TaoLineSearch solver context 12530c52818fSSatish Balay - prefix - the prefix string to prepend to all line search requests 12540c52818fSSatish Balay 12550c52818fSSatish Balay Notes: 12560c52818fSSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 12570c52818fSSatish Balay The first character of all runtime options is AUTOMATICALLY the hyphen. 12580c52818fSSatish Balay 12590c52818fSSatish Balay Level: advanced 12600c52818fSSatish Balay 1261db781477SPatrick Sanan .seealso: `TaoLineSearchSetOptionsPrefix()`, `TaoLineSearchGetOptionsPrefix()` 12620c52818fSSatish Balay @*/ 12630c52818fSSatish Balay PetscErrorCode TaoLineSearchAppendOptionsPrefix(TaoLineSearch ls, const char p[]) 12640c52818fSSatish Balay { 1265f06e3bfaSBarry Smith return PetscObjectAppendOptionsPrefix((PetscObject)ls,p); 12660c52818fSSatish Balay } 12670c52818fSSatish Balay 12680c52818fSSatish Balay /*@C 12690c52818fSSatish Balay TaoLineSearchGetOptionsPrefix - Gets the prefix used for searching for all 12700c52818fSSatish Balay TaoLineSearch options in the database 12710c52818fSSatish Balay 12720c52818fSSatish Balay Not Collective 12730c52818fSSatish Balay 12740c52818fSSatish Balay Input Parameters: 12750c52818fSSatish Balay . ls - the TaoLineSearch context 12760c52818fSSatish Balay 12770c52818fSSatish Balay Output Parameters: 12780c52818fSSatish Balay . prefix - pointer to the prefix string used is returned 12790c52818fSSatish Balay 128095452b02SPatrick Sanan Notes: 128195452b02SPatrick Sanan On the fortran side, the user should pass in a string 'prefix' of 12820c52818fSSatish Balay sufficient length to hold the prefix. 12830c52818fSSatish Balay 12840c52818fSSatish Balay Level: advanced 12850c52818fSSatish Balay 1286db781477SPatrick Sanan .seealso: `TaoLineSearchSetOptionsPrefix()`, `TaoLineSearchAppendOptionsPrefix()` 12870c52818fSSatish Balay @*/ 12880c52818fSSatish Balay PetscErrorCode TaoLineSearchGetOptionsPrefix(TaoLineSearch ls, const char *p[]) 12890c52818fSSatish Balay { 1290f06e3bfaSBarry Smith return PetscObjectGetOptionsPrefix((PetscObject)ls,p); 12910c52818fSSatish Balay } 12920c52818fSSatish Balay 12930c52818fSSatish Balay /*@C 12940c52818fSSatish Balay TaoLineSearchSetOptionsPrefix - Sets the prefix used for searching for all 12950c52818fSSatish Balay TaoLineSearch options in the database. 12960c52818fSSatish Balay 12970c52818fSSatish Balay Logically Collective on TaoLineSearch 12980c52818fSSatish Balay 12990c52818fSSatish Balay Input Parameters: 13000c52818fSSatish Balay + ls - the TaoLineSearch context 13010c52818fSSatish Balay - prefix - the prefix string to prepend to all TAO option requests 13020c52818fSSatish Balay 13030c52818fSSatish Balay Notes: 13040c52818fSSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name. 13050c52818fSSatish Balay The first character of all runtime options is AUTOMATICALLY the hyphen. 13060c52818fSSatish Balay 13070c52818fSSatish Balay For example, to distinguish between the runtime options for two 13080c52818fSSatish Balay different line searches, one could call 13090c52818fSSatish Balay .vb 13100c52818fSSatish Balay TaoLineSearchSetOptionsPrefix(ls1,"sys1_") 13110c52818fSSatish Balay TaoLineSearchSetOptionsPrefix(ls2,"sys2_") 13120c52818fSSatish Balay .ve 13130c52818fSSatish Balay 13140c52818fSSatish Balay This would enable use of different options for each system, such as 13150c52818fSSatish Balay .vb 13160c52818fSSatish Balay -sys1_tao_ls_type mt 13170c52818fSSatish Balay -sys2_tao_ls_type armijo 13180c52818fSSatish Balay .ve 13190c52818fSSatish Balay 13200c52818fSSatish Balay Level: advanced 13210c52818fSSatish Balay 1322db781477SPatrick Sanan .seealso: `TaoLineSearchAppendOptionsPrefix()`, `TaoLineSearchGetOptionsPrefix()` 13230c52818fSSatish Balay @*/ 13240c52818fSSatish Balay 13250c52818fSSatish Balay PetscErrorCode TaoLineSearchSetOptionsPrefix(TaoLineSearch ls, const char p[]) 13260c52818fSSatish Balay { 1327f06e3bfaSBarry Smith return PetscObjectSetOptionsPrefix((PetscObject)ls,p); 13280c52818fSSatish Balay } 1329