1af0996ceSBarry Smith #include <petsc/private/taoimpl.h> /*I "petsctao.h" I*/
20f0abf79SStefano Zampini #include <petsc/private/snesimpl.h>
3a7e14dcfSSatish Balay
4441846f8SBarry Smith PetscBool TaoRegisterAllCalled = PETSC_FALSE;
5441846f8SBarry Smith PetscFunctionList TaoList = NULL;
6a7e14dcfSSatish Balay
7441846f8SBarry Smith PetscClassId TAO_CLASSID;
80ebee16dSLisandro Dalcin
90ebee16dSLisandro Dalcin PetscLogEvent TAO_Solve;
100ebee16dSLisandro Dalcin PetscLogEvent TAO_ObjectiveEval;
110ebee16dSLisandro Dalcin PetscLogEvent TAO_GradientEval;
120ebee16dSLisandro Dalcin PetscLogEvent TAO_ObjGradEval;
130ebee16dSLisandro Dalcin PetscLogEvent TAO_HessianEval;
140ebee16dSLisandro Dalcin PetscLogEvent TAO_JacobianEval;
150ebee16dSLisandro Dalcin PetscLogEvent TAO_ConstraintsEval;
16a7e14dcfSSatish Balay
1783c8fe1dSLisandro Dalcin const char *TaoSubSetTypes[] = {"subvec", "mask", "matrixfree", "TaoSubSetType", "TAO_SUBSET_", NULL};
18a7e14dcfSSatish Balay
19e882e171SHong Zhang struct _n_TaoMonitorDrawCtx {
20e882e171SHong Zhang PetscViewer viewer;
21e882e171SHong Zhang PetscInt howoften; /* when > 0 uses iteration % howoften, when negative only final solution plotted */
22e882e171SHong Zhang };
23e882e171SHong Zhang
KSPPreSolve_TAOEW_Private(KSP ksp,Vec b,Vec x,PetscCtx ctx)242a8381b2SBarry Smith static PetscErrorCode KSPPreSolve_TAOEW_Private(KSP ksp, Vec b, Vec x, PetscCtx ctx)
25d71ae5a4SJacob Faibussowitsch {
26f1e99121SPierre Jolivet Tao tao = (Tao)ctx;
270f0abf79SStefano Zampini SNES snes_ewdummy = tao->snes_ewdummy;
280f0abf79SStefano Zampini
290f0abf79SStefano Zampini PetscFunctionBegin;
303ba16761SJacob Faibussowitsch if (!snes_ewdummy) PetscFunctionReturn(PETSC_SUCCESS);
310f0abf79SStefano Zampini /* populate snes_ewdummy struct values used in KSPPreSolve_SNESEW */
320f0abf79SStefano Zampini snes_ewdummy->vec_func = b;
330f0abf79SStefano Zampini snes_ewdummy->rtol = tao->gttol;
340f0abf79SStefano Zampini snes_ewdummy->iter = tao->niter;
350f0abf79SStefano Zampini PetscCall(VecNorm(b, NORM_2, &snes_ewdummy->norm));
360f0abf79SStefano Zampini PetscCall(KSPPreSolve_SNESEW(ksp, b, x, snes_ewdummy));
370f0abf79SStefano Zampini snes_ewdummy->vec_func = NULL;
383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
390f0abf79SStefano Zampini }
400f0abf79SStefano Zampini
KSPPostSolve_TAOEW_Private(KSP ksp,Vec b,Vec x,PetscCtx ctx)412a8381b2SBarry Smith static PetscErrorCode KSPPostSolve_TAOEW_Private(KSP ksp, Vec b, Vec x, PetscCtx ctx)
42d71ae5a4SJacob Faibussowitsch {
43f1e99121SPierre Jolivet Tao tao = (Tao)ctx;
440f0abf79SStefano Zampini SNES snes_ewdummy = tao->snes_ewdummy;
450f0abf79SStefano Zampini
460f0abf79SStefano Zampini PetscFunctionBegin;
473ba16761SJacob Faibussowitsch if (!snes_ewdummy) PetscFunctionReturn(PETSC_SUCCESS);
480f0abf79SStefano Zampini PetscCall(KSPPostSolve_SNESEW(ksp, b, x, snes_ewdummy));
493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
500f0abf79SStefano Zampini }
510f0abf79SStefano Zampini
TaoSetUpEW_Private(Tao tao)52d71ae5a4SJacob Faibussowitsch static PetscErrorCode TaoSetUpEW_Private(Tao tao)
53d71ae5a4SJacob Faibussowitsch {
540f0abf79SStefano Zampini SNESKSPEW *kctx;
550f0abf79SStefano Zampini const char *ewprefix;
560f0abf79SStefano Zampini
570f0abf79SStefano Zampini PetscFunctionBegin;
583ba16761SJacob Faibussowitsch if (!tao->ksp) PetscFunctionReturn(PETSC_SUCCESS);
590f0abf79SStefano Zampini if (tao->ksp_ewconv) {
600f0abf79SStefano Zampini if (!tao->snes_ewdummy) PetscCall(SNESCreate(PetscObjectComm((PetscObject)tao), &tao->snes_ewdummy));
610f0abf79SStefano Zampini tao->snes_ewdummy->ksp_ewconv = PETSC_TRUE;
62f1e99121SPierre Jolivet PetscCall(KSPSetPreSolve(tao->ksp, KSPPreSolve_TAOEW_Private, tao));
63f1e99121SPierre Jolivet PetscCall(KSPSetPostSolve(tao->ksp, KSPPostSolve_TAOEW_Private, tao));
640f0abf79SStefano Zampini
650f0abf79SStefano Zampini PetscCall(KSPGetOptionsPrefix(tao->ksp, &ewprefix));
660f0abf79SStefano Zampini kctx = (SNESKSPEW *)tao->snes_ewdummy->kspconvctx;
67a4598233SStefano Zampini PetscCall(SNESEWSetFromOptions_Private(kctx, PETSC_FALSE, PetscObjectComm((PetscObject)tao), ewprefix));
680f0abf79SStefano Zampini } else PetscCall(SNESDestroy(&tao->snes_ewdummy));
693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
700f0abf79SStefano Zampini }
710f0abf79SStefano Zampini
72a7e14dcfSSatish Balay /*@
73606f75f6SBarry Smith TaoParametersInitialize - Sets all the parameters in `tao` to their default value (when `TaoCreate()` was called) if they
74606f75f6SBarry Smith currently contain default values. Default values are the parameter values when the object's type is set.
75606f75f6SBarry Smith
76606f75f6SBarry Smith Collective
77606f75f6SBarry Smith
78606f75f6SBarry Smith Input Parameter:
79606f75f6SBarry Smith . tao - the `Tao` object
80606f75f6SBarry Smith
81606f75f6SBarry Smith Level: developer
82606f75f6SBarry Smith
83606f75f6SBarry Smith Developer Note:
84606f75f6SBarry Smith This is called by all the `TaoCreate_XXX()` routines.
85606f75f6SBarry Smith
86606f75f6SBarry Smith .seealso: [](ch_snes), `Tao`, `TaoSolve()`, `TaoDestroy()`,
87606f75f6SBarry Smith `PetscObjectParameterSetDefault()`
88606f75f6SBarry Smith @*/
TaoParametersInitialize(Tao tao)89606f75f6SBarry Smith PetscErrorCode TaoParametersInitialize(Tao tao)
90606f75f6SBarry Smith {
91606f75f6SBarry Smith PetscObjectParameterSetDefault(tao, max_it, 10000);
92606f75f6SBarry Smith PetscObjectParameterSetDefault(tao, max_funcs, PETSC_UNLIMITED);
93606f75f6SBarry Smith PetscObjectParameterSetDefault(tao, gatol, PetscDefined(USE_REAL_SINGLE) ? 1e-5 : 1e-8);
94606f75f6SBarry Smith PetscObjectParameterSetDefault(tao, grtol, PetscDefined(USE_REAL_SINGLE) ? 1e-5 : 1e-8);
95606f75f6SBarry Smith PetscObjectParameterSetDefault(tao, crtol, PetscDefined(USE_REAL_SINGLE) ? 1e-5 : 1e-8);
96606f75f6SBarry Smith PetscObjectParameterSetDefault(tao, catol, PetscDefined(USE_REAL_SINGLE) ? 1e-5 : 1e-8);
97606f75f6SBarry Smith PetscObjectParameterSetDefault(tao, gttol, 0.0);
98606f75f6SBarry Smith PetscObjectParameterSetDefault(tao, steptol, 0.0);
99606f75f6SBarry Smith PetscObjectParameterSetDefault(tao, fmin, PETSC_NINFINITY);
100606f75f6SBarry Smith PetscObjectParameterSetDefault(tao, trust0, PETSC_INFINITY);
101606f75f6SBarry Smith return PETSC_SUCCESS;
102606f75f6SBarry Smith }
103606f75f6SBarry Smith
104606f75f6SBarry Smith /*@
10565ba42b6SBarry Smith TaoCreate - Creates a Tao solver
106a7e14dcfSSatish Balay
107d083f849SBarry Smith Collective
108a7e14dcfSSatish Balay
109a7e14dcfSSatish Balay Input Parameter:
110a7e14dcfSSatish Balay . comm - MPI communicator
111a7e14dcfSSatish Balay
112a7e14dcfSSatish Balay Output Parameter:
11347450a7bSBarry Smith . newtao - the new `Tao` context
114a7e14dcfSSatish Balay
11547450a7bSBarry Smith Options Database Key:
11665ba42b6SBarry Smith . -tao_type - select which method Tao should use
117a7e14dcfSSatish Balay
118a7e14dcfSSatish Balay Level: beginner
119a7e14dcfSSatish Balay
1200241b274SPierre Jolivet .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoDestroy()`, `TaoSetFromOptions()`, `TaoSetType()`
121a7e14dcfSSatish Balay @*/
TaoCreate(MPI_Comm comm,Tao * newtao)122d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoCreate(MPI_Comm comm, Tao *newtao)
123d71ae5a4SJacob Faibussowitsch {
124441846f8SBarry Smith Tao tao;
125a7e14dcfSSatish Balay
126a7e14dcfSSatish Balay PetscFunctionBegin;
1274f572ea9SToby Isaac PetscAssertPointer(newtao, 2);
1289566063dSJacob Faibussowitsch PetscCall(TaoInitializePackage());
1299566063dSJacob Faibussowitsch PetscCall(TaoLineSearchInitializePackage());
130a7e14dcfSSatish Balay
131606f75f6SBarry Smith PetscCall(PetscHeaderCreate(tao, TAO_CLASSID, "Tao", "Optimization solver", "Tao", comm, TaoDestroy, TaoView));
13294511df7SStefano Zampini tao->ops->convergencetest = TaoDefaultConvergenceTest;
133606f75f6SBarry Smith
134a7e14dcfSSatish Balay tao->hist_reset = PETSC_TRUE;
1359566063dSJacob Faibussowitsch PetscCall(TaoResetStatistics(tao));
136a7e14dcfSSatish Balay *newtao = tao;
1373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
138a7e14dcfSSatish Balay }
139a7e14dcfSSatish Balay
140a7e14dcfSSatish Balay /*@
141a7e14dcfSSatish Balay TaoSolve - Solves an optimization problem min F(x) s.t. l <= x <= u
142a7e14dcfSSatish Balay
143c3339decSBarry Smith Collective
144a7e14dcfSSatish Balay
14547450a7bSBarry Smith Input Parameter:
14647450a7bSBarry Smith . tao - the `Tao` context
147a7e14dcfSSatish Balay
14867be906fSBarry Smith Level: beginner
14967be906fSBarry Smith
150a7e14dcfSSatish Balay Notes:
15147450a7bSBarry Smith The user must set up the `Tao` object with calls to `TaoSetSolution()`, `TaoSetObjective()`, `TaoSetGradient()`, and (if using 2nd order method) `TaoSetHessian()`.
152a7e14dcfSSatish Balay
15367be906fSBarry Smith You should call `TaoGetConvergedReason()` or run with `-tao_converged_reason` to determine if the optimization algorithm actually succeeded or
154a35d58b8SBarry Smith why it failed.
155a35d58b8SBarry Smith
1561cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoCreate()`, `TaoSetObjective()`, `TaoSetGradient()`, `TaoSetHessian()`, `TaoGetConvergedReason()`, `TaoSetUp()`
157a7e14dcfSSatish Balay @*/
TaoSolve(Tao tao)158d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSolve(Tao tao)
159d71ae5a4SJacob Faibussowitsch {
160e2379f4fSBarry Smith static PetscBool set = PETSC_FALSE;
16147a47007SBarry Smith
162a7e14dcfSSatish Balay PetscFunctionBegin;
163441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
164d0609cedSBarry Smith PetscCall(PetscCitationsRegister("@TechReport{tao-user-ref,\n"
165e2379f4fSBarry Smith "title = {Toolkit for Advanced Optimization (TAO) Users Manual},\n"
166e2379f4fSBarry Smith "author = {Todd Munson and Jason Sarich and Stefan Wild and Steve Benson and Lois Curfman McInnes},\n"
167e2379f4fSBarry Smith "Institution = {Argonne National Laboratory},\n"
168e2379f4fSBarry Smith "Year = 2014,\n"
169e2379f4fSBarry Smith "Number = {ANL/MCS-TM-322 - Revision 3.5},\n"
1709371c9d4SSatish Balay "url = {https://www.mcs.anl.gov/research/projects/tao/}\n}\n",
1719371c9d4SSatish Balay &set));
172494bef23SAlp Dener tao->header_printed = PETSC_FALSE;
1739566063dSJacob Faibussowitsch PetscCall(TaoSetUp(tao));
1749566063dSJacob Faibussowitsch PetscCall(TaoResetStatistics(tao));
1751baa6e33SBarry Smith if (tao->linesearch) PetscCall(TaoLineSearchReset(tao->linesearch));
176a7e14dcfSSatish Balay
1779566063dSJacob Faibussowitsch PetscCall(PetscLogEventBegin(TAO_Solve, tao, 0, 0, 0));
178dbbe0bcdSBarry Smith PetscTryTypeMethod(tao, solve);
1799566063dSJacob Faibussowitsch PetscCall(PetscLogEventEnd(TAO_Solve, tao, 0, 0, 0));
180a7e14dcfSSatish Balay
1819566063dSJacob Faibussowitsch PetscCall(VecViewFromOptions(tao->solution, (PetscObject)tao, "-tao_view_solution"));
1827cf37e64SBarry Smith
1838931d482SJason Sarich tao->ntotalits += tao->niter;
184a7e14dcfSSatish Balay
185a7e14dcfSSatish Balay if (tao->printreason) {
186f642d338SBarry Smith PetscViewer viewer = PETSC_VIEWER_STDOUT_(((PetscObject)tao)->comm);
187084fd5feSPierre Jolivet
188f642d338SBarry Smith PetscCall(PetscViewerASCIIAddTab(viewer, ((PetscObject)tao)->tablevel));
189a7e14dcfSSatish Balay if (tao->reason > 0) {
190084fd5feSPierre Jolivet if (((PetscObject)tao)->prefix) {
191084fd5feSPierre Jolivet PetscCall(PetscViewerASCIIPrintf(viewer, " TAO %s solve converged due to %s iterations %" PetscInt_FMT "\n", ((PetscObject)tao)->prefix, TaoConvergedReasons[tao->reason], tao->niter));
192a7e14dcfSSatish Balay } else {
193084fd5feSPierre Jolivet PetscCall(PetscViewerASCIIPrintf(viewer, " TAO solve converged due to %s iterations %" PetscInt_FMT "\n", TaoConvergedReasons[tao->reason], tao->niter));
194084fd5feSPierre Jolivet }
195084fd5feSPierre Jolivet } else {
196084fd5feSPierre Jolivet if (((PetscObject)tao)->prefix) {
197084fd5feSPierre Jolivet PetscCall(PetscViewerASCIIPrintf(viewer, " TAO %s solve did not converge due to %s iteration %" PetscInt_FMT "\n", ((PetscObject)tao)->prefix, TaoConvergedReasons[tao->reason], tao->niter));
198084fd5feSPierre Jolivet } else {
199084fd5feSPierre Jolivet PetscCall(PetscViewerASCIIPrintf(viewer, " TAO solve did not converge due to %s iteration %" PetscInt_FMT "\n", TaoConvergedReasons[tao->reason], tao->niter));
200084fd5feSPierre Jolivet }
201a7e14dcfSSatish Balay }
202f642d338SBarry Smith PetscCall(PetscViewerASCIISubtractTab(viewer, ((PetscObject)tao)->tablevel));
203a7e14dcfSSatish Balay }
204f642d338SBarry Smith PetscCall(TaoViewFromOptions(tao, NULL, "-tao_view"));
2053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
206a7e14dcfSSatish Balay }
207a7e14dcfSSatish Balay
208a7e14dcfSSatish Balay /*@
209a7e14dcfSSatish Balay TaoSetUp - Sets up the internal data structures for the later use
210a7e14dcfSSatish Balay of a Tao solver
211a7e14dcfSSatish Balay
212c3339decSBarry Smith Collective
213a7e14dcfSSatish Balay
21447450a7bSBarry Smith Input Parameter:
21547450a7bSBarry Smith . tao - the `Tao` context
216a7e14dcfSSatish Balay
21767be906fSBarry Smith Level: advanced
21867be906fSBarry Smith
21947450a7bSBarry Smith Note:
22065ba42b6SBarry Smith The user will not need to explicitly call `TaoSetUp()`, as it will
22165ba42b6SBarry Smith automatically be called in `TaoSolve()`. However, if the user
22265ba42b6SBarry Smith desires to call it explicitly, it should come after `TaoCreate()`
22365ba42b6SBarry Smith and any TaoSetSomething() routines, but before `TaoSolve()`.
224a7e14dcfSSatish Balay
2251cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoCreate()`, `TaoSolve()`
226a7e14dcfSSatish Balay @*/
TaoSetUp(Tao tao)227d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetUp(Tao tao)
228d71ae5a4SJacob Faibussowitsch {
229a7e14dcfSSatish Balay PetscFunctionBegin;
230441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
2313ba16761SJacob Faibussowitsch if (tao->setupcalled) PetscFunctionReturn(PETSC_SUCCESS);
2320f0abf79SStefano Zampini PetscCall(TaoSetUpEW_Private(tao));
2333c859ba3SBarry Smith PetscCheck(tao->solution, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_WRONGSTATE, "Must call TaoSetSolution");
234dbbe0bcdSBarry Smith PetscTryTypeMethod(tao, setup);
235a7e14dcfSSatish Balay tao->setupcalled = PETSC_TRUE;
2363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
237a7e14dcfSSatish Balay }
238a7e14dcfSSatish Balay
2390764c050SBarry Smith /*@
24047450a7bSBarry Smith TaoDestroy - Destroys the `Tao` context that was created with `TaoCreate()`
241a7e14dcfSSatish Balay
242c3339decSBarry Smith Collective
243a7e14dcfSSatish Balay
244a7e14dcfSSatish Balay Input Parameter:
24547450a7bSBarry Smith . tao - the `Tao` context
246a7e14dcfSSatish Balay
247a7e14dcfSSatish Balay Level: beginner
248a7e14dcfSSatish Balay
2491cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoCreate()`, `TaoSolve()`
250a7e14dcfSSatish Balay @*/
TaoDestroy(Tao * tao)251d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoDestroy(Tao *tao)
252d71ae5a4SJacob Faibussowitsch {
253a7e14dcfSSatish Balay PetscFunctionBegin;
2543ba16761SJacob Faibussowitsch if (!*tao) PetscFunctionReturn(PETSC_SUCCESS);
255441846f8SBarry Smith PetscValidHeaderSpecific(*tao, TAO_CLASSID, 1);
2569371c9d4SSatish Balay if (--((PetscObject)*tao)->refct > 0) {
2579371c9d4SSatish Balay *tao = NULL;
2583ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
259a7e14dcfSSatish Balay }
2609371c9d4SSatish Balay
261213acdd3SPierre Jolivet PetscTryTypeMethod(*tao, destroy);
2629566063dSJacob Faibussowitsch PetscCall(KSPDestroy(&(*tao)->ksp));
2630f0abf79SStefano Zampini PetscCall(SNESDestroy(&(*tao)->snes_ewdummy));
2649566063dSJacob Faibussowitsch PetscCall(TaoLineSearchDestroy(&(*tao)->linesearch));
265a7e14dcfSSatish Balay
266a7e14dcfSSatish Balay if ((*tao)->ops->convergencedestroy) {
2679566063dSJacob Faibussowitsch PetscCall((*(*tao)->ops->convergencedestroy)((*tao)->cnvP));
26848a46eb9SPierre Jolivet if ((*tao)->jacobian_state_inv) PetscCall(MatDestroy(&(*tao)->jacobian_state_inv));
269a7e14dcfSSatish Balay }
2709566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->solution));
2719566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->gradient));
2729566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->ls_res));
273a7e14dcfSSatish Balay
274a9603a14SPatrick Farrell if ((*tao)->gradient_norm) {
2759566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)(*tao)->gradient_norm));
2769566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->gradient_norm_tmp));
277a9603a14SPatrick Farrell }
278a9603a14SPatrick Farrell
2799566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->XL));
2809566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->XU));
2819566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->IL));
2829566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->IU));
2839566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->DE));
2849566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->DI));
2859566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->constraints));
2869566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->constraints_equality));
2879566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->constraints_inequality));
2889566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->stepdirection));
2899566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->hessian_pre));
2909566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->hessian));
2919566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->ls_jac));
2929566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->ls_jac_pre));
2939566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->jacobian_pre));
2949566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->jacobian));
2959566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->jacobian_state_pre));
2969566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->jacobian_state));
2979566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->jacobian_state_inv));
2989566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->jacobian_design));
2999566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->jacobian_equality));
3009566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->jacobian_equality_pre));
3019566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->jacobian_inequality));
3029566063dSJacob Faibussowitsch PetscCall(MatDestroy(&(*tao)->jacobian_inequality_pre));
3039566063dSJacob Faibussowitsch PetscCall(ISDestroy(&(*tao)->state_is));
3049566063dSJacob Faibussowitsch PetscCall(ISDestroy(&(*tao)->design_is));
3059566063dSJacob Faibussowitsch PetscCall(VecDestroy(&(*tao)->res_weights_v));
306b2dc45ddSPierre Jolivet PetscCall(TaoMonitorCancel(*tao));
30748a46eb9SPierre Jolivet if ((*tao)->hist_malloc) PetscCall(PetscFree4((*tao)->hist_obj, (*tao)->hist_resid, (*tao)->hist_cnorm, (*tao)->hist_lits));
308737f463aSAlp Dener if ((*tao)->res_weights_n) {
3099566063dSJacob Faibussowitsch PetscCall(PetscFree((*tao)->res_weights_rows));
3109566063dSJacob Faibussowitsch PetscCall(PetscFree((*tao)->res_weights_cols));
3119566063dSJacob Faibussowitsch PetscCall(PetscFree((*tao)->res_weights_w));
312125ddc8aSJason Sarich }
3139566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(tao));
3143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
315a7e14dcfSSatish Balay }
316a7e14dcfSSatish Balay
317a7e14dcfSSatish Balay /*@
3181d27aa22SBarry Smith TaoKSPSetUseEW - Sets `SNES` to use Eisenstat-Walker method {cite}`ew96`for computing relative tolerance for linear solvers.
3190f0abf79SStefano Zampini
320c3339decSBarry Smith Logically Collective
3210f0abf79SStefano Zampini
3220f0abf79SStefano Zampini Input Parameters:
3230f0abf79SStefano Zampini + tao - Tao context
32465ba42b6SBarry Smith - flag - `PETSC_TRUE` or `PETSC_FALSE`
3250f0abf79SStefano Zampini
32667be906fSBarry Smith Level: advanced
32767be906fSBarry Smith
32847450a7bSBarry Smith Note:
32965ba42b6SBarry Smith See `SNESKSPSetUseEW()` for customization details.
3300f0abf79SStefano Zampini
3311cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `SNESKSPSetUseEW()`
3320f0abf79SStefano Zampini @*/
TaoKSPSetUseEW(Tao tao,PetscBool flag)333d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoKSPSetUseEW(Tao tao, PetscBool flag)
334d71ae5a4SJacob Faibussowitsch {
3350f0abf79SStefano Zampini PetscFunctionBegin;
3360f0abf79SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
3370f0abf79SStefano Zampini PetscValidLogicalCollectiveBool(tao, flag, 2);
3380f0abf79SStefano Zampini tao->ksp_ewconv = flag;
3393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
3400f0abf79SStefano Zampini }
3410f0abf79SStefano Zampini
342*a336c150SZach Atkins /*@C
343*a336c150SZach Atkins TaoMonitorSetFromOptions - Sets a monitor function and viewer appropriate for the type indicated by the user
344*a336c150SZach Atkins
345*a336c150SZach Atkins Collective
346*a336c150SZach Atkins
347*a336c150SZach Atkins Input Parameters:
348*a336c150SZach Atkins + tao - `Tao` object you wish to monitor
349*a336c150SZach Atkins . name - the monitor type one is seeking
350*a336c150SZach Atkins . help - message indicating what monitoring is done
351*a336c150SZach Atkins . manual - manual page for the monitor
352*a336c150SZach Atkins - monitor - the monitor function, this must use a `PetscViewerFormat` as its context
353*a336c150SZach Atkins
354*a336c150SZach Atkins Level: developer
355*a336c150SZach Atkins
356*a336c150SZach Atkins .seealso: [](ch_ts), `Tao`, `TaoMonitorSet()`, `PetscOptionsCreateViewer()`, `PetscOptionsGetReal()`, `PetscOptionsHasName()`, `PetscOptionsGetString()`,
357*a336c150SZach Atkins `PetscOptionsGetIntArray()`, `PetscOptionsGetRealArray()`, `PetscOptionsBool()`
358*a336c150SZach Atkins `PetscOptionsInt()`, `PetscOptionsString()`, `PetscOptionsReal()`,
359*a336c150SZach Atkins `PetscOptionsName()`, `PetscOptionsBegin()`, `PetscOptionsEnd()`, `PetscOptionsHeadBegin()`,
360*a336c150SZach Atkins `PetscOptionsStringArray()`, `PetscOptionsRealArray()`, `PetscOptionsScalar()`,
361*a336c150SZach Atkins `PetscOptionsBoolGroupBegin()`, `PetscOptionsBoolGroup()`, `PetscOptionsBoolGroupEnd()`,
362*a336c150SZach Atkins `PetscOptionsFList()`, `PetscOptionsEList()`
363*a336c150SZach Atkins @*/
TaoMonitorSetFromOptions(Tao tao,const char name[],const char help[],const char manual[],PetscErrorCode (* monitor)(Tao,PetscViewerAndFormat *))364*a336c150SZach Atkins PetscErrorCode TaoMonitorSetFromOptions(Tao tao, const char name[], const char help[], const char manual[], PetscErrorCode (*monitor)(Tao, PetscViewerAndFormat *))
365*a336c150SZach Atkins {
366*a336c150SZach Atkins PetscViewer viewer;
367*a336c150SZach Atkins PetscViewerFormat format;
368*a336c150SZach Atkins PetscBool flg;
369*a336c150SZach Atkins
370*a336c150SZach Atkins PetscFunctionBegin;
371*a336c150SZach Atkins PetscCall(PetscOptionsCreateViewer(PetscObjectComm((PetscObject)tao), ((PetscObject)tao)->options, ((PetscObject)tao)->prefix, name, &viewer, &format, &flg));
372*a336c150SZach Atkins if (flg) {
373*a336c150SZach Atkins PetscViewerAndFormat *vf;
374*a336c150SZach Atkins char interval_key[1024];
375*a336c150SZach Atkins
376*a336c150SZach Atkins PetscCall(PetscSNPrintf(interval_key, sizeof interval_key, "%s_interval", name));
377*a336c150SZach Atkins PetscCall(PetscViewerAndFormatCreate(viewer, format, &vf));
378*a336c150SZach Atkins vf->view_interval = 1;
379*a336c150SZach Atkins PetscCall(PetscOptionsGetInt(((PetscObject)tao)->options, ((PetscObject)tao)->prefix, interval_key, &vf->view_interval, NULL));
380*a336c150SZach Atkins
381*a336c150SZach Atkins PetscCall(PetscViewerDestroy(&viewer));
382*a336c150SZach Atkins PetscCall(TaoMonitorSet(tao, (PetscErrorCode (*)(Tao, PetscCtx))monitor, vf, (PetscCtxDestroyFn *)PetscViewerAndFormatDestroy));
383*a336c150SZach Atkins }
384*a336c150SZach Atkins PetscFunctionReturn(PETSC_SUCCESS);
385*a336c150SZach Atkins }
386*a336c150SZach Atkins
3870f0abf79SStefano Zampini /*@
38847450a7bSBarry Smith TaoSetFromOptions - Sets various Tao parameters from the options database
389a7e14dcfSSatish Balay
390c3339decSBarry Smith Collective
391a7e14dcfSSatish Balay
39201d2d390SJose E. Roman Input Parameter:
39347450a7bSBarry Smith . tao - the `Tao` solver context
394a7e14dcfSSatish Balay
39547450a7bSBarry Smith Options Database Keys:
39665ba42b6SBarry Smith + -tao_type <type> - The algorithm that Tao uses (lmvm, nls, etc.)
397a7e14dcfSSatish Balay . -tao_gatol <gatol> - absolute error tolerance for ||gradient||
398a7e14dcfSSatish Balay . -tao_grtol <grtol> - relative error tolerance for ||gradient||
399a7e14dcfSSatish Balay . -tao_gttol <gttol> - reduction of ||gradient|| relative to initial gradient
400a7e14dcfSSatish Balay . -tao_max_it <max> - sets maximum number of iterations
401a7e14dcfSSatish Balay . -tao_max_funcs <max> - sets maximum number of function evaluations
402a7e14dcfSSatish Balay . -tao_fmin <fmin> - stop if function value reaches fmin
403a7e14dcfSSatish Balay . -tao_steptol <tol> - stop if trust region radius less than <tol>
404a7e14dcfSSatish Balay . -tao_trust0 <t> - initial trust region radius
40510978b7dSBarry Smith . -tao_view_solution - view the solution at the end of the optimization process
40647450a7bSBarry Smith . -tao_monitor - prints function value and residual norm at each iteration
40710978b7dSBarry Smith . -tao_monitor_short - same as `-tao_monitor`, but truncates very small values
40810978b7dSBarry Smith . -tao_monitor_constraint_norm - prints objective value, gradient, and constraint norm at each iteration
40910978b7dSBarry Smith . -tao_monitor_globalization - prints information about the globalization at each iteration
41010978b7dSBarry Smith . -tao_monitor_solution - prints solution vector at each iteration
41110978b7dSBarry Smith . -tao_monitor_ls_residual - prints least-squares residual vector at each iteration
41210978b7dSBarry Smith . -tao_monitor_step - prints step vector at each iteration
41310978b7dSBarry Smith . -tao_monitor_gradient - prints gradient vector at each iteration
41410978b7dSBarry Smith . -tao_monitor_solution_draw - graphically view solution vector at each iteration
41510978b7dSBarry Smith . -tao_monitor_step_draw - graphically view step vector at each iteration
41610978b7dSBarry Smith . -tao_monitor_gradient_draw - graphically view gradient at each iteration
41710978b7dSBarry Smith . -tao_monitor_cancel - cancels all monitors (except those set with command line)
418a7e14dcfSSatish Balay . -tao_fd_gradient - use gradient computed with finite differences
419f4c1ad5cSStefano Zampini . -tao_fd_hessian - use hessian computed with finite differences
42010978b7dSBarry Smith . -tao_mf_hessian - use matrix-free Hessian computed with finite differences
421441846f8SBarry Smith . -tao_view - prints information about the Tao after solving
42265ba42b6SBarry Smith - -tao_converged_reason - prints the reason Tao stopped iterating
423a7e14dcfSSatish Balay
42467be906fSBarry Smith Level: beginner
42567be906fSBarry Smith
42667be906fSBarry Smith Note:
42747450a7bSBarry Smith To see all options, run your program with the `-help` option or consult the
42865ba42b6SBarry Smith user's manual. Should be called after `TaoCreate()` but before `TaoSolve()`
429a7e14dcfSSatish Balay
4301cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoCreate()`, `TaoSolve()`
431a7e14dcfSSatish Balay @*/
TaoSetFromOptions(Tao tao)432d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetFromOptions(Tao tao)
433d71ae5a4SJacob Faibussowitsch {
434b625d6c7SJed Brown TaoType default_type = TAOLMVM;
435*a336c150SZach Atkins char type[256];
436e876fe75SStephan Köhler PetscBool flg, found;
437a7e14dcfSSatish Balay MPI_Comm comm;
438606f75f6SBarry Smith PetscReal catol, crtol, gatol, grtol, gttol;
439a7e14dcfSSatish Balay
440a7e14dcfSSatish Balay PetscFunctionBegin;
441441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
4429566063dSJacob Faibussowitsch PetscCall(PetscObjectGetComm((PetscObject)tao, &comm));
443125ddc8aSJason Sarich
44460b70c5cSStefano Zampini if (((PetscObject)tao)->type_name) default_type = ((PetscObject)tao)->type_name;
44560b70c5cSStefano Zampini
446d0609cedSBarry Smith PetscObjectOptionsBegin((PetscObject)tao);
447a7e14dcfSSatish Balay /* Check for type from options */
4489566063dSJacob Faibussowitsch PetscCall(PetscOptionsFList("-tao_type", "Tao Solver type", "TaoSetType", TaoList, default_type, type, 256, &flg));
449a7e14dcfSSatish Balay if (flg) {
4509566063dSJacob Faibussowitsch PetscCall(TaoSetType(tao, type));
451a7e14dcfSSatish Balay } else if (!((PetscObject)tao)->type_name) {
4529566063dSJacob Faibussowitsch PetscCall(TaoSetType(tao, default_type));
453a7e14dcfSSatish Balay }
454a7e14dcfSSatish Balay
45560b70c5cSStefano Zampini /* Tao solvers do not set the prefix, set it here if not yet done
45660b70c5cSStefano Zampini We do it after SetType since solver may have been changed */
45760b70c5cSStefano Zampini if (tao->linesearch) {
45860b70c5cSStefano Zampini const char *prefix;
45960b70c5cSStefano Zampini PetscCall(TaoLineSearchGetOptionsPrefix(tao->linesearch, &prefix));
460f4f49eeaSPierre Jolivet if (!prefix) PetscCall(TaoLineSearchSetOptionsPrefix(tao->linesearch, ((PetscObject)tao)->prefix));
46160b70c5cSStefano Zampini }
46260b70c5cSStefano Zampini
463606f75f6SBarry Smith catol = tao->catol;
464606f75f6SBarry Smith crtol = tao->crtol;
465606f75f6SBarry Smith PetscCall(PetscOptionsReal("-tao_catol", "Stop if constraints violations within", "TaoSetConstraintTolerances", tao->catol, &catol, NULL));
466606f75f6SBarry Smith PetscCall(PetscOptionsReal("-tao_crtol", "Stop if relative constraint violations within", "TaoSetConstraintTolerances", tao->crtol, &crtol, NULL));
467606f75f6SBarry Smith PetscCall(TaoSetConstraintTolerances(tao, catol, crtol));
468606f75f6SBarry Smith
469606f75f6SBarry Smith gatol = tao->gatol;
470606f75f6SBarry Smith grtol = tao->grtol;
471606f75f6SBarry Smith gttol = tao->gttol;
472606f75f6SBarry Smith PetscCall(PetscOptionsReal("-tao_gatol", "Stop if norm of gradient less than", "TaoSetTolerances", tao->gatol, &gatol, NULL));
473606f75f6SBarry Smith PetscCall(PetscOptionsReal("-tao_grtol", "Stop if norm of gradient divided by the function value is less than", "TaoSetTolerances", tao->grtol, &grtol, NULL));
474606f75f6SBarry Smith PetscCall(PetscOptionsReal("-tao_gttol", "Stop if the norm of the gradient is less than the norm of the initial gradient times tol", "TaoSetTolerances", tao->gttol, >tol, NULL));
475606f75f6SBarry Smith PetscCall(TaoSetTolerances(tao, gatol, grtol, gttol));
476606f75f6SBarry Smith
4779566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-tao_max_it", "Stop if iteration number exceeds", "TaoSetMaximumIterations", tao->max_it, &tao->max_it, &flg));
478606f75f6SBarry Smith if (flg) PetscCall(TaoSetMaximumIterations(tao, tao->max_it));
479606f75f6SBarry Smith
4809566063dSJacob Faibussowitsch PetscCall(PetscOptionsInt("-tao_max_funcs", "Stop if number of function evaluations exceeds", "TaoSetMaximumFunctionEvaluations", tao->max_funcs, &tao->max_funcs, &flg));
481606f75f6SBarry Smith if (flg) PetscCall(TaoSetMaximumFunctionEvaluations(tao, tao->max_funcs));
482606f75f6SBarry Smith
483606f75f6SBarry Smith PetscCall(PetscOptionsReal("-tao_fmin", "Stop if function less than", "TaoSetFunctionLowerBound", tao->fmin, &tao->fmin, NULL));
484606f75f6SBarry Smith PetscCall(PetscOptionsBoundedReal("-tao_steptol", "Stop if step size or trust region radius less than", "", tao->steptol, &tao->steptol, NULL, 0));
485606f75f6SBarry Smith PetscCall(PetscOptionsReal("-tao_trust0", "Initial trust region radius", "TaoSetInitialTrustRegionRadius", tao->trust0, &tao->trust0, &flg));
486606f75f6SBarry Smith if (flg) PetscCall(TaoSetInitialTrustRegionRadius(tao, tao->trust0));
48710978b7dSBarry Smith
48810978b7dSBarry Smith PetscCall(PetscOptionsDeprecated("-tao_solution_monitor", "-tao_monitor_solution", "3.21", NULL));
48910978b7dSBarry Smith PetscCall(PetscOptionsDeprecated("-tao_gradient_monitor", "-tao_monitor_gradient", "3.21", NULL));
49010978b7dSBarry Smith PetscCall(PetscOptionsDeprecated("-tao_stepdirection_monitor", "-tao_monitor_step", "3.21", NULL));
49110978b7dSBarry Smith PetscCall(PetscOptionsDeprecated("-tao_residual_monitor", "-tao_monitor_residual", "3.21", NULL));
49210978b7dSBarry Smith PetscCall(PetscOptionsDeprecated("-tao_smonitor", "-tao_monitor_short", "3.21", NULL));
49310978b7dSBarry Smith PetscCall(PetscOptionsDeprecated("-tao_cmonitor", "-tao_monitor_constraint_norm", "3.21", NULL));
49410978b7dSBarry Smith PetscCall(PetscOptionsDeprecated("-tao_gmonitor", "-tao_monitor_globalization", "3.21", NULL));
49510978b7dSBarry Smith PetscCall(PetscOptionsDeprecated("-tao_draw_solution", "-tao_monitor_solution_draw", "3.21", NULL));
49610978b7dSBarry Smith PetscCall(PetscOptionsDeprecated("-tao_draw_gradient", "-tao_monitor_gradient_draw", "3.21", NULL));
49710978b7dSBarry Smith PetscCall(PetscOptionsDeprecated("-tao_draw_step", "-tao_monitor_step_draw", "3.21", NULL));
49810978b7dSBarry Smith
49965ba42b6SBarry Smith PetscCall(PetscOptionsBool("-tao_converged_reason", "Print reason for Tao converged", "TaoSolve", tao->printreason, &tao->printreason, NULL));
500a7e14dcfSSatish Balay
501*a336c150SZach Atkins PetscCall(TaoMonitorSetFromOptions(tao, "-tao_monitor_solution", "View solution vector after each iteration", "TaoMonitorSolution", TaoMonitorSolution));
502*a336c150SZach Atkins PetscCall(TaoMonitorSetFromOptions(tao, "-tao_monitor_gradient", "View gradient vector for each iteration", "TaoMonitorGradient", TaoMonitorGradient));
503a7e14dcfSSatish Balay
504*a336c150SZach Atkins PetscCall(TaoMonitorSetFromOptions(tao, "-tao_monitor_step", "View step vector after each iteration", "TaoMonitorStep", TaoMonitorStep));
505*a336c150SZach Atkins PetscCall(TaoMonitorSetFromOptions(tao, "-tao_monitor_residual", "View least-squares residual vector after each iteration", "TaoMonitorResidual", TaoMonitorResidual));
506*a336c150SZach Atkins PetscCall(TaoMonitorSetFromOptions(tao, "-tao_monitor", "Use the default convergence monitor", "TaoMonitorDefault", TaoMonitorDefault));
507*a336c150SZach Atkins PetscCall(TaoMonitorSetFromOptions(tao, "-tao_monitor_globalization", "Use the convergence monitor with extra globalization info", "TaoMonitorGlobalization", TaoMonitorGlobalization));
508*a336c150SZach Atkins PetscCall(TaoMonitorSetFromOptions(tao, "-tao_monitor_short", "Use the short convergence monitor", "TaoMonitorDefaultShort", TaoMonitorDefaultShort));
509*a336c150SZach Atkins PetscCall(TaoMonitorSetFromOptions(tao, "-tao_monitor_constraint_norm", "Use the default convergence monitor with constraint norm", "TaoMonitorConstraintNorm", TaoMonitorConstraintNorm));
510a7e14dcfSSatish Balay
5118afaa268SBarry Smith flg = PETSC_FALSE;
512b2dc45ddSPierre Jolivet PetscCall(PetscOptionsDeprecated("-tao_cancelmonitors", "-tao_monitor_cancel", "3.21", NULL));
513b2dc45ddSPierre Jolivet PetscCall(PetscOptionsBool("-tao_monitor_cancel", "cancel all monitors and call any registered destroy routines", "TaoMonitorCancel", flg, &flg, NULL));
514b2dc45ddSPierre Jolivet if (flg) PetscCall(TaoMonitorCancel(tao));
515a7e14dcfSSatish Balay
5168afaa268SBarry Smith flg = PETSC_FALSE;
51710978b7dSBarry Smith PetscCall(PetscOptionsBool("-tao_monitor_solution_draw", "Plot solution vector at each iteration", "TaoMonitorSet", flg, &flg, NULL));
518a7e14dcfSSatish Balay if (flg) {
519e882e171SHong Zhang TaoMonitorDrawCtx drawctx;
520e882e171SHong Zhang PetscInt howoften = 1;
5219566063dSJacob Faibussowitsch PetscCall(TaoMonitorDrawCtxCreate(PetscObjectComm((PetscObject)tao), NULL, NULL, PETSC_DECIDE, PETSC_DECIDE, 300, 300, howoften, &drawctx));
52249abdd8aSBarry Smith PetscCall(TaoMonitorSet(tao, TaoMonitorSolutionDraw, drawctx, (PetscCtxDestroyFn *)TaoMonitorDrawCtxDestroy));
523a7e14dcfSSatish Balay }
524a7e14dcfSSatish Balay
5258afaa268SBarry Smith flg = PETSC_FALSE;
52610978b7dSBarry Smith PetscCall(PetscOptionsBool("-tao_monitor_step_draw", "Plots step at each iteration", "TaoMonitorSet", flg, &flg, NULL));
52710978b7dSBarry Smith if (flg) PetscCall(TaoMonitorSet(tao, TaoMonitorStepDraw, NULL, NULL));
528a7e14dcfSSatish Balay
5298afaa268SBarry Smith flg = PETSC_FALSE;
53010978b7dSBarry Smith PetscCall(PetscOptionsBool("-tao_monitor_gradient_draw", "plots gradient at each iteration", "TaoMonitorSet", flg, &flg, NULL));
531a7e14dcfSSatish Balay if (flg) {
532e882e171SHong Zhang TaoMonitorDrawCtx drawctx;
533e882e171SHong Zhang PetscInt howoften = 1;
5349566063dSJacob Faibussowitsch PetscCall(TaoMonitorDrawCtxCreate(PetscObjectComm((PetscObject)tao), NULL, NULL, PETSC_DECIDE, PETSC_DECIDE, 300, 300, howoften, &drawctx));
53549abdd8aSBarry Smith PetscCall(TaoMonitorSet(tao, TaoMonitorGradientDraw, drawctx, (PetscCtxDestroyFn *)TaoMonitorDrawCtxDestroy));
536a7e14dcfSSatish Balay }
5378afaa268SBarry Smith flg = PETSC_FALSE;
5389566063dSJacob Faibussowitsch PetscCall(PetscOptionsBool("-tao_fd_gradient", "compute gradient using finite differences", "TaoDefaultComputeGradient", flg, &flg, NULL));
5391baa6e33SBarry Smith if (flg) PetscCall(TaoSetGradient(tao, NULL, TaoDefaultComputeGradient, NULL));
540f4c1ad5cSStefano Zampini flg = PETSC_FALSE;
54110978b7dSBarry Smith PetscCall(PetscOptionsBool("-tao_fd_hessian", "compute Hessian using finite differences", "TaoDefaultComputeHessian", flg, &flg, NULL));
542f4c1ad5cSStefano Zampini if (flg) {
543f4c1ad5cSStefano Zampini Mat H;
544f4c1ad5cSStefano Zampini
5459566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)tao), &H));
5469566063dSJacob Faibussowitsch PetscCall(MatSetType(H, MATAIJ));
5479566063dSJacob Faibussowitsch PetscCall(TaoSetHessian(tao, H, H, TaoDefaultComputeHessian, NULL));
5489566063dSJacob Faibussowitsch PetscCall(MatDestroy(&H));
549f4c1ad5cSStefano Zampini }
550f4c1ad5cSStefano Zampini flg = PETSC_FALSE;
55110978b7dSBarry Smith PetscCall(PetscOptionsBool("-tao_mf_hessian", "compute matrix-free Hessian using finite differences", "TaoDefaultComputeHessianMFFD", flg, &flg, NULL));
552f4c1ad5cSStefano Zampini if (flg) {
553f4c1ad5cSStefano Zampini Mat H;
554f4c1ad5cSStefano Zampini
5559566063dSJacob Faibussowitsch PetscCall(MatCreate(PetscObjectComm((PetscObject)tao), &H));
5569566063dSJacob Faibussowitsch PetscCall(TaoSetHessian(tao, H, H, TaoDefaultComputeHessianMFFD, NULL));
5579566063dSJacob Faibussowitsch PetscCall(MatDestroy(&H));
558f4c1ad5cSStefano Zampini }
559e876fe75SStephan Köhler PetscCall(PetscOptionsBool("-tao_recycle_history", "enable recycling/re-using information from the previous TaoSolve() call for some algorithms", "TaoSetRecycleHistory", flg, &flg, &found));
560e876fe75SStephan Köhler if (found) PetscCall(TaoSetRecycleHistory(tao, flg));
5619566063dSJacob Faibussowitsch PetscCall(PetscOptionsEnum("-tao_subset_type", "subset type", "", TaoSubSetTypes, (PetscEnum)tao->subset_type, (PetscEnum *)&tao->subset_type, NULL));
562a7e14dcfSSatish Balay
5630f0abf79SStefano Zampini if (tao->ksp) {
5640f0abf79SStefano Zampini PetscCall(PetscOptionsBool("-tao_ksp_ew", "Use Eisentat-Walker linear system convergence test", "TaoKSPSetUseEW", tao->ksp_ewconv, &tao->ksp_ewconv, NULL));
5650f0abf79SStefano Zampini PetscCall(TaoKSPSetUseEW(tao, tao->ksp_ewconv));
5660f0abf79SStefano Zampini }
5670f0abf79SStefano Zampini
568dbbe0bcdSBarry Smith PetscTryTypeMethod(tao, setfromoptions, PetscOptionsObject);
56960b70c5cSStefano Zampini
57060b70c5cSStefano Zampini /* process any options handlers added with PetscObjectAddOptionsHandler() */
57160b70c5cSStefano Zampini PetscCall(PetscObjectProcessOptionsHandlers((PetscObject)tao, PetscOptionsObject));
572d0609cedSBarry Smith PetscOptionsEnd();
57360b70c5cSStefano Zampini
57460b70c5cSStefano Zampini if (tao->linesearch) PetscCall(TaoLineSearchSetFromOptions(tao->linesearch));
5753ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
576a7e14dcfSSatish Balay }
577a7e14dcfSSatish Balay
578ffeef943SBarry Smith /*@
57947450a7bSBarry Smith TaoViewFromOptions - View a `Tao` object based on values in the options database
580fe2efc57SMark
581c3339decSBarry Smith Collective
582fe2efc57SMark
583fe2efc57SMark Input Parameters:
58447450a7bSBarry Smith + A - the `Tao` context
58547450a7bSBarry Smith . obj - Optional object that provides the prefix for the options database
586736c3998SJose E. Roman - name - command line option
587fe2efc57SMark
588fe2efc57SMark Level: intermediate
58967be906fSBarry Smith
5901cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoView`, `PetscObjectViewFromOptions()`, `TaoCreate()`
591fe2efc57SMark @*/
TaoViewFromOptions(Tao A,PetscObject obj,const char name[])592d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoViewFromOptions(Tao A, PetscObject obj, const char name[])
593d71ae5a4SJacob Faibussowitsch {
594fe2efc57SMark PetscFunctionBegin;
595fe2efc57SMark PetscValidHeaderSpecific(A, TAO_CLASSID, 1);
5969566063dSJacob Faibussowitsch PetscCall(PetscObjectViewFromOptions((PetscObject)A, obj, name));
5973ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
598fe2efc57SMark }
599fe2efc57SMark
600ffeef943SBarry Smith /*@
60147450a7bSBarry Smith TaoView - Prints information about the `Tao` object
602a7e14dcfSSatish Balay
603c3339decSBarry Smith Collective
604a7e14dcfSSatish Balay
605a7e14dcfSSatish Balay Input Parameters:
60647450a7bSBarry Smith + tao - the `Tao` context
607a7e14dcfSSatish Balay - viewer - visualization context
608a7e14dcfSSatish Balay
609a7e14dcfSSatish Balay Options Database Key:
61065ba42b6SBarry Smith . -tao_view - Calls `TaoView()` at the end of `TaoSolve()`
611a7e14dcfSSatish Balay
61267be906fSBarry Smith Level: beginner
61367be906fSBarry Smith
614a7e14dcfSSatish Balay Notes:
615a7e14dcfSSatish Balay The available visualization contexts include
61665ba42b6SBarry Smith + `PETSC_VIEWER_STDOUT_SELF` - standard output (default)
61765ba42b6SBarry Smith - `PETSC_VIEWER_STDOUT_WORLD` - synchronized standard
618a7e14dcfSSatish Balay output where only the first processor opens
619a7e14dcfSSatish Balay the file. All other processors send their
620a7e14dcfSSatish Balay data to the first processor to print.
621a7e14dcfSSatish Balay
6221cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `PetscViewerASCIIOpen()`
623a7e14dcfSSatish Balay @*/
TaoView(Tao tao,PetscViewer viewer)624d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoView(Tao tao, PetscViewer viewer)
625d71ae5a4SJacob Faibussowitsch {
626a7e14dcfSSatish Balay PetscBool isascii, isstring;
627b625d6c7SJed Brown TaoType type;
62847a47007SBarry Smith
629a7e14dcfSSatish Balay PetscFunctionBegin;
630441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
63148a46eb9SPierre Jolivet if (!viewer) PetscCall(PetscViewerASCIIGetStdout(((PetscObject)tao)->comm, &viewer));
632a7e14dcfSSatish Balay PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
633a7e14dcfSSatish Balay PetscCheckSameComm(tao, 1, viewer, 2);
634a7e14dcfSSatish Balay
6359566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
6369566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERSTRING, &isstring));
637a7e14dcfSSatish Balay if (isascii) {
6389566063dSJacob Faibussowitsch PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)tao, viewer));
639a7e14dcfSSatish Balay
6409566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPushTab(viewer));
641606f75f6SBarry Smith PetscTryTypeMethod(tao, view, viewer);
642606f75f6SBarry Smith if (tao->linesearch) PetscCall(TaoLineSearchView(tao->linesearch, viewer));
643a7e14dcfSSatish Balay if (tao->ksp) {
6449566063dSJacob Faibussowitsch PetscCall(KSPView(tao->ksp, viewer));
64563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "total KSP iterations: %" PetscInt_FMT "\n", tao->ksp_tot_its));
646a7e14dcfSSatish Balay }
64719b5c101SAlp Dener
64848a46eb9SPierre Jolivet if (tao->XL || tao->XU) PetscCall(PetscViewerASCIIPrintf(viewer, "Active Set subset type: %s\n", TaoSubSetTypes[tao->subset_type]));
649a7e14dcfSSatish Balay
6509566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "convergence tolerances: gatol=%g,", (double)tao->gatol));
651606f75f6SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " grtol=%g,", (double)tao->grtol));
6529566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " steptol=%g,", (double)tao->steptol));
6539566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " gttol=%g\n", (double)tao->gttol));
6549566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Residual in Function/Gradient:=%g\n", (double)tao->residual));
655a7e14dcfSSatish Balay
6566246e8cdSAlp Dener if (tao->constrained) {
6579566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "convergence tolerances:"));
6589566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " catol=%g,", (double)tao->catol));
6599566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " crtol=%g\n", (double)tao->crtol));
6609566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Residual in Constraints:=%g\n", (double)tao->cnorm));
661a7e14dcfSSatish Balay }
662a7e14dcfSSatish Balay
663a7e14dcfSSatish Balay if (tao->trust < tao->steptol) {
6649566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "convergence tolerances: steptol=%g\n", (double)tao->steptol));
6659566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Final trust region radius:=%g\n", (double)tao->trust));
666a7e14dcfSSatish Balay }
667a7e14dcfSSatish Balay
66848a46eb9SPierre Jolivet if (tao->fmin > -1.e25) PetscCall(PetscViewerASCIIPrintf(viewer, "convergence tolerances: function minimum=%g\n", (double)tao->fmin));
6699566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Objective value=%g\n", (double)tao->fc));
670a7e14dcfSSatish Balay
67163a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "total number of iterations=%" PetscInt_FMT ", ", tao->niter));
67263a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " (max: %" PetscInt_FMT ")\n", tao->max_it));
673a7e14dcfSSatish Balay
674a7e14dcfSSatish Balay if (tao->nfuncs > 0) {
67563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "total number of function evaluations=%" PetscInt_FMT ",", tao->nfuncs));
676606f75f6SBarry Smith if (tao->max_funcs == PETSC_UNLIMITED) PetscCall(PetscViewerASCIIPrintf(viewer, " (max: unlimited)\n"));
677606f75f6SBarry Smith else PetscCall(PetscViewerASCIIPrintf(viewer, " (max: %" PetscInt_FMT ")\n", tao->max_funcs));
678a7e14dcfSSatish Balay }
679a7e14dcfSSatish Balay if (tao->ngrads > 0) {
68063a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "total number of gradient evaluations=%" PetscInt_FMT ",", tao->ngrads));
681606f75f6SBarry Smith if (tao->max_funcs == PETSC_UNLIMITED) PetscCall(PetscViewerASCIIPrintf(viewer, " (max: unlimited)\n"));
682606f75f6SBarry Smith else PetscCall(PetscViewerASCIIPrintf(viewer, " (max: %" PetscInt_FMT ")\n", tao->max_funcs));
683a7e14dcfSSatish Balay }
684a7e14dcfSSatish Balay if (tao->nfuncgrads > 0) {
68563a3b9bcSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "total number of function/gradient evaluations=%" PetscInt_FMT ",", tao->nfuncgrads));
686606f75f6SBarry Smith if (tao->max_funcs == PETSC_UNLIMITED) PetscCall(PetscViewerASCIIPrintf(viewer, " (max: unlimited)\n"));
687606f75f6SBarry Smith else PetscCall(PetscViewerASCIIPrintf(viewer, " (max: %" PetscInt_FMT ")\n", tao->max_funcs));
688a7e14dcfSSatish Balay }
68948a46eb9SPierre Jolivet if (tao->nhess > 0) PetscCall(PetscViewerASCIIPrintf(viewer, "total number of Hessian evaluations=%" PetscInt_FMT "\n", tao->nhess));
69048a46eb9SPierre Jolivet if (tao->nconstraints > 0) PetscCall(PetscViewerASCIIPrintf(viewer, "total number of constraint function evaluations=%" PetscInt_FMT "\n", tao->nconstraints));
69148a46eb9SPierre Jolivet if (tao->njac > 0) PetscCall(PetscViewerASCIIPrintf(viewer, "total number of Jacobian evaluations=%" PetscInt_FMT "\n", tao->njac));
692a7e14dcfSSatish Balay
693a7e14dcfSSatish Balay if (tao->reason > 0) {
6949566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Solution converged: "));
695a7e14dcfSSatish Balay switch (tao->reason) {
696d71ae5a4SJacob Faibussowitsch case TAO_CONVERGED_GATOL:
697d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " ||g(X)|| <= gatol\n"));
698d71ae5a4SJacob Faibussowitsch break;
699d71ae5a4SJacob Faibussowitsch case TAO_CONVERGED_GRTOL:
700d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " ||g(X)||/|f(X)| <= grtol\n"));
701d71ae5a4SJacob Faibussowitsch break;
702d71ae5a4SJacob Faibussowitsch case TAO_CONVERGED_GTTOL:
703d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " ||g(X)||/||g(X0)|| <= gttol\n"));
704d71ae5a4SJacob Faibussowitsch break;
705d71ae5a4SJacob Faibussowitsch case TAO_CONVERGED_STEPTOL:
706d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Steptol -- step size small\n"));
707d71ae5a4SJacob Faibussowitsch break;
708d71ae5a4SJacob Faibussowitsch case TAO_CONVERGED_MINF:
709d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Minf -- f < fmin\n"));
710d71ae5a4SJacob Faibussowitsch break;
711d71ae5a4SJacob Faibussowitsch case TAO_CONVERGED_USER:
712d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " User Terminated\n"));
713d71ae5a4SJacob Faibussowitsch break;
714d71ae5a4SJacob Faibussowitsch default:
715606f75f6SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " %d\n", tao->reason));
716d71ae5a4SJacob Faibussowitsch break;
717a7e14dcfSSatish Balay }
718606f75f6SBarry Smith } else if (tao->reason == TAO_CONTINUE_ITERATING) {
719606f75f6SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Solver never run\n"));
720a7e14dcfSSatish Balay } else {
721606f75f6SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, "Solver failed: "));
722a7e14dcfSSatish Balay switch (tao->reason) {
723d71ae5a4SJacob Faibussowitsch case TAO_DIVERGED_MAXITS:
724d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Maximum Iterations\n"));
725d71ae5a4SJacob Faibussowitsch break;
726d71ae5a4SJacob Faibussowitsch case TAO_DIVERGED_NAN:
72776c63389SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " NAN or infinity encountered\n"));
728d71ae5a4SJacob Faibussowitsch break;
729d71ae5a4SJacob Faibussowitsch case TAO_DIVERGED_MAXFCN:
730d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Maximum Function Evaluations\n"));
731d71ae5a4SJacob Faibussowitsch break;
732d71ae5a4SJacob Faibussowitsch case TAO_DIVERGED_LS_FAILURE:
733d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Line Search Failure\n"));
734d71ae5a4SJacob Faibussowitsch break;
735d71ae5a4SJacob Faibussowitsch case TAO_DIVERGED_TR_REDUCTION:
736d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Trust Region too small\n"));
737d71ae5a4SJacob Faibussowitsch break;
738d71ae5a4SJacob Faibussowitsch case TAO_DIVERGED_USER:
739d71ae5a4SJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " User Terminated\n"));
740d71ae5a4SJacob Faibussowitsch break;
741d71ae5a4SJacob Faibussowitsch default:
742606f75f6SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " %d\n", tao->reason));
743d71ae5a4SJacob Faibussowitsch break;
744a7e14dcfSSatish Balay }
745a7e14dcfSSatish Balay }
7469566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPopTab(viewer));
747a7e14dcfSSatish Balay } else if (isstring) {
7489566063dSJacob Faibussowitsch PetscCall(TaoGetType(tao, &type));
7499566063dSJacob Faibussowitsch PetscCall(PetscViewerStringSPrintf(viewer, " %-3.3s", type));
750a7e14dcfSSatish Balay }
7513ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
752a7e14dcfSSatish Balay }
753a7e14dcfSSatish Balay
754a7e14dcfSSatish Balay /*@
755414d97d3SAlp Dener TaoSetRecycleHistory - Sets the boolean flag to enable/disable re-using
75665ba42b6SBarry Smith iterate information from the previous `TaoSolve()`. This feature is disabled by
757414d97d3SAlp Dener default.
758414d97d3SAlp Dener
75967be906fSBarry Smith Logically Collective
76067be906fSBarry Smith
76167be906fSBarry Smith Input Parameters:
76247450a7bSBarry Smith + tao - the `Tao` context
76367be906fSBarry Smith - recycle - boolean flag
76467be906fSBarry Smith
76547450a7bSBarry Smith Options Database Key:
76667be906fSBarry Smith . -tao_recycle_history <true,false> - reuse the history
76767be906fSBarry Smith
76867be906fSBarry Smith Level: intermediate
76967be906fSBarry Smith
77067be906fSBarry Smith Notes:
77165ba42b6SBarry Smith For conjugate gradient methods (`TAOBNCG`), this re-uses the latest search direction
77265ba42b6SBarry Smith from the previous `TaoSolve()` call when computing the first search direction in a
773414d97d3SAlp Dener new solution. By default, CG methods set the first search direction to the
774414d97d3SAlp Dener negative gradient.
775414d97d3SAlp Dener
77665ba42b6SBarry Smith For quasi-Newton family of methods (`TAOBQNLS`, `TAOBQNKLS`, `TAOBQNKTR`, `TAOBQNKTL`), this re-uses
77765ba42b6SBarry Smith the accumulated quasi-Newton Hessian approximation from the previous `TaoSolve()`
778414d97d3SAlp Dener call. By default, QN family of methods reset the initial Hessian approximation to
779414d97d3SAlp Dener the identity matrix.
780414d97d3SAlp Dener
781414d97d3SAlp Dener For any other algorithm, this setting has no effect.
782414d97d3SAlp Dener
7831cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetRecycleHistory()`, `TAOBNCG`, `TAOBQNLS`, `TAOBQNKLS`, `TAOBQNKTR`, `TAOBQNKTL`
784414d97d3SAlp Dener @*/
TaoSetRecycleHistory(Tao tao,PetscBool recycle)785d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetRecycleHistory(Tao tao, PetscBool recycle)
786d71ae5a4SJacob Faibussowitsch {
787414d97d3SAlp Dener PetscFunctionBegin;
788414d97d3SAlp Dener PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
78994511df7SStefano Zampini PetscValidLogicalCollectiveBool(tao, recycle, 2);
790414d97d3SAlp Dener tao->recycle = recycle;
7913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
792414d97d3SAlp Dener }
793414d97d3SAlp Dener
794414d97d3SAlp Dener /*@
795414d97d3SAlp Dener TaoGetRecycleHistory - Retrieve the boolean flag for re-using iterate information
79665ba42b6SBarry Smith from the previous `TaoSolve()`. This feature is disabled by default.
797414d97d3SAlp Dener
79867be906fSBarry Smith Logically Collective
799414d97d3SAlp Dener
80047450a7bSBarry Smith Input Parameter:
80147450a7bSBarry Smith . tao - the `Tao` context
802414d97d3SAlp Dener
80347450a7bSBarry Smith Output Parameter:
804147403d9SBarry Smith . recycle - boolean flag
805414d97d3SAlp Dener
806414d97d3SAlp Dener Level: intermediate
807414d97d3SAlp Dener
8081cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetRecycleHistory()`, `TAOBNCG`, `TAOBQNLS`, `TAOBQNKLS`, `TAOBQNKTR`, `TAOBQNKTL`
809414d97d3SAlp Dener @*/
TaoGetRecycleHistory(Tao tao,PetscBool * recycle)810d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetRecycleHistory(Tao tao, PetscBool *recycle)
811d71ae5a4SJacob Faibussowitsch {
812414d97d3SAlp Dener PetscFunctionBegin;
813414d97d3SAlp Dener PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
8144f572ea9SToby Isaac PetscAssertPointer(recycle, 2);
815414d97d3SAlp Dener *recycle = tao->recycle;
8163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
817414d97d3SAlp Dener }
818414d97d3SAlp Dener
819414d97d3SAlp Dener /*@
82047450a7bSBarry Smith TaoSetTolerances - Sets parameters used in `TaoSolve()` convergence tests
821a7e14dcfSSatish Balay
82267be906fSBarry Smith Logically Collective
823a7e14dcfSSatish Balay
824a7e14dcfSSatish Balay Input Parameters:
82547450a7bSBarry Smith + tao - the `Tao` context
826a7e14dcfSSatish Balay . gatol - stop if norm of gradient is less than this
827a7e14dcfSSatish Balay . grtol - stop if relative norm of gradient is less than this
828a7e14dcfSSatish Balay - gttol - stop if norm of gradient is reduced by this factor
829a7e14dcfSSatish Balay
830a7e14dcfSSatish Balay Options Database Keys:
831e52336cbSBarry Smith + -tao_gatol <gatol> - Sets gatol
832a7e14dcfSSatish Balay . -tao_grtol <grtol> - Sets grtol
833a7e14dcfSSatish Balay - -tao_gttol <gttol> - Sets gttol
834a7e14dcfSSatish Balay
8353b242c63SJacob Faibussowitsch Stopping Criteria\:
83667be906fSBarry Smith .vb
83767be906fSBarry Smith ||g(X)|| <= gatol
83867be906fSBarry Smith ||g(X)|| / |f(X)| <= grtol
83967be906fSBarry Smith ||g(X)|| / ||g(X0)|| <= gttol
84067be906fSBarry Smith .ve
841a7e14dcfSSatish Balay
842a7e14dcfSSatish Balay Level: beginner
843a7e14dcfSSatish Balay
844606f75f6SBarry Smith Notes:
845606f75f6SBarry Smith Use `PETSC_CURRENT` to leave one or more tolerances unchanged.
846606f75f6SBarry Smith
847606f75f6SBarry Smith Use `PETSC_DETERMINE` to set one or more tolerances to their values when the `tao`object's type was set
848606f75f6SBarry Smith
849606f75f6SBarry Smith Fortran Note:
850606f75f6SBarry Smith Use `PETSC_CURRENT_REAL` or `PETSC_DETERMINE_REAL`
851a7e14dcfSSatish Balay
8521cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoConvergedReason`, `TaoGetTolerances()`
853a7e14dcfSSatish Balay @*/
TaoSetTolerances(Tao tao,PetscReal gatol,PetscReal grtol,PetscReal gttol)854d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetTolerances(Tao tao, PetscReal gatol, PetscReal grtol, PetscReal gttol)
855d71ae5a4SJacob Faibussowitsch {
856a7e14dcfSSatish Balay PetscFunctionBegin;
857441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
85894511df7SStefano Zampini PetscValidLogicalCollectiveReal(tao, gatol, 2);
85994511df7SStefano Zampini PetscValidLogicalCollectiveReal(tao, grtol, 3);
86094511df7SStefano Zampini PetscValidLogicalCollectiveReal(tao, gttol, 4);
861a7e14dcfSSatish Balay
862606f75f6SBarry Smith if (gatol == (PetscReal)PETSC_DETERMINE) {
863606f75f6SBarry Smith tao->gatol = tao->default_gatol;
864606f75f6SBarry Smith } else if (gatol != (PetscReal)PETSC_CURRENT) {
865606f75f6SBarry Smith PetscCheck(gatol >= 0, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_OUTOFRANGE, "Negative gatol not allowed");
866606f75f6SBarry Smith tao->gatol = gatol;
867a7e14dcfSSatish Balay }
868a7e14dcfSSatish Balay
869606f75f6SBarry Smith if (grtol == (PetscReal)PETSC_DETERMINE) {
870606f75f6SBarry Smith tao->grtol = tao->default_grtol;
871606f75f6SBarry Smith } else if (grtol != (PetscReal)PETSC_CURRENT) {
872606f75f6SBarry Smith PetscCheck(grtol >= 0, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_OUTOFRANGE, "Negative grtol not allowed");
873606f75f6SBarry Smith tao->grtol = grtol;
874a7e14dcfSSatish Balay }
875a7e14dcfSSatish Balay
876606f75f6SBarry Smith if (gttol == (PetscReal)PETSC_DETERMINE) {
877606f75f6SBarry Smith tao->gttol = tao->default_gttol;
878606f75f6SBarry Smith } else if (gttol != (PetscReal)PETSC_CURRENT) {
879606f75f6SBarry Smith PetscCheck(gttol >= 0, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_OUTOFRANGE, "Negative gttol not allowed");
880606f75f6SBarry Smith tao->gttol = gttol;
881a7e14dcfSSatish Balay }
8823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
883a7e14dcfSSatish Balay }
884a7e14dcfSSatish Balay
885a7e14dcfSSatish Balay /*@
88647450a7bSBarry Smith TaoSetConstraintTolerances - Sets constraint tolerance parameters used in `TaoSolve()` convergence tests
887a7e14dcfSSatish Balay
88867be906fSBarry Smith Logically Collective
889a7e14dcfSSatish Balay
890a7e14dcfSSatish Balay Input Parameters:
89147450a7bSBarry Smith + tao - the `Tao` context
892606f75f6SBarry Smith . catol - absolute constraint tolerance, constraint norm must be less than `catol` for used for `gatol` convergence criteria
893606f75f6SBarry Smith - crtol - relative constraint tolerance, constraint norm must be less than `crtol` for used for `gatol`, `gttol` convergence criteria
894a7e14dcfSSatish Balay
895a7e14dcfSSatish Balay Options Database Keys:
896a7e14dcfSSatish Balay + -tao_catol <catol> - Sets catol
897a7e14dcfSSatish Balay - -tao_crtol <crtol> - Sets crtol
898a7e14dcfSSatish Balay
899a7e14dcfSSatish Balay Level: intermediate
900a7e14dcfSSatish Balay
90167be906fSBarry Smith Notes:
902606f75f6SBarry Smith Use `PETSC_CURRENT` to leave one or tolerance unchanged.
903606f75f6SBarry Smith
904606f75f6SBarry Smith Use `PETSC_DETERMINE` to set one or more tolerances to their values when the `tao` object's type was set
905606f75f6SBarry Smith
906606f75f6SBarry Smith Fortran Note:
907606f75f6SBarry Smith Use `PETSC_CURRENT_REAL` or `PETSC_DETERMINE_REAL`
908a7e14dcfSSatish Balay
9091cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoConvergedReason`, `TaoGetTolerances()`, `TaoGetConstraintTolerances()`, `TaoSetTolerances()`
910a7e14dcfSSatish Balay @*/
TaoSetConstraintTolerances(Tao tao,PetscReal catol,PetscReal crtol)911d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetConstraintTolerances(Tao tao, PetscReal catol, PetscReal crtol)
912d71ae5a4SJacob Faibussowitsch {
913a7e14dcfSSatish Balay PetscFunctionBegin;
914441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
91594511df7SStefano Zampini PetscValidLogicalCollectiveReal(tao, catol, 2);
91694511df7SStefano Zampini PetscValidLogicalCollectiveReal(tao, crtol, 3);
917a7e14dcfSSatish Balay
918606f75f6SBarry Smith if (catol == (PetscReal)PETSC_DETERMINE) {
919606f75f6SBarry Smith tao->catol = tao->default_catol;
920606f75f6SBarry Smith } else if (catol != (PetscReal)PETSC_CURRENT) {
921606f75f6SBarry Smith PetscCheck(catol >= 0, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_OUTOFRANGE, "Negative catol not allowed");
922606f75f6SBarry Smith tao->catol = catol;
923a7e14dcfSSatish Balay }
924a7e14dcfSSatish Balay
925606f75f6SBarry Smith if (crtol == (PetscReal)PETSC_DETERMINE) {
926606f75f6SBarry Smith tao->crtol = tao->default_crtol;
927606f75f6SBarry Smith } else if (crtol != (PetscReal)PETSC_CURRENT) {
928606f75f6SBarry Smith PetscCheck(crtol >= 0, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_OUTOFRANGE, "Negative crtol not allowed");
929606f75f6SBarry Smith tao->crtol = crtol;
930a7e14dcfSSatish Balay }
9313ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
932a7e14dcfSSatish Balay }
933a7e14dcfSSatish Balay
93458417fe7SBarry Smith /*@
93547450a7bSBarry Smith TaoGetConstraintTolerances - Gets constraint tolerance parameters used in `TaoSolve()` convergence tests
93658417fe7SBarry Smith
93767be906fSBarry Smith Not Collective
93858417fe7SBarry Smith
93958417fe7SBarry Smith Input Parameter:
94047450a7bSBarry Smith . tao - the `Tao` context
94158417fe7SBarry Smith
942d8d19677SJose E. Roman Output Parameters:
943606f75f6SBarry Smith + catol - absolute constraint tolerance, constraint norm must be less than `catol` for used for `gatol` convergence criteria
944606f75f6SBarry Smith - crtol - relative constraint tolerance, constraint norm must be less than `crtol` for used for `gatol`, `gttol` convergence criteria
94558417fe7SBarry Smith
94658417fe7SBarry Smith Level: intermediate
94758417fe7SBarry Smith
9481cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoConvergedReasons`,`TaoGetTolerances()`, `TaoSetTolerances()`, `TaoSetConstraintTolerances()`
94958417fe7SBarry Smith @*/
TaoGetConstraintTolerances(Tao tao,PetscReal * catol,PetscReal * crtol)950d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetConstraintTolerances(Tao tao, PetscReal *catol, PetscReal *crtol)
951d71ae5a4SJacob Faibussowitsch {
95258417fe7SBarry Smith PetscFunctionBegin;
95358417fe7SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
95458417fe7SBarry Smith if (catol) *catol = tao->catol;
95558417fe7SBarry Smith if (crtol) *crtol = tao->crtol;
9563ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
95758417fe7SBarry Smith }
95858417fe7SBarry Smith
959a7e14dcfSSatish Balay /*@
960a7e14dcfSSatish Balay TaoSetFunctionLowerBound - Sets a bound on the solution objective value.
961a7e14dcfSSatish Balay When an approximate solution with an objective value below this number
962a7e14dcfSSatish Balay has been found, the solver will terminate.
963a7e14dcfSSatish Balay
964c3339decSBarry Smith Logically Collective
965a7e14dcfSSatish Balay
966a7e14dcfSSatish Balay Input Parameters:
967441846f8SBarry Smith + tao - the Tao solver context
968a7e14dcfSSatish Balay - fmin - the tolerance
969a7e14dcfSSatish Balay
97047450a7bSBarry Smith Options Database Key:
971a7e14dcfSSatish Balay . -tao_fmin <fmin> - sets the minimum function value
972a7e14dcfSSatish Balay
973a7e14dcfSSatish Balay Level: intermediate
974a7e14dcfSSatish Balay
9751cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoConvergedReason`, `TaoSetTolerances()`
976a7e14dcfSSatish Balay @*/
TaoSetFunctionLowerBound(Tao tao,PetscReal fmin)977d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetFunctionLowerBound(Tao tao, PetscReal fmin)
978d71ae5a4SJacob Faibussowitsch {
979a7e14dcfSSatish Balay PetscFunctionBegin;
980441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
98194511df7SStefano Zampini PetscValidLogicalCollectiveReal(tao, fmin, 2);
982a7e14dcfSSatish Balay tao->fmin = fmin;
9833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
984a7e14dcfSSatish Balay }
985a7e14dcfSSatish Balay
986a7e14dcfSSatish Balay /*@
9878e96d397SJason Sarich TaoGetFunctionLowerBound - Gets the bound on the solution objective value.
988a7e14dcfSSatish Balay When an approximate solution with an objective value below this number
989a7e14dcfSSatish Balay has been found, the solver will terminate.
990a7e14dcfSSatish Balay
99167be906fSBarry Smith Not Collective
992a7e14dcfSSatish Balay
99347450a7bSBarry Smith Input Parameter:
99447450a7bSBarry Smith . tao - the `Tao` solver context
995a7e14dcfSSatish Balay
99647450a7bSBarry Smith Output Parameter:
997a7e14dcfSSatish Balay . fmin - the minimum function value
998a7e14dcfSSatish Balay
999a7e14dcfSSatish Balay Level: intermediate
1000a7e14dcfSSatish Balay
10011cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoConvergedReason`, `TaoSetFunctionLowerBound()`
1002a7e14dcfSSatish Balay @*/
TaoGetFunctionLowerBound(Tao tao,PetscReal * fmin)1003d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetFunctionLowerBound(Tao tao, PetscReal *fmin)
1004d71ae5a4SJacob Faibussowitsch {
1005a7e14dcfSSatish Balay PetscFunctionBegin;
1006441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
10074f572ea9SToby Isaac PetscAssertPointer(fmin, 2);
1008a7e14dcfSSatish Balay *fmin = tao->fmin;
10093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1010a7e14dcfSSatish Balay }
1011a7e14dcfSSatish Balay
1012a7e14dcfSSatish Balay /*@
101347450a7bSBarry Smith TaoSetMaximumFunctionEvaluations - Sets a maximum number of function evaluations allowed for a `TaoSolve()`.
1014a7e14dcfSSatish Balay
1015c3339decSBarry Smith Logically Collective
1016a7e14dcfSSatish Balay
1017a7e14dcfSSatish Balay Input Parameters:
101847450a7bSBarry Smith + tao - the `Tao` solver context
1019606f75f6SBarry Smith - nfcn - the maximum number of function evaluations (>=0), use `PETSC_UNLIMITED` to have no bound
1020a7e14dcfSSatish Balay
102147450a7bSBarry Smith Options Database Key:
1022a7e14dcfSSatish Balay . -tao_max_funcs <nfcn> - sets the maximum number of function evaluations
1023a7e14dcfSSatish Balay
1024a7e14dcfSSatish Balay Level: intermediate
1025a7e14dcfSSatish Balay
1026606f75f6SBarry Smith Note:
1027606f75f6SBarry Smith Use `PETSC_DETERMINE` to use the default maximum number of function evaluations that was set when the object type was set.
1028606f75f6SBarry Smith
1029606f75f6SBarry Smith Developer Note:
1030606f75f6SBarry Smith Deprecated support for an unlimited number of function evaluations by passing a negative value.
1031606f75f6SBarry Smith
10321cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetTolerances()`, `TaoSetMaximumIterations()`
1033a7e14dcfSSatish Balay @*/
TaoSetMaximumFunctionEvaluations(Tao tao,PetscInt nfcn)1034d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetMaximumFunctionEvaluations(Tao tao, PetscInt nfcn)
1035d71ae5a4SJacob Faibussowitsch {
1036a7e14dcfSSatish Balay PetscFunctionBegin;
1037441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
103894511df7SStefano Zampini PetscValidLogicalCollectiveInt(tao, nfcn, 2);
1039606f75f6SBarry Smith if (nfcn == PETSC_DETERMINE) {
1040606f75f6SBarry Smith tao->max_funcs = tao->default_max_funcs;
1041606f75f6SBarry Smith } else if (nfcn == PETSC_UNLIMITED || nfcn < 0) {
1042606f75f6SBarry Smith tao->max_funcs = PETSC_UNLIMITED;
10439371c9d4SSatish Balay } else {
1044d7c1f440SPierre Jolivet PetscCheck(nfcn >= 0, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_OUTOFRANGE, "Maximum number of function evaluations must be positive");
1045606f75f6SBarry Smith tao->max_funcs = nfcn;
10469371c9d4SSatish Balay }
10473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1048a7e14dcfSSatish Balay }
1049a7e14dcfSSatish Balay
1050a7e14dcfSSatish Balay /*@
105147450a7bSBarry Smith TaoGetMaximumFunctionEvaluations - Gets a maximum number of function evaluations allowed for a `TaoSolve()`
1052a7e14dcfSSatish Balay
1053c3339decSBarry Smith Logically Collective
1054a7e14dcfSSatish Balay
105547450a7bSBarry Smith Input Parameter:
105647450a7bSBarry Smith . tao - the `Tao` solver context
1057a7e14dcfSSatish Balay
105847450a7bSBarry Smith Output Parameter:
1059a7e14dcfSSatish Balay . nfcn - the maximum number of function evaluations
1060a7e14dcfSSatish Balay
1061a7e14dcfSSatish Balay Level: intermediate
1062a7e14dcfSSatish Balay
10631cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetMaximumFunctionEvaluations()`, `TaoGetMaximumIterations()`
1064a7e14dcfSSatish Balay @*/
TaoGetMaximumFunctionEvaluations(Tao tao,PetscInt * nfcn)1065d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetMaximumFunctionEvaluations(Tao tao, PetscInt *nfcn)
1066d71ae5a4SJacob Faibussowitsch {
1067a7e14dcfSSatish Balay PetscFunctionBegin;
1068441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
10694f572ea9SToby Isaac PetscAssertPointer(nfcn, 2);
1070a7e14dcfSSatish Balay *nfcn = tao->max_funcs;
10713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1072a7e14dcfSSatish Balay }
1073a7e14dcfSSatish Balay
1074770232b9SCe Qin /*@
107547450a7bSBarry Smith TaoGetCurrentFunctionEvaluations - Get current number of function evaluations used by a `Tao` object
1076770232b9SCe Qin
1077770232b9SCe Qin Not Collective
1078770232b9SCe Qin
107947450a7bSBarry Smith Input Parameter:
108047450a7bSBarry Smith . tao - the `Tao` solver context
1081770232b9SCe Qin
108247450a7bSBarry Smith Output Parameter:
108394511df7SStefano Zampini . nfuncs - the current number of function evaluations (maximum between gradient and function evaluations)
1084770232b9SCe Qin
1085770232b9SCe Qin Level: intermediate
1086770232b9SCe Qin
10871cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetMaximumFunctionEvaluations()`, `TaoGetMaximumFunctionEvaluations()`, `TaoGetMaximumIterations()`
1088770232b9SCe Qin @*/
TaoGetCurrentFunctionEvaluations(Tao tao,PetscInt * nfuncs)1089d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetCurrentFunctionEvaluations(Tao tao, PetscInt *nfuncs)
1090d71ae5a4SJacob Faibussowitsch {
1091770232b9SCe Qin PetscFunctionBegin;
1092770232b9SCe Qin PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
10934f572ea9SToby Isaac PetscAssertPointer(nfuncs, 2);
1094770232b9SCe Qin *nfuncs = PetscMax(tao->nfuncs, tao->nfuncgrads);
10953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1096770232b9SCe Qin }
1097770232b9SCe Qin
1098a7e14dcfSSatish Balay /*@
109947450a7bSBarry Smith TaoSetMaximumIterations - Sets a maximum number of iterates to be used in `TaoSolve()`
1100a7e14dcfSSatish Balay
1101c3339decSBarry Smith Logically Collective
1102a7e14dcfSSatish Balay
1103a7e14dcfSSatish Balay Input Parameters:
110447450a7bSBarry Smith + tao - the `Tao` solver context
1105606f75f6SBarry Smith - maxits - the maximum number of iterates (>=0), use `PETSC_UNLIMITED` to have no bound
1106a7e14dcfSSatish Balay
110747450a7bSBarry Smith Options Database Key:
1108a7e14dcfSSatish Balay . -tao_max_it <its> - sets the maximum number of iterations
1109a7e14dcfSSatish Balay
1110a7e14dcfSSatish Balay Level: intermediate
1111a7e14dcfSSatish Balay
1112606f75f6SBarry Smith Note:
1113606f75f6SBarry Smith Use `PETSC_DETERMINE` to use the default maximum number of iterations that was set when the object's type was set.
1114606f75f6SBarry Smith
1115606f75f6SBarry Smith Developer Note:
1116606f75f6SBarry Smith DeprAlso accepts the deprecated negative values to indicate no limit
1117606f75f6SBarry Smith
11181cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetTolerances()`, `TaoSetMaximumFunctionEvaluations()`
1119a7e14dcfSSatish Balay @*/
TaoSetMaximumIterations(Tao tao,PetscInt maxits)1120d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetMaximumIterations(Tao tao, PetscInt maxits)
1121d71ae5a4SJacob Faibussowitsch {
1122a7e14dcfSSatish Balay PetscFunctionBegin;
1123441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
112494511df7SStefano Zampini PetscValidLogicalCollectiveInt(tao, maxits, 2);
1125606f75f6SBarry Smith if (maxits == PETSC_DETERMINE) {
1126606f75f6SBarry Smith tao->max_it = tao->default_max_it;
1127606f75f6SBarry Smith } else if (maxits == PETSC_UNLIMITED) {
11281690c2aeSBarry Smith tao->max_it = PETSC_INT_MAX;
1129606f75f6SBarry Smith } else {
1130d7c1f440SPierre Jolivet PetscCheck(maxits > 0, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_OUTOFRANGE, "Maximum number of iterations must be positive");
1131606f75f6SBarry Smith tao->max_it = maxits;
1132606f75f6SBarry Smith }
11333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1134a7e14dcfSSatish Balay }
1135a7e14dcfSSatish Balay
1136a7e14dcfSSatish Balay /*@
113765ba42b6SBarry Smith TaoGetMaximumIterations - Gets a maximum number of iterates that will be used
1138a7e14dcfSSatish Balay
1139a7e14dcfSSatish Balay Not Collective
1140a7e14dcfSSatish Balay
114147450a7bSBarry Smith Input Parameter:
114247450a7bSBarry Smith . tao - the `Tao` solver context
1143a7e14dcfSSatish Balay
114447450a7bSBarry Smith Output Parameter:
1145a7e14dcfSSatish Balay . maxits - the maximum number of iterates
1146a7e14dcfSSatish Balay
1147a7e14dcfSSatish Balay Level: intermediate
1148a7e14dcfSSatish Balay
11491cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetMaximumIterations()`, `TaoGetMaximumFunctionEvaluations()`
1150a7e14dcfSSatish Balay @*/
TaoGetMaximumIterations(Tao tao,PetscInt * maxits)1151d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetMaximumIterations(Tao tao, PetscInt *maxits)
1152d71ae5a4SJacob Faibussowitsch {
1153a7e14dcfSSatish Balay PetscFunctionBegin;
1154441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
11554f572ea9SToby Isaac PetscAssertPointer(maxits, 2);
1156a7e14dcfSSatish Balay *maxits = tao->max_it;
11573ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1158a7e14dcfSSatish Balay }
1159a7e14dcfSSatish Balay
1160a7e14dcfSSatish Balay /*@
1161a7e14dcfSSatish Balay TaoSetInitialTrustRegionRadius - Sets the initial trust region radius.
1162a7e14dcfSSatish Balay
116367be906fSBarry Smith Logically Collective
1164a7e14dcfSSatish Balay
1165d8d19677SJose E. Roman Input Parameters:
116647450a7bSBarry Smith + tao - a `Tao` optimization solver
1167a7e14dcfSSatish Balay - radius - the trust region radius
1168a7e14dcfSSatish Balay
1169a7e14dcfSSatish Balay Options Database Key:
1170a7e14dcfSSatish Balay . -tao_trust0 <t0> - sets initial trust region radius
1171a7e14dcfSSatish Balay
117247450a7bSBarry Smith Level: intermediate
117347450a7bSBarry Smith
1174606f75f6SBarry Smith Note:
1175606f75f6SBarry Smith Use `PETSC_DETERMINE` to use the default radius that was set when the object's type was set.
1176606f75f6SBarry Smith
11771cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetTrustRegionRadius()`, `TaoSetTrustRegionTolerance()`, `TAONTR`
1178a7e14dcfSSatish Balay @*/
TaoSetInitialTrustRegionRadius(Tao tao,PetscReal radius)1179d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetInitialTrustRegionRadius(Tao tao, PetscReal radius)
1180d71ae5a4SJacob Faibussowitsch {
1181a7e14dcfSSatish Balay PetscFunctionBegin;
1182441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
118394511df7SStefano Zampini PetscValidLogicalCollectiveReal(tao, radius, 2);
1184606f75f6SBarry Smith if (radius == PETSC_DETERMINE) {
1185606f75f6SBarry Smith tao->trust0 = tao->default_trust0;
1186606f75f6SBarry Smith } else {
1187606f75f6SBarry Smith PetscCheck(radius > 0, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_OUTOFRANGE, "Radius must be positive");
1188606f75f6SBarry Smith tao->trust0 = radius;
1189606f75f6SBarry Smith }
11903ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1191a7e14dcfSSatish Balay }
1192a7e14dcfSSatish Balay
1193a7e14dcfSSatish Balay /*@
119465ba42b6SBarry Smith TaoGetInitialTrustRegionRadius - Gets the initial trust region radius.
1195a7e14dcfSSatish Balay
1196a7e14dcfSSatish Balay Not Collective
1197a7e14dcfSSatish Balay
1198a7e14dcfSSatish Balay Input Parameter:
119947450a7bSBarry Smith . tao - a `Tao` optimization solver
1200a7e14dcfSSatish Balay
1201a7e14dcfSSatish Balay Output Parameter:
1202a7e14dcfSSatish Balay . radius - the trust region radius
1203a7e14dcfSSatish Balay
1204a7e14dcfSSatish Balay Level: intermediate
1205a7e14dcfSSatish Balay
12061cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetInitialTrustRegionRadius()`, `TaoGetCurrentTrustRegionRadius()`, `TAONTR`
1207a7e14dcfSSatish Balay @*/
TaoGetInitialTrustRegionRadius(Tao tao,PetscReal * radius)1208d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetInitialTrustRegionRadius(Tao tao, PetscReal *radius)
1209d71ae5a4SJacob Faibussowitsch {
1210a7e14dcfSSatish Balay PetscFunctionBegin;
1211441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
12124f572ea9SToby Isaac PetscAssertPointer(radius, 2);
1213a7e14dcfSSatish Balay *radius = tao->trust0;
12143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1215a7e14dcfSSatish Balay }
1216a7e14dcfSSatish Balay
1217a7e14dcfSSatish Balay /*@
1218a7e14dcfSSatish Balay TaoGetCurrentTrustRegionRadius - Gets the current trust region radius.
1219a7e14dcfSSatish Balay
1220a7e14dcfSSatish Balay Not Collective
1221a7e14dcfSSatish Balay
1222a7e14dcfSSatish Balay Input Parameter:
122347450a7bSBarry Smith . tao - a `Tao` optimization solver
1224a7e14dcfSSatish Balay
1225a7e14dcfSSatish Balay Output Parameter:
1226a7e14dcfSSatish Balay . radius - the trust region radius
1227a7e14dcfSSatish Balay
1228a7e14dcfSSatish Balay Level: intermediate
1229a7e14dcfSSatish Balay
12301cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetInitialTrustRegionRadius()`, `TaoGetInitialTrustRegionRadius()`, `TAONTR`
1231a7e14dcfSSatish Balay @*/
TaoGetCurrentTrustRegionRadius(Tao tao,PetscReal * radius)1232d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetCurrentTrustRegionRadius(Tao tao, PetscReal *radius)
1233d71ae5a4SJacob Faibussowitsch {
1234a7e14dcfSSatish Balay PetscFunctionBegin;
1235441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
12364f572ea9SToby Isaac PetscAssertPointer(radius, 2);
1237a7e14dcfSSatish Balay *radius = tao->trust;
12383ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1239a7e14dcfSSatish Balay }
1240a7e14dcfSSatish Balay
1241a7e14dcfSSatish Balay /*@
124247450a7bSBarry Smith TaoGetTolerances - gets the current values of some tolerances used for the convergence testing of `TaoSolve()`
1243a7e14dcfSSatish Balay
1244a7e14dcfSSatish Balay Not Collective
1245a7e14dcfSSatish Balay
1246f899ff85SJose E. Roman Input Parameter:
124747450a7bSBarry Smith . tao - the `Tao` context
1248a7e14dcfSSatish Balay
1249a7e14dcfSSatish Balay Output Parameters:
1250e52336cbSBarry Smith + gatol - stop if norm of gradient is less than this
1251a7e14dcfSSatish Balay . grtol - stop if relative norm of gradient is less than this
1252a7e14dcfSSatish Balay - gttol - stop if norm of gradient is reduced by a this factor
1253a7e14dcfSSatish Balay
1254a7e14dcfSSatish Balay Level: intermediate
1255a1cb98faSBarry Smith
1256a1cb98faSBarry Smith Note:
125747450a7bSBarry Smith `NULL` can be used as an argument if not all tolerances values are needed
1258a1cb98faSBarry Smith
12591cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetTolerances()`
1260a7e14dcfSSatish Balay @*/
TaoGetTolerances(Tao tao,PetscReal * gatol,PetscReal * grtol,PetscReal * gttol)1261d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetTolerances(Tao tao, PetscReal *gatol, PetscReal *grtol, PetscReal *gttol)
1262d71ae5a4SJacob Faibussowitsch {
1263a7e14dcfSSatish Balay PetscFunctionBegin;
1264441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1265a7e14dcfSSatish Balay if (gatol) *gatol = tao->gatol;
1266a7e14dcfSSatish Balay if (grtol) *grtol = tao->grtol;
1267a7e14dcfSSatish Balay if (gttol) *gttol = tao->gttol;
12683ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1269a7e14dcfSSatish Balay }
1270a7e14dcfSSatish Balay
1271a7e14dcfSSatish Balay /*@
1272a7e14dcfSSatish Balay TaoGetKSP - Gets the linear solver used by the optimization solver.
1273a7e14dcfSSatish Balay
1274a7e14dcfSSatish Balay Not Collective
1275a7e14dcfSSatish Balay
127647450a7bSBarry Smith Input Parameter:
127747450a7bSBarry Smith . tao - the `Tao` solver
1278a7e14dcfSSatish Balay
127947450a7bSBarry Smith Output Parameter:
128047450a7bSBarry Smith . ksp - the `KSP` linear solver used in the optimization solver
1281a7e14dcfSSatish Balay
1282a7e14dcfSSatish Balay Level: intermediate
1283a7e14dcfSSatish Balay
12841cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `KSP`
1285a7e14dcfSSatish Balay @*/
TaoGetKSP(Tao tao,KSP * ksp)1286d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetKSP(Tao tao, KSP *ksp)
1287d71ae5a4SJacob Faibussowitsch {
1288a7e14dcfSSatish Balay PetscFunctionBegin;
128994511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
12904f572ea9SToby Isaac PetscAssertPointer(ksp, 2);
1291a7e14dcfSSatish Balay *ksp = tao->ksp;
12923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1293a7e14dcfSSatish Balay }
1294a7e14dcfSSatish Balay
1295025e9500SJason Sarich /*@
1296025e9500SJason Sarich TaoGetLinearSolveIterations - Gets the total number of linear iterations
129747450a7bSBarry Smith used by the `Tao` solver
1298025e9500SJason Sarich
1299025e9500SJason Sarich Not Collective
1300025e9500SJason Sarich
1301025e9500SJason Sarich Input Parameter:
130247450a7bSBarry Smith . tao - the `Tao` context
1303025e9500SJason Sarich
1304025e9500SJason Sarich Output Parameter:
1305025e9500SJason Sarich . lits - number of linear iterations
1306025e9500SJason Sarich
1307025e9500SJason Sarich Level: intermediate
1308025e9500SJason Sarich
130947450a7bSBarry Smith Note:
131047450a7bSBarry Smith This counter is reset to zero for each successive call to `TaoSolve()`
131147450a7bSBarry Smith
13121cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetKSP()`
1313025e9500SJason Sarich @*/
TaoGetLinearSolveIterations(Tao tao,PetscInt * lits)1314d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetLinearSolveIterations(Tao tao, PetscInt *lits)
1315d71ae5a4SJacob Faibussowitsch {
1316025e9500SJason Sarich PetscFunctionBegin;
1317025e9500SJason Sarich PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
13184f572ea9SToby Isaac PetscAssertPointer(lits, 2);
13192d9aa51bSJason Sarich *lits = tao->ksp_tot_its;
13203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1321025e9500SJason Sarich }
1322025e9500SJason Sarich
1323a7e14dcfSSatish Balay /*@
1324a7e14dcfSSatish Balay TaoGetLineSearch - Gets the line search used by the optimization solver.
1325a7e14dcfSSatish Balay
1326a7e14dcfSSatish Balay Not Collective
1327a7e14dcfSSatish Balay
132847450a7bSBarry Smith Input Parameter:
132947450a7bSBarry Smith . tao - the `Tao` solver
1330a7e14dcfSSatish Balay
133147450a7bSBarry Smith Output Parameter:
1332a7e14dcfSSatish Balay . ls - the line search used in the optimization solver
1333a7e14dcfSSatish Balay
1334a7e14dcfSSatish Balay Level: intermediate
1335a7e14dcfSSatish Balay
13361cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoLineSearch`, `TaoLineSearchType`
1337a7e14dcfSSatish Balay @*/
TaoGetLineSearch(Tao tao,TaoLineSearch * ls)1338d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetLineSearch(Tao tao, TaoLineSearch *ls)
1339d71ae5a4SJacob Faibussowitsch {
1340a7e14dcfSSatish Balay PetscFunctionBegin;
134194511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
13424f572ea9SToby Isaac PetscAssertPointer(ls, 2);
1343a7e14dcfSSatish Balay *ls = tao->linesearch;
13443ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1345a7e14dcfSSatish Balay }
1346a7e14dcfSSatish Balay
1347a7e14dcfSSatish Balay /*@
1348a7e14dcfSSatish Balay TaoAddLineSearchCounts - Adds the number of function evaluations spent
1349a7e14dcfSSatish Balay in the line search to the running total.
1350a7e14dcfSSatish Balay
1351a7e14dcfSSatish Balay Input Parameters:
13522fe279fdSBarry Smith . tao - the `Tao` solver
1353a7e14dcfSSatish Balay
1354a7e14dcfSSatish Balay Level: developer
1355a7e14dcfSSatish Balay
13561cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetLineSearch()`, `TaoLineSearchApply()`
1357a7e14dcfSSatish Balay @*/
TaoAddLineSearchCounts(Tao tao)1358d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoAddLineSearchCounts(Tao tao)
1359d71ae5a4SJacob Faibussowitsch {
1360a7e14dcfSSatish Balay PetscBool flg;
1361a7e14dcfSSatish Balay PetscInt nfeval, ngeval, nfgeval;
136247a47007SBarry Smith
1363a7e14dcfSSatish Balay PetscFunctionBegin;
1364441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1365a7e14dcfSSatish Balay if (tao->linesearch) {
13669566063dSJacob Faibussowitsch PetscCall(TaoLineSearchIsUsingTaoRoutines(tao->linesearch, &flg));
136794ae4db5SBarry Smith if (!flg) {
13689566063dSJacob Faibussowitsch PetscCall(TaoLineSearchGetNumberFunctionEvaluations(tao->linesearch, &nfeval, &ngeval, &nfgeval));
1369a7e14dcfSSatish Balay tao->nfuncs += nfeval;
1370a7e14dcfSSatish Balay tao->ngrads += ngeval;
1371a7e14dcfSSatish Balay tao->nfuncgrads += nfgeval;
1372a7e14dcfSSatish Balay }
1373a7e14dcfSSatish Balay }
13743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1375a7e14dcfSSatish Balay }
1376a7e14dcfSSatish Balay
1377a7e14dcfSSatish Balay /*@
137847450a7bSBarry Smith TaoGetSolution - Returns the vector with the current solution from the `Tao` object
1379a7e14dcfSSatish Balay
1380a7e14dcfSSatish Balay Not Collective
1381a7e14dcfSSatish Balay
1382a7e14dcfSSatish Balay Input Parameter:
138347450a7bSBarry Smith . tao - the `Tao` context
1384a7e14dcfSSatish Balay
1385a7e14dcfSSatish Balay Output Parameter:
1386a7e14dcfSSatish Balay . X - the current solution
1387a7e14dcfSSatish Balay
1388a7e14dcfSSatish Balay Level: intermediate
1389a7e14dcfSSatish Balay
139065ba42b6SBarry Smith Note:
139165ba42b6SBarry Smith The returned vector will be the same object that was passed into `TaoSetSolution()`
139265ba42b6SBarry Smith
13931cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetSolution()`, `TaoSolve()`
1394a7e14dcfSSatish Balay @*/
TaoGetSolution(Tao tao,Vec * X)1395d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetSolution(Tao tao, Vec *X)
1396d71ae5a4SJacob Faibussowitsch {
1397a7e14dcfSSatish Balay PetscFunctionBegin;
1398441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
13994f572ea9SToby Isaac PetscAssertPointer(X, 2);
1400a7e14dcfSSatish Balay *X = tao->solution;
14013ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1402a7e14dcfSSatish Balay }
1403a7e14dcfSSatish Balay
1404a7e14dcfSSatish Balay /*@
140547450a7bSBarry Smith TaoResetStatistics - Initialize the statistics collected by the `Tao` object.
1406a7e14dcfSSatish Balay These statistics include the iteration number, residual norms, and convergence status.
1407a7e14dcfSSatish Balay This routine gets called before solving each optimization problem.
1408a7e14dcfSSatish Balay
1409c3339decSBarry Smith Collective
1410a7e14dcfSSatish Balay
141147450a7bSBarry Smith Input Parameter:
1412e056e8ceSJacob Faibussowitsch . tao - the `Tao` context
1413a7e14dcfSSatish Balay
1414a7e14dcfSSatish Balay Level: developer
1415a7e14dcfSSatish Balay
14161cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoCreate()`, `TaoSolve()`
1417a7e14dcfSSatish Balay @*/
TaoResetStatistics(Tao tao)1418d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoResetStatistics(Tao tao)
1419d71ae5a4SJacob Faibussowitsch {
1420a7e14dcfSSatish Balay PetscFunctionBegin;
1421441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1422a7e14dcfSSatish Balay tao->niter = 0;
1423a7e14dcfSSatish Balay tao->nfuncs = 0;
1424a7e14dcfSSatish Balay tao->nfuncgrads = 0;
1425a7e14dcfSSatish Balay tao->ngrads = 0;
1426a7e14dcfSSatish Balay tao->nhess = 0;
1427a7e14dcfSSatish Balay tao->njac = 0;
1428a7e14dcfSSatish Balay tao->nconstraints = 0;
1429a7e14dcfSSatish Balay tao->ksp_its = 0;
1430ae93cb3cSJason Sarich tao->ksp_tot_its = 0;
1431a7e14dcfSSatish Balay tao->reason = TAO_CONTINUE_ITERATING;
1432a7e14dcfSSatish Balay tao->residual = 0.0;
1433a7e14dcfSSatish Balay tao->cnorm = 0.0;
1434a7e14dcfSSatish Balay tao->step = 0.0;
1435a7e14dcfSSatish Balay tao->lsflag = PETSC_FALSE;
1436a7e14dcfSSatish Balay if (tao->hist_reset) tao->hist_len = 0;
14373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1438a7e14dcfSSatish Balay }
1439a7e14dcfSSatish Balay
1440a7e14dcfSSatish Balay /*@C
1441e1e80dc8SAlp Dener TaoSetUpdate - Sets the general-purpose update function called
14422fe279fdSBarry Smith at the beginning of every iteration of the optimization algorithm. Called after the new solution and the gradient
1443e1e80dc8SAlp Dener is determined, but before the Hessian is computed (if applicable).
1444e1e80dc8SAlp Dener
1445c3339decSBarry Smith Logically Collective
1446e1e80dc8SAlp Dener
1447e1e80dc8SAlp Dener Input Parameters:
1448270bebe6SStefano Zampini + tao - The `Tao` solver
1449270bebe6SStefano Zampini . func - The function
1450270bebe6SStefano Zampini - ctx - The update function context
1451e1e80dc8SAlp Dener
145220f4b53cSBarry Smith Calling sequence of `func`:
1453270bebe6SStefano Zampini + tao - The optimizer context
1454270bebe6SStefano Zampini . it - The current iteration index
1455270bebe6SStefano Zampini - ctx - The update context
1456e1e80dc8SAlp Dener
1457e1e80dc8SAlp Dener Level: advanced
1458e1e80dc8SAlp Dener
1459270bebe6SStefano Zampini Notes:
1460270bebe6SStefano Zampini Users can modify the gradient direction or any other vector associated to the specific solver used.
1461270bebe6SStefano Zampini The objective function value is always recomputed after a call to the update hook.
1462270bebe6SStefano Zampini
14631cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSolve()`
1464e1e80dc8SAlp Dener @*/
TaoSetUpdate(Tao tao,PetscErrorCode (* func)(Tao tao,PetscInt it,PetscCtx ctx),PetscCtx ctx)14652a8381b2SBarry Smith PetscErrorCode TaoSetUpdate(Tao tao, PetscErrorCode (*func)(Tao tao, PetscInt it, PetscCtx ctx), PetscCtx ctx)
1466d71ae5a4SJacob Faibussowitsch {
1467e1e80dc8SAlp Dener PetscFunctionBegin;
1468e1e80dc8SAlp Dener PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1469e1e80dc8SAlp Dener tao->ops->update = func;
1470e1e80dc8SAlp Dener tao->user_update = ctx;
14713ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1472e1e80dc8SAlp Dener }
1473e1e80dc8SAlp Dener
1474e1e80dc8SAlp Dener /*@C
1475a7e14dcfSSatish Balay TaoSetConvergenceTest - Sets the function that is to be used to test
1476a7e14dcfSSatish Balay for convergence of the iterative minimization solution. The new convergence
147765ba42b6SBarry Smith testing routine will replace Tao's default convergence test.
1478a7e14dcfSSatish Balay
1479c3339decSBarry Smith Logically Collective
1480a7e14dcfSSatish Balay
1481a7e14dcfSSatish Balay Input Parameters:
148247450a7bSBarry Smith + tao - the `Tao` object
1483a7e14dcfSSatish Balay . conv - the routine to test for convergence
1484a7e14dcfSSatish Balay - ctx - [optional] context for private data for the convergence routine
148547450a7bSBarry Smith (may be `NULL`)
1486a7e14dcfSSatish Balay
148720f4b53cSBarry Smith Calling sequence of `conv`:
148847450a7bSBarry Smith + tao - the `Tao` object
1489a7e14dcfSSatish Balay - ctx - [optional] convergence context
1490a7e14dcfSSatish Balay
149147450a7bSBarry Smith Level: advanced
149247450a7bSBarry Smith
149365ba42b6SBarry Smith Note:
149465ba42b6SBarry Smith The new convergence testing routine should call `TaoSetConvergedReason()`.
1495a7e14dcfSSatish Balay
149610978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoSetConvergedReason()`, `TaoGetSolutionStatus()`, `TaoGetTolerances()`, `TaoMonitorSet()`
1497a7e14dcfSSatish Balay @*/
TaoSetConvergenceTest(Tao tao,PetscErrorCode (* conv)(Tao,void *),PetscCtx ctx)14982a8381b2SBarry Smith PetscErrorCode TaoSetConvergenceTest(Tao tao, PetscErrorCode (*conv)(Tao, void *), PetscCtx ctx)
1499d71ae5a4SJacob Faibussowitsch {
1500a7e14dcfSSatish Balay PetscFunctionBegin;
1501441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
150294511df7SStefano Zampini tao->ops->convergencetest = conv;
150394511df7SStefano Zampini tao->cnvP = ctx;
15043ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1505a7e14dcfSSatish Balay }
1506a7e14dcfSSatish Balay
1507a7e14dcfSSatish Balay /*@C
150810978b7dSBarry Smith TaoMonitorSet - Sets an additional function that is to be used at every
1509a7e14dcfSSatish Balay iteration of the solver to display the iteration's
1510a7e14dcfSSatish Balay progress.
1511a7e14dcfSSatish Balay
1512c3339decSBarry Smith Logically Collective
1513a7e14dcfSSatish Balay
1514a7e14dcfSSatish Balay Input Parameters:
151547450a7bSBarry Smith + tao - the `Tao` solver context
15162fe279fdSBarry Smith . func - monitoring routine
15172fe279fdSBarry Smith . ctx - [optional] user-defined context for private data for the monitor routine (may be `NULL`)
151849abdd8aSBarry Smith - dest - [optional] function to destroy the context when the `Tao` is destroyed, see `PetscCtxDestroyFn` for the calling sequence
1519a7e14dcfSSatish Balay
15202fe279fdSBarry Smith Calling sequence of `func`:
152147450a7bSBarry Smith + tao - the `Tao` solver context
15222fe279fdSBarry Smith - ctx - [optional] monitoring context
15232fe279fdSBarry Smith
152447450a7bSBarry Smith Level: intermediate
152547450a7bSBarry Smith
152687497f52SBarry Smith Notes:
152710978b7dSBarry Smith See `TaoSetFromOptions()` for a monitoring options.
152810978b7dSBarry Smith
1529a7e14dcfSSatish Balay Several different monitoring routines may be set by calling
153010978b7dSBarry Smith `TaoMonitorSet()` multiple times; all will be called in the
1531a7e14dcfSSatish Balay order in which they were set.
1532a7e14dcfSSatish Balay
1533e056e8ceSJacob Faibussowitsch Fortran Notes:
153495452b02SPatrick Sanan Only one monitor function may be set
1535a7e14dcfSSatish Balay
1536e6aa7a3bSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoMonitorDefault()`, `TaoMonitorCancel()`, `TaoView()`, `PetscCtxDestroyFn`
1537a7e14dcfSSatish Balay @*/
TaoMonitorSet(Tao tao,PetscErrorCode (* func)(Tao,PetscCtx),PetscCtx ctx,PetscCtxDestroyFn * dest)1538*a336c150SZach Atkins PetscErrorCode TaoMonitorSet(Tao tao, PetscErrorCode (*func)(Tao, PetscCtx), PetscCtx ctx, PetscCtxDestroyFn *dest)
1539d71ae5a4SJacob Faibussowitsch {
1540a7e14dcfSSatish Balay PetscFunctionBegin;
1541441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
15423c859ba3SBarry Smith PetscCheck(tao->numbermonitors < MAXTAOMONITORS, PetscObjectComm((PetscObject)tao), PETSC_ERR_SUP, "Cannot attach another monitor -- max=%d", MAXTAOMONITORS);
1543453a69bbSBarry Smith for (PetscInt i = 0; i < tao->numbermonitors; i++) {
1544453a69bbSBarry Smith PetscBool identical;
154508d19d1fSJason Sarich
1546453a69bbSBarry Smith PetscCall(PetscMonitorCompare((PetscErrorCode (*)(void))(PetscVoidFn *)func, ctx, dest, (PetscErrorCode (*)(void))(PetscVoidFn *)tao->monitor[i], tao->monitorcontext[i], tao->monitordestroy[i], &identical));
15473ba16761SJacob Faibussowitsch if (identical) PetscFunctionReturn(PETSC_SUCCESS);
154808d19d1fSJason Sarich }
1549a7e14dcfSSatish Balay tao->monitor[tao->numbermonitors] = func;
1550835f2295SStefano Zampini tao->monitorcontext[tao->numbermonitors] = ctx;
1551a7e14dcfSSatish Balay tao->monitordestroy[tao->numbermonitors] = dest;
1552a7e14dcfSSatish Balay ++tao->numbermonitors;
15533ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1554a7e14dcfSSatish Balay }
1555a7e14dcfSSatish Balay
1556a7e14dcfSSatish Balay /*@
1557b2dc45ddSPierre Jolivet TaoMonitorCancel - Clears all the monitor functions for a `Tao` object.
1558a7e14dcfSSatish Balay
1559c3339decSBarry Smith Logically Collective
1560a7e14dcfSSatish Balay
156147450a7bSBarry Smith Input Parameter:
156247450a7bSBarry Smith . tao - the `Tao` solver context
1563a7e14dcfSSatish Balay
15643c7db156SBarry Smith Options Database Key:
1565b2dc45ddSPierre Jolivet . -tao_monitor_cancel - cancels all monitors that have been hardwired
156610978b7dSBarry Smith into a code by calls to `TaoMonitorSet()`, but does not cancel those
1567a7e14dcfSSatish Balay set via the options database
1568a7e14dcfSSatish Balay
1569a7e14dcfSSatish Balay Level: advanced
1570a7e14dcfSSatish Balay
157147450a7bSBarry Smith Note:
157247450a7bSBarry Smith There is no way to clear one specific monitor from a `Tao` object.
157347450a7bSBarry Smith
157410978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorDefault()`, `TaoMonitorSet()`
1575a7e14dcfSSatish Balay @*/
TaoMonitorCancel(Tao tao)1576b2dc45ddSPierre Jolivet PetscErrorCode TaoMonitorCancel(Tao tao)
1577d71ae5a4SJacob Faibussowitsch {
1578a7e14dcfSSatish Balay PetscInt i;
157947a47007SBarry Smith
1580a7e14dcfSSatish Balay PetscFunctionBegin;
1581441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1582a7e14dcfSSatish Balay for (i = 0; i < tao->numbermonitors; i++) {
158348a46eb9SPierre Jolivet if (tao->monitordestroy[i]) PetscCall((*tao->monitordestroy[i])(&tao->monitorcontext[i]));
1584a7e14dcfSSatish Balay }
1585a7e14dcfSSatish Balay tao->numbermonitors = 0;
15863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1587a7e14dcfSSatish Balay }
1588a7e14dcfSSatish Balay
15897fab98ebSJason Sarich /*@
159047450a7bSBarry Smith TaoMonitorDefault - Default routine for monitoring progress of `TaoSolve()`
1591a7e14dcfSSatish Balay
1592c3339decSBarry Smith Collective
1593a7e14dcfSSatish Balay
1594a7e14dcfSSatish Balay Input Parameters:
159547450a7bSBarry Smith + tao - the `Tao` context
1596*a336c150SZach Atkins - vf - `PetscViewerAndFormat` context
1597a7e14dcfSSatish Balay
159847450a7bSBarry Smith Options Database Key:
1599147403d9SBarry Smith . -tao_monitor - turn on default monitoring
1600a7e14dcfSSatish Balay
1601a7e14dcfSSatish Balay Level: advanced
1602a7e14dcfSSatish Balay
160347450a7bSBarry Smith Note:
160447450a7bSBarry Smith This monitor prints the function value and gradient
160547450a7bSBarry Smith norm at each iteration.
160647450a7bSBarry Smith
160710978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorDefaultShort()`, `TaoMonitorSet()`
1608a7e14dcfSSatish Balay @*/
TaoMonitorDefault(Tao tao,PetscViewerAndFormat * vf)1609*a336c150SZach Atkins PetscErrorCode TaoMonitorDefault(Tao tao, PetscViewerAndFormat *vf)
1610d71ae5a4SJacob Faibussowitsch {
1611*a336c150SZach Atkins PetscViewer viewer = vf->viewer;
1612*a336c150SZach Atkins PetscBool isascii;
1613*a336c150SZach Atkins PetscInt tabs;
161447a47007SBarry Smith
1615a7e14dcfSSatish Balay PetscFunctionBegin;
161694511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1617*a336c150SZach Atkins if (vf->view_interval > 0 && tao->niter % vf->view_interval) PetscFunctionReturn(PETSC_SUCCESS);
1618*a336c150SZach Atkins
1619*a336c150SZach Atkins PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
1620*a336c150SZach Atkins PetscCall(PetscViewerPushFormat(viewer, vf->format));
1621*a336c150SZach Atkins if (isascii) {
16229566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetTab(viewer, &tabs));
1623*a336c150SZach Atkins
16249566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, ((PetscObject)tao)->tablevel));
1625*a336c150SZach Atkins if (tao->niter == 0 && ((PetscObject)tao)->prefix && !tao->header_printed) {
16269566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Iteration information for %s solve.\n", ((PetscObject)tao)->prefix));
1627494bef23SAlp Dener tao->header_printed = PETSC_TRUE;
162863b15415SAlp Dener }
1629*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, "%3" PetscInt_FMT " TAO,", tao->niter));
1630*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, " Function value: %g,", (double)tao->fc));
1631*a336c150SZach Atkins if (tao->residual >= PETSC_INFINITY) {
163276c63389SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Residual: infinity \n"));
163308d19d1fSJason Sarich } else {
1634*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, " Residual: %g \n", (double)tao->residual));
163508d19d1fSJason Sarich }
16369566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, tabs));
1637*a336c150SZach Atkins }
1638*a336c150SZach Atkins PetscCall(PetscViewerPopFormat(viewer));
16393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1640a7e14dcfSSatish Balay }
1641a7e14dcfSSatish Balay
16427fab98ebSJason Sarich /*@
164310978b7dSBarry Smith TaoMonitorGlobalization - Default routine for monitoring progress of `TaoSolve()` with extra detail on the globalization method.
16448d5ead36SAlp Dener
1645c3339decSBarry Smith Collective
16468d5ead36SAlp Dener
16478d5ead36SAlp Dener Input Parameters:
164847450a7bSBarry Smith + tao - the `Tao` context
1649*a336c150SZach Atkins - vf - `PetscViewerAndFormat` context
16508d5ead36SAlp Dener
165147450a7bSBarry Smith Options Database Key:
165210978b7dSBarry Smith . -tao_monitor_globalization - turn on monitoring with globalization information
16538d5ead36SAlp Dener
16548d5ead36SAlp Dener Level: advanced
16558d5ead36SAlp Dener
165647450a7bSBarry Smith Note:
165747450a7bSBarry Smith This monitor prints the function value and gradient norm at each
165847450a7bSBarry Smith iteration, as well as the step size and trust radius. Note that the
165947450a7bSBarry Smith step size and trust radius may be the same for some algorithms.
166047450a7bSBarry Smith
166110978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorDefaultShort()`, `TaoMonitorSet()`
16628d5ead36SAlp Dener @*/
TaoMonitorGlobalization(Tao tao,PetscViewerAndFormat * vf)1663*a336c150SZach Atkins PetscErrorCode TaoMonitorGlobalization(Tao tao, PetscViewerAndFormat *vf)
1664d71ae5a4SJacob Faibussowitsch {
1665*a336c150SZach Atkins PetscViewer viewer = vf->viewer;
1666*a336c150SZach Atkins PetscBool isascii;
1667*a336c150SZach Atkins PetscInt tabs;
16688d5ead36SAlp Dener
16698d5ead36SAlp Dener PetscFunctionBegin;
167094511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1671*a336c150SZach Atkins if (vf->view_interval > 0 && tao->niter % vf->view_interval) PetscFunctionReturn(PETSC_SUCCESS);
1672*a336c150SZach Atkins
1673*a336c150SZach Atkins PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
1674*a336c150SZach Atkins PetscCall(PetscViewerPushFormat(viewer, vf->format));
1675*a336c150SZach Atkins if (isascii) {
16769566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetTab(viewer, &tabs));
16779566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, ((PetscObject)tao)->tablevel));
1678*a336c150SZach Atkins if (tao->niter == 0 && ((PetscObject)tao)->prefix && !tao->header_printed) {
16799566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Iteration information for %s solve.\n", ((PetscObject)tao)->prefix));
1680494bef23SAlp Dener tao->header_printed = PETSC_TRUE;
16818d5ead36SAlp Dener }
1682*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, "%3" PetscInt_FMT " TAO,", tao->niter));
1683*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, " Function value: %g,", (double)tao->fc));
1684*a336c150SZach Atkins if (tao->residual >= PETSC_INFINITY) {
16859566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Residual: Inf,"));
16868d5ead36SAlp Dener } else {
1687*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, " Residual: %g,", (double)tao->residual));
16888d5ead36SAlp Dener }
1689*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, " Step: %g, Trust: %g\n", (double)tao->step, (double)tao->trust));
16909566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, tabs));
1691*a336c150SZach Atkins }
1692*a336c150SZach Atkins PetscCall(PetscViewerPopFormat(viewer));
16933ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
16948d5ead36SAlp Dener }
16958d5ead36SAlp Dener
16968d5ead36SAlp Dener /*@
169710978b7dSBarry Smith TaoMonitorDefaultShort - Routine for monitoring progress of `TaoSolve()` that displays fewer digits than `TaoMonitorDefault()`
1698a7e14dcfSSatish Balay
1699c3339decSBarry Smith Collective
1700a7e14dcfSSatish Balay
1701a7e14dcfSSatish Balay Input Parameters:
170247450a7bSBarry Smith + tao - the `Tao` context
1703*a336c150SZach Atkins - vf - `PetscViewerAndFormat` context
1704a7e14dcfSSatish Balay
170547450a7bSBarry Smith Options Database Key:
170610978b7dSBarry Smith . -tao_monitor_short - turn on default short monitoring
1707a7e14dcfSSatish Balay
1708a7e14dcfSSatish Balay Level: advanced
1709a7e14dcfSSatish Balay
171047450a7bSBarry Smith Note:
171147450a7bSBarry Smith Same as `TaoMonitorDefault()` except
171247450a7bSBarry Smith it prints fewer digits of the residual as the residual gets smaller.
171347450a7bSBarry Smith This is because the later digits are meaningless and are often
171447450a7bSBarry Smith different on different machines; by using this routine different
171547450a7bSBarry Smith machines will usually generate the same output.
171647450a7bSBarry Smith
171710978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorDefault()`, `TaoMonitorSet()`
1718a7e14dcfSSatish Balay @*/
TaoMonitorDefaultShort(Tao tao,PetscViewerAndFormat * vf)1719*a336c150SZach Atkins PetscErrorCode TaoMonitorDefaultShort(Tao tao, PetscViewerAndFormat *vf)
1720d71ae5a4SJacob Faibussowitsch {
1721*a336c150SZach Atkins PetscViewer viewer = vf->viewer;
1722*a336c150SZach Atkins PetscBool isascii;
1723*a336c150SZach Atkins PetscInt tabs;
1724*a336c150SZach Atkins PetscReal gnorm;
172547a47007SBarry Smith
1726a7e14dcfSSatish Balay PetscFunctionBegin;
172794511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1728*a336c150SZach Atkins if (vf->view_interval > 0 && tao->niter % vf->view_interval) PetscFunctionReturn(PETSC_SUCCESS);
1729*a336c150SZach Atkins
1730a7e14dcfSSatish Balay gnorm = tao->residual;
1731*a336c150SZach Atkins PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
1732*a336c150SZach Atkins PetscCall(PetscViewerPushFormat(viewer, vf->format));
1733*a336c150SZach Atkins if (isascii) {
17349566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetTab(viewer, &tabs));
17359566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, ((PetscObject)tao)->tablevel));
1736*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, "iter = %3" PetscInt_FMT ",", tao->niter));
1737*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, " Function value %g,", (double)tao->fc));
1738d393f493SBarry Smith if (gnorm >= PETSC_INFINITY) {
173976c63389SBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " Residual: infinity \n"));
174008d19d1fSJason Sarich } else if (gnorm > 1.e-6) {
17419566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Residual: %g \n", (double)gnorm));
1742a7e14dcfSSatish Balay } else if (gnorm > 1.e-11) {
17439566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Residual: < 1.0e-6 \n"));
1744a7e14dcfSSatish Balay } else {
17459566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Residual: < 1.0e-11 \n"));
1746a7e14dcfSSatish Balay }
17479566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, tabs));
1748*a336c150SZach Atkins }
1749*a336c150SZach Atkins PetscCall(PetscViewerPopFormat(viewer));
17503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1751a7e14dcfSSatish Balay }
1752a7e14dcfSSatish Balay
17537fab98ebSJason Sarich /*@
175410978b7dSBarry Smith TaoMonitorConstraintNorm - same as `TaoMonitorDefault()` except
175547450a7bSBarry Smith it prints the norm of the constraint function.
1756a7e14dcfSSatish Balay
1757c3339decSBarry Smith Collective
1758a7e14dcfSSatish Balay
1759a7e14dcfSSatish Balay Input Parameters:
176047450a7bSBarry Smith + tao - the `Tao` context
1761*a336c150SZach Atkins - vf - `PetscViewerAndFormat` context
1762a7e14dcfSSatish Balay
176347450a7bSBarry Smith Options Database Key:
176410978b7dSBarry Smith . -tao_monitor_constraint_norm - monitor the constraints
1765a7e14dcfSSatish Balay
1766a7e14dcfSSatish Balay Level: advanced
1767a7e14dcfSSatish Balay
176810978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorDefault()`, `TaoMonitorSet()`
1769a7e14dcfSSatish Balay @*/
TaoMonitorConstraintNorm(Tao tao,PetscViewerAndFormat * vf)1770*a336c150SZach Atkins PetscErrorCode TaoMonitorConstraintNorm(Tao tao, PetscViewerAndFormat *vf)
1771d71ae5a4SJacob Faibussowitsch {
1772*a336c150SZach Atkins PetscViewer viewer = vf->viewer;
1773*a336c150SZach Atkins PetscBool isascii;
1774*a336c150SZach Atkins PetscInt tabs;
1775a7e14dcfSSatish Balay
1776a7e14dcfSSatish Balay PetscFunctionBegin;
177794511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1778*a336c150SZach Atkins if (vf->view_interval > 0 && tao->niter % vf->view_interval) PetscFunctionReturn(PETSC_SUCCESS);
1779*a336c150SZach Atkins
1780*a336c150SZach Atkins PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
1781*a336c150SZach Atkins PetscCall(PetscViewerPushFormat(viewer, vf->format));
1782*a336c150SZach Atkins if (isascii) {
17839566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIGetTab(viewer, &tabs));
17849566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, ((PetscObject)tao)->tablevel));
1785*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, "iter = %" PetscInt_FMT ",", tao->niter));
1786*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, " Function value: %g,", (double)tao->fc));
1787*a336c150SZach Atkins PetscCall(PetscViewerASCIIPrintf(viewer, " Residual: %g ", (double)tao->residual));
17889566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, " Constraint: %g \n", (double)tao->cnorm));
17899566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIISetTab(viewer, tabs));
1790*a336c150SZach Atkins }
1791*a336c150SZach Atkins PetscCall(PetscViewerPopFormat(viewer));
17923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1793a7e14dcfSSatish Balay }
1794a7e14dcfSSatish Balay
1795a7e14dcfSSatish Balay /*@C
179610978b7dSBarry Smith TaoMonitorSolution - Views the solution at each iteration of `TaoSolve()`
1797a7e14dcfSSatish Balay
1798c3339decSBarry Smith Collective
1799a7e14dcfSSatish Balay
1800a7e14dcfSSatish Balay Input Parameters:
180147450a7bSBarry Smith + tao - the `Tao` context
1802*a336c150SZach Atkins - vf - `PetscViewerAndFormat` context
1803a7e14dcfSSatish Balay
180447450a7bSBarry Smith Options Database Key:
180510978b7dSBarry Smith . -tao_monitor_solution - view the solution
1806a7e14dcfSSatish Balay
1807a7e14dcfSSatish Balay Level: advanced
1808a7e14dcfSSatish Balay
180910978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorDefaultShort()`, `TaoMonitorSet()`
1810a7e14dcfSSatish Balay @*/
TaoMonitorSolution(Tao tao,PetscViewerAndFormat * vf)1811*a336c150SZach Atkins PetscErrorCode TaoMonitorSolution(Tao tao, PetscViewerAndFormat *vf)
1812d71ae5a4SJacob Faibussowitsch {
1813a7e14dcfSSatish Balay PetscFunctionBegin;
181494511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1815*a336c150SZach Atkins if (vf->view_interval > 0 && tao->niter % vf->view_interval) PetscFunctionReturn(PETSC_SUCCESS);
1816*a336c150SZach Atkins PetscCall(PetscViewerPushFormat(vf->viewer, vf->format));
1817*a336c150SZach Atkins PetscCall(VecView(tao->gradient, vf->viewer));
1818*a336c150SZach Atkins PetscCall(PetscViewerPopFormat(vf->viewer));
18193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1820a7e14dcfSSatish Balay }
1821a7e14dcfSSatish Balay
1822a7e14dcfSSatish Balay /*@C
182310978b7dSBarry Smith TaoMonitorGradient - Views the gradient at each iteration of `TaoSolve()`
1824a7e14dcfSSatish Balay
1825c3339decSBarry Smith Collective
1826a7e14dcfSSatish Balay
1827a7e14dcfSSatish Balay Input Parameters:
182847450a7bSBarry Smith + tao - the `Tao` context
1829*a336c150SZach Atkins - vf - `PetscViewerAndFormat` context
1830a7e14dcfSSatish Balay
183147450a7bSBarry Smith Options Database Key:
183210978b7dSBarry Smith . -tao_monitor_gradient - view the gradient at each iteration
1833a7e14dcfSSatish Balay
1834a7e14dcfSSatish Balay Level: advanced
1835a7e14dcfSSatish Balay
183610978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorDefaultShort()`, `TaoMonitorSet()`
1837a7e14dcfSSatish Balay @*/
TaoMonitorGradient(Tao tao,PetscViewerAndFormat * vf)1838*a336c150SZach Atkins PetscErrorCode TaoMonitorGradient(Tao tao, PetscViewerAndFormat *vf)
1839d71ae5a4SJacob Faibussowitsch {
1840a7e14dcfSSatish Balay PetscFunctionBegin;
184194511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1842*a336c150SZach Atkins if (vf->view_interval > 0 && tao->niter % vf->view_interval) PetscFunctionReturn(PETSC_SUCCESS);
1843*a336c150SZach Atkins PetscCall(PetscViewerPushFormat(vf->viewer, vf->format));
1844*a336c150SZach Atkins PetscCall(VecView(tao->gradient, vf->viewer));
1845*a336c150SZach Atkins PetscCall(PetscViewerPopFormat(vf->viewer));
18463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1847a7e14dcfSSatish Balay }
1848a7e14dcfSSatish Balay
1849a7e14dcfSSatish Balay /*@C
185010978b7dSBarry Smith TaoMonitorStep - Views the step-direction at each iteration of `TaoSolve()`
1851a7e14dcfSSatish Balay
1852c3339decSBarry Smith Collective
1853a7e14dcfSSatish Balay
1854a7e14dcfSSatish Balay Input Parameters:
185547450a7bSBarry Smith + tao - the `Tao` context
1856*a336c150SZach Atkins - vf - `PetscViewerAndFormat` context
1857a7e14dcfSSatish Balay
185847450a7bSBarry Smith Options Database Key:
185910978b7dSBarry Smith . -tao_monitor_step - view the step vector at each iteration
1860a7e14dcfSSatish Balay
1861a7e14dcfSSatish Balay Level: advanced
1862a7e14dcfSSatish Balay
186310978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorDefaultShort()`, `TaoMonitorSet()`
1864a7e14dcfSSatish Balay @*/
TaoMonitorStep(Tao tao,PetscViewerAndFormat * vf)1865*a336c150SZach Atkins PetscErrorCode TaoMonitorStep(Tao tao, PetscViewerAndFormat *vf)
1866d71ae5a4SJacob Faibussowitsch {
1867a7e14dcfSSatish Balay PetscFunctionBegin;
186894511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1869*a336c150SZach Atkins if (vf->view_interval > 0 && tao->niter % vf->view_interval) PetscFunctionReturn(PETSC_SUCCESS);
1870*a336c150SZach Atkins PetscCall(PetscViewerPushFormat(vf->viewer, vf->format));
1871*a336c150SZach Atkins PetscCall(VecView(tao->stepdirection, vf->viewer));
1872*a336c150SZach Atkins PetscCall(PetscViewerPopFormat(vf->viewer));
18733ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1874a7e14dcfSSatish Balay }
1875a7e14dcfSSatish Balay
1876a7e14dcfSSatish Balay /*@C
187710978b7dSBarry Smith TaoMonitorSolutionDraw - Plots the solution at each iteration of `TaoSolve()`
1878a7e14dcfSSatish Balay
1879c3339decSBarry Smith Collective
1880a7e14dcfSSatish Balay
1881a7e14dcfSSatish Balay Input Parameters:
188247450a7bSBarry Smith + tao - the `Tao` context
188365ba42b6SBarry Smith - ctx - `TaoMonitorDraw` context
1884a7e14dcfSSatish Balay
188547450a7bSBarry Smith Options Database Key:
188610978b7dSBarry Smith . -tao_monitor_solution_draw - draw the solution at each iteration
1887a7e14dcfSSatish Balay
1888a7e14dcfSSatish Balay Level: advanced
1889a7e14dcfSSatish Balay
1890a81c3919SBarry Smith Note:
1891a81c3919SBarry Smith The context created by `TaoMonitorDrawCtxCreate()`, along with `TaoMonitorSolutionDraw()`, and `TaoMonitorDrawCtxDestroy()`
1892a81c3919SBarry Smith are passed to `TaoMonitorSet()` to monitor the solution graphically.
1893a81c3919SBarry Smith
1894a81c3919SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorSolution()`, `TaoMonitorSet()`, `TaoMonitorGradientDraw()`, `TaoMonitorDrawCtxCreate()`,
1895a81c3919SBarry Smith `TaoMonitorDrawCtxDestroy()`
1896a7e14dcfSSatish Balay @*/
TaoMonitorSolutionDraw(Tao tao,PetscCtx ctx)18972a8381b2SBarry Smith PetscErrorCode TaoMonitorSolutionDraw(Tao tao, PetscCtx ctx)
1898d71ae5a4SJacob Faibussowitsch {
1899e882e171SHong Zhang TaoMonitorDrawCtx ictx = (TaoMonitorDrawCtx)ctx;
190047a47007SBarry Smith
1901a7e14dcfSSatish Balay PetscFunctionBegin;
190294511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
19033ba16761SJacob Faibussowitsch if (!(((ictx->howoften > 0) && (!(tao->niter % ictx->howoften))) || ((ictx->howoften == -1) && tao->reason))) PetscFunctionReturn(PETSC_SUCCESS);
19049566063dSJacob Faibussowitsch PetscCall(VecView(tao->solution, ictx->viewer));
19053ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1906a7e14dcfSSatish Balay }
1907a7e14dcfSSatish Balay
1908a7e14dcfSSatish Balay /*@C
190910978b7dSBarry Smith TaoMonitorGradientDraw - Plots the gradient at each iteration of `TaoSolve()`
1910a7e14dcfSSatish Balay
1911c3339decSBarry Smith Collective
1912a7e14dcfSSatish Balay
1913a7e14dcfSSatish Balay Input Parameters:
191447450a7bSBarry Smith + tao - the `Tao` context
191565ba42b6SBarry Smith - ctx - `PetscViewer` context
1916a7e14dcfSSatish Balay
191747450a7bSBarry Smith Options Database Key:
191810978b7dSBarry Smith . -tao_monitor_gradient_draw - draw the gradient at each iteration
1919a7e14dcfSSatish Balay
1920a7e14dcfSSatish Balay Level: advanced
1921a7e14dcfSSatish Balay
192210978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorGradient()`, `TaoMonitorSet()`, `TaoMonitorSolutionDraw()`
1923a7e14dcfSSatish Balay @*/
TaoMonitorGradientDraw(Tao tao,PetscCtx ctx)19242a8381b2SBarry Smith PetscErrorCode TaoMonitorGradientDraw(Tao tao, PetscCtx ctx)
1925d71ae5a4SJacob Faibussowitsch {
1926e882e171SHong Zhang TaoMonitorDrawCtx ictx = (TaoMonitorDrawCtx)ctx;
192747a47007SBarry Smith
1928a7e14dcfSSatish Balay PetscFunctionBegin;
192994511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
19303ba16761SJacob Faibussowitsch if (!(((ictx->howoften > 0) && (!(tao->niter % ictx->howoften))) || ((ictx->howoften == -1) && tao->reason))) PetscFunctionReturn(PETSC_SUCCESS);
19319566063dSJacob Faibussowitsch PetscCall(VecView(tao->gradient, ictx->viewer));
19323ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1933a7e14dcfSSatish Balay }
1934a7e14dcfSSatish Balay
1935a7e14dcfSSatish Balay /*@C
193610978b7dSBarry Smith TaoMonitorStepDraw - Plots the step direction at each iteration of `TaoSolve()`
1937a7e14dcfSSatish Balay
1938c3339decSBarry Smith Collective
1939a7e14dcfSSatish Balay
1940a7e14dcfSSatish Balay Input Parameters:
194147450a7bSBarry Smith + tao - the `Tao` context
194247450a7bSBarry Smith - ctx - the `PetscViewer` context
1943a7e14dcfSSatish Balay
194447450a7bSBarry Smith Options Database Key:
194510978b7dSBarry Smith . -tao_monitor_step_draw - draw the step direction at each iteration
1946a7e14dcfSSatish Balay
1947a7e14dcfSSatish Balay Level: advanced
1948a7e14dcfSSatish Balay
194910978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorSet()`, `TaoMonitorSolutionDraw`
1950a7e14dcfSSatish Balay @*/
TaoMonitorStepDraw(Tao tao,PetscCtx ctx)19512a8381b2SBarry Smith PetscErrorCode TaoMonitorStepDraw(Tao tao, PetscCtx ctx)
1952d71ae5a4SJacob Faibussowitsch {
195394511df7SStefano Zampini PetscViewer viewer = (PetscViewer)ctx;
195447a47007SBarry Smith
1955a7e14dcfSSatish Balay PetscFunctionBegin;
195694511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
195794511df7SStefano Zampini PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
19589566063dSJacob Faibussowitsch PetscCall(VecView(tao->stepdirection, viewer));
19593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1960a7e14dcfSSatish Balay }
1961a7e14dcfSSatish Balay
1962a7e14dcfSSatish Balay /*@C
196310978b7dSBarry Smith TaoMonitorResidual - Views the least-squares residual at each iteration of `TaoSolve()`
1964a7e14dcfSSatish Balay
1965c3339decSBarry Smith Collective
1966a7e14dcfSSatish Balay
1967a7e14dcfSSatish Balay Input Parameters:
196847450a7bSBarry Smith + tao - the `Tao` context
1969*a336c150SZach Atkins - vf - `PetscViewerAndFormat` context
1970a7e14dcfSSatish Balay
197147450a7bSBarry Smith Options Database Key:
197210978b7dSBarry Smith . -tao_monitor_ls_residual - view the residual at each iteration
1973a7e14dcfSSatish Balay
1974a7e14dcfSSatish Balay Level: advanced
1975a7e14dcfSSatish Balay
197610978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorDefaultShort()`, `TaoMonitorSet()`
1977a7e14dcfSSatish Balay @*/
TaoMonitorResidual(Tao tao,PetscViewerAndFormat * vf)1978*a336c150SZach Atkins PetscErrorCode TaoMonitorResidual(Tao tao, PetscViewerAndFormat *vf)
1979d71ae5a4SJacob Faibussowitsch {
1980a7e14dcfSSatish Balay PetscFunctionBegin;
198194511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
1982*a336c150SZach Atkins if (vf->view_interval > 0 && tao->niter % vf->view_interval) PetscFunctionReturn(PETSC_SUCCESS);
1983*a336c150SZach Atkins PetscCall(PetscViewerPushFormat(vf->viewer, vf->format));
1984*a336c150SZach Atkins PetscCall(VecView(tao->ls_res, vf->viewer));
1985*a336c150SZach Atkins PetscCall(PetscViewerPopFormat(vf->viewer));
19863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
1987a7e14dcfSSatish Balay }
1988a7e14dcfSSatish Balay
19897fab98ebSJason Sarich /*@
1990a7e14dcfSSatish Balay TaoDefaultConvergenceTest - Determines whether the solver should continue iterating
1991a7e14dcfSSatish Balay or terminate.
1992a7e14dcfSSatish Balay
1993c3339decSBarry Smith Collective
1994a7e14dcfSSatish Balay
1995a7e14dcfSSatish Balay Input Parameters:
199647450a7bSBarry Smith + tao - the `Tao` context
1997a7e14dcfSSatish Balay - dummy - unused dummy context
1998a7e14dcfSSatish Balay
199947450a7bSBarry Smith Level: developer
200047450a7bSBarry Smith
2001a7e14dcfSSatish Balay Notes:
2002a7e14dcfSSatish Balay This routine checks the residual in the optimality conditions, the
2003a7e14dcfSSatish Balay relative residual in the optimity conditions, the number of function
2004a7e14dcfSSatish Balay evaluations, and the function value to test convergence. Some
2005a7e14dcfSSatish Balay solvers may use different convergence routines.
2006a7e14dcfSSatish Balay
20071cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetTolerances()`, `TaoGetConvergedReason()`, `TaoSetConvergedReason()`
2008a7e14dcfSSatish Balay @*/
TaoDefaultConvergenceTest(Tao tao,void * dummy)2009d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoDefaultConvergenceTest(Tao tao, void *dummy)
2010d71ae5a4SJacob Faibussowitsch {
2011a7e14dcfSSatish Balay PetscInt niter = tao->niter, nfuncs = PetscMax(tao->nfuncs, tao->nfuncgrads);
2012a7e14dcfSSatish Balay PetscInt max_funcs = tao->max_funcs;
2013a7e14dcfSSatish Balay PetscReal gnorm = tao->residual, gnorm0 = tao->gnorm0;
2014a7e14dcfSSatish Balay PetscReal f = tao->fc, steptol = tao->steptol, trradius = tao->step;
2015a7e14dcfSSatish Balay PetscReal gatol = tao->gatol, grtol = tao->grtol, gttol = tao->gttol;
2016e52336cbSBarry Smith PetscReal catol = tao->catol, crtol = tao->crtol;
2017e52336cbSBarry Smith PetscReal fmin = tao->fmin, cnorm = tao->cnorm;
2018e4cb33bbSBarry Smith TaoConvergedReason reason = tao->reason;
2019a7e14dcfSSatish Balay
2020a7e14dcfSSatish Balay PetscFunctionBegin;
2021441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
20223ba16761SJacob Faibussowitsch if (reason != TAO_CONTINUE_ITERATING) PetscFunctionReturn(PETSC_SUCCESS);
2023a7e14dcfSSatish Balay
2024a7e14dcfSSatish Balay if (PetscIsInfOrNanReal(f)) {
202576c63389SBarry Smith PetscCall(PetscInfo(tao, "Failed to converged, function value is infinity or NaN\n"));
2026a7e14dcfSSatish Balay reason = TAO_DIVERGED_NAN;
2027a7e14dcfSSatish Balay } else if (f <= fmin && cnorm <= catol) {
20289566063dSJacob Faibussowitsch PetscCall(PetscInfo(tao, "Converged due to function value %g < minimum function value %g\n", (double)f, (double)fmin));
2029a7e14dcfSSatish Balay reason = TAO_CONVERGED_MINF;
2030a7e14dcfSSatish Balay } else if (gnorm <= gatol && cnorm <= catol) {
20319566063dSJacob Faibussowitsch PetscCall(PetscInfo(tao, "Converged due to residual norm ||g(X)||=%g < %g\n", (double)gnorm, (double)gatol));
2032a7e14dcfSSatish Balay reason = TAO_CONVERGED_GATOL;
2033a7e14dcfSSatish Balay } else if (f != 0 && PetscAbsReal(gnorm / f) <= grtol && cnorm <= crtol) {
20349566063dSJacob Faibussowitsch PetscCall(PetscInfo(tao, "Converged due to residual ||g(X)||/|f(X)| =%g < %g\n", (double)(gnorm / f), (double)grtol));
2035a7e14dcfSSatish Balay reason = TAO_CONVERGED_GRTOL;
2036e1d16bb9SBarry Smith } else if (gnorm0 != 0 && ((gttol == 0 && gnorm == 0) || gnorm / gnorm0 < gttol) && cnorm <= crtol) {
20379566063dSJacob Faibussowitsch PetscCall(PetscInfo(tao, "Converged due to relative residual norm ||g(X)||/||g(X0)|| = %g < %g\n", (double)(gnorm / gnorm0), (double)gttol));
2038a7e14dcfSSatish Balay reason = TAO_CONVERGED_GTTOL;
2039606f75f6SBarry Smith } else if (max_funcs != PETSC_UNLIMITED && nfuncs > max_funcs) {
20409566063dSJacob Faibussowitsch PetscCall(PetscInfo(tao, "Exceeded maximum number of function evaluations: %" PetscInt_FMT " > %" PetscInt_FMT "\n", nfuncs, max_funcs));
2041a7e14dcfSSatish Balay reason = TAO_DIVERGED_MAXFCN;
2042a7e14dcfSSatish Balay } else if (tao->lsflag != 0) {
20439566063dSJacob Faibussowitsch PetscCall(PetscInfo(tao, "Tao Line Search failure.\n"));
2044a7e14dcfSSatish Balay reason = TAO_DIVERGED_LS_FAILURE;
2045a7e14dcfSSatish Balay } else if (trradius < steptol && niter > 0) {
20469566063dSJacob Faibussowitsch PetscCall(PetscInfo(tao, "Trust region/step size too small: %g < %g\n", (double)trradius, (double)steptol));
2047a7e14dcfSSatish Balay reason = TAO_CONVERGED_STEPTOL;
2048e031d6f5SAlp Dener } else if (niter >= tao->max_it) {
204963a3b9bcSJacob Faibussowitsch PetscCall(PetscInfo(tao, "Exceeded maximum number of iterations: %" PetscInt_FMT " > %" PetscInt_FMT "\n", niter, tao->max_it));
2050a7e14dcfSSatish Balay reason = TAO_DIVERGED_MAXITS;
2051a7e14dcfSSatish Balay } else {
2052a7e14dcfSSatish Balay reason = TAO_CONTINUE_ITERATING;
2053a7e14dcfSSatish Balay }
2054a7e14dcfSSatish Balay tao->reason = reason;
20553ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2056a7e14dcfSSatish Balay }
2057a7e14dcfSSatish Balay
2058cc4c1da9SBarry Smith /*@
2059a7e14dcfSSatish Balay TaoSetOptionsPrefix - Sets the prefix used for searching for all
206065ba42b6SBarry Smith Tao options in the database.
2061a7e14dcfSSatish Balay
2062c3339decSBarry Smith Logically Collective
2063a7e14dcfSSatish Balay
2064a7e14dcfSSatish Balay Input Parameters:
206547450a7bSBarry Smith + tao - the `Tao` context
2066e056e8ceSJacob Faibussowitsch - p - the prefix string to prepend to all Tao option requests
2067a7e14dcfSSatish Balay
20682fe279fdSBarry Smith Level: advanced
20692fe279fdSBarry Smith
2070a7e14dcfSSatish Balay Notes:
2071a7e14dcfSSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name.
2072a7e14dcfSSatish Balay The first character of all runtime options is AUTOMATICALLY the hyphen.
2073a7e14dcfSSatish Balay
2074a7e14dcfSSatish Balay For example, to distinguish between the runtime options for two
207565ba42b6SBarry Smith different Tao solvers, one could call
2076a7e14dcfSSatish Balay .vb
2077a7e14dcfSSatish Balay TaoSetOptionsPrefix(tao1,"sys1_")
2078a7e14dcfSSatish Balay TaoSetOptionsPrefix(tao2,"sys2_")
2079a7e14dcfSSatish Balay .ve
2080a7e14dcfSSatish Balay
2081a7e14dcfSSatish Balay This would enable use of different options for each system, such as
2082a7e14dcfSSatish Balay .vb
20839fa2b5dcSStefano Zampini -sys1_tao_method blmvm -sys1_tao_grtol 1.e-3
20849fa2b5dcSStefano Zampini -sys2_tao_method lmvm -sys2_tao_grtol 1.e-4
2085a7e14dcfSSatish Balay .ve
2086a7e14dcfSSatish Balay
20871cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetFromOptions()`, `TaoAppendOptionsPrefix()`, `TaoGetOptionsPrefix()`
2088a7e14dcfSSatish Balay @*/
TaoSetOptionsPrefix(Tao tao,const char p[])2089d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetOptionsPrefix(Tao tao, const char p[])
2090d71ae5a4SJacob Faibussowitsch {
2091a7e14dcfSSatish Balay PetscFunctionBegin;
209294511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
20939566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)tao, p));
20941baa6e33SBarry Smith if (tao->linesearch) PetscCall(TaoLineSearchSetOptionsPrefix(tao->linesearch, p));
20951baa6e33SBarry Smith if (tao->ksp) PetscCall(KSPSetOptionsPrefix(tao->ksp, p));
20963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2097a7e14dcfSSatish Balay }
2098a7e14dcfSSatish Balay
2099cc4c1da9SBarry Smith /*@
210047450a7bSBarry Smith TaoAppendOptionsPrefix - Appends to the prefix used for searching for all Tao options in the database.
2101a7e14dcfSSatish Balay
2102c3339decSBarry Smith Logically Collective
2103a7e14dcfSSatish Balay
2104a7e14dcfSSatish Balay Input Parameters:
210547450a7bSBarry Smith + tao - the `Tao` solver context
2106e056e8ceSJacob Faibussowitsch - p - the prefix string to prepend to all `Tao` option requests
2107a7e14dcfSSatish Balay
21082fe279fdSBarry Smith Level: advanced
21092fe279fdSBarry Smith
211065ba42b6SBarry Smith Note:
2111a7e14dcfSSatish Balay A hyphen (-) must NOT be given at the beginning of the prefix name.
211265ba42b6SBarry Smith The first character of all runtime options is automatically the hyphen.
2113a7e14dcfSSatish Balay
21141cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetFromOptions()`, `TaoSetOptionsPrefix()`, `TaoGetOptionsPrefix()`
2115a7e14dcfSSatish Balay @*/
TaoAppendOptionsPrefix(Tao tao,const char p[])2116d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoAppendOptionsPrefix(Tao tao, const char p[])
2117d71ae5a4SJacob Faibussowitsch {
2118a7e14dcfSSatish Balay PetscFunctionBegin;
211994511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
21209566063dSJacob Faibussowitsch PetscCall(PetscObjectAppendOptionsPrefix((PetscObject)tao, p));
21211baa6e33SBarry Smith if (tao->linesearch) PetscCall(PetscObjectAppendOptionsPrefix((PetscObject)tao->linesearch, p));
21221baa6e33SBarry Smith if (tao->ksp) PetscCall(KSPAppendOptionsPrefix(tao->ksp, p));
21233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2124a7e14dcfSSatish Balay }
2125a7e14dcfSSatish Balay
2126cc4c1da9SBarry Smith /*@
2127a7e14dcfSSatish Balay TaoGetOptionsPrefix - Gets the prefix used for searching for all
212865ba42b6SBarry Smith Tao options in the database
2129a7e14dcfSSatish Balay
2130a7e14dcfSSatish Balay Not Collective
2131a7e14dcfSSatish Balay
213247450a7bSBarry Smith Input Parameter:
213347450a7bSBarry Smith . tao - the `Tao` context
2134a7e14dcfSSatish Balay
213547450a7bSBarry Smith Output Parameter:
2136e056e8ceSJacob Faibussowitsch . p - pointer to the prefix string used is returned
2137a7e14dcfSSatish Balay
2138a7e14dcfSSatish Balay Level: advanced
2139a7e14dcfSSatish Balay
21401cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetFromOptions()`, `TaoSetOptionsPrefix()`, `TaoAppendOptionsPrefix()`
2141a7e14dcfSSatish Balay @*/
TaoGetOptionsPrefix(Tao tao,const char * p[])2142d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetOptionsPrefix(Tao tao, const char *p[])
2143d71ae5a4SJacob Faibussowitsch {
214494511df7SStefano Zampini PetscFunctionBegin;
214594511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
21469566063dSJacob Faibussowitsch PetscCall(PetscObjectGetOptionsPrefix((PetscObject)tao, p));
21473ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2148a7e14dcfSSatish Balay }
2149a7e14dcfSSatish Balay
2150cc4c1da9SBarry Smith /*@
215147450a7bSBarry Smith TaoSetType - Sets the `TaoType` for the minimization solver.
2152a7e14dcfSSatish Balay
2153c3339decSBarry Smith Collective
2154a7e14dcfSSatish Balay
2155a7e14dcfSSatish Balay Input Parameters:
2156e056e8ceSJacob Faibussowitsch + tao - the `Tao` solver context
2157a7e14dcfSSatish Balay - type - a known method
2158a7e14dcfSSatish Balay
2159a7e14dcfSSatish Balay Options Database Key:
216058417fe7SBarry Smith . -tao_type <type> - Sets the method; use -help for a list
216158417fe7SBarry Smith of available methods (for instance, "-tao_type lmvm" or "-tao_type tron")
2162a7e14dcfSSatish Balay
2163a7e14dcfSSatish Balay Level: intermediate
2164a7e14dcfSSatish Balay
21651cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoCreate()`, `TaoGetType()`, `TaoType`
2166a7e14dcfSSatish Balay @*/
TaoSetType(Tao tao,TaoType type)2167d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetType(Tao tao, TaoType type)
2168d71ae5a4SJacob Faibussowitsch {
2169441846f8SBarry Smith PetscErrorCode (*create_xxx)(Tao);
2170a7e14dcfSSatish Balay PetscBool issame;
2171a7e14dcfSSatish Balay
2172a7e14dcfSSatish Balay PetscFunctionBegin;
2173441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
2174a7e14dcfSSatish Balay
21759566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)tao, type, &issame));
21763ba16761SJacob Faibussowitsch if (issame) PetscFunctionReturn(PETSC_SUCCESS);
2177a7e14dcfSSatish Balay
2178835f2295SStefano Zampini PetscCall(PetscFunctionListFind(TaoList, type, &create_xxx));
21793c859ba3SBarry Smith PetscCheck(create_xxx, PetscObjectComm((PetscObject)tao), PETSC_ERR_ARG_UNKNOWN_TYPE, "Unable to find requested Tao type %s", type);
2180a7e14dcfSSatish Balay
2181a7e14dcfSSatish Balay /* Destroy the existing solver information */
2182dbbe0bcdSBarry Smith PetscTryTypeMethod(tao, destroy);
21831baa6e33SBarry Smith PetscCall(KSPDestroy(&tao->ksp));
21849566063dSJacob Faibussowitsch PetscCall(TaoLineSearchDestroy(&tao->linesearch));
218543547594SStefano Zampini
218643547594SStefano Zampini /* Reinitialize type-specific function pointers in TaoOps structure */
218783c8fe1dSLisandro Dalcin tao->ops->setup = NULL;
218843547594SStefano Zampini tao->ops->computedual = NULL;
218983c8fe1dSLisandro Dalcin tao->ops->solve = NULL;
219083c8fe1dSLisandro Dalcin tao->ops->view = NULL;
219183c8fe1dSLisandro Dalcin tao->ops->setfromoptions = NULL;
219283c8fe1dSLisandro Dalcin tao->ops->destroy = NULL;
2193a7e14dcfSSatish Balay
2194a7e14dcfSSatish Balay tao->setupcalled = PETSC_FALSE;
2195a7e14dcfSSatish Balay
21969566063dSJacob Faibussowitsch PetscCall((*create_xxx)(tao));
21979566063dSJacob Faibussowitsch PetscCall(PetscObjectChangeTypeName((PetscObject)tao, type));
21983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2199a7e14dcfSSatish Balay }
220047a47007SBarry Smith
220167be906fSBarry Smith /*@C
220247450a7bSBarry Smith TaoRegister - Adds a method to the Tao package for minimization.
2203a7e14dcfSSatish Balay
2204cc4c1da9SBarry Smith Not Collective, No Fortran Support
2205a7e14dcfSSatish Balay
2206a7e14dcfSSatish Balay Input Parameters:
2207a7e14dcfSSatish Balay + sname - name of a new user-defined solver
2208a7e14dcfSSatish Balay - func - routine to Create method context
2209a7e14dcfSSatish Balay
2210e056e8ceSJacob Faibussowitsch Example Usage:
2211a7e14dcfSSatish Balay .vb
2212441846f8SBarry Smith TaoRegister("my_solver", MySolverCreate);
2213a7e14dcfSSatish Balay .ve
2214a7e14dcfSSatish Balay
2215a7e14dcfSSatish Balay Then, your solver can be chosen with the procedural interface via
2216b44f4de4SBarry Smith .vb
2217b44f4de4SBarry Smith TaoSetType(tao, "my_solver")
2218b44f4de4SBarry Smith .ve
2219a7e14dcfSSatish Balay or at runtime via the option
2220b44f4de4SBarry Smith .vb
2221b44f4de4SBarry Smith -tao_type my_solver
2222b44f4de4SBarry Smith .ve
2223a7e14dcfSSatish Balay
2224a7e14dcfSSatish Balay Level: advanced
2225a7e14dcfSSatish Balay
222667be906fSBarry Smith Note:
222767be906fSBarry Smith `TaoRegister()` may be called multiple times to add several user-defined solvers.
222867be906fSBarry Smith
22291cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetType()`, `TaoRegisterAll()`, `TaoRegisterDestroy()`
223067be906fSBarry Smith @*/
TaoRegister(const char sname[],PetscErrorCode (* func)(Tao))2231d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoRegister(const char sname[], PetscErrorCode (*func)(Tao))
2232d71ae5a4SJacob Faibussowitsch {
2233a7e14dcfSSatish Balay PetscFunctionBegin;
22349566063dSJacob Faibussowitsch PetscCall(TaoInitializePackage());
2235835f2295SStefano Zampini PetscCall(PetscFunctionListAdd(&TaoList, sname, func));
22363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2237a7e14dcfSSatish Balay }
2238a7e14dcfSSatish Balay
2239a7e14dcfSSatish Balay /*@C
2240441846f8SBarry Smith TaoRegisterDestroy - Frees the list of minimization solvers that were
224147450a7bSBarry Smith registered by `TaoRegister()`.
2242a7e14dcfSSatish Balay
2243a7e14dcfSSatish Balay Not Collective
2244a7e14dcfSSatish Balay
2245a7e14dcfSSatish Balay Level: advanced
2246a7e14dcfSSatish Balay
22471cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoRegisterAll()`, `TaoRegister()`
2248a7e14dcfSSatish Balay @*/
TaoRegisterDestroy(void)2249d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoRegisterDestroy(void)
2250d71ae5a4SJacob Faibussowitsch {
2251a7e14dcfSSatish Balay PetscFunctionBegin;
22529566063dSJacob Faibussowitsch PetscCall(PetscFunctionListDestroy(&TaoList));
2253441846f8SBarry Smith TaoRegisterAllCalled = PETSC_FALSE;
22543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2255a7e14dcfSSatish Balay }
225647a47007SBarry Smith
22578931d482SJason Sarich /*@
225847450a7bSBarry Smith TaoGetIterationNumber - Gets the number of `TaoSolve()` iterations completed
22598931d482SJason Sarich at this time.
22608931d482SJason Sarich
22618931d482SJason Sarich Not Collective
22628931d482SJason Sarich
22638931d482SJason Sarich Input Parameter:
226447450a7bSBarry Smith . tao - the `Tao` context
22658931d482SJason Sarich
22668931d482SJason Sarich Output Parameter:
22678931d482SJason Sarich . iter - iteration number
22688931d482SJason Sarich
22698931d482SJason Sarich Notes:
22708931d482SJason Sarich For example, during the computation of iteration 2 this would return 1.
22718931d482SJason Sarich
22728931d482SJason Sarich Level: intermediate
22738931d482SJason Sarich
22741cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetLinearSolveIterations()`, `TaoGetResidualNorm()`, `TaoGetObjective()`
22758931d482SJason Sarich @*/
TaoGetIterationNumber(Tao tao,PetscInt * iter)2276d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetIterationNumber(Tao tao, PetscInt *iter)
2277d71ae5a4SJacob Faibussowitsch {
22788931d482SJason Sarich PetscFunctionBegin;
22798931d482SJason Sarich PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
22804f572ea9SToby Isaac PetscAssertPointer(iter, 2);
22818931d482SJason Sarich *iter = tao->niter;
22823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
22838931d482SJason Sarich }
22848931d482SJason Sarich
22858931d482SJason Sarich /*@
228647450a7bSBarry Smith TaoGetResidualNorm - Gets the current value of the norm of the residual (gradient)
228779f5d8caSBarry Smith at this time.
228879f5d8caSBarry Smith
228979f5d8caSBarry Smith Not Collective
229079f5d8caSBarry Smith
229179f5d8caSBarry Smith Input Parameter:
229247450a7bSBarry Smith . tao - the `Tao` context
229379f5d8caSBarry Smith
229479f5d8caSBarry Smith Output Parameter:
229579f5d8caSBarry Smith . value - the current value
229679f5d8caSBarry Smith
229779f5d8caSBarry Smith Level: intermediate
229879f5d8caSBarry Smith
2299e056e8ceSJacob Faibussowitsch Developer Notes:
230067be906fSBarry Smith This is the 2-norm of the residual, we cannot use `TaoGetGradientNorm()` because that has
230147450a7bSBarry Smith a different meaning. For some reason `Tao` sometimes calls the gradient the residual.
230279f5d8caSBarry Smith
23031cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetLinearSolveIterations()`, `TaoGetIterationNumber()`, `TaoGetObjective()`
230479f5d8caSBarry Smith @*/
TaoGetResidualNorm(Tao tao,PetscReal * value)2305d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetResidualNorm(Tao tao, PetscReal *value)
2306d71ae5a4SJacob Faibussowitsch {
230779f5d8caSBarry Smith PetscFunctionBegin;
230879f5d8caSBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
23094f572ea9SToby Isaac PetscAssertPointer(value, 2);
231079f5d8caSBarry Smith *value = tao->residual;
23113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
231279f5d8caSBarry Smith }
231379f5d8caSBarry Smith
231479f5d8caSBarry Smith /*@
23158931d482SJason Sarich TaoSetIterationNumber - Sets the current iteration number.
23168931d482SJason Sarich
2317c3339decSBarry Smith Logically Collective
23188931d482SJason Sarich
2319d8d19677SJose E. Roman Input Parameters:
232047450a7bSBarry Smith + tao - the `Tao` context
2321a2b725a8SWilliam Gropp - iter - iteration number
23228931d482SJason Sarich
23238931d482SJason Sarich Level: developer
23248931d482SJason Sarich
23251cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetLinearSolveIterations()`
23268931d482SJason Sarich @*/
TaoSetIterationNumber(Tao tao,PetscInt iter)2327d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetIterationNumber(Tao tao, PetscInt iter)
2328d71ae5a4SJacob Faibussowitsch {
23298931d482SJason Sarich PetscFunctionBegin;
23308931d482SJason Sarich PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
233194511df7SStefano Zampini PetscValidLogicalCollectiveInt(tao, iter, 2);
23329566063dSJacob Faibussowitsch PetscCall(PetscObjectSAWsTakeAccess((PetscObject)tao));
23338931d482SJason Sarich tao->niter = iter;
23349566063dSJacob Faibussowitsch PetscCall(PetscObjectSAWsGrantAccess((PetscObject)tao));
23353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
23368931d482SJason Sarich }
23378931d482SJason Sarich
23388931d482SJason Sarich /*@
233947450a7bSBarry Smith TaoGetTotalIterationNumber - Gets the total number of `TaoSolve()` iterations
23408931d482SJason Sarich completed. This number keeps accumulating if multiple solves
234147450a7bSBarry Smith are called with the `Tao` object.
23428931d482SJason Sarich
23438931d482SJason Sarich Not Collective
23448931d482SJason Sarich
23458931d482SJason Sarich Input Parameter:
234647450a7bSBarry Smith . tao - the `Tao` context
23478931d482SJason Sarich
23488931d482SJason Sarich Output Parameter:
234947450a7bSBarry Smith . iter - number of iterations
23508931d482SJason Sarich
23518931d482SJason Sarich Level: intermediate
23528931d482SJason Sarich
235320f4b53cSBarry Smith Note:
235467be906fSBarry Smith The total iteration count is updated after each solve, if there is a current
235547450a7bSBarry Smith `TaoSolve()` in progress then those iterations are not included in the count
235667be906fSBarry Smith
23571cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetLinearSolveIterations()`
23588931d482SJason Sarich @*/
TaoGetTotalIterationNumber(Tao tao,PetscInt * iter)2359d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetTotalIterationNumber(Tao tao, PetscInt *iter)
2360d71ae5a4SJacob Faibussowitsch {
23618931d482SJason Sarich PetscFunctionBegin;
23628931d482SJason Sarich PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
23634f572ea9SToby Isaac PetscAssertPointer(iter, 2);
23648931d482SJason Sarich *iter = tao->ntotalits;
23653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
23668931d482SJason Sarich }
23678931d482SJason Sarich
23688931d482SJason Sarich /*@
23698931d482SJason Sarich TaoSetTotalIterationNumber - Sets the current total iteration number.
23708931d482SJason Sarich
2371c3339decSBarry Smith Logically Collective
23728931d482SJason Sarich
2373d8d19677SJose E. Roman Input Parameters:
237447450a7bSBarry Smith + tao - the `Tao` context
237547450a7bSBarry Smith - iter - the iteration number
23768931d482SJason Sarich
23778931d482SJason Sarich Level: developer
23788931d482SJason Sarich
23791cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetLinearSolveIterations()`
23808931d482SJason Sarich @*/
TaoSetTotalIterationNumber(Tao tao,PetscInt iter)2381d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetTotalIterationNumber(Tao tao, PetscInt iter)
2382d71ae5a4SJacob Faibussowitsch {
23838931d482SJason Sarich PetscFunctionBegin;
23848931d482SJason Sarich PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
238594511df7SStefano Zampini PetscValidLogicalCollectiveInt(tao, iter, 2);
23869566063dSJacob Faibussowitsch PetscCall(PetscObjectSAWsTakeAccess((PetscObject)tao));
23878931d482SJason Sarich tao->ntotalits = iter;
23889566063dSJacob Faibussowitsch PetscCall(PetscObjectSAWsGrantAccess((PetscObject)tao));
23893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
23908931d482SJason Sarich }
23918931d482SJason Sarich
2392a7e14dcfSSatish Balay /*@
239347450a7bSBarry Smith TaoSetConvergedReason - Sets the termination flag on a `Tao` object
2394a7e14dcfSSatish Balay
2395c3339decSBarry Smith Logically Collective
2396a7e14dcfSSatish Balay
2397a7e14dcfSSatish Balay Input Parameters:
239847450a7bSBarry Smith + tao - the `Tao` context
239947450a7bSBarry Smith - reason - the `TaoConvergedReason`
2400a7e14dcfSSatish Balay
2401a7e14dcfSSatish Balay Level: intermediate
2402a7e14dcfSSatish Balay
24031cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoConvergedReason`
2404a7e14dcfSSatish Balay @*/
TaoSetConvergedReason(Tao tao,TaoConvergedReason reason)2405d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetConvergedReason(Tao tao, TaoConvergedReason reason)
2406d71ae5a4SJacob Faibussowitsch {
2407a7e14dcfSSatish Balay PetscFunctionBegin;
240894511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
240994511df7SStefano Zampini PetscValidLogicalCollectiveEnum(tao, reason, 2);
2410a7e14dcfSSatish Balay tao->reason = reason;
24113ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2412a7e14dcfSSatish Balay }
2413a7e14dcfSSatish Balay
2414a7e14dcfSSatish Balay /*@
241547450a7bSBarry Smith TaoGetConvergedReason - Gets the reason the `TaoSolve()` was stopped.
2416a7e14dcfSSatish Balay
2417a7e14dcfSSatish Balay Not Collective
2418a7e14dcfSSatish Balay
2419a7e14dcfSSatish Balay Input Parameter:
242047450a7bSBarry Smith . tao - the `Tao` solver context
2421a7e14dcfSSatish Balay
2422a7e14dcfSSatish Balay Output Parameter:
242347450a7bSBarry Smith . reason - value of `TaoConvergedReason`
2424a7e14dcfSSatish Balay
2425a7e14dcfSSatish Balay Level: intermediate
2426a7e14dcfSSatish Balay
24271cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoConvergedReason`, `TaoSetConvergenceTest()`, `TaoSetTolerances()`
2428a7e14dcfSSatish Balay @*/
TaoGetConvergedReason(Tao tao,TaoConvergedReason * reason)2429d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetConvergedReason(Tao tao, TaoConvergedReason *reason)
2430d71ae5a4SJacob Faibussowitsch {
2431a7e14dcfSSatish Balay PetscFunctionBegin;
2432441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
24334f572ea9SToby Isaac PetscAssertPointer(reason, 2);
2434a7e14dcfSSatish Balay *reason = tao->reason;
24353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2436a7e14dcfSSatish Balay }
2437a7e14dcfSSatish Balay
2438a7e14dcfSSatish Balay /*@
2439a7e14dcfSSatish Balay TaoGetSolutionStatus - Get the current iterate, objective value,
244047450a7bSBarry Smith residual, infeasibility, and termination from a `Tao` object
2441a7e14dcfSSatish Balay
2442a7e14dcfSSatish Balay Not Collective
2443a7e14dcfSSatish Balay
2444f899ff85SJose E. Roman Input Parameter:
244547450a7bSBarry Smith . tao - the `Tao` context
2446a7e14dcfSSatish Balay
2447a7e14dcfSSatish Balay Output Parameters:
2448e056e8ceSJacob Faibussowitsch + its - the current iterate number (>=0)
2449a7e14dcfSSatish Balay . f - the current function value
245058417fe7SBarry Smith . gnorm - the square of the gradient norm, duality gap, or other measure indicating distance from optimality.
2451a7e14dcfSSatish Balay . cnorm - the infeasibility of the current solution with regard to the constraints.
2452a7e14dcfSSatish Balay . xdiff - the step length or trust region radius of the most recent iterate.
245365ba42b6SBarry Smith - reason - The termination reason, which can equal `TAO_CONTINUE_ITERATING`
2454a7e14dcfSSatish Balay
2455a7e14dcfSSatish Balay Level: intermediate
2456a7e14dcfSSatish Balay
245765ba42b6SBarry Smith Notes:
245865ba42b6SBarry Smith Tao returns the values set by the solvers in the routine `TaoMonitor()`.
2459a7e14dcfSSatish Balay
246067be906fSBarry Smith If any of the output arguments are set to `NULL`, no corresponding value will be returned.
2461a7e14dcfSSatish Balay
24621cc06b55SBarry Smith .seealso: [](ch_tao), `TaoMonitor()`, `TaoGetConvergedReason()`
2463a7e14dcfSSatish Balay @*/
TaoGetSolutionStatus(Tao tao,PetscInt * its,PetscReal * f,PetscReal * gnorm,PetscReal * cnorm,PetscReal * xdiff,TaoConvergedReason * reason)2464d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetSolutionStatus(Tao tao, PetscInt *its, PetscReal *f, PetscReal *gnorm, PetscReal *cnorm, PetscReal *xdiff, TaoConvergedReason *reason)
2465d71ae5a4SJacob Faibussowitsch {
2466a7e14dcfSSatish Balay PetscFunctionBegin;
246794511df7SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
2468a7e14dcfSSatish Balay if (its) *its = tao->niter;
2469a7e14dcfSSatish Balay if (f) *f = tao->fc;
2470a7e14dcfSSatish Balay if (gnorm) *gnorm = tao->residual;
2471a7e14dcfSSatish Balay if (cnorm) *cnorm = tao->cnorm;
2472a7e14dcfSSatish Balay if (reason) *reason = tao->reason;
2473a7e14dcfSSatish Balay if (xdiff) *xdiff = tao->step;
24743ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2475a7e14dcfSSatish Balay }
2476a7e14dcfSSatish Balay
2477cc4c1da9SBarry Smith /*@
247847450a7bSBarry Smith TaoGetType - Gets the current `TaoType` being used in the `Tao` object
2479a7e14dcfSSatish Balay
2480a7e14dcfSSatish Balay Not Collective
2481a7e14dcfSSatish Balay
2482a7e14dcfSSatish Balay Input Parameter:
248347450a7bSBarry Smith . tao - the `Tao` solver context
2484a7e14dcfSSatish Balay
2485a7e14dcfSSatish Balay Output Parameter:
248647450a7bSBarry Smith . type - the `TaoType`
2487a7e14dcfSSatish Balay
2488a7e14dcfSSatish Balay Level: intermediate
2489a7e14dcfSSatish Balay
24901cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoType`, `TaoSetType()`
2491a7e14dcfSSatish Balay @*/
TaoGetType(Tao tao,TaoType * type)2492d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetType(Tao tao, TaoType *type)
2493d71ae5a4SJacob Faibussowitsch {
2494a7e14dcfSSatish Balay PetscFunctionBegin;
2495441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
24964f572ea9SToby Isaac PetscAssertPointer(type, 2);
2497a7e14dcfSSatish Balay *type = ((PetscObject)tao)->type_name;
24983ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2499a7e14dcfSSatish Balay }
2500a7e14dcfSSatish Balay
2501a7e14dcfSSatish Balay /*@C
2502a7e14dcfSSatish Balay TaoMonitor - Monitor the solver and the current solution. This
2503a7e14dcfSSatish Balay routine will record the iteration number and residual statistics,
2504670c031eSStefano Zampini and call any monitors specified by the user.
2505a7e14dcfSSatish Balay
2506a7e14dcfSSatish Balay Input Parameters:
250747450a7bSBarry Smith + tao - the `Tao` context
2508a7e14dcfSSatish Balay . its - the current iterate number (>=0)
2509a7e14dcfSSatish Balay . f - the current objective function value
25101cb3f120SPierre Jolivet . res - the gradient norm, square root of the duality gap, or other measure indicating distance from optimality. This measure will be recorded and
2511a7e14dcfSSatish Balay used for some termination tests.
2512a7e14dcfSSatish Balay . cnorm - the infeasibility of the current solution with regard to the constraints.
2513a7e14dcfSSatish Balay - steplength - multiple of the step direction added to the previous iterate.
2514a7e14dcfSSatish Balay
2515a7e14dcfSSatish Balay Options Database Key:
2516a7e14dcfSSatish Balay . -tao_monitor - Use the default monitor, which prints statistics to standard output
2517a7e14dcfSSatish Balay
2518a7e14dcfSSatish Balay Level: developer
2519a7e14dcfSSatish Balay
252010978b7dSBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetConvergedReason()`, `TaoMonitorDefault()`, `TaoMonitorSet()`
2521a7e14dcfSSatish Balay @*/
TaoMonitor(Tao tao,PetscInt its,PetscReal f,PetscReal res,PetscReal cnorm,PetscReal steplength)2522d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoMonitor(Tao tao, PetscInt its, PetscReal f, PetscReal res, PetscReal cnorm, PetscReal steplength)
2523d71ae5a4SJacob Faibussowitsch {
252447a47007SBarry Smith PetscInt i;
252547a47007SBarry Smith
2526a7e14dcfSSatish Balay PetscFunctionBegin;
2527441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
2528a7e14dcfSSatish Balay tao->fc = f;
2529a7e14dcfSSatish Balay tao->residual = res;
2530a7e14dcfSSatish Balay tao->cnorm = cnorm;
2531a7e14dcfSSatish Balay tao->step = steplength;
2532e52336cbSBarry Smith if (!its) {
253394511df7SStefano Zampini tao->cnorm0 = cnorm;
253494511df7SStefano Zampini tao->gnorm0 = res;
2535a7e14dcfSSatish Balay }
2536bfdcf5a2SStefano Zampini PetscCall(VecLockReadPush(tao->solution));
253748a46eb9SPierre Jolivet for (i = 0; i < tao->numbermonitors; i++) PetscCall((*tao->monitor[i])(tao, tao->monitorcontext[i]));
2538bfdcf5a2SStefano Zampini PetscCall(VecLockReadPop(tao->solution));
25393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2540a7e14dcfSSatish Balay }
2541a7e14dcfSSatish Balay
2542a7e14dcfSSatish Balay /*@
2543ae93cb3cSJason Sarich TaoSetConvergenceHistory - Sets the array used to hold the convergence history.
2544a7e14dcfSSatish Balay
2545c3339decSBarry Smith Logically Collective
2546a7e14dcfSSatish Balay
2547a7e14dcfSSatish Balay Input Parameters:
254847450a7bSBarry Smith + tao - the `Tao` solver context
2549a7e14dcfSSatish Balay . obj - array to hold objective value history
2550a7e14dcfSSatish Balay . resid - array to hold residual history
2551a7e14dcfSSatish Balay . cnorm - array to hold constraint violation history
2552be1558d8SJason Sarich . lits - integer array holds the number of linear iterations for each Tao iteration
255367be906fSBarry Smith . na - size of `obj`, `resid`, and `cnorm`
255465ba42b6SBarry Smith - reset - `PETSC_TRUE` indicates each new minimization resets the history counter to zero,
2555a7e14dcfSSatish Balay else it continues storing new values for new minimizations after the old ones
2556a7e14dcfSSatish Balay
255767be906fSBarry Smith Level: intermediate
255867be906fSBarry Smith
2559a7e14dcfSSatish Balay Notes:
256047450a7bSBarry Smith If set, `Tao` will fill the given arrays with the indicated
2561ae93cb3cSJason Sarich information at each iteration. If 'obj','resid','cnorm','lits' are
2562606f75f6SBarry Smith *all* `NULL` then space (using size `na`, or 1000 if `na` is `PETSC_DECIDE`) is allocated for the history.
256367be906fSBarry Smith If not all are `NULL`, then only the non-`NULL` information categories
2564ae93cb3cSJason Sarich will be stored, the others will be ignored.
2565ae93cb3cSJason Sarich
2566ae93cb3cSJason Sarich Any convergence information after iteration number 'na' will not be stored.
2567a7e14dcfSSatish Balay
2568a7e14dcfSSatish Balay This routine is useful, e.g., when running a code for purposes
2569a7e14dcfSSatish Balay of accurate performance monitoring, when no I/O should be done
2570a7e14dcfSSatish Balay during the section of code that is being timed.
2571a7e14dcfSSatish Balay
25721cc06b55SBarry Smith .seealso: [](ch_tao), `TaoGetConvergenceHistory()`
2573a7e14dcfSSatish Balay @*/
TaoSetConvergenceHistory(Tao tao,PetscReal obj[],PetscReal resid[],PetscReal cnorm[],PetscInt lits[],PetscInt na,PetscBool reset)2574d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetConvergenceHistory(Tao tao, PetscReal obj[], PetscReal resid[], PetscReal cnorm[], PetscInt lits[], PetscInt na, PetscBool reset)
2575d71ae5a4SJacob Faibussowitsch {
2576a7e14dcfSSatish Balay PetscFunctionBegin;
2577441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
25784f572ea9SToby Isaac if (obj) PetscAssertPointer(obj, 2);
25794f572ea9SToby Isaac if (resid) PetscAssertPointer(resid, 3);
25804f572ea9SToby Isaac if (cnorm) PetscAssertPointer(cnorm, 4);
25814f572ea9SToby Isaac if (lits) PetscAssertPointer(lits, 5);
2582ae93cb3cSJason Sarich
2583606f75f6SBarry Smith if (na == PETSC_DECIDE || na == PETSC_CURRENT) na = 1000;
2584ae93cb3cSJason Sarich if (!obj && !resid && !cnorm && !lits) {
25859566063dSJacob Faibussowitsch PetscCall(PetscCalloc4(na, &obj, na, &resid, na, &cnorm, na, &lits));
2586ae93cb3cSJason Sarich tao->hist_malloc = PETSC_TRUE;
2587ae93cb3cSJason Sarich }
2588ae93cb3cSJason Sarich
2589a7e14dcfSSatish Balay tao->hist_obj = obj;
2590a7e14dcfSSatish Balay tao->hist_resid = resid;
2591a7e14dcfSSatish Balay tao->hist_cnorm = cnorm;
2592ae93cb3cSJason Sarich tao->hist_lits = lits;
2593a7e14dcfSSatish Balay tao->hist_max = na;
2594a7e14dcfSSatish Balay tao->hist_reset = reset;
2595ae93cb3cSJason Sarich tao->hist_len = 0;
25963ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2597a7e14dcfSSatish Balay }
2598a7e14dcfSSatish Balay
2599a7e14dcfSSatish Balay /*@C
260065ba42b6SBarry Smith TaoGetConvergenceHistory - Gets the arrays used that hold the convergence history.
2601a7e14dcfSSatish Balay
2602c3339decSBarry Smith Collective
2603a7e14dcfSSatish Balay
2604a7e14dcfSSatish Balay Input Parameter:
260547450a7bSBarry Smith . tao - the `Tao` context
2606a7e14dcfSSatish Balay
2607a7e14dcfSSatish Balay Output Parameters:
2608a7e14dcfSSatish Balay + obj - array used to hold objective value history
2609a7e14dcfSSatish Balay . resid - array used to hold residual history
2610a7e14dcfSSatish Balay . cnorm - array used to hold constraint violation history
2611ae93cb3cSJason Sarich . lits - integer array used to hold linear solver iteration count
261267be906fSBarry Smith - nhist - size of `obj`, `resid`, `cnorm`, and `lits`
261367be906fSBarry Smith
261467be906fSBarry Smith Level: advanced
2615a7e14dcfSSatish Balay
2616a7e14dcfSSatish Balay Notes:
261765ba42b6SBarry Smith This routine must be preceded by calls to `TaoSetConvergenceHistory()`
261865ba42b6SBarry Smith and `TaoSolve()`, otherwise it returns useless information.
2619ae93cb3cSJason Sarich
2620a7e14dcfSSatish Balay This routine is useful, e.g., when running a code for purposes
2621a7e14dcfSSatish Balay of accurate performance monitoring, when no I/O should be done
2622a7e14dcfSSatish Balay during the section of code that is being timed.
2623a7e14dcfSSatish Balay
2624e056e8ceSJacob Faibussowitsch Fortran Notes:
262567be906fSBarry Smith The calling sequence is
262667be906fSBarry Smith .vb
262767be906fSBarry Smith call TaoGetConvergenceHistory(Tao tao, PetscInt nhist, PetscErrorCode ierr)
262867be906fSBarry Smith .ve
2629a3b724e8SBarry Smith In other words this gets the current number of entries in the history. Access the history through the array you passed to `TaoSetConvergenceHistory()`
2630a7e14dcfSSatish Balay
26311cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoSetConvergenceHistory()`
2632a7e14dcfSSatish Balay @*/
TaoGetConvergenceHistory(Tao tao,PetscReal ** obj,PetscReal ** resid,PetscReal ** cnorm,PetscInt ** lits,PetscInt * nhist)2633d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetConvergenceHistory(Tao tao, PetscReal **obj, PetscReal **resid, PetscReal **cnorm, PetscInt **lits, PetscInt *nhist)
2634d71ae5a4SJacob Faibussowitsch {
2635a7e14dcfSSatish Balay PetscFunctionBegin;
2636441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
2637a7e14dcfSSatish Balay if (obj) *obj = tao->hist_obj;
2638a7e14dcfSSatish Balay if (cnorm) *cnorm = tao->hist_cnorm;
2639a7e14dcfSSatish Balay if (resid) *resid = tao->hist_resid;
26405b494b05SBarry Smith if (lits) *lits = tao->hist_lits;
2641a7e14dcfSSatish Balay if (nhist) *nhist = tao->hist_len;
26423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2643a7e14dcfSSatish Balay }
2644a7e14dcfSSatish Balay
2645a7e14dcfSSatish Balay /*@
2646ce78bad3SBarry Smith TaoSetApplicationContext - Sets the optional user-defined context for a `Tao` solver that can be accessed later, for example in the
2647ce78bad3SBarry Smith `Tao` callback functions with `TaoGetApplicationContext()`
2648a7e14dcfSSatish Balay
2649c3339decSBarry Smith Logically Collective
2650a7e14dcfSSatish Balay
2651a7e14dcfSSatish Balay Input Parameters:
265247450a7bSBarry Smith + tao - the `Tao` context
2653ce78bad3SBarry Smith - ctx - the user context
2654a7e14dcfSSatish Balay
2655a7e14dcfSSatish Balay Level: intermediate
2656a7e14dcfSSatish Balay
2657ce78bad3SBarry Smith Fortran Note:
2658ce78bad3SBarry Smith This only works when `ctx` is a Fortran derived type (it cannot be a `PetscObject`), we recommend writing a Fortran interface definition for this
2659ce78bad3SBarry Smith function that tells the Fortran compiler the derived data type that is passed in as the `ctx` argument. See `TaoGetApplicationContext()` for
2660ce78bad3SBarry Smith an example.
2661ce78bad3SBarry Smith
266242747ad1SJacob Faibussowitsch .seealso: [](ch_tao), `Tao`, `TaoGetApplicationContext()`
2663a7e14dcfSSatish Balay @*/
TaoSetApplicationContext(Tao tao,PetscCtx ctx)26642a8381b2SBarry Smith PetscErrorCode TaoSetApplicationContext(Tao tao, PetscCtx ctx)
2665d71ae5a4SJacob Faibussowitsch {
2666a7e14dcfSSatish Balay PetscFunctionBegin;
2667441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
266849abdd8aSBarry Smith tao->ctx = ctx;
26693ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2670a7e14dcfSSatish Balay }
2671a7e14dcfSSatish Balay
2672a7e14dcfSSatish Balay /*@
2673ce78bad3SBarry Smith TaoGetApplicationContext - Gets the user-defined context for a `Tao` solver provided with `TaoSetApplicationContext()`
2674a7e14dcfSSatish Balay
2675a7e14dcfSSatish Balay Not Collective
2676a7e14dcfSSatish Balay
2677a7e14dcfSSatish Balay Input Parameter:
267847450a7bSBarry Smith . tao - the `Tao` context
2679a7e14dcfSSatish Balay
2680a7e14dcfSSatish Balay Output Parameter:
2681ce78bad3SBarry Smith . ctx - a pointer to the user context
2682a7e14dcfSSatish Balay
2683a7e14dcfSSatish Balay Level: intermediate
2684a7e14dcfSSatish Balay
26852a8381b2SBarry Smith Fortran Note:
26862a8381b2SBarry Smith This only works when the context is a Fortran derived type or a `PetscObject`. Define `ctx` with
2687ce78bad3SBarry Smith .vb
2688ce78bad3SBarry Smith type(tUsertype), pointer :: ctx
2689ce78bad3SBarry Smith .ve
2690ce78bad3SBarry Smith
26911cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetApplicationContext()`
2692a7e14dcfSSatish Balay @*/
TaoGetApplicationContext(Tao tao,PetscCtxRt ctx)26932a8381b2SBarry Smith PetscErrorCode TaoGetApplicationContext(Tao tao, PetscCtxRt ctx)
2694d71ae5a4SJacob Faibussowitsch {
2695a7e14dcfSSatish Balay PetscFunctionBegin;
2696441846f8SBarry Smith PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
269749abdd8aSBarry Smith PetscAssertPointer(ctx, 2);
269849abdd8aSBarry Smith *(void **)ctx = tao->ctx;
26993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2700a7e14dcfSSatish Balay }
2701a9603a14SPatrick Farrell
2702a9603a14SPatrick Farrell /*@
2703a81c3919SBarry Smith TaoSetGradientNorm - Sets the matrix used to define the norm that measures the size of the gradient in some of the `Tao` algorithms
2704a9603a14SPatrick Farrell
2705c3339decSBarry Smith Collective
2706a9603a14SPatrick Farrell
2707a9603a14SPatrick Farrell Input Parameters:
270847450a7bSBarry Smith + tao - the `Tao` context
270965ba42b6SBarry Smith - M - matrix that defines the norm
2710a9603a14SPatrick Farrell
2711a9603a14SPatrick Farrell Level: beginner
2712a9603a14SPatrick Farrell
27131cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoGetGradientNorm()`, `TaoGradientNorm()`
2714a9603a14SPatrick Farrell @*/
TaoSetGradientNorm(Tao tao,Mat M)2715d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoSetGradientNorm(Tao tao, Mat M)
2716d71ae5a4SJacob Faibussowitsch {
2717a9603a14SPatrick Farrell PetscFunctionBegin;
2718a9603a14SPatrick Farrell PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
271994511df7SStefano Zampini PetscValidHeaderSpecific(M, MAT_CLASSID, 2);
27209566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)M));
27219566063dSJacob Faibussowitsch PetscCall(MatDestroy(&tao->gradient_norm));
27229566063dSJacob Faibussowitsch PetscCall(VecDestroy(&tao->gradient_norm_tmp));
2723a9603a14SPatrick Farrell tao->gradient_norm = M;
27249566063dSJacob Faibussowitsch PetscCall(MatCreateVecs(M, NULL, &tao->gradient_norm_tmp));
27253ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2726a9603a14SPatrick Farrell }
2727a9603a14SPatrick Farrell
2728a9603a14SPatrick Farrell /*@
2729a81c3919SBarry Smith TaoGetGradientNorm - Returns the matrix used to define the norm used for measuring the size of the gradient in some of the `Tao` algorithms
2730a9603a14SPatrick Farrell
2731a9603a14SPatrick Farrell Not Collective
2732a9603a14SPatrick Farrell
2733a9603a14SPatrick Farrell Input Parameter:
273447450a7bSBarry Smith . tao - the `Tao` context
2735a9603a14SPatrick Farrell
2736a9603a14SPatrick Farrell Output Parameter:
2737a9603a14SPatrick Farrell . M - gradient norm
2738a9603a14SPatrick Farrell
2739a9603a14SPatrick Farrell Level: beginner
2740a9603a14SPatrick Farrell
27411cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetGradientNorm()`, `TaoGradientNorm()`
2742a9603a14SPatrick Farrell @*/
TaoGetGradientNorm(Tao tao,Mat * M)2743d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGetGradientNorm(Tao tao, Mat *M)
2744d71ae5a4SJacob Faibussowitsch {
2745a9603a14SPatrick Farrell PetscFunctionBegin;
2746a9603a14SPatrick Farrell PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
27474f572ea9SToby Isaac PetscAssertPointer(M, 2);
2748a9603a14SPatrick Farrell *M = tao->gradient_norm;
27493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2750a9603a14SPatrick Farrell }
2751a9603a14SPatrick Farrell
2752cc4c1da9SBarry Smith /*@
275347450a7bSBarry Smith TaoGradientNorm - Compute the norm using the `NormType`, the user has selected
2754a9603a14SPatrick Farrell
2755c3339decSBarry Smith Collective
2756a9603a14SPatrick Farrell
2757d8d19677SJose E. Roman Input Parameters:
275847450a7bSBarry Smith + tao - the `Tao` context
2759a81c3919SBarry Smith . gradient - the gradient
27603b242c63SJacob Faibussowitsch - type - the norm type
2761a9603a14SPatrick Farrell
2762a9603a14SPatrick Farrell Output Parameter:
2763a9603a14SPatrick Farrell . gnorm - the gradient norm
2764a9603a14SPatrick Farrell
276547450a7bSBarry Smith Level: advanced
2766a9603a14SPatrick Farrell
2767a81c3919SBarry Smith Note:
2768a81c3919SBarry Smith If `TaoSetGradientNorm()` has been set and `type` is `NORM_2` then the norm provided with `TaoSetGradientNorm()` is used.
2769a81c3919SBarry Smith
2770a81c3919SBarry Smith Developer Notes:
2771a81c3919SBarry Smith Should be named `TaoComputeGradientNorm()`.
2772a81c3919SBarry Smith
2773a81c3919SBarry Smith The usage is a bit confusing, with `TaoSetGradientNorm()` plus `NORM_2` resulting in the computation of the user provided
2774a81c3919SBarry Smith norm, perhaps a refactorization is in order.
2775a81c3919SBarry Smith
27761cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoSetGradientNorm()`, `TaoGetGradientNorm()`
2777a9603a14SPatrick Farrell @*/
TaoGradientNorm(Tao tao,Vec gradient,NormType type,PetscReal * gnorm)2778d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoGradientNorm(Tao tao, Vec gradient, NormType type, PetscReal *gnorm)
2779d71ae5a4SJacob Faibussowitsch {
2780a9603a14SPatrick Farrell PetscFunctionBegin;
27818854b543SStefano Zampini PetscValidHeaderSpecific(tao, TAO_CLASSID, 1);
27828854b543SStefano Zampini PetscValidHeaderSpecific(gradient, VEC_CLASSID, 2);
27838854b543SStefano Zampini PetscValidLogicalCollectiveEnum(tao, type, 3);
27844f572ea9SToby Isaac PetscAssertPointer(gnorm, 4);
2785a9603a14SPatrick Farrell if (tao->gradient_norm) {
2786680e2bc7SPatrick Farrell PetscScalar gnorms;
2787680e2bc7SPatrick Farrell
27883c859ba3SBarry Smith PetscCheck(type == NORM_2, PetscObjectComm((PetscObject)gradient), PETSC_ERR_ARG_WRONG, "Norm type must be NORM_2 if an inner product for the gradient norm is set.");
27899566063dSJacob Faibussowitsch PetscCall(MatMult(tao->gradient_norm, gradient, tao->gradient_norm_tmp));
27909566063dSJacob Faibussowitsch PetscCall(VecDot(gradient, tao->gradient_norm_tmp, &gnorms));
27917bb79937SPatrick Farrell *gnorm = PetscRealPart(PetscSqrtScalar(gnorms));
2792a9603a14SPatrick Farrell } else {
27939566063dSJacob Faibussowitsch PetscCall(VecNorm(gradient, type, gnorm));
2794a9603a14SPatrick Farrell }
27953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2796a9603a14SPatrick Farrell }
2797a9603a14SPatrick Farrell
2798e882e171SHong Zhang /*@C
2799a81c3919SBarry Smith TaoMonitorDrawCtxCreate - Creates the monitor context for `TaoMonitorSolutionDraw()`
2800a9603a14SPatrick Farrell
2801c3339decSBarry Smith Collective
2802e882e171SHong Zhang
28032fe279fdSBarry Smith Input Parameters:
28042fe279fdSBarry Smith + comm - the communicator to share the context
28052fe279fdSBarry Smith . host - the name of the X Windows host that will display the monitor
28062fe279fdSBarry Smith . label - the label to put at the top of the display window
28072fe279fdSBarry Smith . x - the horizontal coordinate of the lower left corner of the window to open
28082fe279fdSBarry Smith . y - the vertical coordinate of the lower left corner of the window to open
28092fe279fdSBarry Smith . m - the width of the window
28102fe279fdSBarry Smith . n - the height of the window
28112fe279fdSBarry Smith - howoften - how many `Tao` iterations between displaying the monitor information
28122fe279fdSBarry Smith
2813d5b43468SJose E. Roman Output Parameter:
2814e882e171SHong Zhang . ctx - the monitor context
2815e882e171SHong Zhang
2816a81c3919SBarry Smith Options Database Keys:
2817a81c3919SBarry Smith + -tao_monitor_solution_draw - use `TaoMonitorSolutionDraw()` to monitor the solution
2818a81c3919SBarry Smith - -tao_draw_solution_initial - show initial guess as well as current solution
2819e882e171SHong Zhang
2820e882e171SHong Zhang Level: intermediate
2821e882e171SHong Zhang
2822a81c3919SBarry Smith Note:
2823a81c3919SBarry Smith The context this creates, along with `TaoMonitorSolutionDraw()`, and `TaoMonitorDrawCtxDestroy()`
2824a81c3919SBarry Smith are passed to `TaoMonitorSet()`.
2825a81c3919SBarry Smith
28261cc06b55SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorSet()`, `TaoMonitorDefault()`, `VecView()`, `TaoMonitorDrawCtx()`
2827e882e171SHong Zhang @*/
TaoMonitorDrawCtxCreate(MPI_Comm comm,const char host[],const char label[],int x,int y,int m,int n,PetscInt howoften,TaoMonitorDrawCtx * ctx)2828d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoMonitorDrawCtxCreate(MPI_Comm comm, const char host[], const char label[], int x, int y, int m, int n, PetscInt howoften, TaoMonitorDrawCtx *ctx)
2829d71ae5a4SJacob Faibussowitsch {
2830e882e171SHong Zhang PetscFunctionBegin;
28319566063dSJacob Faibussowitsch PetscCall(PetscNew(ctx));
28329566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawOpen(comm, host, label, x, y, m, n, &(*ctx)->viewer));
28339566063dSJacob Faibussowitsch PetscCall(PetscViewerSetFromOptions((*ctx)->viewer));
2834e882e171SHong Zhang (*ctx)->howoften = howoften;
28353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2836e882e171SHong Zhang }
2837e882e171SHong Zhang
2838e882e171SHong Zhang /*@C
2839a81c3919SBarry Smith TaoMonitorDrawCtxDestroy - Destroys the monitor context for `TaoMonitorSolutionDraw()`
2840e882e171SHong Zhang
2841c3339decSBarry Smith Collective
2842e882e171SHong Zhang
284347450a7bSBarry Smith Input Parameter:
2844e056e8ceSJacob Faibussowitsch . ictx - the monitor context
2845e882e171SHong Zhang
2846e882e171SHong Zhang Level: intermediate
2847e882e171SHong Zhang
2848a81c3919SBarry Smith Note:
2849a81c3919SBarry Smith This is passed to `TaoMonitorSet()` as the final argument, along with `TaoMonitorSolutionDraw()`, and the context
2850a81c3919SBarry Smith obtained with `TaoMonitorDrawCtxCreate()`.
2851a81c3919SBarry Smith
2852a81c3919SBarry Smith .seealso: [](ch_tao), `Tao`, `TaoMonitorSet()`, `TaoMonitorDefault()`, `VecView()`, `TaoMonitorSolutionDraw()`
2853e882e171SHong Zhang @*/
TaoMonitorDrawCtxDestroy(TaoMonitorDrawCtx * ictx)2854d71ae5a4SJacob Faibussowitsch PetscErrorCode TaoMonitorDrawCtxDestroy(TaoMonitorDrawCtx *ictx)
2855d71ae5a4SJacob Faibussowitsch {
2856e882e171SHong Zhang PetscFunctionBegin;
28579566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&(*ictx)->viewer));
28589566063dSJacob Faibussowitsch PetscCall(PetscFree(*ictx));
28593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
2860e882e171SHong Zhang }
2861