xref: /petsc/include/petsctao.h (revision 66af8762ec03dbef0e079729eb2a1734a35ed7ff)
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 $  TAO_BNCG_GD         - basic gradient descent, no CG update
148 $  TAO_BNCG_PCGD       - preconditioned/scaled gradient descent
149 $  TAO_BNCG_HS         - Hestenes-Stiefel
150 $  TAO_BNCG_FR         - Fletcher-Reeves
151 $  TAO_BNCG_PRP        - Polak-Ribiere-Polyak (PRP)
152 $  TAO_BNCG_PRP_PLUS   - Polak-Ribiere-Polyak "plus" (PRP+)
153 $  TAO_BNCG_DY         - Dai-Yuan
154 $  TAO_BNCG_HZ         - Hager-Zhang (CG_DESCENT 5.3)
155 $  TAO_BNCG_DK         - Dai-Kou (2013)
156 $  TAO_BNCG_KD         - Kou-Dai (2015)
157 $  TAO_BNCG_SSML_BFGS  - Self-Scaling Memoryless BFGS (Perry-Shanno)
158 $  TAO_BNCG_SSML_DFP   - Self-Scaling Memoryless DFP
159 $  TAO_BNCG_SSML_BRDN  - Self-Scaling Memoryless (Symmetric) Broyden
160 
161   Level: advanced
162 
163 .seealso: `Tao`, `TAOBNCG`, `TaoBNCGSetType()`, `TaoBNCGGetType()`
164 E*/
165 
166 typedef enum {
167   TAO_BNCG_GD,
168   TAO_BNCG_PCGD,
169   TAO_BNCG_HS,
170   TAO_BNCG_FR,
171   TAO_BNCG_PRP,
172   TAO_BNCG_PRP_PLUS,
173   TAO_BNCG_DY,
174   TAO_BNCG_HZ,
175   TAO_BNCG_DK,
176   TAO_BNCG_KD,
177   TAO_BNCG_SSML_BFGS,
178   TAO_BNCG_SSML_DFP,
179   TAO_BNCG_SSML_BRDN
180 } TaoBNCGType;
181 PETSC_EXTERN const char *const TaoBNCGTypes[];
182 
183 /*J
184         TaoType - String with the name of a `Tao` method
185 
186   Values:
187 +    `TAONLS` - nls Newton's method with line search for unconstrained minimization
188 .    `TAONTR` - ntr Newton's method with trust region for unconstrained minimization
189 .    `TAONTL` - ntl Newton's method with trust region, line search for unconstrained minimization
190 .    `TAOLMVM` - lmvm Limited memory variable metric method for unconstrained minimization
191 .    `TAOCG` - cg Nonlinear conjugate gradient method for unconstrained minimization
192 .    `TAONM` - nm Nelder-Mead algorithm for derivate-free unconstrained minimization
193 .    `TAOTRON` - tron Newton Trust Region method for bound constrained minimization
194 .    `TAOGPCG` - gpcg Newton Trust Region method for quadratic bound constrained minimization
195 .    `TAOBLMVM` - blmvm Limited memory variable metric method for bound constrained minimization
196 .    `TAOLCL` - lcl Linearly constrained Lagrangian method for pde-constrained minimization
197 -    `TAOPOUNDERS` - Pounders Model-based algorithm for nonlinear least squares
198 
199        Level: beginner
200 
201 .seealso: [](doc_taosolve), [](ch_tao), `Tao`, `TaoCreate()`, `TaoSetType()`
202 J*/
203 typedef const char *TaoType;
204 #define TAOLMVM     "lmvm"
205 #define TAONLS      "nls"
206 #define TAONTR      "ntr"
207 #define TAONTL      "ntl"
208 #define TAOCG       "cg"
209 #define TAOTRON     "tron"
210 #define TAOOWLQN    "owlqn"
211 #define TAOBMRM     "bmrm"
212 #define TAOBLMVM    "blmvm"
213 #define TAOBQNLS    "bqnls"
214 #define TAOBNCG     "bncg"
215 #define TAOBNLS     "bnls"
216 #define TAOBNTR     "bntr"
217 #define TAOBNTL     "bntl"
218 #define TAOBQNKLS   "bqnkls"
219 #define TAOBQNKTR   "bqnktr"
220 #define TAOBQNKTL   "bqnktl"
221 #define TAOBQPIP    "bqpip"
222 #define TAOGPCG     "gpcg"
223 #define TAONM       "nm"
224 #define TAOPOUNDERS "pounders"
225 #define TAOBRGN     "brgn"
226 #define TAOLCL      "lcl"
227 #define TAOSSILS    "ssils"
228 #define TAOSSFLS    "ssfls"
229 #define TAOASILS    "asils"
230 #define TAOASFLS    "asfls"
231 #define TAOIPM      "ipm"
232 #define TAOPDIPM    "pdipm"
233 #define TAOSHELL    "shell"
234 #define TAOADMM     "admm"
235 #define TAOALMM     "almm"
236 #define TAOPYTHON   "python"
237 #define TAOSNES     "snes"
238 
239 PETSC_EXTERN PetscClassId      TAO_CLASSID;
240 PETSC_EXTERN PetscFunctionList TaoList;
241 
242 /*E
243     TaoConvergedReason - reason a `Tao` optimizer was said to have converged or diverged
244 
245    Values:
246 +  `TAO_CONVERGED_GATOL` - ||g(X)|| < gatol
247 .  `TAO_CONVERGED_GRTOL` - ||g(X)|| / f(X)  < grtol
248 .  `TAO_CONVERGED_GTTOL` - ||g(X)|| / ||g(X0)|| < gttol
249 .  `TAO_CONVERGED_STEPTOL` - step size smaller than tolerance
250 .  `TAO_CONVERGED_MINF` - F < F_min
251 .  `TAO_CONVERGED_USER` - the user indicates the optimization has succeeded
252 .  `TAO_DIVERGED_MAXITS` - the maximum number of iterations allowed has been achieved
253 .  `TAO_DIVERGED_NAN` - not a number appeared in the computations
254 .  `TAO_DIVERGED_MAXFCN` - the maximum number of function evaluations has been computed
255 .  `TAO_DIVERGED_LS_FAILURE` - a linesearch failed
256 .  `TAO_DIVERGED_TR_REDUCTION` - trust region failure
257 .  `TAO_DIVERGED_USER` - the user has indicated the optimization has failed
258 -  `TAO_CONTINUE_ITERATING` - the optimization is still running, `TaoSolve()`
259 
260    where
261 +  X - current solution
262 .  X0 - initial guess
263 .  f(X) - current function value
264 .  f(X*) - true solution (estimated)
265 .  g(X) - current gradient
266 .  its - current iterate number
267 .  maxits - maximum number of iterates
268 .  fevals - number of function evaluations
269 -  max_funcsals - maximum number of function evaluations
270 
271    Level: beginner
272 
273    Note:
274    The two most common reasons for divergence are  an incorrectly coded or computed gradient or Hessian failure or lack of convergence
275    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).
276 
277    Developer Note:
278    The names in `KSPConvergedReason`, `SNESConvergedReason`, and `TaoConvergedReason` should be uniformized
279 
280 .seealso: [](ch_tao), `Tao`, `TaoSolve()`, `TaoGetConvergedReason()`, `KSPConvergedReason`, `SNESConvergedReason`
281 E*/
282 typedef enum {               /* converged */
283   TAO_CONVERGED_GATOL   = 3, /* ||g(X)|| < gatol */
284   TAO_CONVERGED_GRTOL   = 4, /* ||g(X)|| / f(X)  < grtol */
285   TAO_CONVERGED_GTTOL   = 5, /* ||g(X)|| / ||g(X0)|| < gttol */
286   TAO_CONVERGED_STEPTOL = 6, /* step size small */
287   TAO_CONVERGED_MINF    = 7, /* F < F_min */
288   TAO_CONVERGED_USER    = 8, /* User defined */
289   /* diverged */
290   TAO_DIVERGED_MAXITS       = -2,
291   TAO_DIVERGED_NAN          = -4,
292   TAO_DIVERGED_MAXFCN       = -5,
293   TAO_DIVERGED_LS_FAILURE   = -6,
294   TAO_DIVERGED_TR_REDUCTION = -7,
295   TAO_DIVERGED_USER         = -8, /* User defined */
296   /* keep going */
297   TAO_CONTINUE_ITERATING = 0
298 } TaoConvergedReason;
299 
300 PETSC_EXTERN const char **TaoConvergedReasons;
301 
302 PETSC_EXTERN PetscErrorCode TaoInitializePackage(void);
303 PETSC_EXTERN PetscErrorCode TaoFinalizePackage(void);
304 PETSC_EXTERN PetscErrorCode TaoCreate(MPI_Comm, Tao *);
305 PETSC_EXTERN PetscErrorCode TaoSetFromOptions(Tao);
306 PETSC_EXTERN PetscErrorCode TaoSetUp(Tao);
307 PETSC_EXTERN PetscErrorCode TaoSetType(Tao, TaoType);
308 PETSC_EXTERN PetscErrorCode TaoGetType(Tao, TaoType *);
309 PETSC_EXTERN PetscErrorCode TaoSetApplicationContext(Tao, void *);
310 PETSC_EXTERN PetscErrorCode TaoGetApplicationContext(Tao, void *);
311 PETSC_EXTERN PetscErrorCode TaoDestroy(Tao *);
312 
313 PETSC_EXTERN PetscErrorCode TaoSetOptionsPrefix(Tao, const char[]);
314 PETSC_EXTERN PetscErrorCode TaoView(Tao, PetscViewer);
315 PETSC_EXTERN PetscErrorCode TaoViewFromOptions(Tao, PetscObject, const char[]);
316 
317 PETSC_EXTERN PetscErrorCode TaoSolve(Tao);
318 
319 PETSC_EXTERN PetscErrorCode TaoRegister(const char[], PetscErrorCode (*)(Tao));
320 PETSC_EXTERN PetscErrorCode TaoRegisterDestroy(void);
321 
322 PETSC_EXTERN PetscErrorCode TaoGetConvergedReason(Tao, TaoConvergedReason *);
323 PETSC_EXTERN PetscErrorCode TaoGetSolutionStatus(Tao, PetscInt *, PetscReal *, PetscReal *, PetscReal *, PetscReal *, TaoConvergedReason *);
324 PETSC_EXTERN PetscErrorCode TaoSetConvergedReason(Tao, TaoConvergedReason);
325 PETSC_EXTERN PetscErrorCode TaoSetSolution(Tao, Vec);
326 PETSC_EXTERN PetscErrorCode TaoGetSolution(Tao, Vec *);
327 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoSetSolution()", ) static inline PetscErrorCode TaoSetInitialVector(Tao t, Vec v)
328 {
329   return TaoSetSolution(t, v);
330 }
331 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoGetSolution()", ) static inline PetscErrorCode TaoGetInitialVector(Tao t, Vec *v)
332 {
333   return TaoGetSolution(t, v);
334 }
335 
336 PETSC_EXTERN PetscErrorCode TaoSetObjective(Tao, PetscErrorCode (*)(Tao, Vec, PetscReal *, void *), void *);
337 PETSC_EXTERN PetscErrorCode TaoGetObjective(Tao, PetscErrorCode (**)(Tao, Vec, PetscReal *, void *), void **);
338 PETSC_EXTERN PetscErrorCode TaoSetGradient(Tao, Vec, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
339 PETSC_EXTERN PetscErrorCode TaoGetGradient(Tao, Vec *, PetscErrorCode (**)(Tao, Vec, Vec, void *), void **);
340 PETSC_EXTERN PetscErrorCode TaoSetObjectiveAndGradient(Tao, Vec, PetscErrorCode (*)(Tao, Vec, PetscReal *, Vec, void *), void *);
341 PETSC_EXTERN PetscErrorCode TaoGetObjectiveAndGradient(Tao, Vec *, PetscErrorCode (**)(Tao, Vec, PetscReal *, Vec, void *), void **);
342 PETSC_EXTERN PetscErrorCode TaoSetHessian(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
343 PETSC_EXTERN PetscErrorCode TaoGetHessian(Tao, Mat *, Mat *, PetscErrorCode (**)(Tao, Vec, Mat, Mat, void *), void **);
344 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoSetObjective()", ) static inline PetscErrorCode TaoSetObjectiveRoutine(Tao t, PetscErrorCode (*f)(Tao, Vec, PetscReal *, void *), void *c)
345 {
346   return TaoSetObjective(t, f, c);
347 }
348 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoGetGradient()", ) static inline PetscErrorCode TaoGetGradientVector(Tao t, Vec *v)
349 {
350   return TaoGetGradient(t, v, PETSC_NULLPTR, PETSC_NULLPTR);
351 }
352 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoSetGradient()", ) static inline PetscErrorCode TaoSetGradientRoutine(Tao t, PetscErrorCode (*f)(Tao, Vec, Vec, void *), void *c)
353 {
354   return TaoSetGradient(t, PETSC_NULLPTR, f, c);
355 }
356 PETSC_DEPRECATED_FUNCTION(3, 17, 0, "TaoSetObjectiveAndGradient()", ) static inline PetscErrorCode TaoSetObjectiveAndGradientRoutine(Tao t, PetscErrorCode (*f)(Tao, Vec, PetscReal *, Vec, void *), void *c)
357 {
358   return TaoSetObjectiveAndGradient(t, PETSC_NULLPTR, f, c);
359 }
360 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)
361 {
362   return TaoSetHessian(t, H, P, f, c);
363 }
364 
365 PETSC_EXTERN PetscErrorCode TaoSetGradientNorm(Tao, Mat);
366 PETSC_EXTERN PetscErrorCode TaoGetGradientNorm(Tao, Mat *);
367 PETSC_EXTERN PetscErrorCode TaoSetLMVMMatrix(Tao, Mat);
368 PETSC_EXTERN PetscErrorCode TaoGetLMVMMatrix(Tao, Mat *);
369 PETSC_EXTERN PetscErrorCode TaoSetRecycleHistory(Tao, PetscBool);
370 PETSC_EXTERN PetscErrorCode TaoGetRecycleHistory(Tao, PetscBool *);
371 PETSC_EXTERN PetscErrorCode TaoLMVMSetH0(Tao, Mat);
372 PETSC_EXTERN PetscErrorCode TaoLMVMGetH0(Tao, Mat *);
373 PETSC_EXTERN PetscErrorCode TaoLMVMGetH0KSP(Tao, KSP *);
374 PETSC_EXTERN PetscErrorCode TaoLMVMRecycle(Tao, PetscBool);
375 PETSC_EXTERN PetscErrorCode TaoSetResidualRoutine(Tao, Vec, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
376 PETSC_EXTERN PetscErrorCode TaoSetResidualWeights(Tao, Vec, PetscInt, PetscInt *, PetscInt *, PetscReal *);
377 PETSC_EXTERN PetscErrorCode TaoSetConstraintsRoutine(Tao, Vec, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
378 PETSC_EXTERN PetscErrorCode TaoSetInequalityConstraintsRoutine(Tao, Vec, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
379 PETSC_EXTERN PetscErrorCode TaoSetEqualityConstraintsRoutine(Tao, Vec, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
380 PETSC_EXTERN PetscErrorCode TaoSetJacobianResidualRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
381 PETSC_EXTERN PetscErrorCode TaoSetJacobianRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
382 PETSC_EXTERN PetscErrorCode TaoSetJacobianStateRoutine(Tao, Mat, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, Mat, void *), void *);
383 PETSC_EXTERN PetscErrorCode TaoSetJacobianDesignRoutine(Tao, Mat, PetscErrorCode (*)(Tao, Vec, Mat, void *), void *);
384 PETSC_EXTERN PetscErrorCode TaoSetJacobianInequalityRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
385 PETSC_EXTERN PetscErrorCode TaoSetJacobianEqualityRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
386 
387 PETSC_EXTERN PetscErrorCode TaoPythonSetType(Tao, const char[]);
388 PETSC_EXTERN PetscErrorCode TaoPythonGetType(Tao, const char *[]);
389 
390 PETSC_EXTERN PetscErrorCode TaoShellSetSolve(Tao, PetscErrorCode (*)(Tao));
391 PETSC_EXTERN PetscErrorCode TaoShellSetContext(Tao, void *);
392 PETSC_EXTERN PetscErrorCode TaoShellGetContext(Tao, void *);
393 
394 PETSC_DEPRECATED_FUNCTION(3, 11, 0, "TaoSetResidualRoutine()", ) static inline PetscErrorCode TaoSetSeparableObjectiveRoutine(Tao tao, Vec res, PetscErrorCode (*func)(Tao, Vec, Vec, void *), void *ctx)
395 {
396   return TaoSetResidualRoutine(tao, res, func, ctx);
397 }
398 PETSC_DEPRECATED_FUNCTION(3, 11, 0, "TaoSetResidualWeights()", ) static inline PetscErrorCode TaoSetSeparableObjectiveWeights(Tao tao, Vec sigma_v, PetscInt n, PetscInt *rows, PetscInt *cols, PetscReal *vals)
399 {
400   return TaoSetResidualWeights(tao, sigma_v, n, rows, cols, vals);
401 }
402 
403 PETSC_EXTERN PetscErrorCode TaoSetStateDesignIS(Tao, IS, IS);
404 
405 PETSC_EXTERN PetscErrorCode TaoComputeObjective(Tao, Vec, PetscReal *);
406 PETSC_EXTERN PetscErrorCode TaoComputeResidual(Tao, Vec, Vec);
407 PETSC_EXTERN PetscErrorCode TaoTestGradient(Tao, Vec, Vec);
408 PETSC_EXTERN PetscErrorCode TaoComputeGradient(Tao, Vec, Vec);
409 PETSC_EXTERN PetscErrorCode TaoComputeObjectiveAndGradient(Tao, Vec, PetscReal *, Vec);
410 PETSC_EXTERN PetscErrorCode TaoComputeConstraints(Tao, Vec, Vec);
411 PETSC_EXTERN PetscErrorCode TaoComputeInequalityConstraints(Tao, Vec, Vec);
412 PETSC_EXTERN PetscErrorCode TaoComputeEqualityConstraints(Tao, Vec, Vec);
413 PETSC_EXTERN PetscErrorCode TaoDefaultComputeGradient(Tao, Vec, Vec, void *);
414 PETSC_EXTERN PetscErrorCode TaoIsObjectiveDefined(Tao, PetscBool *);
415 PETSC_EXTERN PetscErrorCode TaoIsGradientDefined(Tao, PetscBool *);
416 PETSC_EXTERN PetscErrorCode TaoIsObjectiveAndGradientDefined(Tao, PetscBool *);
417 
418 PETSC_DEPRECATED_FUNCTION(3, 11, 0, "TaoComputeResidual()", ) static inline PetscErrorCode TaoComputeSeparableObjective(Tao tao, Vec X, Vec F)
419 {
420   return TaoComputeResidual(tao, X, F);
421 }
422 
423 PETSC_EXTERN PetscErrorCode TaoTestHessian(Tao);
424 PETSC_EXTERN PetscErrorCode TaoComputeHessian(Tao, Vec, Mat, Mat);
425 PETSC_EXTERN PetscErrorCode TaoComputeResidualJacobian(Tao, Vec, Mat, Mat);
426 PETSC_EXTERN PetscErrorCode TaoComputeJacobian(Tao, Vec, Mat, Mat);
427 PETSC_EXTERN PetscErrorCode TaoComputeJacobianState(Tao, Vec, Mat, Mat, Mat);
428 PETSC_EXTERN PetscErrorCode TaoComputeJacobianEquality(Tao, Vec, Mat, Mat);
429 PETSC_EXTERN PetscErrorCode TaoComputeJacobianInequality(Tao, Vec, Mat, Mat);
430 PETSC_EXTERN PetscErrorCode TaoComputeJacobianDesign(Tao, Vec, Mat);
431 
432 PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessian(Tao, Vec, Mat, Mat, void *);
433 PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessianColor(Tao, Vec, Mat, Mat, void *);
434 PETSC_EXTERN PetscErrorCode TaoDefaultComputeHessianMFFD(Tao, Vec, Mat, Mat, void *);
435 PETSC_EXTERN PetscErrorCode TaoComputeDualVariables(Tao, Vec, Vec);
436 PETSC_EXTERN PetscErrorCode TaoSetVariableBounds(Tao, Vec, Vec);
437 PETSC_EXTERN PetscErrorCode TaoGetVariableBounds(Tao, Vec *, Vec *);
438 PETSC_EXTERN PetscErrorCode TaoGetDualVariables(Tao, Vec *, Vec *);
439 PETSC_EXTERN PetscErrorCode TaoSetInequalityBounds(Tao, Vec, Vec);
440 PETSC_EXTERN PetscErrorCode TaoGetInequalityBounds(Tao, Vec *, Vec *);
441 PETSC_EXTERN PetscErrorCode TaoSetVariableBoundsRoutine(Tao, PetscErrorCode (*)(Tao, Vec, Vec, void *), void *);
442 PETSC_EXTERN PetscErrorCode TaoComputeVariableBounds(Tao);
443 
444 PETSC_EXTERN PetscErrorCode TaoGetTolerances(Tao, PetscReal *, PetscReal *, PetscReal *);
445 PETSC_EXTERN PetscErrorCode TaoSetTolerances(Tao, PetscReal, PetscReal, PetscReal);
446 PETSC_EXTERN PetscErrorCode TaoGetConstraintTolerances(Tao, PetscReal *, PetscReal *);
447 PETSC_EXTERN PetscErrorCode TaoSetConstraintTolerances(Tao, PetscReal, PetscReal);
448 PETSC_EXTERN PetscErrorCode TaoSetFunctionLowerBound(Tao, PetscReal);
449 PETSC_EXTERN PetscErrorCode TaoSetInitialTrustRegionRadius(Tao, PetscReal);
450 PETSC_EXTERN PetscErrorCode TaoSetMaximumIterations(Tao, PetscInt);
451 PETSC_EXTERN PetscErrorCode TaoSetMaximumFunctionEvaluations(Tao, PetscInt);
452 PETSC_EXTERN PetscErrorCode TaoGetFunctionLowerBound(Tao, PetscReal *);
453 PETSC_EXTERN PetscErrorCode TaoGetInitialTrustRegionRadius(Tao, PetscReal *);
454 PETSC_EXTERN PetscErrorCode TaoGetCurrentTrustRegionRadius(Tao, PetscReal *);
455 PETSC_EXTERN PetscErrorCode TaoGetMaximumIterations(Tao, PetscInt *);
456 PETSC_EXTERN PetscErrorCode TaoGetCurrentFunctionEvaluations(Tao, PetscInt *);
457 PETSC_EXTERN PetscErrorCode TaoGetMaximumFunctionEvaluations(Tao, PetscInt *);
458 PETSC_EXTERN PetscErrorCode TaoGetIterationNumber(Tao, PetscInt *);
459 PETSC_EXTERN PetscErrorCode TaoSetIterationNumber(Tao, PetscInt);
460 PETSC_EXTERN PetscErrorCode TaoGetTotalIterationNumber(Tao, PetscInt *);
461 PETSC_EXTERN PetscErrorCode TaoSetTotalIterationNumber(Tao, PetscInt);
462 PETSC_EXTERN PetscErrorCode TaoGetResidualNorm(Tao, PetscReal *);
463 
464 PETSC_EXTERN PetscErrorCode TaoAppendOptionsPrefix(Tao, const char[]);
465 PETSC_EXTERN PetscErrorCode TaoGetOptionsPrefix(Tao, const char *[]);
466 PETSC_EXTERN PetscErrorCode TaoResetStatistics(Tao);
467 PETSC_EXTERN PetscErrorCode TaoSetUpdate(Tao, PetscErrorCode (*)(Tao, PetscInt, void *), void *);
468 
469 PETSC_EXTERN PetscErrorCode TaoGetKSP(Tao, KSP *);
470 PETSC_EXTERN PetscErrorCode TaoGetLinearSolveIterations(Tao, PetscInt *);
471 PETSC_EXTERN PetscErrorCode TaoKSPSetUseEW(Tao, PetscBool);
472 
473 #include <petsctaolinesearch.h>
474 
475 PETSC_EXTERN PetscErrorCode TaoGetLineSearch(Tao, TaoLineSearch *);
476 
477 PETSC_EXTERN PetscErrorCode TaoSetConvergenceHistory(Tao, PetscReal *, PetscReal *, PetscReal *, PetscInt *, PetscInt, PetscBool);
478 PETSC_EXTERN PetscErrorCode TaoGetConvergenceHistory(Tao, PetscReal **, PetscReal **, PetscReal **, PetscInt **, PetscInt *);
479 PETSC_EXTERN PetscErrorCode TaoSetMonitor(Tao, PetscErrorCode (*)(Tao, void *), void *, PetscErrorCode (*)(void **));
480 PETSC_EXTERN PetscErrorCode TaoCancelMonitors(Tao);
481 PETSC_EXTERN PetscErrorCode TaoMonitorDefault(Tao, void *);
482 PETSC_DEPRECATED_FUNCTION(3, 9, 0, "TaoMonitorDefault()", ) static inline PetscErrorCode TaoDefaultMonitor(Tao tao, void *ctx)
483 {
484   return TaoMonitorDefault(tao, ctx);
485 }
486 PETSC_EXTERN PetscErrorCode TaoDefaultGMonitor(Tao, void *);
487 PETSC_EXTERN PetscErrorCode TaoDefaultSMonitor(Tao, void *);
488 PETSC_EXTERN PetscErrorCode TaoDefaultCMonitor(Tao, void *);
489 PETSC_EXTERN PetscErrorCode TaoSolutionMonitor(Tao, void *);
490 PETSC_EXTERN PetscErrorCode TaoResidualMonitor(Tao, void *);
491 PETSC_EXTERN PetscErrorCode TaoGradientMonitor(Tao, void *);
492 PETSC_EXTERN PetscErrorCode TaoStepDirectionMonitor(Tao, void *);
493 PETSC_EXTERN PetscErrorCode TaoDrawSolutionMonitor(Tao, void *);
494 PETSC_EXTERN PetscErrorCode TaoDrawStepMonitor(Tao, void *);
495 PETSC_EXTERN PetscErrorCode TaoDrawGradientMonitor(Tao, void *);
496 PETSC_EXTERN PetscErrorCode TaoAddLineSearchCounts(Tao);
497 
498 PETSC_EXTERN PetscErrorCode TaoDefaultConvergenceTest(Tao, void *);
499 PETSC_EXTERN PetscErrorCode TaoSetConvergenceTest(Tao, PetscErrorCode (*)(Tao, void *), void *);
500 
501 PETSC_EXTERN PetscErrorCode          TaoLCLSetStateDesignIS(Tao, IS, IS);
502 PETSC_EXTERN PetscErrorCode          TaoMonitor(Tao, PetscInt, PetscReal, PetscReal, PetscReal, PetscReal);
503 typedef struct _n_TaoMonitorDrawCtx *TaoMonitorDrawCtx;
504 PETSC_EXTERN PetscErrorCode          TaoMonitorDrawCtxCreate(MPI_Comm, const char[], const char[], int, int, int, int, PetscInt, TaoMonitorDrawCtx *);
505 PETSC_EXTERN PetscErrorCode          TaoMonitorDrawCtxDestroy(TaoMonitorDrawCtx *);
506 
507 PETSC_EXTERN PetscErrorCode TaoBRGNGetSubsolver(Tao, Tao *);
508 PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerObjectiveAndGradientRoutine(Tao, PetscErrorCode (*)(Tao, Vec, PetscReal *, Vec, void *), void *);
509 PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerHessianRoutine(Tao, Mat, PetscErrorCode (*)(Tao, Vec, Mat, void *), void *);
510 PETSC_EXTERN PetscErrorCode TaoBRGNSetRegularizerWeight(Tao, PetscReal);
511 PETSC_EXTERN PetscErrorCode TaoBRGNSetL1SmoothEpsilon(Tao, PetscReal);
512 PETSC_EXTERN PetscErrorCode TaoBRGNSetDictionaryMatrix(Tao, Mat);
513 PETSC_EXTERN PetscErrorCode TaoBRGNGetDampingVector(Tao, Vec *);
514 PETSC_EXTERN PetscErrorCode TaoBNCGSetType(Tao, TaoBNCGType);
515 PETSC_EXTERN PetscErrorCode TaoBNCGGetType(Tao, TaoBNCGType *);
516 
517 PETSC_EXTERN PetscErrorCode TaoADMMGetMisfitSubsolver(Tao, Tao *);
518 PETSC_EXTERN PetscErrorCode TaoADMMGetRegularizationSubsolver(Tao, Tao *);
519 PETSC_EXTERN PetscErrorCode TaoADMMGetDualVector(Tao, Vec *);
520 PETSC_EXTERN PetscErrorCode TaoADMMGetSpectralPenalty(Tao, PetscReal *);
521 PETSC_EXTERN PetscErrorCode TaoADMMSetSpectralPenalty(Tao, PetscReal);
522 PETSC_EXTERN PetscErrorCode TaoGetADMMParentTao(Tao, Tao *);
523 PETSC_EXTERN PetscErrorCode TaoADMMSetConstraintVectorRHS(Tao, Vec);
524 PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerCoefficient(Tao, PetscReal);
525 PETSC_EXTERN PetscErrorCode TaoADMMGetRegularizerCoefficient(Tao, PetscReal *);
526 PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitConstraintJacobian(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
527 PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerConstraintJacobian(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
528 PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerHessianRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
529 PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerObjectiveAndGradientRoutine(Tao, PetscErrorCode (*)(Tao, Vec, PetscReal *, Vec, void *), void *);
530 PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitHessianRoutine(Tao, Mat, Mat, PetscErrorCode (*)(Tao, Vec, Mat, Mat, void *), void *);
531 PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitObjectiveAndGradientRoutine(Tao, PetscErrorCode (*)(Tao, Vec, PetscReal *, Vec, void *), void *);
532 PETSC_EXTERN PetscErrorCode TaoADMMSetMisfitHessianChangeStatus(Tao, PetscBool);
533 PETSC_EXTERN PetscErrorCode TaoADMMSetRegHessianChangeStatus(Tao, PetscBool);
534 PETSC_EXTERN PetscErrorCode TaoADMMSetMinimumSpectralPenalty(Tao, PetscReal);
535 PETSC_EXTERN PetscErrorCode TaoADMMSetRegularizerType(Tao, TaoADMMRegularizerType);
536 PETSC_EXTERN PetscErrorCode TaoADMMGetRegularizerType(Tao, TaoADMMRegularizerType *);
537 PETSC_EXTERN PetscErrorCode TaoADMMSetUpdateType(Tao, TaoADMMUpdateType);
538 PETSC_EXTERN PetscErrorCode TaoADMMGetUpdateType(Tao, TaoADMMUpdateType *);
539 
540 PETSC_EXTERN PetscErrorCode TaoALMMGetType(Tao, TaoALMMType *);
541 PETSC_EXTERN PetscErrorCode TaoALMMSetType(Tao, TaoALMMType);
542 PETSC_EXTERN PetscErrorCode TaoALMMGetSubsolver(Tao, Tao *);
543 PETSC_EXTERN PetscErrorCode TaoALMMSetSubsolver(Tao, Tao);
544 PETSC_EXTERN PetscErrorCode TaoALMMGetMultipliers(Tao, Vec *);
545 PETSC_EXTERN PetscErrorCode TaoALMMSetMultipliers(Tao, Vec);
546 PETSC_EXTERN PetscErrorCode TaoALMMGetPrimalIS(Tao, IS *, IS *);
547 PETSC_EXTERN PetscErrorCode TaoALMMGetDualIS(Tao, IS *, IS *);
548 
549 PETSC_EXTERN PetscErrorCode TaoVecGetSubVec(Vec, IS, TaoSubsetType, PetscReal, Vec *);
550 PETSC_EXTERN PetscErrorCode TaoMatGetSubMat(Mat, IS, Vec, TaoSubsetType, Mat *);
551 PETSC_EXTERN PetscErrorCode TaoGradientNorm(Tao, Vec, NormType, PetscReal *);
552 PETSC_EXTERN PetscErrorCode TaoEstimateActiveBounds(Vec, Vec, Vec, Vec, Vec, Vec, PetscReal, PetscReal *, IS *, IS *, IS *, IS *, IS *);
553 PETSC_EXTERN PetscErrorCode TaoBoundStep(Vec, Vec, Vec, IS, IS, IS, PetscReal, Vec);
554 PETSC_EXTERN PetscErrorCode TaoBoundSolution(Vec, Vec, Vec, PetscReal, PetscInt *, Vec);
555