xref: /petsc/include/petsctao.h (revision b498ca8a579f835524ffb6d2b93edfa02ef9f10c)
1 #pragma once
2 
3 #include <petscsnes.h>
4 
5 /* SUBMANSEC = Tao */
6 
7 PETSC_EXTERN PetscErrorCode VecFischer(Vec, Vec, Vec, Vec, Vec);
8 PETSC_EXTERN PetscErrorCode VecSFischer(Vec, Vec, Vec, Vec, PetscReal, Vec);
9 PETSC_EXTERN PetscErrorCode MatDFischer(Mat, Vec, Vec, Vec, Vec, Vec, Vec, Vec, Vec);
10 PETSC_EXTERN PetscErrorCode MatDSFischer(Mat, Vec, Vec, Vec, Vec, PetscReal, Vec, Vec, Vec, Vec, Vec);
11 PETSC_EXTERN PetscErrorCode TaoSoftThreshold(Vec, PetscReal, PetscReal, Vec);
12 
13 /*E
14   TaoSubsetType - Type representing the way TAO handles active sets
15 
16   Values:
17 + `TAO_SUBSET_SUBVEC` - Tao uses `MatCreateSubMatrix()` and `VecGetSubVector()`
18 . `TAO_SUBSET_MASK` - Matrices are zeroed out corresponding to active set entries
19 - `TAO_SUBSET_MATRIXFREE` - Same as `TAO_SUBSET_MASK` but it can be applied to matrix-free operators
20 
21   Options database Key:
22 . -different_hessian - Tao will use a copy of the Hessian operator for masking.  By default TAO will directly alter the Hessian operator.
23 
24   Level: intermediate
25 
26 .seealso: [](ch_tao), `TaoVecGetSubVec()`, `TaoMatGetSubMat()`, `Tao`, `TaoCreate()`, `TaoDestroy()`, `TaoSetType()`, `TaoType`
27 E*/
28 typedef enum {
29   TAO_SUBSET_SUBVEC,
30   TAO_SUBSET_MASK,
31   TAO_SUBSET_MATRIXFREE
32 } TaoSubsetType;
33 PETSC_EXTERN const char *const TaoSubsetTypes[];
34 
35 /*S
36      Tao - Abstract PETSc object that manages nonlinear optimization solves
37 
38    Level: advanced
39 
40 .seealso: [](doc_taosolve), [](ch_tao), `TaoCreate()`, `TaoDestroy()`, `TaoSetType()`, `TaoType`
41 S*/
42 typedef struct _p_Tao *Tao;
43 
44 /*E
45      TaoADMMUpdateType - Determine spectral penalty update routine for Lagrange augmented term for `TAOADMM`.
46 
47   Level: advanced
48 
49 .seealso: [](ch_tao), `Tao`, `TAOADMM`, `TaoADMMSetUpdateType()`
50 E*/
51 typedef enum {
52   TAO_ADMM_UPDATE_BASIC,
53   TAO_ADMM_UPDATE_ADAPTIVE,
54   TAO_ADMM_UPDATE_ADAPTIVE_RELAXED
55 } TaoADMMUpdateType;
56 PETSC_EXTERN const char *const TaoADMMUpdateTypes[];
57 
58 /*MC
59      TAO_ADMM_UPDATE_BASIC - Use same spectral penalty set at the beginning. No update
60 
61   Level: advanced
62 
63   Note:
64   Most basic implementation of `TAOADMM`. Generally slower than adaptive or adaptive relaxed version.
65 
66 .seealso: [](ch_tao), `Tao`, `TAOADMM`, `TaoADMMSetUpdateType()`, `TAO_ADMM_UPDATE_ADAPTIVE`, `TAO_ADMM_UPDATE_ADAPTIVE_RELAXED`
67 M*/
68 
69 /*MC
70      TAO_ADMM_UPDATE_ADAPTIVE - Adaptively update spectral penalty
71 
72   Level: advanced
73 
74   Note:
75   Adaptively updates spectral penalty of `TAOADMM` by using both steepest descent and minimum gradient.
76 
77 .seealso: [](ch_tao), `Tao`, `TAOADMM`, `TaoADMMSetUpdateType()`, `TAO_ADMM_UPDATE_BASIC`, `TAO_ADMM_UPDATE_ADAPTIVE_RELAXED`
78 M*/
79 
80 /*MC
81      ADMM_UPDATE_ADAPTIVE_RELAXED - Adaptively update spectral penalty, and relaxes parameter update
82 
83   Level: advanced
84 
85   Note:
86   With adaptive spectral penalty update, it also relaxes x vector update by a factor.
87 
88 .seealso: [](ch_tao), `Tao`, `TaoADMMSetUpdateType()`, `TAO_ADMM_UPDATE_BASIC`, `TAO_ADMM_UPDATE_ADAPTIVE`
89 M*/
90 
91 /*E
92      TaoADMMRegularizerType - Determine regularizer routine - either user provided or soft threshold for `TAOADMM`
93 
94   Level: advanced
95 
96 .seealso: [](ch_tao), `Tao`, `TAOADMM`, `TaoADMMSetRegularizerType()`
97 E*/
98 typedef enum {
99   TAO_ADMM_REGULARIZER_USER,
100   TAO_ADMM_REGULARIZER_SOFT_THRESH
101 } TaoADMMRegularizerType;
102 PETSC_EXTERN const char *const TaoADMMRegularizerTypes[];
103 
104 /*MC
105   TAO_ADMM_REGULARIZER_USER - User provided routines for regularizer part of `TAOADMM`
106 
107   Level: advanced
108 
109   Note:
110   User needs to provided appropriate routines and type for regularizer solver
111 
112 .seealso: [](ch_tao), `Tao`, `TAOADMM`, `TaoADMMSetRegularizerType()`, `TAO_ADMM_REGULARIZER_SOFT_THRESH`
113 M*/
114 
115 /*MC
116   TAO_ADMM_REGULARIZER_SOFT_THRESH - Soft threshold to solve regularizer part of `TAOADMM`
117 
118   Level: advanced
119 
120   Note:
121   Utilizes built-in SoftThreshold routines
122 
123 .seealso: [](ch_tao), `Tao`, `TAOADMM`, `TaoSoftThreshold()`, `TaoADMMSetRegularizerObjectiveAndGradientRoutine()`,
124           `TaoADMMSetRegularizerHessianRoutine()`, `TaoADMMSetRegularizerType()`, `TAO_ADMM_REGULARIZER_USER`
125 M*/
126 
127 /*E
128      TaoALMMType - Determine the augmented Lagrangian formulation used in the `TAOALMM` subproblem.
129 
130    Values:
131 +  `TAO_ALMM_CLASSIC` - classic augmented Lagrangian definition including slack variables for inequality constraints
132 -  `TAO_ALMM_PHR`     - Powell-Hestenes-Rockafellar formulation without slack variables, uses pointwise min() for inequalities
133 
134   Level: advanced
135 
136 .seealso: [](ch_tao), `Tao`, `TAOALMM`, `TaoALMMSetType()`, `TaoALMMGetType()`
137 E*/
138 typedef enum {
139   TAO_ALMM_CLASSIC,
140   TAO_ALMM_PHR
141 } TaoALMMType;
142 PETSC_EXTERN const char *const TaoALMMTypes[];
143 
144 /*E
145      TaoBNCGType - Determine the conjugate gradient update formula used in the TAOBNCG algorithm.
146 
147   Values:
148 .vb
149   TAO_BNCG_GD         - basic gradient descent, no CG update
150   TAO_BNCG_PCGD       - preconditioned/scaled gradient descent
151   TAO_BNCG_HS         - Hestenes-Stiefel
152   TAO_BNCG_FR         - Fletcher-Reeves
153   TAO_BNCG_PRP        - Polak-Ribiere-Polyak (PRP)
154   TAO_BNCG_PRP_PLUS   - Polak-Ribiere-Polyak "plus" (PRP+)
155   TAO_BNCG_DY         - Dai-Yuan
156   TAO_BNCG_HZ         - Hager-Zhang (CG_DESCENT 5.3)
157   TAO_BNCG_DK         - Dai-Kou (2013)
158   TAO_BNCG_KD         - Kou-Dai (2015)
159   TAO_BNCG_SSML_BFGS  - Self-Scaling Memoryless BFGS (Perry-Shanno)
160   TAO_BNCG_SSML_DFP   - Self-Scaling Memoryless DFP
161   TAO_BNCG_SSML_BRDN  - Self-Scaling Memoryless (Symmetric) Broyden
162 .ve
163   Level: advanced
164 
165 .seealso: `Tao`, `TAOBNCG`, `TaoBNCGSetType()`, `TaoBNCGGetType()`
166 E*/
167 
168 typedef enum {
169   TAO_BNCG_GD,
170   TAO_BNCG_PCGD,
171   TAO_BNCG_HS,
172   TAO_BNCG_FR,
173   TAO_BNCG_PRP,
174   TAO_BNCG_PRP_PLUS,
175   TAO_BNCG_DY,
176   TAO_BNCG_HZ,
177   TAO_BNCG_DK,
178   TAO_BNCG_KD,
179   TAO_BNCG_SSML_BFGS,
180   TAO_BNCG_SSML_DFP,
181   TAO_BNCG_SSML_BRDN
182 } TaoBNCGType;
183 PETSC_EXTERN const char *const TaoBNCGTypes[];
184 
185 /*J
186         TaoType - String with the name of a `Tao` method
187 
188   Values:
189 +    `TAONLS` - nls Newton's method with line search for unconstrained minimization
190 .    `TAONTR` - ntr Newton's method with trust region for unconstrained minimization
191 .    `TAONTL` - ntl Newton's method with trust region, line search for unconstrained minimization
192 .    `TAOLMVM` - lmvm Limited memory variable metric method for unconstrained minimization
193 .    `TAOCG` - cg Nonlinear conjugate gradient method for unconstrained minimization
194 .    `TAONM` - nm Nelder-Mead algorithm for derivate-free unconstrained minimization
195 .    `TAOTRON` - tron Newton Trust Region method for bound constrained minimization
196 .    `TAOGPCG` - gpcg Newton Trust Region method for quadratic bound constrained minimization
197 .    `TAOBLMVM` - blmvm Limited memory variable metric method for bound constrained minimization
198 .    `TAOLCL` - lcl Linearly constrained Lagrangian method for pde-constrained minimization
199 -    `TAOPOUNDERS` - Pounders Model-based algorithm for nonlinear least squares
200 
201        Level: beginner
202 
203 .seealso: [](doc_taosolve), [](ch_tao), `Tao`, `TaoCreate()`, `TaoSetType()`
204 J*/
205 typedef const char *TaoType;
206 #define TAOLMVM     "lmvm"
207 #define TAONLS      "nls"
208 #define TAONTR      "ntr"
209 #define TAONTL      "ntl"
210 #define TAOCG       "cg"
211 #define TAOTRON     "tron"
212 #define TAOOWLQN    "owlqn"
213 #define TAOBMRM     "bmrm"
214 #define TAOBLMVM    "blmvm"
215 #define TAOBQNLS    "bqnls"
216 #define TAOBNCG     "bncg"
217 #define TAOBNLS     "bnls"
218 #define TAOBNTR     "bntr"
219 #define TAOBNTL     "bntl"
220 #define TAOBQNKLS   "bqnkls"
221 #define TAOBQNKTR   "bqnktr"
222 #define TAOBQNKTL   "bqnktl"
223 #define TAOBQPIP    "bqpip"
224 #define TAOGPCG     "gpcg"
225 #define TAONM       "nm"
226 #define TAOPOUNDERS "pounders"
227 #define TAOBRGN     "brgn"
228 #define TAOLCL      "lcl"
229 #define TAOSSILS    "ssils"
230 #define TAOSSFLS    "ssfls"
231 #define TAOASILS    "asils"
232 #define TAOASFLS    "asfls"
233 #define TAOIPM      "ipm"
234 #define TAOPDIPM    "pdipm"
235 #define TAOSHELL    "shell"
236 #define TAOADMM     "admm"
237 #define TAOALMM     "almm"
238 #define TAOPYTHON   "python"
239 #define TAOSNES     "snes"
240 
241 PETSC_EXTERN PetscClassId      TAO_CLASSID;
242 PETSC_EXTERN PetscFunctionList TaoList;
243 
244 /*E
245     TaoConvergedReason - reason a `Tao` optimizer was said to have converged or diverged
246 
247    Values:
248 +  `TAO_CONVERGED_GATOL` - ||g(X)|| < gatol
249 .  `TAO_CONVERGED_GRTOL` - ||g(X)|| / f(X)  < grtol
250 .  `TAO_CONVERGED_GTTOL` - ||g(X)|| / ||g(X0)|| < gttol
251 .  `TAO_CONVERGED_STEPTOL` - step size smaller than tolerance
252 .  `TAO_CONVERGED_MINF` - F < F_min
253 .  `TAO_CONVERGED_USER` - the user indicates the optimization has succeeded
254 .  `TAO_DIVERGED_MAXITS` - the maximum number of iterations allowed has been achieved
255 .  `TAO_DIVERGED_NAN` - not a number appeared in the computations
256 .  `TAO_DIVERGED_MAXFCN` - the maximum number of function evaluations has been computed
257 .  `TAO_DIVERGED_LS_FAILURE` - a linesearch failed
258 .  `TAO_DIVERGED_TR_REDUCTION` - trust region failure
259 .  `TAO_DIVERGED_USER` - the user has indicated the optimization has failed
260 -  `TAO_CONTINUE_ITERATING` - the optimization is still running, `TaoSolve()`
261 
262    where
263 +  X - current solution
264 .  X0 - initial guess
265 .  f(X) - current function value
266 .  f(X*) - true solution (estimated)
267 .  g(X) - current gradient
268 .  its - current iterate number
269 .  maxits - maximum number of iterates
270 .  fevals - number of function evaluations
271 -  max_funcsals - maximum number of function evaluations
272 
273    Level: beginner
274 
275    Note:
276    The two most common reasons for divergence are  an incorrectly coded or computed gradient or Hessian failure or lack of convergence
277    in the linear system solve (in this case we recommend testing with `-pc_type lu` to eliminate the linear solver as the cause of the problem).
278 
279    Developer Note:
280    The names in `KSPConvergedReason`, `SNESConvergedReason`, and `TaoConvergedReason` should be uniformized
281 
282 .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoGetConvergedReason()`, `KSPConvergedReason`, `SNESConvergedReason`
283 E*/
284 typedef enum {               /* converged */
285   TAO_CONVERGED_GATOL   = 3, /* ||g(X)|| < gatol */
286   TAO_CONVERGED_GRTOL   = 4, /* ||g(X)|| / f(X)  < grtol */
287   TAO_CONVERGED_GTTOL   = 5, /* ||g(X)|| / ||g(X0)|| < gttol */
288   TAO_CONVERGED_STEPTOL = 6, /* step size small */
289   TAO_CONVERGED_MINF    = 7, /* F < F_min */
290   TAO_CONVERGED_USER    = 8, /* User defined */
291   /* diverged */
292   TAO_DIVERGED_MAXITS       = -2,
293   TAO_DIVERGED_NAN          = -4,
294   TAO_DIVERGED_MAXFCN       = -5,
295   TAO_DIVERGED_LS_FAILURE   = -6,
296   TAO_DIVERGED_TR_REDUCTION = -7,
297   TAO_DIVERGED_USER         = -8, /* User defined */
298   /* keep going */
299   TAO_CONTINUE_ITERATING = 0
300 } TaoConvergedReason;
301 
302 PETSC_EXTERN const char **TaoConvergedReasons;
303 
304 PETSC_EXTERN PetscErrorCode TaoInitializePackage(void);
305 PETSC_EXTERN PetscErrorCode TaoFinalizePackage(void);
306 PETSC_EXTERN PetscErrorCode TaoCreate(MPI_Comm, Tao *);
307 PETSC_EXTERN PetscErrorCode TaoSetFromOptions(Tao);
308 PETSC_EXTERN PetscErrorCode TaoSetUp(Tao);
309 PETSC_EXTERN PetscErrorCode TaoSetType(Tao, TaoType);
310 PETSC_EXTERN PetscErrorCode TaoGetType(Tao, TaoType *);
311 PETSC_EXTERN PetscErrorCode TaoSetApplicationContext(Tao, void *);
312 PETSC_EXTERN PetscErrorCode TaoGetApplicationContext(Tao, void *);
313 PETSC_EXTERN PetscErrorCode TaoDestroy(Tao *);
314 
315 PETSC_EXTERN PetscErrorCode TaoSetOptionsPrefix(Tao, const char[]);
316 PETSC_EXTERN PetscErrorCode TaoView(Tao, PetscViewer);
317 PETSC_EXTERN PetscErrorCode TaoViewFromOptions(Tao, PetscObject, const char[]);
318 
319 PETSC_EXTERN PetscErrorCode TaoSolve(Tao);
320 
321 PETSC_EXTERN PetscErrorCode TaoRegister(const char[], PetscErrorCode (*)(Tao));
322 PETSC_EXTERN PetscErrorCode TaoRegisterDestroy(void);
323 
324 PETSC_EXTERN PetscErrorCode TaoGetConvergedReason(Tao, TaoConvergedReason *);
325 PETSC_EXTERN PetscErrorCode TaoGetSolutionStatus(Tao, PetscInt *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, TaoConvergedReason *);
326 PETSC_EXTERN PetscErrorCode TaoSetConvergedReason(Tao, TaoConvergedReason);
327 PETSC_EXTERN PetscErrorCode TaoSetSolution(Tao, Vec);
328 PETSC_EXTERN PetscErrorCode TaoGetSolution(Tao, Vec *);
329 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoSetSolution()", ) static inline PetscErrorCode TaoSetInitialVector(Tao t, Vec v)
330 {
331   return TaoSetSolution(t, v);
332 }
333 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoGetSolution()", ) static inline PetscErrorCode TaoGetInitialVector(Tao t, Vec *v)
334 {
335   return TaoGetSolution(t, v);
336 }
337 
338 PETSC_EXTERN PetscErrorCode TaoSetObjective(Tao, PetscErrorCode (*)(Tao, Vec, PetscReal *, void *), void *);
339 PETSC_EXTERN PetscErrorCode TaoGetObjective(Tao, PetscErrorCode (**)(Tao, Vec, PetscReal *, void *), void **);
340 PETSC_EXTERN PetscErrorCode TaoSetGradient(Tao, Vec, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
341 PETSC_EXTERN PetscErrorCode TaoGetGradient(Tao, Vec *, PetscErrorCode (**)(Tao, Vec, Vec, void *), void **);
342 PETSC_EXTERN PetscErrorCode TaoSetObjectiveAndGradient(Tao, Vec, PetscErrorCode (*)(Tao, Vec, PetscReal *, Vec, void *), void *);
343 PETSC_EXTERN PetscErrorCode TaoGetObjectiveAndGradient(Tao, Vec *, PetscErrorCode (**)(Tao, Vec, PetscReal *, Vec, void *), void **);
344 PETSC_EXTERN PetscErrorCode TaoSetHessian(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
345 PETSC_EXTERN PetscErrorCode TaoGetHessian(Tao, Mat *, Mat *, PetscErrorCode (**)(Tao, Vec, Mat, Mat, void *), void **);
346 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoSetObjective()", ) static inline PetscErrorCode TaoSetObjectiveRoutine(Tao t, PetscErrorCode (*f)(Tao, Vec, PetscReal *, void *), void *c)
347 {
348   return TaoSetObjective(t, f, c);
349 }
350 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoGetGradient()", ) static inline PetscErrorCode TaoGetGradientVector(Tao t, Vec *v)
351 {
352   return TaoGetGradient(t, v, PETSC_NULLPTR, PETSC_NULLPTR);
353 }
354 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoSetGradient()", ) static inline PetscErrorCode TaoSetGradientRoutine(Tao t, PetscErrorCode (*f)(Tao, Vec, Vec, void *), void *c)
355 {
356   return TaoSetGradient(t, PETSC_NULLPTR, f, c);
357 }
358 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoSetObjectiveAndGradient()", ) static inline PetscErrorCode TaoSetObjectiveAndGradientRoutine(Tao t, PetscErrorCode (*f)(Tao, Vec, PetscReal *, Vec, void *), void *c)
359 {
360   return TaoSetObjectiveAndGradient(t, PETSC_NULLPTR, f, c);
361 }
362 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoSetHessian()", ) static inline PetscErrorCode TaoSetHessianRoutine(Tao t, Mat H, Mat P, PetscErrorCode (*f)(Tao, Vec, Mat, Mat, void *), void *c)
363 {
364   return TaoSetHessian(t, H, P, f, c);
365 }
366 
367 PETSC_EXTERN PetscErrorCode TaoSetGradientNorm(Tao, Mat);
368 PETSC_EXTERN PetscErrorCode TaoGetGradientNorm(Tao, Mat *);
369 PETSC_EXTERN PetscErrorCode TaoSetLMVMMatrix(Tao, Mat);
370 PETSC_EXTERN PetscErrorCode TaoGetLMVMMatrix(Tao, Mat *);
371 PETSC_EXTERN PetscErrorCode TaoSetRecycleHistory(Tao, PetscBool);
372 PETSC_EXTERN PetscErrorCode TaoGetRecycleHistory(Tao, PetscBool *);
373 PETSC_EXTERN PetscErrorCode TaoLMVMSetH0(Tao, Mat);
374 PETSC_EXTERN PetscErrorCode TaoLMVMGetH0(Tao, Mat *);
375 PETSC_EXTERN PetscErrorCode TaoLMVMGetH0KSP(Tao, KSP *);
376 PETSC_EXTERN PetscErrorCode TaoLMVMRecycle(Tao, PetscBool);
377 PETSC_EXTERN PetscErrorCode TaoSetResidualRoutine(Tao, Vec, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
378 PETSC_EXTERN PetscErrorCode TaoSetResidualWeights(Tao, Vec, PetscInt, PetscInt *, PetscInt *, PetscReal *);
379 PETSC_EXTERN PetscErrorCode TaoSetConstraintsRoutine(Tao, Vec, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
380 PETSC_EXTERN PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao, Vec, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
381 PETSC_EXTERN PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao, Vec, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
382 PETSC_EXTERN PetscErrorCode TaoSetJacobianResidualRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
383 PETSC_EXTERN PetscErrorCode TaoSetJacobianRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
384 PETSC_EXTERN PetscErrorCode TaoSetJacobianStateRoutine(Tao, Mat, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, Mat, void *), void *);
385 PETSC_EXTERN PetscErrorCode TaoSetJacobianDesignRoutine(Tao, Mat, PetscErrorCode (*)(Tao, Vec, Mat, void *), void *);
386 PETSC_EXTERN PetscErrorCode TaoSetJacobianInequalityRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
387 PETSC_EXTERN PetscErrorCode TaoSetJacobianEqualityRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
388 
389 PETSC_EXTERN PetscErrorCode TaoPythonSetType(Tao, const char[]);
390 PETSC_EXTERN PetscErrorCode TaoPythonGetType(Tao, const char *[]);
391 
392 PETSC_EXTERN PetscErrorCode TaoShellSetSolve(Tao, PetscErrorCode (*)(Tao));
393 PETSC_EXTERN PetscErrorCode TaoShellSetContext(Tao, void *);
394 PETSC_EXTERN PetscErrorCode TaoShellGetContext(Tao, void *);
395 
396 PETSC_DEPRECATED_FUNCTION(3, 11, 0, "TaoSetResidualRoutine()", ) static inline PetscErrorCode TaoSetSeparableObjectiveRoutine(Tao tao, Vec res, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
397 {
398   return TaoSetResidualRoutine(tao, res, func, ctx);
399 }
400 PETSC_DEPRECATED_FUNCTION(3, 11, 0, "TaoSetResidualWeights()", ) static inline PetscErrorCode TaoSetSeparableObjectiveWeights(Tao tao, Vec sigma_v, PetscInt n, PetscInt *rows, PetscInt *cols, PetscReal *vals)
401 {
402   return TaoSetResidualWeights(tao, sigma_v, n, rows, cols, vals);
403 }
404 
405 PETSC_EXTERN PetscErrorCode TaoSetStateDesignIS(Tao, IS, IS);
406 
407 PETSC_EXTERN PetscErrorCode TaoComputeObjective(Tao, Vec, PetscReal *);
408 PETSC_EXTERN PetscErrorCode TaoComputeResidual(Tao, Vec, Vec);
409 PETSC_EXTERN PetscErrorCode TaoTestGradient(Tao, Vec, Vec);
410 PETSC_EXTERN PetscErrorCode TaoComputeGradient(Tao, Vec, Vec);
411 PETSC_EXTERN PetscErrorCode TaoComputeObjectiveAndGradient(Tao, Vec, PetscReal *, Vec);
412 PETSC_EXTERN PetscErrorCode TaoComputeConstraints(Tao, Vec, Vec);
413 PETSC_EXTERN PetscErrorCode TaoComputeInequalityConstraints(Tao, Vec, Vec);
414 PETSC_EXTERN PetscErrorCode TaoComputeEqualityConstraints(Tao, Vec, Vec);
415 PETSC_EXTERN PetscErrorCode TaoDefaultComputeGradient(Tao, Vec, Vec, void *);
416 PETSC_EXTERN PetscErrorCode TaoIsObjectiveDefined(Tao, PetscBool *);
417 PETSC_EXTERN PetscErrorCode TaoIsGradientDefined(Tao, PetscBool *);
418 PETSC_EXTERN PetscErrorCode TaoIsObjectiveAndGradientDefined(Tao, PetscBool *);
419 
420 PETSC_DEPRECATED_FUNCTION(3, 11, 0, "TaoComputeResidual()", ) static inline PetscErrorCode TaoComputeSeparableObjective(Tao tao, Vec X, Vec F)
421 {
422   return TaoComputeResidual(tao, X, F);
423 }
424 
425 PETSC_EXTERN PetscErrorCode TaoTestHessian(Tao);
426 PETSC_EXTERN PetscErrorCode TaoComputeHessian(Tao, Vec, Mat, Mat);
427 PETSC_EXTERN PetscErrorCode TaoComputeResidualJacobian(Tao, Vec, Mat, Mat);
428 PETSC_EXTERN PetscErrorCode TaoComputeJacobian(Tao, Vec, Mat, Mat);
429 PETSC_EXTERN PetscErrorCode TaoComputeJacobianState(Tao, Vec, Mat, Mat, Mat);
430 PETSC_EXTERN PetscErrorCode TaoComputeJacobianEquality(Tao, Vec, Mat, Mat);
431 PETSC_EXTERN PetscErrorCode TaoComputeJacobianInequality(Tao, Vec, Mat, Mat);
432 PETSC_EXTERN PetscErrorCode TaoComputeJacobianDesign(Tao, Vec, Mat);
433 
434 PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessian(Tao, Vec, Mat, Mat, void *);
435 PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessianColor(Tao, Vec, Mat, Mat, void *);
436 PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessianMFFD(Tao, Vec, Mat, Mat, void *);
437 PETSC_EXTERN PetscErrorCode TaoComputeDualVariables(Tao, Vec, Vec);
438 PETSC_EXTERN PetscErrorCode TaoSetVariableBounds(Tao, Vec, Vec);
439 PETSC_EXTERN PetscErrorCode TaoGetVariableBounds(Tao, Vec *, Vec *);
440 PETSC_EXTERN PetscErrorCode TaoGetDualVariables(Tao, Vec *, Vec *);
441 PETSC_EXTERN PetscErrorCode TaoSetInequalityBounds(Tao, Vec, Vec);
442 PETSC_EXTERN PetscErrorCode TaoGetInequalityBounds(Tao, Vec *, Vec *);
443 PETSC_EXTERN PetscErrorCode TaoSetVariableBoundsRoutine(Tao, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
444 PETSC_EXTERN PetscErrorCode TaoComputeVariableBounds(Tao);
445 
446 PETSC_EXTERN PetscErrorCode TaoGetTolerances(Tao, PetscReal *, PetscReal *, PetscReal *);
447 PETSC_EXTERN PetscErrorCode TaoSetTolerances(Tao, PetscReal, PetscReal, PetscReal);
448 PETSC_EXTERN PetscErrorCode TaoGetConstraintTolerances(Tao, PetscReal *, PetscReal *);
449 PETSC_EXTERN PetscErrorCode TaoSetConstraintTolerances(Tao, PetscReal, PetscReal);
450 PETSC_EXTERN PetscErrorCode TaoSetFunctionLowerBound(Tao, PetscReal);
451 PETSC_EXTERN PetscErrorCode TaoSetInitialTrustRegionRadius(Tao, PetscReal);
452 PETSC_EXTERN PetscErrorCode TaoSetMaximumIterations(Tao, PetscInt);
453 PETSC_EXTERN PetscErrorCode TaoSetMaximumFunctionEvaluations(Tao, PetscInt);
454 PETSC_EXTERN PetscErrorCode TaoGetFunctionLowerBound(Tao, PetscReal *);
455 PETSC_EXTERN PetscErrorCode TaoGetInitialTrustRegionRadius(Tao, PetscReal *);
456 PETSC_EXTERN PetscErrorCode TaoGetCurrentTrustRegionRadius(Tao, PetscReal *);
457 PETSC_EXTERN PetscErrorCode TaoGetMaximumIterations(Tao, PetscInt *);
458 PETSC_EXTERN PetscErrorCode TaoGetCurrentFunctionEvaluations(Tao, PetscInt *);
459 PETSC_EXTERN PetscErrorCode TaoGetMaximumFunctionEvaluations(Tao, PetscInt *);
460 PETSC_EXTERN PetscErrorCode TaoGetIterationNumber(Tao, PetscInt *);
461 PETSC_EXTERN PetscErrorCode TaoSetIterationNumber(Tao, PetscInt);
462 PETSC_EXTERN PetscErrorCode TaoGetTotalIterationNumber(Tao, PetscInt *);
463 PETSC_EXTERN PetscErrorCode TaoSetTotalIterationNumber(Tao, PetscInt);
464 PETSC_EXTERN PetscErrorCode TaoGetResidualNorm(Tao, PetscReal *);
465 
466 PETSC_EXTERN PetscErrorCode TaoAppendOptionsPrefix(Tao, const char[]);
467 PETSC_EXTERN PetscErrorCode TaoGetOptionsPrefix(Tao, const char *[]);
468 PETSC_EXTERN PetscErrorCode TaoResetStatistics(Tao);
469 PETSC_EXTERN PetscErrorCode TaoSetUpdate(Tao, PetscErrorCode (*)(Tao, PetscInt, void *), void *);
470 
471 PETSC_EXTERN PetscErrorCode TaoGetKSP(Tao, KSP *);
472 PETSC_EXTERN PetscErrorCode TaoGetLinearSolveIterations(Tao, PetscInt *);
473 PETSC_EXTERN PetscErrorCode TaoKSPSetUseEW(Tao, PetscBool);
474 
475 #include <petsctaolinesearch.h>
476 
477 PETSC_EXTERN PetscErrorCode TaoGetLineSearch(Tao, TaoLineSearch *);
478 
479 PETSC_EXTERN PetscErrorCode TaoSetConvergenceHistory(Tao, PetscReal *, PetscReal *, PetscReal *, PetscInt *, PetscInt, PetscBool);
480 PETSC_EXTERN PetscErrorCode TaoGetConvergenceHistory(Tao, PetscReal **, PetscReal **, PetscReal **, PetscInt **, PetscInt *);
481 PETSC_EXTERN PetscErrorCode TaoSetMonitor(Tao, PetscErrorCode (*)(Tao, void *), void *, PetscErrorCode (*)(void **));
482 PETSC_EXTERN PetscErrorCode TaoCancelMonitors(Tao);
483 PETSC_EXTERN PetscErrorCode TaoMonitorDefault(Tao, void *);
484 PETSC_DEPRECATED_FUNCTION(3, 9, 0, "TaoMonitorDefault()", ) static inline PetscErrorCode TaoDefaultMonitor(Tao tao, void *ctx)
485 {
486   return TaoMonitorDefault(tao, ctx);
487 }
488 PETSC_EXTERN PetscErrorCode TaoDefaultGMonitor(Tao, void *);
489 PETSC_EXTERN PetscErrorCode TaoDefaultSMonitor(Tao, void *);
490 PETSC_EXTERN PetscErrorCode TaoDefaultCMonitor(Tao, void *);
491 PETSC_EXTERN PetscErrorCode TaoSolutionMonitor(Tao, void *);
492 PETSC_EXTERN PetscErrorCode TaoResidualMonitor(Tao, void *);
493 PETSC_EXTERN PetscErrorCode TaoGradientMonitor(Tao, void *);
494 PETSC_EXTERN PetscErrorCode TaoStepDirectionMonitor(Tao, void *);
495 PETSC_EXTERN PetscErrorCode TaoDrawSolutionMonitor(Tao, void *);
496 PETSC_EXTERN PetscErrorCode TaoDrawStepMonitor(Tao, void *);
497 PETSC_EXTERN PetscErrorCode TaoDrawGradientMonitor(Tao, void *);
498 PETSC_EXTERN PetscErrorCode TaoAddLineSearchCounts(Tao);
499 
500 PETSC_EXTERN PetscErrorCode TaoDefaultConvergenceTest(Tao, void *);
501 PETSC_EXTERN PetscErrorCode TaoSetConvergenceTest(Tao, PetscErrorCode (*)(Tao, void *), void *);
502 
503 PETSC_EXTERN PetscErrorCode          TaoLCLSetStateDesignIS(Tao, IS, IS);
504 PETSC_EXTERN PetscErrorCode          TaoMonitor(Tao, PetscInt, PetscReal, PetscReal, PetscReal, PetscReal);
505 typedef struct _n_TaoMonitorDrawCtx *TaoMonitorDrawCtx;
506 PETSC_EXTERN PetscErrorCode          TaoMonitorDrawCtxCreate(MPI_Comm, const char[], const char[], int, int, int, int, PetscInt, TaoMonitorDrawCtx *);
507 PETSC_EXTERN PetscErrorCode          TaoMonitorDrawCtxDestroy(TaoMonitorDrawCtx *);
508 
509 PETSC_EXTERN PetscErrorCode TaoBRGNGetSubsolver(Tao, Tao *);
510 PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerObjectiveAndGradientRoutine(Tao, PetscErrorCode (*)(Tao, Vec, PetscReal *, Vec, void *), void *);
511 PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerHessianRoutine(Tao, Mat, PetscErrorCode (*)(Tao, Vec, Mat, void *), void *);
512 PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerWeight(Tao, PetscReal);
513 PETSC_EXTERN PetscErrorCode TaoBRGNSetL1SmoothEpsilon(Tao, PetscReal);
514 PETSC_EXTERN PetscErrorCode TaoBRGNSetDictionaryMatrix(Tao, Mat);
515 PETSC_EXTERN PetscErrorCode TaoBRGNGetDampingVector(Tao, Vec *);
516 PETSC_EXTERN PetscErrorCode TaoBNCGSetType(Tao, TaoBNCGType);
517 PETSC_EXTERN PetscErrorCode TaoBNCGGetType(Tao, TaoBNCGType *);
518 
519 PETSC_EXTERN PetscErrorCode TaoADMMGetMisfitSubsolver(Tao, Tao *);
520 PETSC_EXTERN PetscErrorCode TaoADMMGetRegularizationSubsolver(Tao, Tao *);
521 PETSC_EXTERN PetscErrorCode TaoADMMGetDualVector(Tao, Vec *);
522 PETSC_EXTERN PetscErrorCode TaoADMMGetSpectralPenalty(Tao, PetscReal *);
523 PETSC_EXTERN PetscErrorCode TaoADMMSetSpectralPenalty(Tao, PetscReal);
524 PETSC_EXTERN PetscErrorCode TaoGetADMMParentTao(Tao, Tao *);
525 PETSC_EXTERN PetscErrorCode TaoADMMSetConstraintVectorRHS(Tao, Vec);
526 PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerCoefficient(Tao, PetscReal);
527 PETSC_EXTERN PetscErrorCode TaoADMMGetRegularizerCoefficient(Tao, PetscReal *);
528 PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitConstraintJacobian(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
529 PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerConstraintJacobian(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
530 PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerHessianRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
531 PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerObjectiveAndGradientRoutine(Tao, PetscErrorCode (*)(Tao, Vec, PetscReal *, Vec, void *), void *);
532 PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitHessianRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
533 PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitObjectiveAndGradientRoutine(Tao, PetscErrorCode (*)(Tao, Vec, PetscReal *, Vec, void *), void *);
534 PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitHessianChangeStatus(Tao, PetscBool);
535 PETSC_EXTERN PetscErrorCode TaoADMMSetRegHessianChangeStatus(Tao, PetscBool);
536 PETSC_EXTERN PetscErrorCode TaoADMMSetMinimumSpectralPenalty(Tao, PetscReal);
537 PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerType(Tao, TaoADMMRegularizerType);
538 PETSC_EXTERN PetscErrorCode TaoADMMGetRegularizerType(Tao, TaoADMMRegularizerType *);
539 PETSC_EXTERN PetscErrorCode TaoADMMSetUpdateType(Tao, TaoADMMUpdateType);
540 PETSC_EXTERN PetscErrorCode TaoADMMGetUpdateType(Tao, TaoADMMUpdateType *);
541 
542 PETSC_EXTERN PetscErrorCode TaoALMMGetType(Tao, TaoALMMType *);
543 PETSC_EXTERN PetscErrorCode TaoALMMSetType(Tao, TaoALMMType);
544 PETSC_EXTERN PetscErrorCode TaoALMMGetSubsolver(Tao, Tao *);
545 PETSC_EXTERN PetscErrorCode TaoALMMSetSubsolver(Tao, Tao);
546 PETSC_EXTERN PetscErrorCode TaoALMMGetMultipliers(Tao, Vec *);
547 PETSC_EXTERN PetscErrorCode TaoALMMSetMultipliers(Tao, Vec);
548 PETSC_EXTERN PetscErrorCode TaoALMMGetPrimalIS(Tao, IS *, IS *);
549 PETSC_EXTERN PetscErrorCode TaoALMMGetDualIS(Tao, IS *, IS *);
550 
551 PETSC_EXTERN PetscErrorCode TaoVecGetSubVec(Vec, IS, TaoSubsetType, PetscReal, Vec *);
552 PETSC_EXTERN PetscErrorCode TaoMatGetSubMat(Mat, IS, Vec, TaoSubsetType, Mat *);
553 PETSC_EXTERN PetscErrorCode TaoGradientNorm(Tao, Vec, NormType, PetscReal *);
554 PETSC_EXTERN PetscErrorCode TaoEstimateActiveBounds(Vec, Vec, Vec, Vec, Vec, Vec, PetscReal, PetscReal *, IS *, IS *, IS *, IS *, IS *);
555 PETSC_EXTERN PetscErrorCode TaoBoundStep(Vec, Vec, Vec, IS, IS, IS, PetscReal, Vec);
556 PETSC_EXTERN PetscErrorCode TaoBoundSolution(Vec, Vec, Vec, PetscReal, PetscInt *, Vec);
557