xref: /petsc/src/tao/linesearch/interface/taolinesearch.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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 @*/
249371c9d4SSatish Balay PetscErrorCode TaoLineSearchViewFromOptions(TaoLineSearch A, PetscObject obj, const char name[]) {
25fe2efc57SMark   PetscFunctionBegin;
26fe2efc57SMark   PetscValidHeaderSpecific(A, TAOLINESEARCH_CLASSID, 1);
279566063dSJacob Faibussowitsch   PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
28fe2efc57SMark   PetscFunctionReturn(0);
29fe2efc57SMark }
30fe2efc57SMark 
31fe2efc57SMark /*@C
320c52818fSSatish Balay   TaoLineSearchView - Prints information about the TaoLineSearch
330c52818fSSatish Balay 
340c52818fSSatish Balay   Collective on TaoLineSearch
350c52818fSSatish Balay 
360c52818fSSatish Balay   InputParameters:
37441846f8SBarry Smith + ls - the Tao context
380c52818fSSatish Balay - viewer - visualization context
390c52818fSSatish Balay 
400c52818fSSatish Balay   Options Database Key:
410c52818fSSatish Balay . -tao_ls_view - Calls TaoLineSearchView() at the end of each line search
420c52818fSSatish Balay 
430c52818fSSatish Balay   Notes:
440c52818fSSatish Balay   The available visualization contexts include
450c52818fSSatish Balay +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
460c52818fSSatish Balay -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
470c52818fSSatish Balay          output where only the first processor opens
480c52818fSSatish Balay          the file.  All other processors send their
490c52818fSSatish Balay          data to the first processor to print.
500c52818fSSatish Balay 
510c52818fSSatish Balay   Level: beginner
520c52818fSSatish Balay 
53db781477SPatrick Sanan .seealso: `PetscViewerASCIIOpen()`
540c52818fSSatish Balay @*/
550c52818fSSatish Balay 
569371c9d4SSatish Balay PetscErrorCode TaoLineSearchView(TaoLineSearch ls, PetscViewer viewer) {
570c52818fSSatish Balay   PetscBool         isascii, isstring;
58dedfbcbeSJed Brown   TaoLineSearchType type;
59f06e3bfaSBarry Smith 
600c52818fSSatish Balay   PetscFunctionBegin;
610c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
62*48a46eb9SPierre Jolivet   if (!viewer) PetscCall(PetscViewerASCIIGetStdout(((PetscObject)ls)->comm, &viewer));
630c52818fSSatish Balay   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
640c52818fSSatish Balay   PetscCheckSameComm(ls, 1, viewer, 2);
650c52818fSSatish Balay 
669566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
679566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring));
680c52818fSSatish Balay   if (isascii) {
699566063dSJacob Faibussowitsch     PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)ls, viewer));
709566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
71dbbe0bcdSBarry Smith     PetscTryTypeMethod(ls, view, viewer);
729566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
739566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPushTab(viewer));
7463a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "maximum function evaluations=%" PetscInt_FMT "\n", ls->max_funcs));
759566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "tolerances: ftol=%g, rtol=%g, gtol=%g\n", (double)ls->ftol, (double)ls->rtol, (double)ls->gtol));
7663a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "total number of function evaluations=%" PetscInt_FMT "\n", ls->nfeval));
7763a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "total number of gradient evaluations=%" PetscInt_FMT "\n", ls->ngeval));
7863a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "total number of function/gradient evaluations=%" PetscInt_FMT "\n", ls->nfgeval));
790c52818fSSatish Balay 
80*48a46eb9SPierre Jolivet     if (ls->bounded) PetscCall(PetscViewerASCIIPrintf(viewer, "using variable bounds\n"));
819566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Termination reason: %d\n", (int)ls->reason));
829566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPopTab(viewer));
830c52818fSSatish Balay   } else if (isstring) {
849566063dSJacob Faibussowitsch     PetscCall(TaoLineSearchGetType(ls, &type));
859566063dSJacob Faibussowitsch     PetscCall(PetscViewerStringSPrintf(viewer, " %-3.3s", type));
860c52818fSSatish Balay   }
870c52818fSSatish Balay   PetscFunctionReturn(0);
880c52818fSSatish Balay }
890c52818fSSatish Balay 
900c52818fSSatish Balay /*@C
910c52818fSSatish Balay   TaoLineSearchCreate - Creates a TAO Line Search object.  Algorithms in TAO that use
920c52818fSSatish Balay   line-searches will automatically create one.
930c52818fSSatish Balay 
94d083f849SBarry Smith   Collective
950c52818fSSatish Balay 
960c52818fSSatish Balay   Input Parameter:
970c52818fSSatish Balay . comm - MPI communicator
980c52818fSSatish Balay 
990c52818fSSatish Balay   Output Parameter:
1000c52818fSSatish Balay . newls - the new TaoLineSearch context
1010c52818fSSatish Balay 
1020c52818fSSatish Balay   Available methods include:
103147403d9SBarry Smith + more-thuente - the More-Thuente method
104147403d9SBarry Smith . gpcg - the GPCG method
1050c52818fSSatish Balay - unit - Do not perform any line search
1060c52818fSSatish Balay 
1070c52818fSSatish Balay    Options Database Keys:
1080c52818fSSatish Balay .   -tao_ls_type - select which method TAO should use
1090c52818fSSatish Balay 
1100c52818fSSatish Balay    Level: beginner
1110c52818fSSatish Balay 
112db781477SPatrick Sanan .seealso: `TaoLineSearchSetType()`, `TaoLineSearchApply()`, `TaoLineSearchDestroy()`
1130c52818fSSatish Balay @*/
1140c52818fSSatish Balay 
1159371c9d4SSatish Balay PetscErrorCode TaoLineSearchCreate(MPI_Comm comm, TaoLineSearch *newls) {
1160c52818fSSatish Balay   TaoLineSearch ls;
1170c52818fSSatish Balay 
1180c52818fSSatish Balay   PetscFunctionBegin;
1190c52818fSSatish Balay   PetscValidPointer(newls, 2);
1209566063dSJacob Faibussowitsch   PetscCall(TaoLineSearchInitializePackage());
1210c52818fSSatish Balay 
1229566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(ls, TAOLINESEARCH_CLASSID, "TaoLineSearch", "Linesearch", "Tao", comm, TaoLineSearchDestroy, TaoLineSearchView));
1230c52818fSSatish Balay   ls->max_funcs = 30;
1240c52818fSSatish Balay   ls->ftol      = 0.0001;
1250c52818fSSatish Balay   ls->gtol      = 0.9;
1266f4723b1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE)
1276f4723b1SBarry Smith   ls->rtol = 1.0e-5;
1286f4723b1SBarry Smith #else
1290c52818fSSatish Balay   ls->rtol = 1.0e-10;
1306f4723b1SBarry Smith #endif
1310c52818fSSatish Balay   ls->stepmin  = 1.0e-20;
1320c52818fSSatish Balay   ls->stepmax  = 1.0e+20;
1330c52818fSSatish Balay   ls->step     = 1.0;
134a39c8e28SStefano Zampini   ls->initstep = 1.0;
1350c52818fSSatish Balay   *newls       = ls;
1360c52818fSSatish Balay   PetscFunctionReturn(0);
1370c52818fSSatish Balay }
1380c52818fSSatish Balay 
1390c52818fSSatish Balay /*@
1400c52818fSSatish Balay   TaoLineSearchSetUp - Sets up the internal data structures for the later use
1410c52818fSSatish Balay   of a Tao solver
1420c52818fSSatish Balay 
1430c52818fSSatish Balay   Collective on ls
1440c52818fSSatish Balay 
1450c52818fSSatish Balay   Input Parameters:
1460c52818fSSatish Balay . ls - the TaoLineSearch context
1470c52818fSSatish Balay 
1480c52818fSSatish Balay   Notes:
1490c52818fSSatish Balay   The user will not need to explicitly call TaoLineSearchSetUp(), as it will
1500c52818fSSatish Balay   automatically be called in TaoLineSearchSolve().  However, if the user
1510c52818fSSatish Balay   desires to call it explicitly, it should come after TaoLineSearchCreate()
1520c52818fSSatish Balay   but before TaoLineSearchApply().
1530c52818fSSatish Balay 
1540c52818fSSatish Balay   Level: developer
1550c52818fSSatish Balay 
156db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchApply()`
1570c52818fSSatish Balay @*/
1580c52818fSSatish Balay 
1599371c9d4SSatish Balay PetscErrorCode TaoLineSearchSetUp(TaoLineSearch ls) {
1608caf6e8cSBarry Smith   const char *default_type = TAOLINESEARCHMT;
1610c52818fSSatish Balay   PetscBool   flg;
162f06e3bfaSBarry Smith 
1630c52818fSSatish Balay   PetscFunctionBegin;
1640c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
1650c52818fSSatish Balay   if (ls->setupcalled) PetscFunctionReturn(0);
166*48a46eb9SPierre Jolivet   if (!((PetscObject)ls)->type_name) PetscCall(TaoLineSearchSetType(ls, default_type));
167dbbe0bcdSBarry Smith   PetscTryTypeMethod(ls, setup);
1680c52818fSSatish Balay   if (ls->usetaoroutines) {
1699566063dSJacob Faibussowitsch     PetscCall(TaoIsObjectiveDefined(ls->tao, &flg));
1700c52818fSSatish Balay     ls->hasobjective = flg;
1719566063dSJacob Faibussowitsch     PetscCall(TaoIsGradientDefined(ls->tao, &flg));
1720c52818fSSatish Balay     ls->hasgradient = flg;
1739566063dSJacob Faibussowitsch     PetscCall(TaoIsObjectiveAndGradientDefined(ls->tao, &flg));
1740c52818fSSatish Balay     ls->hasobjectiveandgradient = flg;
1750c52818fSSatish Balay   } else {
1760c52818fSSatish Balay     if (ls->ops->computeobjective) {
1770c52818fSSatish Balay       ls->hasobjective = PETSC_TRUE;
1780c52818fSSatish Balay     } else {
1790c52818fSSatish Balay       ls->hasobjective = PETSC_FALSE;
1800c52818fSSatish Balay     }
1810c52818fSSatish Balay     if (ls->ops->computegradient) {
1820c52818fSSatish Balay       ls->hasgradient = PETSC_TRUE;
1830c52818fSSatish Balay     } else {
1840c52818fSSatish Balay       ls->hasgradient = PETSC_FALSE;
1850c52818fSSatish Balay     }
1860c52818fSSatish Balay     if (ls->ops->computeobjectiveandgradient) {
1870c52818fSSatish Balay       ls->hasobjectiveandgradient = PETSC_TRUE;
1880c52818fSSatish Balay     } else {
1890c52818fSSatish Balay       ls->hasobjectiveandgradient = PETSC_FALSE;
1900c52818fSSatish Balay     }
1910c52818fSSatish Balay   }
1920c52818fSSatish Balay   ls->setupcalled = PETSC_TRUE;
1930c52818fSSatish Balay   PetscFunctionReturn(0);
1940c52818fSSatish Balay }
1950c52818fSSatish Balay 
1960c52818fSSatish Balay /*@
1970c52818fSSatish Balay   TaoLineSearchReset - Some line searches may carry state information
1980c52818fSSatish Balay   from one TaoLineSearchApply() to the next.  This function resets this
1990c52818fSSatish Balay   state information.
2000c52818fSSatish Balay 
2010c52818fSSatish Balay   Collective on TaoLineSearch
2020c52818fSSatish Balay 
2030c52818fSSatish Balay   Input Parameter:
2040c52818fSSatish Balay . ls - the TaoLineSearch context
2050c52818fSSatish Balay 
2060c52818fSSatish Balay   Level: developer
2070c52818fSSatish Balay 
208db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchApply()`
2090c52818fSSatish Balay @*/
2109371c9d4SSatish Balay PetscErrorCode TaoLineSearchReset(TaoLineSearch ls) {
2110c52818fSSatish Balay   PetscFunctionBegin;
2120c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
213dbbe0bcdSBarry Smith   PetscTryTypeMethod(ls, reset);
2140c52818fSSatish Balay   PetscFunctionReturn(0);
2150c52818fSSatish Balay }
216f06e3bfaSBarry Smith 
2170c52818fSSatish Balay /*@
2180c52818fSSatish Balay   TaoLineSearchDestroy - Destroys the TAO context that was created with
2190c52818fSSatish Balay   TaoLineSearchCreate()
2200c52818fSSatish Balay 
2210c52818fSSatish Balay   Collective on TaoLineSearch
2220c52818fSSatish Balay 
2237a7aea1fSJed Brown   Input Parameter:
2240c52818fSSatish Balay . ls - the TaoLineSearch context
2250c52818fSSatish Balay 
2260c52818fSSatish Balay   Level: beginner
2270c52818fSSatish Balay 
2280c52818fSSatish Balay .seealse: TaoLineSearchCreate(), TaoLineSearchSolve()
2290c52818fSSatish Balay @*/
2309371c9d4SSatish Balay PetscErrorCode TaoLineSearchDestroy(TaoLineSearch *ls) {
2310c52818fSSatish Balay   PetscFunctionBegin;
2320c52818fSSatish Balay   if (!*ls) PetscFunctionReturn(0);
2330c52818fSSatish Balay   PetscValidHeaderSpecific(*ls, TAOLINESEARCH_CLASSID, 1);
2349371c9d4SSatish Balay   if (--((PetscObject)*ls)->refct > 0) {
2359371c9d4SSatish Balay     *ls = NULL;
2369371c9d4SSatish Balay     PetscFunctionReturn(0);
2379371c9d4SSatish Balay   }
2389566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*ls)->stepdirection));
2399566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*ls)->start_x));
2409566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*ls)->upper));
2419566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&(*ls)->lower));
242*48a46eb9SPierre Jolivet   if ((*ls)->ops->destroy) PetscCall((*(*ls)->ops->destroy)(*ls));
243*48a46eb9SPierre Jolivet   if ((*ls)->usemonitor) PetscCall(PetscViewerDestroy(&(*ls)->viewer));
2449566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(ls));
2450c52818fSSatish Balay   PetscFunctionReturn(0);
2460c52818fSSatish Balay }
2470c52818fSSatish Balay 
2480c52818fSSatish Balay /*@
2490c52818fSSatish Balay   TaoLineSearchApply - Performs a line-search in a given step direction.  Criteria for acceptable step length depends on the line-search algorithm chosen
2500c52818fSSatish Balay 
2510c52818fSSatish Balay   Collective on TaoLineSearch
2520c52818fSSatish Balay 
2530c52818fSSatish Balay   Input Parameters:
254441846f8SBarry Smith + ls - the Tao context
2550c52818fSSatish Balay - s - search direction
2560c52818fSSatish Balay 
2576b867d5aSJose E. Roman   Input/Output Parameters:
2586b867d5aSJose E. Roman 
2590c52818fSSatish Balay   Output Parameters:
260f1a722f8SMatthew G. Knepley + x - On input the current solution, on output x contains the new solution determined by the line search
261f1a722f8SMatthew G. Knepley . f - On input the objective function value at current solution, on output contains the objective function value at new solution
262f1a722f8SMatthew G. Knepley . g - On input the gradient evaluated at x, on output contains the gradient at new solution
263f1a722f8SMatthew G. Knepley . steplength - scalar multiplier of s used ( x = x0 + steplength * x)
2640c52818fSSatish Balay - reason - reason why the line-search stopped
2650c52818fSSatish Balay 
26697bb3fdcSJose E. Roman   Notes:
2670c52818fSSatish Balay   reason will be set to one of:
2680c52818fSSatish Balay 
2690c52818fSSatish Balay + TAOLINESEARCH_FAILED_ASCENT - initial line search step * g is not descent direction
2700c52818fSSatish Balay . TAOLINESEARCH_FAILED_INFORNAN - function evaluation gives Inf or Nan value
2710c52818fSSatish Balay . TAOLINESEARCH_FAILED_BADPARAMETER - negative value set as parameter
2720c52818fSSatish Balay . TAOLINESEARCH_HALTED_MAXFCN - maximum number of function evaluation reached
2730c52818fSSatish Balay . TAOLINESEARCH_HALTED_UPPERBOUND - step is at upper bound
2740c52818fSSatish Balay . TAOLINESEARCH_HALTED_LOWERBOUND - step is at lower bound
2750c52818fSSatish Balay . TAOLINESEARCH_HALTED_RTOL - range of uncertainty is smaller than given tolerance
2760c52818fSSatish Balay . TAOLINESEARCH_HALTED_USER - user can set this reason to stop line search
2770c52818fSSatish Balay . TAOLINESEARCH_HALTED_OTHER - any other reason
2780c52818fSSatish Balay - TAOLINESEARCH_SUCCESS - successful line search
2790c52818fSSatish Balay 
2800c52818fSSatish Balay   The algorithm developer must set up the TaoLineSearch with calls to
281441846f8SBarry Smith   TaoLineSearchSetObjectiveRoutine() and TaoLineSearchSetGradientRoutine(), TaoLineSearchSetObjectiveAndGradientRoutine(), or TaoLineSearchUseTaoRoutines()
2820c52818fSSatish Balay 
2830c52818fSSatish Balay   You may or may not need to follow this with a call to
2840c52818fSSatish Balay   TaoAddLineSearchCounts(), depending on whether you want these
2850c52818fSSatish Balay   evaluations to count toward the total function/gradient evaluations.
2860c52818fSSatish Balay 
2870c52818fSSatish Balay   Level: beginner
2880c52818fSSatish Balay 
289db781477SPatrick Sanan   .seealso: `TaoLineSearchCreate()`, `TaoLineSearchSetType()`, `TaoLineSearchSetInitialStepLength()`, `TaoAddLineSearchCounts()`
2900c52818fSSatish Balay  @*/
2910c52818fSSatish Balay 
2929371c9d4SSatish Balay PetscErrorCode TaoLineSearchApply(TaoLineSearch ls, Vec x, PetscReal *f, Vec g, Vec s, PetscReal *steplength, TaoLineSearchConvergedReason *reason) {
2930c52818fSSatish Balay   PetscInt low1, low2, low3, high1, high2, high3;
2940c52818fSSatish Balay 
2950c52818fSSatish Balay   PetscFunctionBegin;
2960c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
2970c52818fSSatish Balay   PetscValidHeaderSpecific(x, VEC_CLASSID, 2);
2983f6ba705SLisandro Dalcin   PetscValidRealPointer(f, 3);
2990c52818fSSatish Balay   PetscValidHeaderSpecific(g, VEC_CLASSID, 4);
3000c52818fSSatish Balay   PetscValidHeaderSpecific(s, VEC_CLASSID, 5);
3010c52818fSSatish Balay   PetscValidPointer(reason, 7);
3020c52818fSSatish Balay   PetscCheckSameComm(ls, 1, x, 2);
3030c52818fSSatish Balay   PetscCheckSameTypeAndComm(x, 2, g, 4);
3040c52818fSSatish Balay   PetscCheckSameTypeAndComm(x, 2, s, 5);
3059566063dSJacob Faibussowitsch   PetscCall(VecGetOwnershipRange(x, &low1, &high1));
3069566063dSJacob Faibussowitsch   PetscCall(VecGetOwnershipRange(g, &low2, &high2));
3079566063dSJacob Faibussowitsch   PetscCall(VecGetOwnershipRange(s, &low3, &high3));
3083c859ba3SBarry Smith   PetscCheck(low1 == low2 && low1 == low3 && high1 == high2 && high1 == high3, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "Incompatible vector local lengths");
3090c52818fSSatish Balay 
31097ab8e72SStefano Zampini   *reason = TAOLINESEARCH_CONTINUE_ITERATING;
3119566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)s));
3129566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ls->stepdirection));
313050fc7a3SBarry Smith   ls->stepdirection = s;
3140c52818fSSatish Balay 
3159566063dSJacob Faibussowitsch   PetscCall(TaoLineSearchSetUp(ls));
3160c52818fSSatish Balay   ls->nfeval  = 0;
3170c52818fSSatish Balay   ls->ngeval  = 0;
3180c52818fSSatish Balay   ls->nfgeval = 0;
3190c52818fSSatish Balay   /* Check parameter values */
3200c52818fSSatish Balay   if (ls->ftol < 0.0) {
3219566063dSJacob Faibussowitsch     PetscCall(PetscInfo(ls, "Bad Line Search Parameter: ftol (%g) < 0\n", (double)ls->ftol));
3220c52818fSSatish Balay     *reason = TAOLINESEARCH_FAILED_BADPARAMETER;
3230c52818fSSatish Balay   }
3240c52818fSSatish Balay   if (ls->rtol < 0.0) {
3259566063dSJacob Faibussowitsch     PetscCall(PetscInfo(ls, "Bad Line Search Parameter: rtol (%g) < 0\n", (double)ls->rtol));
3260c52818fSSatish Balay     *reason = TAOLINESEARCH_FAILED_BADPARAMETER;
3270c52818fSSatish Balay   }
3280c52818fSSatish Balay   if (ls->gtol < 0.0) {
3299566063dSJacob Faibussowitsch     PetscCall(PetscInfo(ls, "Bad Line Search Parameter: gtol (%g) < 0\n", (double)ls->gtol));
3300c52818fSSatish Balay     *reason = TAOLINESEARCH_FAILED_BADPARAMETER;
3310c52818fSSatish Balay   }
3320c52818fSSatish Balay   if (ls->stepmin < 0.0) {
3339566063dSJacob Faibussowitsch     PetscCall(PetscInfo(ls, "Bad Line Search Parameter: stepmin (%g) < 0\n", (double)ls->stepmin));
3340c52818fSSatish Balay     *reason = TAOLINESEARCH_FAILED_BADPARAMETER;
3350c52818fSSatish Balay   }
3360c52818fSSatish Balay   if (ls->stepmax < ls->stepmin) {
3379566063dSJacob Faibussowitsch     PetscCall(PetscInfo(ls, "Bad Line Search Parameter: stepmin (%g) > stepmax (%g)\n", (double)ls->stepmin, (double)ls->stepmax));
3380c52818fSSatish Balay     *reason = TAOLINESEARCH_FAILED_BADPARAMETER;
3390c52818fSSatish Balay   }
3400c52818fSSatish Balay   if (ls->max_funcs < 0) {
3419566063dSJacob Faibussowitsch     PetscCall(PetscInfo(ls, "Bad Line Search Parameter: max_funcs (%" PetscInt_FMT ") < 0\n", ls->max_funcs));
3420c52818fSSatish Balay     *reason = TAOLINESEARCH_FAILED_BADPARAMETER;
3430c52818fSSatish Balay   }
3440c52818fSSatish Balay   if (PetscIsInfOrNanReal(*f)) {
3459566063dSJacob Faibussowitsch     PetscCall(PetscInfo(ls, "Initial Line Search Function Value is Inf or Nan (%g)\n", (double)*f));
3460c52818fSSatish Balay     *reason = TAOLINESEARCH_FAILED_INFORNAN;
3470c52818fSSatish Balay   }
3480c52818fSSatish Balay 
3499566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)x));
3509566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ls->start_x));
3510c52818fSSatish Balay   ls->start_x = x;
352050fc7a3SBarry Smith 
3539566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAOLINESEARCH_Apply, ls, 0, 0, 0));
354dbbe0bcdSBarry Smith   PetscUseTypeMethod(ls, apply, x, f, g, s);
3559566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAOLINESEARCH_Apply, ls, 0, 0, 0));
3560c52818fSSatish Balay   *reason   = ls->reason;
3570c52818fSSatish Balay   ls->new_f = *f;
3580c52818fSSatish Balay 
35997ab8e72SStefano Zampini   if (steplength) *steplength = ls->step;
3600c52818fSSatish Balay 
3619566063dSJacob Faibussowitsch   PetscCall(TaoLineSearchViewFromOptions(ls, NULL, "-tao_ls_view"));
3620c52818fSSatish Balay   PetscFunctionReturn(0);
3630c52818fSSatish Balay }
3640c52818fSSatish Balay 
3650c52818fSSatish Balay /*@C
3660c52818fSSatish Balay    TaoLineSearchSetType - Sets the algorithm used in a line search
3670c52818fSSatish Balay 
3680c52818fSSatish Balay    Collective on TaoLineSearch
3690c52818fSSatish Balay 
3700c52818fSSatish Balay    Input Parameters:
3710c52818fSSatish Balay +  ls - the TaoLineSearch context
372820824deSAlp Dener -  type - the TaoLineSearchType selection
3730c52818fSSatish Balay 
3740c52818fSSatish Balay   Available methods include:
375820824deSAlp Dener +  more-thuente - line search with a cubic model enforcing the strong Wolfe/curvature condition
376820824deSAlp Dener .  armijo - simple backtracking line search enforcing only the sufficient decrease condition
377820824deSAlp Dener -  unit - do not perform a line search and always accept unit step length
3780c52818fSSatish Balay 
3790c52818fSSatish Balay   Options Database Keys:
380820824deSAlp Dener .  -tao_ls_type <more-thuente, armijo, unit> - select which method TAO should use at runtime
3810c52818fSSatish Balay 
3820c52818fSSatish Balay   Level: beginner
3830c52818fSSatish Balay 
384db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchGetType()`, `TaoLineSearchApply()`
3850c52818fSSatish Balay 
3860c52818fSSatish Balay @*/
3870c52818fSSatish Balay 
3889371c9d4SSatish Balay PetscErrorCode TaoLineSearchSetType(TaoLineSearch ls, TaoLineSearchType type) {
3890c52818fSSatish Balay   PetscErrorCode (*r)(TaoLineSearch);
3900c52818fSSatish Balay   PetscBool flg;
3910c52818fSSatish Balay 
3920c52818fSSatish Balay   PetscFunctionBegin;
3930c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
3940c52818fSSatish Balay   PetscValidCharPointer(type, 2);
3959566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)ls, type, &flg));
3960c52818fSSatish Balay   if (flg) PetscFunctionReturn(0);
3970c52818fSSatish Balay 
3989566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListFind(TaoLineSearchList, type, (void (**)(void)) & r));
3993c859ba3SBarry Smith   PetscCheck(r, PetscObjectComm((PetscObject)ls), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unable to find requested TaoLineSearch type %s", type);
400dbbe0bcdSBarry Smith   PetscTryTypeMethod(ls, destroy);
4010c52818fSSatish Balay   ls->max_funcs = 30;
4020c52818fSSatish Balay   ls->ftol      = 0.0001;
4030c52818fSSatish Balay   ls->gtol      = 0.9;
4046f4723b1SBarry Smith #if defined(PETSC_USE_REAL_SINGLE)
4056f4723b1SBarry Smith   ls->rtol = 1.0e-5;
4066f4723b1SBarry Smith #else
4070c52818fSSatish Balay   ls->rtol = 1.0e-10;
4086f4723b1SBarry Smith #endif
4090c52818fSSatish Balay   ls->stepmin = 1.0e-20;
4100c52818fSSatish Balay   ls->stepmax = 1.0e+20;
4110c52818fSSatish Balay 
4120c52818fSSatish Balay   ls->nfeval              = 0;
4130c52818fSSatish Balay   ls->ngeval              = 0;
4140c52818fSSatish Balay   ls->nfgeval             = 0;
41583c8fe1dSLisandro Dalcin   ls->ops->setup          = NULL;
41683c8fe1dSLisandro Dalcin   ls->ops->apply          = NULL;
41783c8fe1dSLisandro Dalcin   ls->ops->view           = NULL;
41883c8fe1dSLisandro Dalcin   ls->ops->setfromoptions = NULL;
41983c8fe1dSLisandro Dalcin   ls->ops->destroy        = NULL;
4200c52818fSSatish Balay   ls->setupcalled         = PETSC_FALSE;
4219566063dSJacob Faibussowitsch   PetscCall((*r)(ls));
4229566063dSJacob Faibussowitsch   PetscCall(PetscObjectChangeTypeName((PetscObject)ls, type));
4230c52818fSSatish Balay   PetscFunctionReturn(0);
4240c52818fSSatish Balay }
4250c52818fSSatish Balay 
4262a0dac07SAlp Dener /*@C
4272a0dac07SAlp Dener   TaoLineSearchMonitor - Monitor the line search steps. This routine will otuput the
4282a0dac07SAlp Dener   iteration number, step length, and function value before calling the implementation
4292a0dac07SAlp Dener   specific monitor.
4302a0dac07SAlp Dener 
4312a0dac07SAlp Dener    Input Parameters:
4322a0dac07SAlp Dener +  ls - the TaoLineSearch context
4332a0dac07SAlp Dener .  its - the current iterate number (>=0)
4342a0dac07SAlp Dener .  f - the current objective function value
4352a0dac07SAlp Dener -  step - the step length
4362a0dac07SAlp Dener 
4372a0dac07SAlp Dener    Options Database Key:
4382a0dac07SAlp Dener .  -tao_ls_monitor - Use the default monitor, which prints statistics to standard output
4392a0dac07SAlp Dener 
4402a0dac07SAlp Dener    Level: developer
4412a0dac07SAlp Dener 
4422a0dac07SAlp Dener @*/
4439371c9d4SSatish Balay PetscErrorCode TaoLineSearchMonitor(TaoLineSearch ls, PetscInt its, PetscReal f, PetscReal step) {
4442a0dac07SAlp Dener   PetscInt tabs;
4452a0dac07SAlp Dener 
4462a0dac07SAlp Dener   PetscFunctionBegin;
4472a0dac07SAlp Dener   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
4482a0dac07SAlp Dener   if (ls->usemonitor) {
4499566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIGetTab(ls->viewer, &tabs));
4509566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIISetTab(ls->viewer, ((PetscObject)ls)->tablevel));
45163a3b9bcSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(ls->viewer, "%3" PetscInt_FMT " LS", its));
4529566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(ls->viewer, "  Function value: %g,", (double)f));
4539566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(ls->viewer, "  Step length: %g\n", (double)step));
4542a0dac07SAlp Dener     if (ls->ops->monitor && its > 0) {
4559566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIISetTab(ls->viewer, ((PetscObject)ls)->tablevel + 3));
456dbbe0bcdSBarry Smith       PetscUseTypeMethod(ls, monitor);
4572a0dac07SAlp Dener     }
4589566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIISetTab(ls->viewer, tabs));
4592a0dac07SAlp Dener   }
4602a0dac07SAlp Dener   PetscFunctionReturn(0);
4612a0dac07SAlp Dener }
4622a0dac07SAlp Dener 
4630c52818fSSatish Balay /*@
4640c52818fSSatish Balay   TaoLineSearchSetFromOptions - Sets various TaoLineSearch parameters from user
4650c52818fSSatish Balay   options.
4660c52818fSSatish Balay 
4670c52818fSSatish Balay   Collective on TaoLineSearch
4680c52818fSSatish Balay 
46901d2d390SJose E. Roman   Input Parameter:
4700c52818fSSatish Balay . ls - the TaoLineSearch context
4710c52818fSSatish Balay 
4720c52818fSSatish Balay   Options Database Keys:
4730c52818fSSatish Balay + -tao_ls_type <type> - The algorithm that TAO uses (more-thuente, gpcg, unit)
4740c52818fSSatish Balay . -tao_ls_ftol <tol> - tolerance for sufficient decrease
4750c52818fSSatish Balay . -tao_ls_gtol <tol> - tolerance for curvature condition
4760c52818fSSatish Balay . -tao_ls_rtol <tol> - relative tolerance for acceptable step
477a39c8e28SStefano Zampini . -tao_ls_stepinit <step> - initial steplength allowed
4780c52818fSSatish Balay . -tao_ls_stepmin <step> - minimum steplength allowed
4790c52818fSSatish Balay . -tao_ls_stepmax <step> - maximum steplength allowed
4800c52818fSSatish Balay . -tao_ls_max_funcs <n> - maximum number of function evaluations allowed
4810c52818fSSatish Balay - -tao_ls_view - display line-search results to standard output
4820c52818fSSatish Balay 
4830c52818fSSatish Balay   Level: beginner
4840c52818fSSatish Balay @*/
4859371c9d4SSatish Balay PetscErrorCode TaoLineSearchSetFromOptions(TaoLineSearch ls) {
4868caf6e8cSBarry Smith   const char *default_type = TAOLINESEARCHMT;
4872a0dac07SAlp Dener   char        type[256], monfilename[PETSC_MAX_PATH_LEN];
4882a0dac07SAlp Dener   PetscViewer monviewer;
4890c52818fSSatish Balay   PetscBool   flg;
490f06e3bfaSBarry Smith 
4910c52818fSSatish Balay   PetscFunctionBegin;
4920c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
493d0609cedSBarry Smith   PetscObjectOptionsBegin((PetscObject)ls);
4949371c9d4SSatish Balay   if (((PetscObject)ls)->type_name) { default_type = ((PetscObject)ls)->type_name; }
4950c52818fSSatish Balay   /* Check for type from options */
4969566063dSJacob Faibussowitsch   PetscCall(PetscOptionsFList("-tao_ls_type", "Tao Line Search type", "TaoLineSearchSetType", TaoLineSearchList, default_type, type, 256, &flg));
4970c52818fSSatish Balay   if (flg) {
4989566063dSJacob Faibussowitsch     PetscCall(TaoLineSearchSetType(ls, type));
4990c52818fSSatish Balay   } else if (!((PetscObject)ls)->type_name) {
5009566063dSJacob Faibussowitsch     PetscCall(TaoLineSearchSetType(ls, default_type));
5010c52818fSSatish Balay   }
5020c52818fSSatish Balay 
5039566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-tao_ls_max_funcs", "max function evals in line search", "", ls->max_funcs, &ls->max_funcs, NULL));
5049566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-tao_ls_ftol", "tol for sufficient decrease", "", ls->ftol, &ls->ftol, NULL));
5059566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-tao_ls_gtol", "tol for curvature condition", "", ls->gtol, &ls->gtol, NULL));
5069566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-tao_ls_rtol", "relative tol for acceptable step", "", ls->rtol, &ls->rtol, NULL));
5079566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-tao_ls_stepmin", "lower bound for step", "", ls->stepmin, &ls->stepmin, NULL));
5089566063dSJacob Faibussowitsch   PetscCall(PetscOptionsReal("-tao_ls_stepmax", "upper bound for step", "", ls->stepmax, &ls->stepmax, NULL));
509a39c8e28SStefano Zampini   PetscCall(PetscOptionsReal("-tao_ls_stepinit", "initial step", "", ls->initstep, &ls->initstep, NULL));
5109566063dSJacob Faibussowitsch   PetscCall(PetscOptionsString("-tao_ls_monitor", "enable the basic monitor", "TaoLineSearchSetMonitor", "stdout", monfilename, sizeof(monfilename), &flg));
5112a0dac07SAlp Dener   if (flg) {
5129566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIOpen(PetscObjectComm((PetscObject)ls), monfilename, &monviewer));
5132a0dac07SAlp Dener     ls->viewer     = monviewer;
5142a0dac07SAlp Dener     ls->usemonitor = PETSC_TRUE;
5152a0dac07SAlp Dener   }
516dbbe0bcdSBarry Smith   PetscTryTypeMethod(ls, setfromoptions, PetscOptionsObject);
517d0609cedSBarry Smith   PetscOptionsEnd();
5180c52818fSSatish Balay   PetscFunctionReturn(0);
5190c52818fSSatish Balay }
5200c52818fSSatish Balay 
5210c52818fSSatish Balay /*@C
5220c52818fSSatish Balay   TaoLineSearchGetType - Gets the current line search algorithm
5230c52818fSSatish Balay 
5240c52818fSSatish Balay   Not Collective
5250c52818fSSatish Balay 
5260c52818fSSatish Balay   Input Parameter:
5270c52818fSSatish Balay . ls - the TaoLineSearch context
5280c52818fSSatish Balay 
529fd292e60Sprj-   Output Parameter:
5300c52818fSSatish Balay . type - the line search algorithm in effect
5310c52818fSSatish Balay 
5320c52818fSSatish Balay   Level: developer
5330c52818fSSatish Balay 
5340c52818fSSatish Balay @*/
5359371c9d4SSatish Balay PetscErrorCode TaoLineSearchGetType(TaoLineSearch ls, TaoLineSearchType *type) {
5360c52818fSSatish Balay   PetscFunctionBegin;
5370c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
5380c52818fSSatish Balay   PetscValidPointer(type, 2);
5390c52818fSSatish Balay   *type = ((PetscObject)ls)->type_name;
5400c52818fSSatish Balay   PetscFunctionReturn(0);
5410c52818fSSatish Balay }
5420c52818fSSatish Balay 
5430c52818fSSatish Balay /*@
5440c52818fSSatish Balay   TaoLineSearchGetNumberFunctionEvaluations - Gets the number of function and gradient evaluation
5450c52818fSSatish Balay   routines used by the line search in last application (not cumulative).
5460c52818fSSatish Balay 
5470c52818fSSatish Balay   Not Collective
5480c52818fSSatish Balay 
5490c52818fSSatish Balay   Input Parameter:
5500c52818fSSatish Balay . ls - the TaoLineSearch context
5510c52818fSSatish Balay 
5520c52818fSSatish Balay   Output Parameters:
5530c52818fSSatish Balay + nfeval   - number of function evaluations
5540c52818fSSatish Balay . ngeval   - number of gradient evaluations
5550c52818fSSatish Balay - nfgeval  - number of function/gradient evaluations
5560c52818fSSatish Balay 
5570c52818fSSatish Balay   Level: intermediate
5580c52818fSSatish Balay 
5590c52818fSSatish Balay   Note:
560441846f8SBarry Smith   If the line search is using the Tao objective and gradient
561441846f8SBarry Smith   routines directly (see TaoLineSearchUseTaoRoutines()), then TAO
5620c52818fSSatish Balay   is already counting the number of evaluations.
5630c52818fSSatish Balay 
5640c52818fSSatish Balay @*/
5659371c9d4SSatish Balay PetscErrorCode TaoLineSearchGetNumberFunctionEvaluations(TaoLineSearch ls, PetscInt *nfeval, PetscInt *ngeval, PetscInt *nfgeval) {
5660c52818fSSatish Balay   PetscFunctionBegin;
5670c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
5680c52818fSSatish Balay   *nfeval  = ls->nfeval;
5690c52818fSSatish Balay   *ngeval  = ls->ngeval;
5700c52818fSSatish Balay   *nfgeval = ls->nfgeval;
5710c52818fSSatish Balay   PetscFunctionReturn(0);
5720c52818fSSatish Balay }
5730c52818fSSatish Balay 
5740c52818fSSatish Balay /*@
575441846f8SBarry Smith   TaoLineSearchIsUsingTaoRoutines - Checks whether the line search is using
576441846f8SBarry Smith   Tao evaluation routines.
5770c52818fSSatish Balay 
5780c52818fSSatish Balay   Not Collective
5790c52818fSSatish Balay 
5800c52818fSSatish Balay   Input Parameter:
5810c52818fSSatish Balay . ls - the TaoLineSearch context
5820c52818fSSatish Balay 
5830c52818fSSatish Balay   Output Parameter:
584441846f8SBarry Smith . flg - PETSC_TRUE if the line search is using Tao evaluation routines,
5850c52818fSSatish Balay         otherwise PETSC_FALSE
5860c52818fSSatish Balay 
5870c52818fSSatish Balay   Level: developer
5880c52818fSSatish Balay @*/
5899371c9d4SSatish Balay PetscErrorCode TaoLineSearchIsUsingTaoRoutines(TaoLineSearch ls, PetscBool *flg) {
5900c52818fSSatish Balay   PetscFunctionBegin;
5910c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
592f06e3bfaSBarry Smith   *flg = ls->usetaoroutines;
5930c52818fSSatish Balay   PetscFunctionReturn(0);
5940c52818fSSatish Balay }
5950c52818fSSatish Balay 
5960c52818fSSatish Balay /*@C
5970c52818fSSatish Balay   TaoLineSearchSetObjectiveRoutine - Sets the function evaluation routine for the line search
5980c52818fSSatish Balay 
5990c52818fSSatish Balay   Logically Collective on TaoLineSearch
6000c52818fSSatish Balay 
601d8d19677SJose E. Roman   Input Parameters:
6020c52818fSSatish Balay + ls - the TaoLineSearch context
6030c52818fSSatish Balay . func - the objective function evaluation routine
6040c52818fSSatish Balay - ctx - the (optional) user-defined context for private data
6050c52818fSSatish Balay 
6060c52818fSSatish Balay   Calling sequence of func:
6070c52818fSSatish Balay $      func (TaoLinesearch ls, Vec x, PetscReal *f, void *ctx);
6080c52818fSSatish Balay 
6090c52818fSSatish Balay + x - input vector
6100c52818fSSatish Balay . f - function value
6110c52818fSSatish Balay - ctx (optional) user-defined context
6120c52818fSSatish Balay 
6130c52818fSSatish Balay   Level: beginner
6140c52818fSSatish Balay 
6150c52818fSSatish Balay   Note:
6160c52818fSSatish Balay   Use this routine only if you want the line search objective
617441846f8SBarry Smith   evaluation routine to be different from the Tao's objective
6180c52818fSSatish Balay   evaluation routine. If you use this routine you must also set
6190c52818fSSatish Balay   the line search gradient and/or function/gradient routine.
6200c52818fSSatish Balay 
6210c52818fSSatish Balay   Note:
6220c52818fSSatish Balay   Some algorithms (lcl, gpcg) set their own objective routine for the
6230c52818fSSatish Balay   line search, application programmers should be wary of overriding the
6240c52818fSSatish Balay   default objective routine.
6250c52818fSSatish Balay 
626db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchSetGradientRoutine()`, `TaoLineSearchSetObjectiveAndGradientRoutine()`, `TaoLineSearchUseTaoRoutines()`
6270c52818fSSatish Balay @*/
6289371c9d4SSatish Balay PetscErrorCode TaoLineSearchSetObjectiveRoutine(TaoLineSearch ls, PetscErrorCode (*func)(TaoLineSearch ls, Vec x, PetscReal *, void *), void *ctx) {
6290c52818fSSatish Balay   PetscFunctionBegin;
6300c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
6310c52818fSSatish Balay 
6320c52818fSSatish Balay   ls->ops->computeobjective = func;
6330c52818fSSatish Balay   if (ctx) ls->userctx_func = ctx;
6340c52818fSSatish Balay   ls->usetaoroutines = PETSC_FALSE;
6350c52818fSSatish Balay   PetscFunctionReturn(0);
6360c52818fSSatish Balay }
6370c52818fSSatish Balay 
6380c52818fSSatish Balay /*@C
6390c52818fSSatish Balay   TaoLineSearchSetGradientRoutine - Sets the gradient evaluation routine for the line search
6400c52818fSSatish Balay 
6410c52818fSSatish Balay   Logically Collective on TaoLineSearch
6420c52818fSSatish Balay 
643d8d19677SJose E. Roman   Input Parameters:
6440c52818fSSatish Balay + ls - the TaoLineSearch context
6450c52818fSSatish Balay . func - the gradient evaluation routine
6460c52818fSSatish Balay - ctx - the (optional) user-defined context for private data
6470c52818fSSatish Balay 
6480c52818fSSatish Balay   Calling sequence of func:
6490c52818fSSatish Balay $      func (TaoLinesearch ls, Vec x, Vec g, void *ctx);
6500c52818fSSatish Balay 
6510c52818fSSatish Balay + x - input vector
6520c52818fSSatish Balay . g - gradient vector
6530c52818fSSatish Balay - ctx (optional) user-defined context
6540c52818fSSatish Balay 
6550c52818fSSatish Balay   Level: beginner
6560c52818fSSatish Balay 
6570c52818fSSatish Balay   Note:
6580c52818fSSatish Balay   Use this routine only if you want the line search gradient
659441846f8SBarry Smith   evaluation routine to be different from the Tao's gradient
6600c52818fSSatish Balay   evaluation routine. If you use this routine you must also set
6610c52818fSSatish Balay   the line search function and/or function/gradient routine.
6620c52818fSSatish Balay 
6630c52818fSSatish Balay   Note:
6640c52818fSSatish Balay   Some algorithms (lcl, gpcg) set their own gradient routine for the
6650c52818fSSatish Balay   line search, application programmers should be wary of overriding the
6660c52818fSSatish Balay   default gradient routine.
6670c52818fSSatish Balay 
668db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchSetObjectiveRoutine()`, `TaoLineSearchSetObjectiveAndGradientRoutine()`, `TaoLineSearchUseTaoRoutines()`
6690c52818fSSatish Balay @*/
6709371c9d4SSatish Balay PetscErrorCode TaoLineSearchSetGradientRoutine(TaoLineSearch ls, PetscErrorCode (*func)(TaoLineSearch ls, Vec x, Vec g, void *), void *ctx) {
6710c52818fSSatish Balay   PetscFunctionBegin;
6720c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
6730c52818fSSatish Balay   ls->ops->computegradient = func;
6740c52818fSSatish Balay   if (ctx) ls->userctx_grad = ctx;
6750c52818fSSatish Balay   ls->usetaoroutines = PETSC_FALSE;
6760c52818fSSatish Balay   PetscFunctionReturn(0);
6770c52818fSSatish Balay }
6780c52818fSSatish Balay 
6790c52818fSSatish Balay /*@C
6800c52818fSSatish Balay   TaoLineSearchSetObjectiveAndGradientRoutine - Sets the objective/gradient evaluation routine for the line search
6810c52818fSSatish Balay 
6820c52818fSSatish Balay   Logically Collective on TaoLineSearch
6830c52818fSSatish Balay 
684d8d19677SJose E. Roman   Input Parameters:
6850c52818fSSatish Balay + ls - the TaoLineSearch context
6860c52818fSSatish Balay . func - the objective and gradient evaluation routine
6870c52818fSSatish Balay - ctx - the (optional) user-defined context for private data
6880c52818fSSatish Balay 
6890c52818fSSatish Balay   Calling sequence of func:
6900c52818fSSatish Balay $      func (TaoLinesearch ls, Vec x, PetscReal *f, Vec g, void *ctx);
6910c52818fSSatish Balay 
6920c52818fSSatish Balay + x - input vector
6930c52818fSSatish Balay . f - function value
6940c52818fSSatish Balay . g - gradient vector
6950c52818fSSatish Balay - ctx (optional) user-defined context
6960c52818fSSatish Balay 
6970c52818fSSatish Balay   Level: beginner
6980c52818fSSatish Balay 
6990c52818fSSatish Balay   Note:
7000c52818fSSatish Balay   Use this routine only if you want the line search objective and gradient
701441846f8SBarry Smith   evaluation routines to be different from the Tao's objective
7020c52818fSSatish Balay   and gradient evaluation routines.
7030c52818fSSatish Balay 
7040c52818fSSatish Balay   Note:
7050c52818fSSatish Balay   Some algorithms (lcl, gpcg) set their own objective routine for the
7060c52818fSSatish Balay   line search, application programmers should be wary of overriding the
7070c52818fSSatish Balay   default objective routine.
7080c52818fSSatish Balay 
709db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchSetObjectiveRoutine()`, `TaoLineSearchSetGradientRoutine()`, `TaoLineSearchUseTaoRoutines()`
7100c52818fSSatish Balay @*/
7119371c9d4SSatish Balay PetscErrorCode TaoLineSearchSetObjectiveAndGradientRoutine(TaoLineSearch ls, PetscErrorCode (*func)(TaoLineSearch ls, Vec x, PetscReal *, Vec g, void *), void *ctx) {
7120c52818fSSatish Balay   PetscFunctionBegin;
7130c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
7140c52818fSSatish Balay   ls->ops->computeobjectiveandgradient = func;
7150c52818fSSatish Balay   if (ctx) ls->userctx_funcgrad = ctx;
7160c52818fSSatish Balay   ls->usetaoroutines = PETSC_FALSE;
7170c52818fSSatish Balay   PetscFunctionReturn(0);
7180c52818fSSatish Balay }
7190c52818fSSatish Balay 
7200c52818fSSatish Balay /*@C
7210c52818fSSatish Balay   TaoLineSearchSetObjectiveAndGTSRoutine - Sets the objective and
7220c52818fSSatish Balay   (gradient'*stepdirection) evaluation routine for the line search.
7230c52818fSSatish Balay   Sometimes it is more efficient to compute the inner product of the gradient
7240c52818fSSatish Balay   and the step direction than it is to compute the gradient, and this is all
7250c52818fSSatish Balay   the line search typically needs of the gradient.
7260c52818fSSatish Balay 
7270c52818fSSatish Balay   Logically Collective on TaoLineSearch
7280c52818fSSatish Balay 
729d8d19677SJose E. Roman   Input Parameters:
7300c52818fSSatish Balay + ls - the TaoLineSearch context
7310c52818fSSatish Balay . func - the objective and gradient evaluation routine
7320c52818fSSatish Balay - ctx - the (optional) user-defined context for private data
7330c52818fSSatish Balay 
7340c52818fSSatish Balay   Calling sequence of func:
7350c52818fSSatish Balay $      func (TaoLinesearch ls, Vec x, PetscReal *f, PetscReal *gts, void *ctx);
7360c52818fSSatish Balay 
7370c52818fSSatish Balay + x - input vector
7380c52818fSSatish Balay . s - step direction
7390c52818fSSatish Balay . f - function value
7400c52818fSSatish Balay . gts - inner product of gradient and step direction vectors
7410c52818fSSatish Balay - ctx (optional) user-defined context
7420c52818fSSatish Balay 
7430c52818fSSatish Balay   Note: The gradient will still need to be computed at the end of the line
7440c52818fSSatish Balay   search, so you will still need to set a line search gradient evaluation
7450c52818fSSatish Balay   routine
7460c52818fSSatish Balay 
7470c52818fSSatish Balay   Note: Bounded line searches (those used in bounded optimization algorithms)
7480c52818fSSatish Balay   don't use g's directly, but rather (g'x - g'x0)/steplength.  You can get the
7490c52818fSSatish Balay   x0 and steplength with TaoLineSearchGetStartingVector() and TaoLineSearchGetStepLength()
7500c52818fSSatish Balay 
7510c52818fSSatish Balay   Level: advanced
7520c52818fSSatish Balay 
7530c52818fSSatish Balay   Note:
7540c52818fSSatish Balay   Some algorithms (lcl, gpcg) set their own objective routine for the
7550c52818fSSatish Balay   line search, application programmers should be wary of overriding the
7560c52818fSSatish Balay   default objective routine.
7570c52818fSSatish Balay 
758db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`, `TaoLineSearchSetObjective()`, `TaoLineSearchSetGradient()`, `TaoLineSearchUseTaoRoutines()`
7590c52818fSSatish Balay @*/
7609371c9d4SSatish Balay PetscErrorCode TaoLineSearchSetObjectiveAndGTSRoutine(TaoLineSearch ls, PetscErrorCode (*func)(TaoLineSearch ls, Vec x, Vec s, PetscReal *, PetscReal *, void *), void *ctx) {
7610c52818fSSatish Balay   PetscFunctionBegin;
7620c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
7630c52818fSSatish Balay   ls->ops->computeobjectiveandgts = func;
7640c52818fSSatish Balay   if (ctx) ls->userctx_funcgts = ctx;
7650c52818fSSatish Balay   ls->usegts         = PETSC_TRUE;
7660c52818fSSatish Balay   ls->usetaoroutines = PETSC_FALSE;
7670c52818fSSatish Balay   PetscFunctionReturn(0);
7680c52818fSSatish Balay }
7690c52818fSSatish Balay 
7700c52818fSSatish Balay /*@C
771441846f8SBarry Smith   TaoLineSearchUseTaoRoutines - Informs the TaoLineSearch to use the
772441846f8SBarry Smith   objective and gradient evaluation routines from the given Tao object.
7730c52818fSSatish Balay 
7740c52818fSSatish Balay   Logically Collective on TaoLineSearch
7750c52818fSSatish Balay 
776d8d19677SJose E. Roman   Input Parameters:
7770c52818fSSatish Balay + ls - the TaoLineSearch context
778441846f8SBarry Smith - ts - the Tao context with defined objective/gradient evaluation routines
7790c52818fSSatish Balay 
7800c52818fSSatish Balay   Level: developer
7810c52818fSSatish Balay 
782db781477SPatrick Sanan .seealso: `TaoLineSearchCreate()`
7830c52818fSSatish Balay @*/
7849371c9d4SSatish Balay PetscErrorCode TaoLineSearchUseTaoRoutines(TaoLineSearch ls, Tao ts) {
7850c52818fSSatish Balay   PetscFunctionBegin;
7860c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
787064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(ts, TAO_CLASSID, 2);
788441846f8SBarry Smith   ls->tao            = ts;
7890c52818fSSatish Balay   ls->usetaoroutines = PETSC_TRUE;
7900c52818fSSatish Balay   PetscFunctionReturn(0);
7910c52818fSSatish Balay }
7920c52818fSSatish Balay 
7930c52818fSSatish Balay /*@
7940c52818fSSatish Balay   TaoLineSearchComputeObjective - Computes the objective function value at a given point
7950c52818fSSatish Balay 
7960c52818fSSatish Balay   Collective on TaoLineSearch
7970c52818fSSatish Balay 
7980c52818fSSatish Balay   Input Parameters:
7990c52818fSSatish Balay + ls - the TaoLineSearch context
8000c52818fSSatish Balay - x - input vector
8010c52818fSSatish Balay 
8020c52818fSSatish Balay   Output Parameter:
8030c52818fSSatish Balay . f - Objective value at X
8040c52818fSSatish Balay 
80595452b02SPatrick Sanan   Notes:
80695452b02SPatrick Sanan     TaoLineSearchComputeObjective() is typically used within line searches
8070c52818fSSatish Balay   so most users would not generally call this routine themselves.
8080c52818fSSatish Balay 
8090c52818fSSatish Balay   Level: developer
8100c52818fSSatish Balay 
811db781477SPatrick Sanan .seealso: `TaoLineSearchComputeGradient()`, `TaoLineSearchComputeObjectiveAndGradient()`, `TaoLineSearchSetObjectiveRoutine()`
8120c52818fSSatish Balay @*/
8139371c9d4SSatish Balay PetscErrorCode TaoLineSearchComputeObjective(TaoLineSearch ls, Vec x, PetscReal *f) {
8140c52818fSSatish Balay   Vec       gdummy;
8150c52818fSSatish Balay   PetscReal gts;
816f06e3bfaSBarry Smith 
8170c52818fSSatish Balay   PetscFunctionBegin;
8180c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
8190c52818fSSatish Balay   PetscValidHeaderSpecific(x, VEC_CLASSID, 2);
820dadcf809SJacob Faibussowitsch   PetscValidRealPointer(f, 3);
8210c52818fSSatish Balay   PetscCheckSameComm(ls, 1, x, 2);
8220c52818fSSatish Balay   if (ls->usetaoroutines) {
8239566063dSJacob Faibussowitsch     PetscCall(TaoComputeObjective(ls->tao, x, f));
8240c52818fSSatish Balay   } else {
8253c859ba3SBarry 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");
8269566063dSJacob Faibussowitsch     PetscCall(PetscLogEventBegin(TAOLINESEARCH_Eval, ls, 0, 0, 0));
827792fecdfSBarry Smith     if (ls->ops->computeobjective) PetscCallBack("TaoLineSearch callback objective", (*ls->ops->computeobjective)(ls, x, f, ls->userctx_func));
828ef1023bdSBarry Smith     else if (ls->ops->computeobjectiveandgradient) {
8299566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(x, &gdummy));
830792fecdfSBarry Smith       PetscCallBack("TaoLineSearch callback objective", (*ls->ops->computeobjectiveandgradient)(ls, x, f, gdummy, ls->userctx_funcgrad));
8319566063dSJacob Faibussowitsch       PetscCall(VecDestroy(&gdummy));
832792fecdfSBarry Smith     } else PetscCallBack("TaoLineSearch callback objective", (*ls->ops->computeobjectiveandgts)(ls, x, ls->stepdirection, f, &gts, ls->userctx_funcgts));
8339566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TAOLINESEARCH_Eval, ls, 0, 0, 0));
8340c52818fSSatish Balay   }
8350c52818fSSatish Balay   ls->nfeval++;
8360c52818fSSatish Balay   PetscFunctionReturn(0);
8370c52818fSSatish Balay }
8380c52818fSSatish Balay 
8390c52818fSSatish Balay /*@
8400c52818fSSatish Balay   TaoLineSearchComputeObjectiveAndGradient - Computes the objective function value at a given point
8410c52818fSSatish Balay 
842441846f8SBarry Smith   Collective on Tao
8430c52818fSSatish Balay 
8440c52818fSSatish Balay   Input Parameters:
8450c52818fSSatish Balay + ls - the TaoLineSearch context
8460c52818fSSatish Balay - x - input vector
8470c52818fSSatish Balay 
848d8d19677SJose E. Roman   Output Parameters:
8490c52818fSSatish Balay + f - Objective value at X
8500c52818fSSatish Balay - g - Gradient vector at X
8510c52818fSSatish Balay 
85295452b02SPatrick Sanan   Notes:
85395452b02SPatrick Sanan     TaoLineSearchComputeObjectiveAndGradient() is typically used within line searches
8540c52818fSSatish Balay   so most users would not generally call this routine themselves.
8550c52818fSSatish Balay 
8560c52818fSSatish Balay   Level: developer
8570c52818fSSatish Balay 
858db781477SPatrick Sanan .seealso: `TaoLineSearchComputeGradient()`, `TaoLineSearchComputeObjectiveAndGradient()`, `TaoLineSearchSetObjectiveRoutine()`
8590c52818fSSatish Balay @*/
8609371c9d4SSatish Balay PetscErrorCode TaoLineSearchComputeObjectiveAndGradient(TaoLineSearch ls, Vec x, PetscReal *f, Vec g) {
8610c52818fSSatish Balay   PetscFunctionBegin;
8620c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
8630c52818fSSatish Balay   PetscValidHeaderSpecific(x, VEC_CLASSID, 2);
864dadcf809SJacob Faibussowitsch   PetscValidRealPointer(f, 3);
8650c52818fSSatish Balay   PetscValidHeaderSpecific(g, VEC_CLASSID, 4);
8660c52818fSSatish Balay   PetscCheckSameComm(ls, 1, x, 2);
8670c52818fSSatish Balay   PetscCheckSameComm(ls, 1, g, 4);
8680c52818fSSatish Balay   if (ls->usetaoroutines) {
8699566063dSJacob Faibussowitsch     PetscCall(TaoComputeObjectiveAndGradient(ls->tao, x, f, g));
8700c52818fSSatish Balay   } else {
8719566063dSJacob Faibussowitsch     PetscCall(PetscLogEventBegin(TAOLINESEARCH_Eval, ls, 0, 0, 0));
872792fecdfSBarry Smith     if (ls->ops->computeobjectiveandgradient) PetscCallBack("TaoLineSearch callback objective/gradient", (*ls->ops->computeobjectiveandgradient)(ls, x, f, g, ls->userctx_funcgrad));
873ef1023bdSBarry Smith     else {
874792fecdfSBarry Smith       PetscCallBack("TaoLineSearch callback objective", (*ls->ops->computeobjective)(ls, x, f, ls->userctx_func));
875792fecdfSBarry Smith       PetscCallBack("TaoLineSearch callback gradient", (*ls->ops->computegradient)(ls, x, g, ls->userctx_grad));
876362febeeSStefano Zampini     }
8779566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TAOLINESEARCH_Eval, ls, 0, 0, 0));
8789566063dSJacob Faibussowitsch     PetscCall(PetscInfo(ls, "TaoLineSearch Function evaluation: %14.12e\n", (double)(*f)));
879f06e3bfaSBarry Smith   }
880fbe0838dSJason Sarich   ls->nfgeval++;
8810c52818fSSatish Balay   PetscFunctionReturn(0);
8820c52818fSSatish Balay }
8830c52818fSSatish Balay 
8840c52818fSSatish Balay /*@
8850c52818fSSatish Balay   TaoLineSearchComputeGradient - Computes the gradient of the objective function
8860c52818fSSatish Balay 
8870c52818fSSatish Balay   Collective on TaoLineSearch
8880c52818fSSatish Balay 
8890c52818fSSatish Balay   Input Parameters:
8900c52818fSSatish Balay + ls - the TaoLineSearch context
8910c52818fSSatish Balay - x - input vector
8920c52818fSSatish Balay 
8930c52818fSSatish Balay   Output Parameter:
8940c52818fSSatish Balay . g - gradient vector
8950c52818fSSatish Balay 
89695452b02SPatrick Sanan   Notes:
89795452b02SPatrick Sanan     TaoComputeGradient() is typically used within line searches
8980c52818fSSatish Balay   so most users would not generally call this routine themselves.
8990c52818fSSatish Balay 
9000c52818fSSatish Balay   Level: developer
9010c52818fSSatish Balay 
902db781477SPatrick Sanan .seealso: `TaoLineSearchComputeObjective()`, `TaoLineSearchComputeObjectiveAndGradient()`, `TaoLineSearchSetGradient()`
9030c52818fSSatish Balay @*/
9049371c9d4SSatish Balay PetscErrorCode TaoLineSearchComputeGradient(TaoLineSearch ls, Vec x, Vec g) {
9050c52818fSSatish Balay   PetscReal fdummy;
906f06e3bfaSBarry Smith 
9070c52818fSSatish Balay   PetscFunctionBegin;
9080c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
9090c52818fSSatish Balay   PetscValidHeaderSpecific(x, VEC_CLASSID, 2);
9100c52818fSSatish Balay   PetscValidHeaderSpecific(g, VEC_CLASSID, 3);
9110c52818fSSatish Balay   PetscCheckSameComm(ls, 1, x, 2);
9120c52818fSSatish Balay   PetscCheckSameComm(ls, 1, g, 3);
9130c52818fSSatish Balay   if (ls->usetaoroutines) {
9149566063dSJacob Faibussowitsch     PetscCall(TaoComputeGradient(ls->tao, x, g));
9150c52818fSSatish Balay   } else {
9169566063dSJacob Faibussowitsch     PetscCall(PetscLogEventBegin(TAOLINESEARCH_Eval, ls, 0, 0, 0));
917792fecdfSBarry Smith     if (ls->ops->computegradient) PetscCallBack("TaoLineSearch callback gradient", (*ls->ops->computegradient)(ls, x, g, ls->userctx_grad));
918*48a46eb9SPierre Jolivet     else PetscCallBack("TaoLineSearch callback gradient", (*ls->ops->computeobjectiveandgradient)(ls, x, &fdummy, g, ls->userctx_funcgrad));
9199566063dSJacob Faibussowitsch     PetscCall(PetscLogEventEnd(TAOLINESEARCH_Eval, ls, 0, 0, 0));
9200c52818fSSatish Balay   }
9210c52818fSSatish Balay   ls->ngeval++;
9220c52818fSSatish Balay   PetscFunctionReturn(0);
9230c52818fSSatish Balay }
9240c52818fSSatish Balay 
9250c52818fSSatish Balay /*@
9260c52818fSSatish Balay   TaoLineSearchComputeObjectiveAndGTS - Computes the objective function value and inner product of gradient and step direction at a given point
9270c52818fSSatish Balay 
928441846f8SBarry Smith   Collective on Tao
9290c52818fSSatish Balay 
9300c52818fSSatish Balay   Input Parameters:
9310c52818fSSatish Balay + ls - the TaoLineSearch context
9320c52818fSSatish Balay - x - input vector
9330c52818fSSatish Balay 
934d8d19677SJose E. Roman   Output Parameters:
9350c52818fSSatish Balay + f - Objective value at X
9360c52818fSSatish Balay - gts - inner product of gradient and step direction at X
9370c52818fSSatish Balay 
93895452b02SPatrick Sanan   Notes:
93995452b02SPatrick Sanan     TaoLineSearchComputeObjectiveAndGTS() is typically used within line searches
9400c52818fSSatish Balay   so most users would not generally call this routine themselves.
9410c52818fSSatish Balay 
9420c52818fSSatish Balay   Level: developer
9430c52818fSSatish Balay 
944db781477SPatrick Sanan .seealso: `TaoLineSearchComputeGradient()`, `TaoLineSearchComputeObjectiveAndGradient()`, `TaoLineSearchSetObjectiveRoutine()`
9450c52818fSSatish Balay @*/
9469371c9d4SSatish Balay PetscErrorCode TaoLineSearchComputeObjectiveAndGTS(TaoLineSearch ls, Vec x, PetscReal *f, PetscReal *gts) {
9470c52818fSSatish Balay   PetscFunctionBegin;
9480c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
9490c52818fSSatish Balay   PetscValidHeaderSpecific(x, VEC_CLASSID, 2);
950dadcf809SJacob Faibussowitsch   PetscValidRealPointer(f, 3);
951dadcf809SJacob Faibussowitsch   PetscValidRealPointer(gts, 4);
9520c52818fSSatish Balay   PetscCheckSameComm(ls, 1, x, 2);
9539566063dSJacob Faibussowitsch   PetscCall(PetscLogEventBegin(TAOLINESEARCH_Eval, ls, 0, 0, 0));
954792fecdfSBarry Smith   PetscCallBack("TaoLineSearch callback objective/gts", (*ls->ops->computeobjectiveandgts)(ls, x, ls->stepdirection, f, gts, ls->userctx_funcgts));
9559566063dSJacob Faibussowitsch   PetscCall(PetscLogEventEnd(TAOLINESEARCH_Eval, ls, 0, 0, 0));
9569566063dSJacob Faibussowitsch   PetscCall(PetscInfo(ls, "TaoLineSearch Function evaluation: %14.12e\n", (double)(*f)));
9570c52818fSSatish Balay   ls->nfeval++;
9580c52818fSSatish Balay   PetscFunctionReturn(0);
9590c52818fSSatish Balay }
9600c52818fSSatish Balay 
9610c52818fSSatish Balay /*@
9620c52818fSSatish Balay   TaoLineSearchGetSolution - Returns the solution to the line search
9630c52818fSSatish Balay 
9640c52818fSSatish Balay   Collective on TaoLineSearch
9650c52818fSSatish Balay 
9660c52818fSSatish Balay   Input Parameter:
9670c52818fSSatish Balay . ls - the TaoLineSearch context
9680c52818fSSatish Balay 
969d8d19677SJose E. Roman   Output Parameters:
9700c52818fSSatish Balay + x - the new solution
9710c52818fSSatish Balay . f - the objective function value at x
9720c52818fSSatish Balay . g - the gradient at x
9730c52818fSSatish Balay . steplength - the multiple of the step direction taken by the line search
9740c52818fSSatish Balay - reason - the reason why the line search terminated
9750c52818fSSatish Balay 
9760c52818fSSatish Balay   reason will be set to one of:
9770c52818fSSatish Balay 
9780c52818fSSatish Balay + TAOLINESEARCH_FAILED_INFORNAN - function evaluation gives Inf or Nan value
9790c52818fSSatish Balay . TAOLINESEARCH_FAILED_BADPARAMETER - negative value set as parameter
9800c52818fSSatish Balay . TAOLINESEARCH_FAILED_ASCENT - initial line search step * g is not descent direction
9810c52818fSSatish Balay . TAOLINESEARCH_HALTED_MAXFCN - maximum number of function evaluation reached
9820c52818fSSatish Balay . TAOLINESEARCH_HALTED_UPPERBOUND - step is at upper bound
9830c52818fSSatish Balay . TAOLINESEARCH_HALTED_LOWERBOUND - step is at lower bound
9840c52818fSSatish Balay . TAOLINESEARCH_HALTED_RTOL - range of uncertainty is smaller than given tolerance
9850c52818fSSatish Balay 
9860c52818fSSatish Balay . TAOLINESEARCH_HALTED_USER - user can set this reason to stop line search
9870c52818fSSatish Balay . TAOLINESEARCH_HALTED_OTHER - any other reason
9880c52818fSSatish Balay 
989a2b725a8SWilliam Gropp - TAOLINESEARCH_SUCCESS - successful line search
9900c52818fSSatish Balay 
9910c52818fSSatish Balay   Level: developer
9920c52818fSSatish Balay 
9930c52818fSSatish Balay @*/
9949371c9d4SSatish Balay PetscErrorCode TaoLineSearchGetSolution(TaoLineSearch ls, Vec x, PetscReal *f, Vec g, PetscReal *steplength, TaoLineSearchConvergedReason *reason) {
9950c52818fSSatish Balay   PetscFunctionBegin;
9960c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
9970c52818fSSatish Balay   PetscValidHeaderSpecific(x, VEC_CLASSID, 2);
998dadcf809SJacob Faibussowitsch   PetscValidRealPointer(f, 3);
9990c52818fSSatish Balay   PetscValidHeaderSpecific(g, VEC_CLASSID, 4);
10000c52818fSSatish Balay   PetscValidIntPointer(reason, 6);
10011baa6e33SBarry Smith   if (ls->new_x) PetscCall(VecCopy(ls->new_x, x));
10020c52818fSSatish Balay   *f = ls->new_f;
10031baa6e33SBarry Smith   if (ls->new_g) PetscCall(VecCopy(ls->new_g, g));
100497ab8e72SStefano Zampini   if (steplength) *steplength = ls->step;
10050c52818fSSatish Balay   *reason = ls->reason;
10060c52818fSSatish Balay   PetscFunctionReturn(0);
10070c52818fSSatish Balay }
10080c52818fSSatish Balay 
10090c52818fSSatish Balay /*@
10100c52818fSSatish Balay   TaoLineSearchGetStartingVector - Gets a the initial point of the line
10110c52818fSSatish Balay   search.
10120c52818fSSatish Balay 
10130c52818fSSatish Balay   Not Collective
10140c52818fSSatish Balay 
10150c52818fSSatish Balay   Input Parameter:
10160c52818fSSatish Balay . ls - the TaoLineSearch context
10170c52818fSSatish Balay 
10180c52818fSSatish Balay   Output Parameter:
10190c52818fSSatish Balay . x - The initial point of the line search
10200c52818fSSatish Balay 
10210c52818fSSatish Balay   Level: intermediate
10220c52818fSSatish Balay @*/
10239371c9d4SSatish Balay PetscErrorCode TaoLineSearchGetStartingVector(TaoLineSearch ls, Vec *x) {
10240c52818fSSatish Balay   PetscFunctionBegin;
10250c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
102697ab8e72SStefano Zampini   if (x) *x = ls->start_x;
10270c52818fSSatish Balay   PetscFunctionReturn(0);
10280c52818fSSatish Balay }
10290c52818fSSatish Balay 
10300c52818fSSatish Balay /*@
10310c52818fSSatish Balay   TaoLineSearchGetStepDirection - Gets the step direction of the line
10320c52818fSSatish Balay   search.
10330c52818fSSatish Balay 
10340c52818fSSatish Balay   Not Collective
10350c52818fSSatish Balay 
10360c52818fSSatish Balay   Input Parameter:
10370c52818fSSatish Balay . ls - the TaoLineSearch context
10380c52818fSSatish Balay 
10390c52818fSSatish Balay   Output Parameter:
10400c52818fSSatish Balay . s - the step direction of the line search
10410c52818fSSatish Balay 
10420c52818fSSatish Balay   Level: advanced
10430c52818fSSatish Balay @*/
10449371c9d4SSatish Balay PetscErrorCode TaoLineSearchGetStepDirection(TaoLineSearch ls, Vec *s) {
10450c52818fSSatish Balay   PetscFunctionBegin;
10460c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
104797ab8e72SStefano Zampini   if (s) *s = ls->stepdirection;
10480c52818fSSatish Balay   PetscFunctionReturn(0);
10490c52818fSSatish Balay }
10500c52818fSSatish Balay 
10510c52818fSSatish Balay /*@
10520c52818fSSatish Balay   TaoLineSearchGetFullStepObjective - Returns the objective function value at the full step.  Useful for some minimization algorithms.
10530c52818fSSatish Balay 
10540c52818fSSatish Balay   Not Collective
10550c52818fSSatish Balay 
10560c52818fSSatish Balay   Input Parameter:
10570c52818fSSatish Balay . ls - the TaoLineSearch context
10580c52818fSSatish Balay 
10590c52818fSSatish Balay   Output Parameter:
10600c52818fSSatish Balay . f - the objective value at the full step length
10610c52818fSSatish Balay 
10620c52818fSSatish Balay   Level: developer
10630c52818fSSatish Balay @*/
10640c52818fSSatish Balay 
10659371c9d4SSatish Balay PetscErrorCode TaoLineSearchGetFullStepObjective(TaoLineSearch ls, PetscReal *f_fullstep) {
10660c52818fSSatish Balay   PetscFunctionBegin;
10670c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
10680c52818fSSatish Balay   *f_fullstep = ls->f_fullstep;
10690c52818fSSatish Balay   PetscFunctionReturn(0);
10700c52818fSSatish Balay }
10710c52818fSSatish Balay 
10720c52818fSSatish Balay /*@
10730c52818fSSatish Balay   TaoLineSearchSetVariableBounds - Sets the upper and lower bounds.
10740c52818fSSatish Balay 
1075441846f8SBarry Smith   Logically Collective on Tao
10760c52818fSSatish Balay 
10770c52818fSSatish Balay   Input Parameters:
10780c52818fSSatish Balay + ls - the TaoLineSearch context
10790c52818fSSatish Balay . xl  - vector of lower bounds
10800c52818fSSatish Balay - xu  - vector of upper bounds
10810c52818fSSatish Balay 
10820c52818fSSatish Balay   Note: If the variable bounds are not set with this routine, then
1083e270355aSBarry Smith   PETSC_NINFINITY and PETSC_INFINITY are assumed
10840c52818fSSatish Balay 
10850c52818fSSatish Balay   Level: beginner
10860c52818fSSatish Balay 
1087db781477SPatrick Sanan .seealso: `TaoSetVariableBounds()`, `TaoLineSearchCreate()`
10880c52818fSSatish Balay @*/
10899371c9d4SSatish Balay PetscErrorCode TaoLineSearchSetVariableBounds(TaoLineSearch ls, Vec xl, Vec xu) {
10900c52818fSSatish Balay   PetscFunctionBegin;
10910c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
109276be6f4fSStefano Zampini   if (xl) PetscValidHeaderSpecific(xl, VEC_CLASSID, 2);
109376be6f4fSStefano Zampini   if (xu) PetscValidHeaderSpecific(xu, VEC_CLASSID, 3);
10949566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)xl));
10959566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)xu));
10969566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ls->lower));
10979566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&ls->upper));
10980c52818fSSatish Balay   ls->lower   = xl;
10990c52818fSSatish Balay   ls->upper   = xu;
110076be6f4fSStefano Zampini   ls->bounded = (PetscBool)(xl || xu);
11010c52818fSSatish Balay   PetscFunctionReturn(0);
11020c52818fSSatish Balay }
11030c52818fSSatish Balay 
11040c52818fSSatish Balay /*@
11050c52818fSSatish Balay   TaoLineSearchSetInitialStepLength - Sets the initial step length of a line
11060c52818fSSatish Balay   search.  If this value is not set then 1.0 is assumed.
11070c52818fSSatish Balay 
11080c52818fSSatish Balay   Logically Collective on TaoLineSearch
11090c52818fSSatish Balay 
11100c52818fSSatish Balay   Input Parameters:
11110c52818fSSatish Balay + ls - the TaoLineSearch context
11120c52818fSSatish Balay - s - the initial step size
11130c52818fSSatish Balay 
11140c52818fSSatish Balay   Level: intermediate
11150c52818fSSatish Balay 
1116db781477SPatrick Sanan .seealso: `TaoLineSearchGetStepLength()`, `TaoLineSearchApply()`
11170c52818fSSatish Balay @*/
11189371c9d4SSatish Balay PetscErrorCode TaoLineSearchSetInitialStepLength(TaoLineSearch ls, PetscReal s) {
11190c52818fSSatish Balay   PetscFunctionBegin;
11200c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
1121a39c8e28SStefano Zampini   PetscValidLogicalCollectiveReal(ls, s, 2);
11220c52818fSSatish Balay   ls->initstep = s;
11230c52818fSSatish Balay   PetscFunctionReturn(0);
11240c52818fSSatish Balay }
11250c52818fSSatish Balay 
11260c52818fSSatish Balay /*@
11270c52818fSSatish Balay   TaoLineSearchGetStepLength - Get the current step length
11280c52818fSSatish Balay 
11290c52818fSSatish Balay   Not Collective
11300c52818fSSatish Balay 
11310c52818fSSatish Balay   Input Parameters:
11320c52818fSSatish Balay . ls - the TaoLineSearch context
11330c52818fSSatish Balay 
11347a7aea1fSJed Brown   Output Parameters:
11350c52818fSSatish Balay . s - the current step length
11360c52818fSSatish Balay 
11370c52818fSSatish Balay   Level: beginner
11380c52818fSSatish Balay 
1139db781477SPatrick Sanan .seealso: `TaoLineSearchSetInitialStepLength()`, `TaoLineSearchApply()`
11400c52818fSSatish Balay @*/
11419371c9d4SSatish Balay PetscErrorCode TaoLineSearchGetStepLength(TaoLineSearch ls, PetscReal *s) {
11420c52818fSSatish Balay   PetscFunctionBegin;
11430c52818fSSatish Balay   PetscValidHeaderSpecific(ls, TAOLINESEARCH_CLASSID, 1);
11440c52818fSSatish Balay   *s = ls->step;
11450c52818fSSatish Balay   PetscFunctionReturn(0);
11460c52818fSSatish Balay }
11470c52818fSSatish Balay 
11480ebee16dSLisandro Dalcin /*@C
11490c52818fSSatish Balay    TaoLineSearchRegister - Adds a line-search algorithm to the registry
11500c52818fSSatish Balay 
11510c52818fSSatish Balay    Not collective
11520c52818fSSatish Balay 
11530c52818fSSatish Balay    Input Parameters:
11540c52818fSSatish Balay +  sname - name of a new user-defined solver
11550c52818fSSatish Balay -  func - routine to Create method context
11560c52818fSSatish Balay 
11570c52818fSSatish Balay    Notes:
11580c52818fSSatish Balay    TaoLineSearchRegister() may be called multiple times to add several user-defined solvers.
11590c52818fSSatish Balay 
11600c52818fSSatish Balay    Sample usage:
11610c52818fSSatish Balay .vb
11620c52818fSSatish Balay    TaoLineSearchRegister("my_linesearch",MyLinesearchCreate);
11630c52818fSSatish Balay .ve
11640c52818fSSatish Balay 
11650c52818fSSatish Balay    Then, your solver can be chosen with the procedural interface via
11660c52818fSSatish Balay $     TaoLineSearchSetType(ls,"my_linesearch")
11670c52818fSSatish Balay    or at runtime via the option
11680c52818fSSatish Balay $     -tao_ls_type my_linesearch
11690c52818fSSatish Balay 
11700c52818fSSatish Balay    Level: developer
11710c52818fSSatish Balay 
11720ebee16dSLisandro Dalcin @*/
11739371c9d4SSatish Balay PetscErrorCode TaoLineSearchRegister(const char sname[], PetscErrorCode (*func)(TaoLineSearch)) {
11740c52818fSSatish Balay   PetscFunctionBegin;
11759566063dSJacob Faibussowitsch   PetscCall(TaoLineSearchInitializePackage());
11769566063dSJacob Faibussowitsch   PetscCall(PetscFunctionListAdd(&TaoLineSearchList, sname, (void (*)(void))func));
11770c52818fSSatish Balay   PetscFunctionReturn(0);
11780c52818fSSatish Balay }
11790c52818fSSatish Balay 
11800c52818fSSatish Balay /*@C
11810c52818fSSatish Balay    TaoLineSearchAppendOptionsPrefix - Appends to the prefix used for searching
11820c52818fSSatish Balay    for all TaoLineSearch options in the database.
11830c52818fSSatish Balay 
11840c52818fSSatish Balay    Collective on TaoLineSearch
11850c52818fSSatish Balay 
11860c52818fSSatish Balay    Input Parameters:
11870c52818fSSatish Balay +  ls - the TaoLineSearch solver context
11880c52818fSSatish Balay -  prefix - the prefix string to prepend to all line search requests
11890c52818fSSatish Balay 
11900c52818fSSatish Balay    Notes:
11910c52818fSSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
11920c52818fSSatish Balay    The first character of all runtime options is AUTOMATICALLY the hyphen.
11930c52818fSSatish Balay 
11940c52818fSSatish Balay    Level: advanced
11950c52818fSSatish Balay 
1196db781477SPatrick Sanan .seealso: `TaoLineSearchSetOptionsPrefix()`, `TaoLineSearchGetOptionsPrefix()`
11970c52818fSSatish Balay @*/
11989371c9d4SSatish Balay PetscErrorCode TaoLineSearchAppendOptionsPrefix(TaoLineSearch ls, const char p[]) {
1199f06e3bfaSBarry Smith   return PetscObjectAppendOptionsPrefix((PetscObject)ls, p);
12000c52818fSSatish Balay }
12010c52818fSSatish Balay 
12020c52818fSSatish Balay /*@C
12030c52818fSSatish Balay   TaoLineSearchGetOptionsPrefix - Gets the prefix used for searching for all
12040c52818fSSatish Balay   TaoLineSearch options in the database
12050c52818fSSatish Balay 
12060c52818fSSatish Balay   Not Collective
12070c52818fSSatish Balay 
12080c52818fSSatish Balay   Input Parameters:
12090c52818fSSatish Balay . ls - the TaoLineSearch context
12100c52818fSSatish Balay 
12110c52818fSSatish Balay   Output Parameters:
12120c52818fSSatish Balay . prefix - pointer to the prefix string used is returned
12130c52818fSSatish Balay 
121495452b02SPatrick Sanan   Notes:
121595452b02SPatrick Sanan     On the fortran side, the user should pass in a string 'prefix' of
12160c52818fSSatish Balay   sufficient length to hold the prefix.
12170c52818fSSatish Balay 
12180c52818fSSatish Balay   Level: advanced
12190c52818fSSatish Balay 
1220db781477SPatrick Sanan .seealso: `TaoLineSearchSetOptionsPrefix()`, `TaoLineSearchAppendOptionsPrefix()`
12210c52818fSSatish Balay @*/
12229371c9d4SSatish Balay PetscErrorCode TaoLineSearchGetOptionsPrefix(TaoLineSearch ls, const char *p[]) {
1223f06e3bfaSBarry Smith   return PetscObjectGetOptionsPrefix((PetscObject)ls, p);
12240c52818fSSatish Balay }
12250c52818fSSatish Balay 
12260c52818fSSatish Balay /*@C
12270c52818fSSatish Balay    TaoLineSearchSetOptionsPrefix - Sets the prefix used for searching for all
12280c52818fSSatish Balay    TaoLineSearch options in the database.
12290c52818fSSatish Balay 
12300c52818fSSatish Balay    Logically Collective on TaoLineSearch
12310c52818fSSatish Balay 
12320c52818fSSatish Balay    Input Parameters:
12330c52818fSSatish Balay +  ls - the TaoLineSearch context
12340c52818fSSatish Balay -  prefix - the prefix string to prepend to all TAO option requests
12350c52818fSSatish Balay 
12360c52818fSSatish Balay    Notes:
12370c52818fSSatish Balay    A hyphen (-) must NOT be given at the beginning of the prefix name.
12380c52818fSSatish Balay    The first character of all runtime options is AUTOMATICALLY the hyphen.
12390c52818fSSatish Balay 
12400c52818fSSatish Balay    For example, to distinguish between the runtime options for two
12410c52818fSSatish Balay    different line searches, one could call
12420c52818fSSatish Balay .vb
12430c52818fSSatish Balay       TaoLineSearchSetOptionsPrefix(ls1,"sys1_")
12440c52818fSSatish Balay       TaoLineSearchSetOptionsPrefix(ls2,"sys2_")
12450c52818fSSatish Balay .ve
12460c52818fSSatish Balay 
12470c52818fSSatish Balay    This would enable use of different options for each system, such as
12480c52818fSSatish Balay .vb
12490c52818fSSatish Balay       -sys1_tao_ls_type mt
12500c52818fSSatish Balay       -sys2_tao_ls_type armijo
12510c52818fSSatish Balay .ve
12520c52818fSSatish Balay 
12530c52818fSSatish Balay    Level: advanced
12540c52818fSSatish Balay 
1255db781477SPatrick Sanan .seealso: `TaoLineSearchAppendOptionsPrefix()`, `TaoLineSearchGetOptionsPrefix()`
12560c52818fSSatish Balay @*/
12570c52818fSSatish Balay 
12589371c9d4SSatish Balay PetscErrorCode TaoLineSearchSetOptionsPrefix(TaoLineSearch ls, const char p[]) {
1259f06e3bfaSBarry Smith   return PetscObjectSetOptionsPrefix((PetscObject)ls, p);
12600c52818fSSatish Balay }
1261